content: # Copyright 2016 Google Inc. All Rights Reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  """Support module for tests for yapf."""
  
  import difflib
  import sys
  import unittest
  
  from yapf.pytree import blank_line_calculator
  from yapf.pytree import comment_splicer
  from yapf.pytree import continuation_splicer
  from yapf.pytree import pytree_unwrapper
  from yapf.pytree import pytree_utils
  from yapf.pytree import pytree_visitor
  from yapf.pytree import split_penalty
  from yapf.pytree import subtype_assigner
  from yapf.yapflib import identify_container
  from yapf.yapflib import style
  
  
  class YAPFTest(unittest.TestCase):
  
    def __init__(self, *args):
      super(YAPFTest, self).__init__(*args)
  
    def assertCodeEqual(self, expected_code, code):
      if code != expected_code:
        msg = ['Code format mismatch:', 'Expected:']
        linelen = style.Get('COLUMN_LIMIT')
        for line in expected_code.splitlines():
          if len(line) > linelen:
            msg.append('!> %s' % line)
          else:
            msg.append(' > %s' % line)
        msg.append('Actual:')
        for line in code.splitlines():
          if len(line) > linelen:
            msg.append('!> %s' % line)
          else:
            msg.append(' > %s' % line)
        msg.append('Diff:')
        msg.extend(
            difflib.unified_diff(
                code.splitlines(),
                expected_code.splitlines(),
                fromfile='actual',
                tofile='expected',
                lineterm=''))
        self.fail('\n'.join(msg))
  
  
  def ParseAndUnwrap(code, dumptree=False):
    """Produces logical lines from the given code.
  
    Parses the code into a tree, performs comment splicing and runs the
    unwrapper.
  
    Arguments:
      code: code to parse as a string
      dumptree: if True, the parsed pytree (after comment splicing) is dumped
                to stderr. Useful for debugging.
  
    Returns:
      List of logical lines.
    """
    tree = pytree_utils.ParseCodeToTree(code)
    comment_splicer.SpliceComments(tree)
    continuation_splicer.SpliceContinuations(tree)
    subtype_assigner.AssignSubtypes(tree)
    identify_container.IdentifyContainers(tree)
    split_penalty.ComputeSplitPenalties(tree)
    blank_line_calculator.CalculateBlankLines(tree)
  
    if dumptree:
      pytree_visitor.DumpPyTree(tree, target_stream=sys.stderr)
  
    llines = pytree_unwrapper.UnwrapPyTree(tree)
    for lline in llines:
      lline.CalculateFormattingInformation()
  
    return llines
  