xref: /aosp_15_r20/external/yapf/yapftests/yapf_test.py (revision 7249d1a64f4850ccf838e62a46276f891f72998e)
1*7249d1a6SKrzysztof Kosiński# -*- coding: utf-8 -*-
2*7249d1a6SKrzysztof Kosiński# Copyright 2015 Google Inc. All Rights Reserved.
3*7249d1a6SKrzysztof Kosiński#
4*7249d1a6SKrzysztof Kosiński# Licensed under the Apache License, Version 2.0 (the "License");
5*7249d1a6SKrzysztof Kosiński# you may not use this file except in compliance with the License.
6*7249d1a6SKrzysztof Kosiński# You may obtain a copy of the License at
7*7249d1a6SKrzysztof Kosiński#
8*7249d1a6SKrzysztof Kosiński#     http://www.apache.org/licenses/LICENSE-2.0
9*7249d1a6SKrzysztof Kosiński#
10*7249d1a6SKrzysztof Kosiński# Unless required by applicable law or agreed to in writing, software
11*7249d1a6SKrzysztof Kosiński# distributed under the License is distributed on an "AS IS" BASIS,
12*7249d1a6SKrzysztof Kosiński# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7249d1a6SKrzysztof Kosiński# See the License for the specific language governing permissions and
14*7249d1a6SKrzysztof Kosiński# limitations under the License.
15*7249d1a6SKrzysztof Kosiński"""Tests for yapf.yapf."""
16*7249d1a6SKrzysztof Kosiński
17*7249d1a6SKrzysztof Kosińskiimport io
18*7249d1a6SKrzysztof Kosińskiimport logging
19*7249d1a6SKrzysztof Kosińskiimport os
20*7249d1a6SKrzysztof Kosińskiimport shutil
21*7249d1a6SKrzysztof Kosińskiimport subprocess
22*7249d1a6SKrzysztof Kosińskiimport sys
23*7249d1a6SKrzysztof Kosińskiimport tempfile
24*7249d1a6SKrzysztof Kosińskiimport textwrap
25*7249d1a6SKrzysztof Kosińskiimport unittest
26*7249d1a6SKrzysztof Kosiński
27*7249d1a6SKrzysztof Kosińskifrom lib2to3.pgen2 import tokenize
28*7249d1a6SKrzysztof Kosiński
29*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import errors
30*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import py3compat
31*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import style
32*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import yapf_api
33*7249d1a6SKrzysztof Kosiński
34*7249d1a6SKrzysztof Kosińskifrom yapftests import utils
35*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper
36*7249d1a6SKrzysztof Kosiński
37*7249d1a6SKrzysztof KosińskiROOT_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
38*7249d1a6SKrzysztof Kosiński
39*7249d1a6SKrzysztof Kosiński# Verification is turned off by default, but want to enable it for testing.
40*7249d1a6SKrzysztof KosińskiYAPF_BINARY = [sys.executable, '-m', 'yapf', '--verify', '--no-local-style']
41*7249d1a6SKrzysztof Kosiński
42*7249d1a6SKrzysztof Kosiński
43*7249d1a6SKrzysztof Kosińskiclass FormatCodeTest(yapf_test_helper.YAPFTest):
44*7249d1a6SKrzysztof Kosiński
45*7249d1a6SKrzysztof Kosiński  def _Check(self, unformatted_code, expected_formatted_code):
46*7249d1a6SKrzysztof Kosiński    formatted_code, _ = yapf_api.FormatCode(
47*7249d1a6SKrzysztof Kosiński        unformatted_code, style_config='yapf')
48*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, formatted_code)
49*7249d1a6SKrzysztof Kosiński
50*7249d1a6SKrzysztof Kosiński  def testSimple(self):
51*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
52*7249d1a6SKrzysztof Kosiński        print('foo')
53*7249d1a6SKrzysztof Kosiński        """)
54*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, unformatted_code)
55*7249d1a6SKrzysztof Kosiński
56*7249d1a6SKrzysztof Kosiński  def testNoEndingNewline(self):
57*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
58*7249d1a6SKrzysztof Kosiński        if True:
59*7249d1a6SKrzysztof Kosiński          pass""")
60*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
61*7249d1a6SKrzysztof Kosiński        if True:
62*7249d1a6SKrzysztof Kosiński          pass
63*7249d1a6SKrzysztof Kosiński        """)
64*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
65*7249d1a6SKrzysztof Kosiński
66*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6')
67*7249d1a6SKrzysztof Kosiński  def testPrintAfterPeriod(self):
68*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""a.print\n""")
69*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""a.print\n""")
70*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
71*7249d1a6SKrzysztof Kosiński
72*7249d1a6SKrzysztof Kosiński
73*7249d1a6SKrzysztof Kosińskiclass FormatFileTest(unittest.TestCase):
74*7249d1a6SKrzysztof Kosiński
75*7249d1a6SKrzysztof Kosiński  def setUp(self):  # pylint: disable=g-missing-super-call
76*7249d1a6SKrzysztof Kosiński    self.test_tmpdir = tempfile.mkdtemp()
77*7249d1a6SKrzysztof Kosiński
78*7249d1a6SKrzysztof Kosiński  def tearDown(self):  # pylint: disable=g-missing-super-call
79*7249d1a6SKrzysztof Kosiński    shutil.rmtree(self.test_tmpdir)
80*7249d1a6SKrzysztof Kosiński
81*7249d1a6SKrzysztof Kosiński  def assertCodeEqual(self, expected_code, code):
82*7249d1a6SKrzysztof Kosiński    if code != expected_code:
83*7249d1a6SKrzysztof Kosiński      msg = 'Code format mismatch:\n'
84*7249d1a6SKrzysztof Kosiński      msg += 'Expected:\n >'
85*7249d1a6SKrzysztof Kosiński      msg += '\n > '.join(expected_code.splitlines())
86*7249d1a6SKrzysztof Kosiński      msg += '\nActual:\n >'
87*7249d1a6SKrzysztof Kosiński      msg += '\n > '.join(code.splitlines())
88*7249d1a6SKrzysztof Kosiński      # TODO(sbc): maybe using difflib here to produce easy to read deltas?
89*7249d1a6SKrzysztof Kosiński      self.fail(msg)
90*7249d1a6SKrzysztof Kosiński
91*7249d1a6SKrzysztof Kosiński  def testFormatFile(self):
92*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
93*7249d1a6SKrzysztof Kosiński        if True:
94*7249d1a6SKrzysztof Kosiński         pass
95*7249d1a6SKrzysztof Kosiński        """)
96*7249d1a6SKrzysztof Kosiński    expected_formatted_code_pep8 = textwrap.dedent(u"""\
97*7249d1a6SKrzysztof Kosiński        if True:
98*7249d1a6SKrzysztof Kosiński            pass
99*7249d1a6SKrzysztof Kosiński        """)
100*7249d1a6SKrzysztof Kosiński    expected_formatted_code_yapf = textwrap.dedent(u"""\
101*7249d1a6SKrzysztof Kosiński        if True:
102*7249d1a6SKrzysztof Kosiński          pass
103*7249d1a6SKrzysztof Kosiński        """)
104*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
105*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
106*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code_pep8, formatted_code)
107*7249d1a6SKrzysztof Kosiński
108*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf')
109*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code_yapf, formatted_code)
110*7249d1a6SKrzysztof Kosiński
111*7249d1a6SKrzysztof Kosiński  def testDisableLinesPattern(self):
112*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
113*7249d1a6SKrzysztof Kosiński        if a:    b
114*7249d1a6SKrzysztof Kosiński
115*7249d1a6SKrzysztof Kosiński        # yapf: disable
116*7249d1a6SKrzysztof Kosiński        if f:    g
117*7249d1a6SKrzysztof Kosiński
118*7249d1a6SKrzysztof Kosiński        if h:    i
119*7249d1a6SKrzysztof Kosiński        """)
120*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent(u"""\
121*7249d1a6SKrzysztof Kosiński        if a: b
122*7249d1a6SKrzysztof Kosiński
123*7249d1a6SKrzysztof Kosiński        # yapf: disable
124*7249d1a6SKrzysztof Kosiński        if f:    g
125*7249d1a6SKrzysztof Kosiński
126*7249d1a6SKrzysztof Kosiński        if h:    i
127*7249d1a6SKrzysztof Kosiński        """)
128*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
129*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
130*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, formatted_code)
131*7249d1a6SKrzysztof Kosiński
132*7249d1a6SKrzysztof Kosiński  def testDisableAndReenableLinesPattern(self):
133*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
134*7249d1a6SKrzysztof Kosiński        if a:    b
135*7249d1a6SKrzysztof Kosiński
136*7249d1a6SKrzysztof Kosiński        # yapf: disable
137*7249d1a6SKrzysztof Kosiński        if f:    g
138*7249d1a6SKrzysztof Kosiński        # yapf: enable
139*7249d1a6SKrzysztof Kosiński
140*7249d1a6SKrzysztof Kosiński        if h:    i
141*7249d1a6SKrzysztof Kosiński        """)
142*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent(u"""\
143*7249d1a6SKrzysztof Kosiński        if a: b
144*7249d1a6SKrzysztof Kosiński
145*7249d1a6SKrzysztof Kosiński        # yapf: disable
146*7249d1a6SKrzysztof Kosiński        if f:    g
147*7249d1a6SKrzysztof Kosiński        # yapf: enable
148*7249d1a6SKrzysztof Kosiński
149*7249d1a6SKrzysztof Kosiński        if h: i
150*7249d1a6SKrzysztof Kosiński        """)
151*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
152*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
153*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, formatted_code)
154*7249d1a6SKrzysztof Kosiński
155*7249d1a6SKrzysztof Kosiński  def testDisablePartOfMultilineComment(self):
156*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
157*7249d1a6SKrzysztof Kosiński        if a:    b
158*7249d1a6SKrzysztof Kosiński
159*7249d1a6SKrzysztof Kosiński        # This is a multiline comment that disables YAPF.
160*7249d1a6SKrzysztof Kosiński        # yapf: disable
161*7249d1a6SKrzysztof Kosiński        if f:    g
162*7249d1a6SKrzysztof Kosiński        # yapf: enable
163*7249d1a6SKrzysztof Kosiński        # This is a multiline comment that enables YAPF.
164*7249d1a6SKrzysztof Kosiński
165*7249d1a6SKrzysztof Kosiński        if h:    i
166*7249d1a6SKrzysztof Kosiński        """)
167*7249d1a6SKrzysztof Kosiński
168*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent(u"""\
169*7249d1a6SKrzysztof Kosiński        if a: b
170*7249d1a6SKrzysztof Kosiński
171*7249d1a6SKrzysztof Kosiński        # This is a multiline comment that disables YAPF.
172*7249d1a6SKrzysztof Kosiński        # yapf: disable
173*7249d1a6SKrzysztof Kosiński        if f:    g
174*7249d1a6SKrzysztof Kosiński        # yapf: enable
175*7249d1a6SKrzysztof Kosiński        # This is a multiline comment that enables YAPF.
176*7249d1a6SKrzysztof Kosiński
177*7249d1a6SKrzysztof Kosiński        if h: i
178*7249d1a6SKrzysztof Kosiński        """)
179*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
180*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
181*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, formatted_code)
182*7249d1a6SKrzysztof Kosiński
183*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
184*7249d1a6SKrzysztof Kosiński      def foo_function():
185*7249d1a6SKrzysztof Kosiński          # some comment
186*7249d1a6SKrzysztof Kosiński          # yapf: disable
187*7249d1a6SKrzysztof Kosiński
188*7249d1a6SKrzysztof Kosiński          foo(
189*7249d1a6SKrzysztof Kosiński          bar,
190*7249d1a6SKrzysztof Kosiński          baz
191*7249d1a6SKrzysztof Kosiński          )
192*7249d1a6SKrzysztof Kosiński
193*7249d1a6SKrzysztof Kosiński          # yapf: enable
194*7249d1a6SKrzysztof Kosiński      """)
195*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
196*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
197*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
198*7249d1a6SKrzysztof Kosiński
199*7249d1a6SKrzysztof Kosiński  def testEnabledDisabledSameComment(self):
200*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
201*7249d1a6SKrzysztof Kosiński        # yapf: disable
202*7249d1a6SKrzysztof Kosiński        a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee)
203*7249d1a6SKrzysztof Kosiński        # yapf: enable
204*7249d1a6SKrzysztof Kosiński        # yapf: disable
205*7249d1a6SKrzysztof Kosiński        a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee)
206*7249d1a6SKrzysztof Kosiński        # yapf: enable
207*7249d1a6SKrzysztof Kosiński        """)  # noqa
208*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
209*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
210*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
211*7249d1a6SKrzysztof Kosiński
212*7249d1a6SKrzysztof Kosiński  def testFormatFileLinesSelection(self):
213*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
214*7249d1a6SKrzysztof Kosiński        if a:    b
215*7249d1a6SKrzysztof Kosiński
216*7249d1a6SKrzysztof Kosiński        if f:    g
217*7249d1a6SKrzysztof Kosiński
218*7249d1a6SKrzysztof Kosiński        if h:    i
219*7249d1a6SKrzysztof Kosiński        """)
220*7249d1a6SKrzysztof Kosiński    expected_formatted_code_lines1and2 = textwrap.dedent(u"""\
221*7249d1a6SKrzysztof Kosiński        if a: b
222*7249d1a6SKrzysztof Kosiński
223*7249d1a6SKrzysztof Kosiński        if f:    g
224*7249d1a6SKrzysztof Kosiński
225*7249d1a6SKrzysztof Kosiński        if h:    i
226*7249d1a6SKrzysztof Kosiński        """)
227*7249d1a6SKrzysztof Kosiński    expected_formatted_code_lines3 = textwrap.dedent(u"""\
228*7249d1a6SKrzysztof Kosiński        if a:    b
229*7249d1a6SKrzysztof Kosiński
230*7249d1a6SKrzysztof Kosiński        if f: g
231*7249d1a6SKrzysztof Kosiński
232*7249d1a6SKrzysztof Kosiński        if h:    i
233*7249d1a6SKrzysztof Kosiński        """)
234*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
235*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(
236*7249d1a6SKrzysztof Kosiński          filepath, style_config='pep8', lines=[(1, 2)])
237*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code_lines1and2, formatted_code)
238*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(
239*7249d1a6SKrzysztof Kosiński          filepath, style_config='pep8', lines=[(3, 3)])
240*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code_lines3, formatted_code)
241*7249d1a6SKrzysztof Kosiński
242*7249d1a6SKrzysztof Kosiński  def testFormatFileDiff(self):
243*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
244*7249d1a6SKrzysztof Kosiński        if True:
245*7249d1a6SKrzysztof Kosiński         pass
246*7249d1a6SKrzysztof Kosiński        """)
247*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
248*7249d1a6SKrzysztof Kosiński      diff, _, _ = yapf_api.FormatFile(filepath, print_diff=True)
249*7249d1a6SKrzysztof Kosiński      self.assertIn(u'+  pass', diff)
250*7249d1a6SKrzysztof Kosiński
251*7249d1a6SKrzysztof Kosiński  def testFormatFileInPlace(self):
252*7249d1a6SKrzysztof Kosiński    unformatted_code = u'True==False\n'
253*7249d1a6SKrzysztof Kosiński    formatted_code = u'True == False\n'
254*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
255*7249d1a6SKrzysztof Kosiński      result, _, _ = yapf_api.FormatFile(filepath, in_place=True)
256*7249d1a6SKrzysztof Kosiński      self.assertEqual(result, None)
257*7249d1a6SKrzysztof Kosiński      with open(filepath) as fd:
258*7249d1a6SKrzysztof Kosiński        if sys.version_info[0] <= 2:
259*7249d1a6SKrzysztof Kosiński          self.assertCodeEqual(formatted_code, fd.read().decode('ascii'))
260*7249d1a6SKrzysztof Kosiński        else:
261*7249d1a6SKrzysztof Kosiński          self.assertCodeEqual(formatted_code, fd.read())
262*7249d1a6SKrzysztof Kosiński
263*7249d1a6SKrzysztof Kosiński      self.assertRaises(
264*7249d1a6SKrzysztof Kosiński          ValueError,
265*7249d1a6SKrzysztof Kosiński          yapf_api.FormatFile,
266*7249d1a6SKrzysztof Kosiński          filepath,
267*7249d1a6SKrzysztof Kosiński          in_place=True,
268*7249d1a6SKrzysztof Kosiński          print_diff=True)
269*7249d1a6SKrzysztof Kosiński
270*7249d1a6SKrzysztof Kosiński  def testNoFile(self):
271*7249d1a6SKrzysztof Kosiński    stream = py3compat.StringIO()
272*7249d1a6SKrzysztof Kosiński    handler = logging.StreamHandler(stream)
273*7249d1a6SKrzysztof Kosiński    logger = logging.getLogger('mylogger')
274*7249d1a6SKrzysztof Kosiński    logger.addHandler(handler)
275*7249d1a6SKrzysztof Kosiński    self.assertRaises(
276*7249d1a6SKrzysztof Kosiński        IOError, yapf_api.FormatFile, 'not_a_file.py', logger=logger.error)
277*7249d1a6SKrzysztof Kosiński    self.assertEqual(stream.getvalue(),
278*7249d1a6SKrzysztof Kosiński                     "[Errno 2] No such file or directory: 'not_a_file.py'\n")
279*7249d1a6SKrzysztof Kosiński
280*7249d1a6SKrzysztof Kosiński  def testCommentsUnformatted(self):
281*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
282*7249d1a6SKrzysztof Kosiński        foo = [# A list of things
283*7249d1a6SKrzysztof Kosiński               # bork
284*7249d1a6SKrzysztof Kosiński            'one',
285*7249d1a6SKrzysztof Kosiński            # quark
286*7249d1a6SKrzysztof Kosiński            'two'] # yapf: disable
287*7249d1a6SKrzysztof Kosiński        """)
288*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
289*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
290*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
291*7249d1a6SKrzysztof Kosiński
292*7249d1a6SKrzysztof Kosiński  def testDisabledHorizontalFormattingOnNewLine(self):
293*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
294*7249d1a6SKrzysztof Kosiński        # yapf: disable
295*7249d1a6SKrzysztof Kosiński        a = [
296*7249d1a6SKrzysztof Kosiński        1]
297*7249d1a6SKrzysztof Kosiński        # yapf: enable
298*7249d1a6SKrzysztof Kosiński        """)
299*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
300*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
301*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
302*7249d1a6SKrzysztof Kosiński
303*7249d1a6SKrzysztof Kosiński  def testSplittingSemicolonStatements(self):
304*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
305*7249d1a6SKrzysztof Kosiński        def f():
306*7249d1a6SKrzysztof Kosiński          x = y + 42 ; z = n * 42
307*7249d1a6SKrzysztof Kosiński          if True: a += 1 ; b += 1; c += 1
308*7249d1a6SKrzysztof Kosiński        """)
309*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent(u"""\
310*7249d1a6SKrzysztof Kosiński        def f():
311*7249d1a6SKrzysztof Kosiński            x = y + 42
312*7249d1a6SKrzysztof Kosiński            z = n * 42
313*7249d1a6SKrzysztof Kosiński            if True:
314*7249d1a6SKrzysztof Kosiński                a += 1
315*7249d1a6SKrzysztof Kosiński                b += 1
316*7249d1a6SKrzysztof Kosiński                c += 1
317*7249d1a6SKrzysztof Kosiński        """)
318*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
319*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
320*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, formatted_code)
321*7249d1a6SKrzysztof Kosiński
322*7249d1a6SKrzysztof Kosiński  def testSemicolonStatementsDisabled(self):
323*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
324*7249d1a6SKrzysztof Kosiński        def f():
325*7249d1a6SKrzysztof Kosiński          x = y + 42 ; z = n * 42  # yapf: disable
326*7249d1a6SKrzysztof Kosiński          if True: a += 1 ; b += 1; c += 1
327*7249d1a6SKrzysztof Kosiński        """)
328*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent(u"""\
329*7249d1a6SKrzysztof Kosiński        def f():
330*7249d1a6SKrzysztof Kosiński            x = y + 42 ; z = n * 42  # yapf: disable
331*7249d1a6SKrzysztof Kosiński            if True:
332*7249d1a6SKrzysztof Kosiński                a += 1
333*7249d1a6SKrzysztof Kosiński                b += 1
334*7249d1a6SKrzysztof Kosiński                c += 1
335*7249d1a6SKrzysztof Kosiński        """)
336*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath:
337*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
338*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, formatted_code)
339*7249d1a6SKrzysztof Kosiński
340*7249d1a6SKrzysztof Kosiński  def testDisabledSemiColonSeparatedStatements(self):
341*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
342*7249d1a6SKrzysztof Kosiński        # yapf: disable
343*7249d1a6SKrzysztof Kosiński        if True: a ; b
344*7249d1a6SKrzysztof Kosiński        """)
345*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
346*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8')
347*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
348*7249d1a6SKrzysztof Kosiński
349*7249d1a6SKrzysztof Kosiński  def testDisabledMultilineStringInDictionary(self):
350*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
351*7249d1a6SKrzysztof Kosiński        # yapf: disable
352*7249d1a6SKrzysztof Kosiński
353*7249d1a6SKrzysztof Kosiński        A = [
354*7249d1a6SKrzysztof Kosiński            {
355*7249d1a6SKrzysztof Kosiński                "aaaaaaaaaaaaaaaaaaa": '''
356*7249d1a6SKrzysztof Kosiński        bbbbbbbbbbb: "ccccccccccc"
357*7249d1a6SKrzysztof Kosiński        dddddddddddddd: 1
358*7249d1a6SKrzysztof Kosiński        eeeeeeee: 0
359*7249d1a6SKrzysztof Kosiński        ffffffffff: "ggggggg"
360*7249d1a6SKrzysztof Kosiński        ''',
361*7249d1a6SKrzysztof Kosiński            },
362*7249d1a6SKrzysztof Kosiński        ]
363*7249d1a6SKrzysztof Kosiński        """)
364*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
365*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf')
366*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
367*7249d1a6SKrzysztof Kosiński
368*7249d1a6SKrzysztof Kosiński  def testDisabledWithPrecedingText(self):
369*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(u"""\
370*7249d1a6SKrzysztof Kosiński        # TODO(fix formatting): yapf: disable
371*7249d1a6SKrzysztof Kosiński
372*7249d1a6SKrzysztof Kosiński        A = [
373*7249d1a6SKrzysztof Kosiński            {
374*7249d1a6SKrzysztof Kosiński                "aaaaaaaaaaaaaaaaaaa": '''
375*7249d1a6SKrzysztof Kosiński        bbbbbbbbbbb: "ccccccccccc"
376*7249d1a6SKrzysztof Kosiński        dddddddddddddd: 1
377*7249d1a6SKrzysztof Kosiński        eeeeeeee: 0
378*7249d1a6SKrzysztof Kosiński        ffffffffff: "ggggggg"
379*7249d1a6SKrzysztof Kosiński        ''',
380*7249d1a6SKrzysztof Kosiński            },
381*7249d1a6SKrzysztof Kosiński        ]
382*7249d1a6SKrzysztof Kosiński        """)
383*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
384*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf')
385*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
386*7249d1a6SKrzysztof Kosiński
387*7249d1a6SKrzysztof Kosiński  def testCRLFLineEnding(self):
388*7249d1a6SKrzysztof Kosiński    code = u'class _():\r\n  pass\r\n'
389*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, code) as filepath:
390*7249d1a6SKrzysztof Kosiński      formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf')
391*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, formatted_code)
392*7249d1a6SKrzysztof Kosiński
393*7249d1a6SKrzysztof Kosiński
394*7249d1a6SKrzysztof Kosińskiclass CommandLineTest(unittest.TestCase):
395*7249d1a6SKrzysztof Kosiński  """Test how calling yapf from the command line acts."""
396*7249d1a6SKrzysztof Kosiński
397*7249d1a6SKrzysztof Kosiński  @classmethod
398*7249d1a6SKrzysztof Kosiński  def setUpClass(cls):  # pylint: disable=g-missing-super-call
399*7249d1a6SKrzysztof Kosiński    cls.test_tmpdir = tempfile.mkdtemp()
400*7249d1a6SKrzysztof Kosiński
401*7249d1a6SKrzysztof Kosiński  @classmethod
402*7249d1a6SKrzysztof Kosiński  def tearDownClass(cls):  # pylint: disable=g-missing-super-call
403*7249d1a6SKrzysztof Kosiński    shutil.rmtree(cls.test_tmpdir)
404*7249d1a6SKrzysztof Kosiński
405*7249d1a6SKrzysztof Kosiński  def assertYapfReformats(self,
406*7249d1a6SKrzysztof Kosiński                          unformatted,
407*7249d1a6SKrzysztof Kosiński                          expected,
408*7249d1a6SKrzysztof Kosiński                          extra_options=None,
409*7249d1a6SKrzysztof Kosiński                          env=None):
410*7249d1a6SKrzysztof Kosiński    """Check that yapf reformats the given code as expected.
411*7249d1a6SKrzysztof Kosiński
412*7249d1a6SKrzysztof Kosiński    Invokes yapf in a subprocess, piping the unformatted code into its stdin.
413*7249d1a6SKrzysztof Kosiński    Checks that the formatted output is as expected.
414*7249d1a6SKrzysztof Kosiński
415*7249d1a6SKrzysztof Kosiński    Arguments:
416*7249d1a6SKrzysztof Kosiński      unformatted: unformatted code - input to yapf
417*7249d1a6SKrzysztof Kosiński      expected: expected formatted code at the output of yapf
418*7249d1a6SKrzysztof Kosiński      extra_options: iterable of extra command-line options to pass to yapf
419*7249d1a6SKrzysztof Kosiński      env: dict of environment variables.
420*7249d1a6SKrzysztof Kosiński    """
421*7249d1a6SKrzysztof Kosiński    cmdline = YAPF_BINARY + (extra_options or [])
422*7249d1a6SKrzysztof Kosiński    p = subprocess.Popen(
423*7249d1a6SKrzysztof Kosiński        cmdline,
424*7249d1a6SKrzysztof Kosiński        stdout=subprocess.PIPE,
425*7249d1a6SKrzysztof Kosiński        stdin=subprocess.PIPE,
426*7249d1a6SKrzysztof Kosiński        stderr=subprocess.PIPE,
427*7249d1a6SKrzysztof Kosiński        env=env)
428*7249d1a6SKrzysztof Kosiński    reformatted_code, stderrdata = p.communicate(
429*7249d1a6SKrzysztof Kosiński        unformatted.encode('utf-8-sig'))
430*7249d1a6SKrzysztof Kosiński    self.assertEqual(stderrdata, b'')
431*7249d1a6SKrzysztof Kosiński    self.assertMultiLineEqual(reformatted_code.decode('utf-8'), expected)
432*7249d1a6SKrzysztof Kosiński
433*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6')
434*7249d1a6SKrzysztof Kosiński  def testUnicodeEncodingPipedToFile(self):
435*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
436*7249d1a6SKrzysztof Kosiński        def foo():
437*7249d1a6SKrzysztof Kosiński            print('⇒')
438*7249d1a6SKrzysztof Kosiński        """)
439*7249d1a6SKrzysztof Kosiński    with utils.NamedTempFile(
440*7249d1a6SKrzysztof Kosiński        dirname=self.test_tmpdir, suffix='.py') as (out, _):
441*7249d1a6SKrzysztof Kosiński      with utils.TempFileContents(
442*7249d1a6SKrzysztof Kosiński          self.test_tmpdir, unformatted_code, suffix='.py') as filepath:
443*7249d1a6SKrzysztof Kosiński        subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out)
444*7249d1a6SKrzysztof Kosiński
445*7249d1a6SKrzysztof Kosiński  def testInPlaceReformatting(self):
446*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
447*7249d1a6SKrzysztof Kosiński        def foo():
448*7249d1a6SKrzysztof Kosiński          x = 37
449*7249d1a6SKrzysztof Kosiński        """)
450*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
451*7249d1a6SKrzysztof Kosiński        def foo():
452*7249d1a6SKrzysztof Kosiński            x = 37
453*7249d1a6SKrzysztof Kosiński        """)
454*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(
455*7249d1a6SKrzysztof Kosiński        self.test_tmpdir, unformatted_code, suffix='.py') as filepath:
456*7249d1a6SKrzysztof Kosiński      p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath])
457*7249d1a6SKrzysztof Kosiński      p.wait()
458*7249d1a6SKrzysztof Kosiński      with io.open(filepath, mode='r', newline='') as fd:
459*7249d1a6SKrzysztof Kosiński        reformatted_code = fd.read()
460*7249d1a6SKrzysztof Kosiński    self.assertEqual(reformatted_code, expected_formatted_code)
461*7249d1a6SKrzysztof Kosiński
462*7249d1a6SKrzysztof Kosiński  def testInPlaceReformattingBlank(self):
463*7249d1a6SKrzysztof Kosiński    unformatted_code = u'\n\n'
464*7249d1a6SKrzysztof Kosiński    expected_formatted_code = u'\n'
465*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(
466*7249d1a6SKrzysztof Kosiński        self.test_tmpdir, unformatted_code, suffix='.py') as filepath:
467*7249d1a6SKrzysztof Kosiński      p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath])
468*7249d1a6SKrzysztof Kosiński      p.wait()
469*7249d1a6SKrzysztof Kosiński      with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd:
470*7249d1a6SKrzysztof Kosiński        reformatted_code = fd.read()
471*7249d1a6SKrzysztof Kosiński    self.assertEqual(reformatted_code, expected_formatted_code)
472*7249d1a6SKrzysztof Kosiński
473*7249d1a6SKrzysztof Kosiński  def testInPlaceReformattingEmpty(self):
474*7249d1a6SKrzysztof Kosiński    unformatted_code = u''
475*7249d1a6SKrzysztof Kosiński    expected_formatted_code = u''
476*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(
477*7249d1a6SKrzysztof Kosiński        self.test_tmpdir, unformatted_code, suffix='.py') as filepath:
478*7249d1a6SKrzysztof Kosiński      p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath])
479*7249d1a6SKrzysztof Kosiński      p.wait()
480*7249d1a6SKrzysztof Kosiński      with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd:
481*7249d1a6SKrzysztof Kosiński        reformatted_code = fd.read()
482*7249d1a6SKrzysztof Kosiński    self.assertEqual(reformatted_code, expected_formatted_code)
483*7249d1a6SKrzysztof Kosiński
484*7249d1a6SKrzysztof Kosiński  def testReadFromStdin(self):
485*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
486*7249d1a6SKrzysztof Kosiński        def foo():
487*7249d1a6SKrzysztof Kosiński          x = 37
488*7249d1a6SKrzysztof Kosiński        """)
489*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
490*7249d1a6SKrzysztof Kosiński        def foo():
491*7249d1a6SKrzysztof Kosiński            x = 37
492*7249d1a6SKrzysztof Kosiński        """)
493*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
494*7249d1a6SKrzysztof Kosiński
495*7249d1a6SKrzysztof Kosiński  def testReadFromStdinWithEscapedStrings(self):
496*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
497*7249d1a6SKrzysztof Kosiński        s =   "foo\\nbar"
498*7249d1a6SKrzysztof Kosiński        """)
499*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
500*7249d1a6SKrzysztof Kosiński        s = "foo\\nbar"
501*7249d1a6SKrzysztof Kosiński        """)
502*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
503*7249d1a6SKrzysztof Kosiński
504*7249d1a6SKrzysztof Kosiński  def testSetYapfStyle(self):
505*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
506*7249d1a6SKrzysztof Kosiński        def foo(): # trail
507*7249d1a6SKrzysztof Kosiński            x = 37
508*7249d1a6SKrzysztof Kosiński        """)
509*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
510*7249d1a6SKrzysztof Kosiński        def foo():  # trail
511*7249d1a6SKrzysztof Kosiński          x = 37
512*7249d1a6SKrzysztof Kosiński        """)
513*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
514*7249d1a6SKrzysztof Kosiński        unformatted_code,
515*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
516*7249d1a6SKrzysztof Kosiński        extra_options=['--style=yapf'])
517*7249d1a6SKrzysztof Kosiński
518*7249d1a6SKrzysztof Kosiński  def testSetCustomStyleBasedOnYapf(self):
519*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
520*7249d1a6SKrzysztof Kosiński        def foo(): # trail
521*7249d1a6SKrzysztof Kosiński            x = 37
522*7249d1a6SKrzysztof Kosiński        """)
523*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
524*7249d1a6SKrzysztof Kosiński        def foo():    # trail
525*7249d1a6SKrzysztof Kosiński          x = 37
526*7249d1a6SKrzysztof Kosiński        """)
527*7249d1a6SKrzysztof Kosiński    style_file = textwrap.dedent(u'''\
528*7249d1a6SKrzysztof Kosiński        [style]
529*7249d1a6SKrzysztof Kosiński        based_on_style = yapf
530*7249d1a6SKrzysztof Kosiński        spaces_before_comment = 4
531*7249d1a6SKrzysztof Kosiński        ''')
532*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath:
533*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
534*7249d1a6SKrzysztof Kosiński          unformatted_code,
535*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
536*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
537*7249d1a6SKrzysztof Kosiński
538*7249d1a6SKrzysztof Kosiński  def testSetCustomStyleSpacesBeforeComment(self):
539*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
540*7249d1a6SKrzysztof Kosiński        a_very_long_statement_that_extends_way_beyond # Comment
541*7249d1a6SKrzysztof Kosiński        short # This is a shorter statement
542*7249d1a6SKrzysztof Kosiński        """)
543*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
544*7249d1a6SKrzysztof Kosiński        a_very_long_statement_that_extends_way_beyond # Comment
545*7249d1a6SKrzysztof Kosiński        short                                         # This is a shorter statement
546*7249d1a6SKrzysztof Kosiński        """)  # noqa
547*7249d1a6SKrzysztof Kosiński    style_file = textwrap.dedent(u'''\
548*7249d1a6SKrzysztof Kosiński        [style]
549*7249d1a6SKrzysztof Kosiński        spaces_before_comment = 15, 20
550*7249d1a6SKrzysztof Kosiński        ''')
551*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath:
552*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
553*7249d1a6SKrzysztof Kosiński          unformatted_code,
554*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
555*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
556*7249d1a6SKrzysztof Kosiński
557*7249d1a6SKrzysztof Kosiński  def testReadSingleLineCodeFromStdin(self):
558*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
559*7249d1a6SKrzysztof Kosiński        if True: pass
560*7249d1a6SKrzysztof Kosiński        """)
561*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
562*7249d1a6SKrzysztof Kosiński        if True: pass
563*7249d1a6SKrzysztof Kosiński        """)
564*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
565*7249d1a6SKrzysztof Kosiński
566*7249d1a6SKrzysztof Kosiński  def testEncodingVerification(self):
567*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent(u"""\
568*7249d1a6SKrzysztof Kosiński        '''The module docstring.'''
569*7249d1a6SKrzysztof Kosiński        # -*- coding: utf-8 -*-
570*7249d1a6SKrzysztof Kosiński        def f():
571*7249d1a6SKrzysztof Kosiński            x = 37
572*7249d1a6SKrzysztof Kosiński        """)
573*7249d1a6SKrzysztof Kosiński
574*7249d1a6SKrzysztof Kosiński    with utils.NamedTempFile(
575*7249d1a6SKrzysztof Kosiński        suffix='.py', dirname=self.test_tmpdir) as (out, _):
576*7249d1a6SKrzysztof Kosiński      with utils.TempFileContents(
577*7249d1a6SKrzysztof Kosiński          self.test_tmpdir, unformatted_code, suffix='.py') as filepath:
578*7249d1a6SKrzysztof Kosiński        try:
579*7249d1a6SKrzysztof Kosiński          subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out)
580*7249d1a6SKrzysztof Kosiński        except subprocess.CalledProcessError as e:
581*7249d1a6SKrzysztof Kosiński          # Indicates the text changed.
582*7249d1a6SKrzysztof Kosiński          self.assertEqual(e.returncode, 1)  # pylint: disable=g-assert-in-except # noqa
583*7249d1a6SKrzysztof Kosiński
584*7249d1a6SKrzysztof Kosiński  def testReformattingSpecificLines(self):
585*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
586*7249d1a6SKrzysztof Kosiński        def h():
587*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
588*7249d1a6SKrzysztof Kosiński                pass
589*7249d1a6SKrzysztof Kosiński
590*7249d1a6SKrzysztof Kosiński
591*7249d1a6SKrzysztof Kosiński        def g():
592*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
593*7249d1a6SKrzysztof Kosiński                pass
594*7249d1a6SKrzysztof Kosiński        """)  # noqa
595*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
596*7249d1a6SKrzysztof Kosiński        def h():
597*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
598*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
599*7249d1a6SKrzysztof Kosiński                pass
600*7249d1a6SKrzysztof Kosiński
601*7249d1a6SKrzysztof Kosiński
602*7249d1a6SKrzysztof Kosiński        def g():
603*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
604*7249d1a6SKrzysztof Kosiński                pass
605*7249d1a6SKrzysztof Kosiński        """)  # noqa
606*7249d1a6SKrzysztof Kosiński    # TODO(ambv): the `expected_formatted_code` here is not PEP8 compliant,
607*7249d1a6SKrzysztof Kosiński    # raising "E129 visually indented line with same indent as next logical
608*7249d1a6SKrzysztof Kosiński    # line" with flake8.
609*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
610*7249d1a6SKrzysztof Kosiński        unformatted_code,
611*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
612*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-2'])
613*7249d1a6SKrzysztof Kosiński
614*7249d1a6SKrzysztof Kosiński  def testOmitFormattingLinesBeforeDisabledFunctionComment(self):
615*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
616*7249d1a6SKrzysztof Kosiński        import sys
617*7249d1a6SKrzysztof Kosiński
618*7249d1a6SKrzysztof Kosiński        # Comment
619*7249d1a6SKrzysztof Kosiński        def some_func(x):
620*7249d1a6SKrzysztof Kosiński            x = ["badly" , "formatted","line" ]
621*7249d1a6SKrzysztof Kosiński        """)
622*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
623*7249d1a6SKrzysztof Kosiński        import sys
624*7249d1a6SKrzysztof Kosiński
625*7249d1a6SKrzysztof Kosiński        # Comment
626*7249d1a6SKrzysztof Kosiński        def some_func(x):
627*7249d1a6SKrzysztof Kosiński            x = ["badly", "formatted", "line"]
628*7249d1a6SKrzysztof Kosiński        """)
629*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
630*7249d1a6SKrzysztof Kosiński        unformatted_code,
631*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
632*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '5-5'])
633*7249d1a6SKrzysztof Kosiński
634*7249d1a6SKrzysztof Kosiński  def testReformattingSkippingLines(self):
635*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
636*7249d1a6SKrzysztof Kosiński        def h():
637*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
638*7249d1a6SKrzysztof Kosiński                pass
639*7249d1a6SKrzysztof Kosiński
640*7249d1a6SKrzysztof Kosiński        # yapf: disable
641*7249d1a6SKrzysztof Kosiński        def g():
642*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
643*7249d1a6SKrzysztof Kosiński                pass
644*7249d1a6SKrzysztof Kosiński        # yapf: enable
645*7249d1a6SKrzysztof Kosiński        """)  # noqa
646*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
647*7249d1a6SKrzysztof Kosiński        def h():
648*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
649*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
650*7249d1a6SKrzysztof Kosiński                pass
651*7249d1a6SKrzysztof Kosiński
652*7249d1a6SKrzysztof Kosiński
653*7249d1a6SKrzysztof Kosiński        # yapf: disable
654*7249d1a6SKrzysztof Kosiński        def g():
655*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
656*7249d1a6SKrzysztof Kosiński                pass
657*7249d1a6SKrzysztof Kosiński        # yapf: enable
658*7249d1a6SKrzysztof Kosiński        """)  # noqa
659*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
660*7249d1a6SKrzysztof Kosiński
661*7249d1a6SKrzysztof Kosiński  def testReformattingSkippingToEndOfFile(self):
662*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
663*7249d1a6SKrzysztof Kosiński        def h():
664*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
665*7249d1a6SKrzysztof Kosiński                pass
666*7249d1a6SKrzysztof Kosiński
667*7249d1a6SKrzysztof Kosiński        # yapf: disable
668*7249d1a6SKrzysztof Kosiński        def g():
669*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
670*7249d1a6SKrzysztof Kosiński                pass
671*7249d1a6SKrzysztof Kosiński
672*7249d1a6SKrzysztof Kosiński        def f():
673*7249d1a6SKrzysztof Kosiński            def e():
674*7249d1a6SKrzysztof Kosiński                while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and
675*7249d1a6SKrzysztof Kosiński                       xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) ==
676*7249d1a6SKrzysztof Kosiński                       'bbbbbbb'):
677*7249d1a6SKrzysztof Kosiński                    pass
678*7249d1a6SKrzysztof Kosiński        """)  # noqa
679*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
680*7249d1a6SKrzysztof Kosiński        def h():
681*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
682*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
683*7249d1a6SKrzysztof Kosiński                pass
684*7249d1a6SKrzysztof Kosiński
685*7249d1a6SKrzysztof Kosiński
686*7249d1a6SKrzysztof Kosiński        # yapf: disable
687*7249d1a6SKrzysztof Kosiński        def g():
688*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
689*7249d1a6SKrzysztof Kosiński                pass
690*7249d1a6SKrzysztof Kosiński
691*7249d1a6SKrzysztof Kosiński        def f():
692*7249d1a6SKrzysztof Kosiński            def e():
693*7249d1a6SKrzysztof Kosiński                while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and
694*7249d1a6SKrzysztof Kosiński                       xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) ==
695*7249d1a6SKrzysztof Kosiński                       'bbbbbbb'):
696*7249d1a6SKrzysztof Kosiński                    pass
697*7249d1a6SKrzysztof Kosiński        """)  # noqa
698*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
699*7249d1a6SKrzysztof Kosiński
700*7249d1a6SKrzysztof Kosiński  def testReformattingSkippingSingleLine(self):
701*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
702*7249d1a6SKrzysztof Kosiński        def h():
703*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
704*7249d1a6SKrzysztof Kosiński                pass
705*7249d1a6SKrzysztof Kosiński
706*7249d1a6SKrzysztof Kosiński        def g():
707*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):  # yapf: disable
708*7249d1a6SKrzysztof Kosiński                pass
709*7249d1a6SKrzysztof Kosiński        """)  # noqa
710*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
711*7249d1a6SKrzysztof Kosiński        def h():
712*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
713*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
714*7249d1a6SKrzysztof Kosiński                pass
715*7249d1a6SKrzysztof Kosiński
716*7249d1a6SKrzysztof Kosiński
717*7249d1a6SKrzysztof Kosiński        def g():
718*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):  # yapf: disable
719*7249d1a6SKrzysztof Kosiński                pass
720*7249d1a6SKrzysztof Kosiński        """)  # noqa
721*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
722*7249d1a6SKrzysztof Kosiński
723*7249d1a6SKrzysztof Kosiński  def testDisableWholeDataStructure(self):
724*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
725*7249d1a6SKrzysztof Kosiński        A = set([
726*7249d1a6SKrzysztof Kosiński            'hello',
727*7249d1a6SKrzysztof Kosiński            'world',
728*7249d1a6SKrzysztof Kosiński        ])  # yapf: disable
729*7249d1a6SKrzysztof Kosiński        """)
730*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
731*7249d1a6SKrzysztof Kosiński        A = set([
732*7249d1a6SKrzysztof Kosiński            'hello',
733*7249d1a6SKrzysztof Kosiński            'world',
734*7249d1a6SKrzysztof Kosiński        ])  # yapf: disable
735*7249d1a6SKrzysztof Kosiński        """)
736*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
737*7249d1a6SKrzysztof Kosiński
738*7249d1a6SKrzysztof Kosiński  def testDisableButAdjustIndentations(self):
739*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
740*7249d1a6SKrzysztof Kosiński        class SplitPenaltyTest(unittest.TestCase):
741*7249d1a6SKrzysztof Kosiński
742*7249d1a6SKrzysztof Kosiński          def testUnbreakable(self):
743*7249d1a6SKrzysztof Kosiński            self._CheckPenalties(tree, [
744*7249d1a6SKrzysztof Kosiński            ])  # yapf: disable
745*7249d1a6SKrzysztof Kosiński        """)
746*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
747*7249d1a6SKrzysztof Kosiński        class SplitPenaltyTest(unittest.TestCase):
748*7249d1a6SKrzysztof Kosiński
749*7249d1a6SKrzysztof Kosiński            def testUnbreakable(self):
750*7249d1a6SKrzysztof Kosiński                self._CheckPenalties(tree, [
751*7249d1a6SKrzysztof Kosiński                ])  # yapf: disable
752*7249d1a6SKrzysztof Kosiński        """)
753*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
754*7249d1a6SKrzysztof Kosiński
755*7249d1a6SKrzysztof Kosiński  def testRetainingHorizontalWhitespace(self):
756*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
757*7249d1a6SKrzysztof Kosiński        def h():
758*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
759*7249d1a6SKrzysztof Kosiński                pass
760*7249d1a6SKrzysztof Kosiński
761*7249d1a6SKrzysztof Kosiński        def g():
762*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy        (zzzzzzzzzzzzz  [0]) ==     'aaaaaaaaaaa' and    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):  # yapf: disable
763*7249d1a6SKrzysztof Kosiński                pass
764*7249d1a6SKrzysztof Kosiński        """)  # noqa
765*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
766*7249d1a6SKrzysztof Kosiński        def h():
767*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
768*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
769*7249d1a6SKrzysztof Kosiński                pass
770*7249d1a6SKrzysztof Kosiński
771*7249d1a6SKrzysztof Kosiński
772*7249d1a6SKrzysztof Kosiński        def g():
773*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy        (zzzzzzzzzzzzz  [0]) ==     'aaaaaaaaaaa' and    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):  # yapf: disable
774*7249d1a6SKrzysztof Kosiński                pass
775*7249d1a6SKrzysztof Kosiński        """)  # noqa
776*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(unformatted_code, expected_formatted_code)
777*7249d1a6SKrzysztof Kosiński
778*7249d1a6SKrzysztof Kosiński  def testRetainingVerticalWhitespace(self):
779*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
780*7249d1a6SKrzysztof Kosiński        def h():
781*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
782*7249d1a6SKrzysztof Kosiński                pass
783*7249d1a6SKrzysztof Kosiński
784*7249d1a6SKrzysztof Kosiński        def g():
785*7249d1a6SKrzysztof Kosiński
786*7249d1a6SKrzysztof Kosiński
787*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
788*7249d1a6SKrzysztof Kosiński
789*7249d1a6SKrzysztof Kosiński                pass
790*7249d1a6SKrzysztof Kosiński        """)  # noqa
791*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
792*7249d1a6SKrzysztof Kosiński        def h():
793*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
794*7249d1a6SKrzysztof Kosiński                    xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
795*7249d1a6SKrzysztof Kosiński                pass
796*7249d1a6SKrzysztof Kosiński
797*7249d1a6SKrzysztof Kosiński        def g():
798*7249d1a6SKrzysztof Kosiński
799*7249d1a6SKrzysztof Kosiński
800*7249d1a6SKrzysztof Kosiński            if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
801*7249d1a6SKrzysztof Kosiński
802*7249d1a6SKrzysztof Kosiński                pass
803*7249d1a6SKrzysztof Kosiński        """)  # noqa
804*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
805*7249d1a6SKrzysztof Kosiński        unformatted_code,
806*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
807*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-2'])
808*7249d1a6SKrzysztof Kosiński
809*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
810*7249d1a6SKrzysztof Kosiński
811*7249d1a6SKrzysztof Kosiński
812*7249d1a6SKrzysztof Kosiński        if a:     b
813*7249d1a6SKrzysztof Kosiński
814*7249d1a6SKrzysztof Kosiński
815*7249d1a6SKrzysztof Kosiński        if c:
816*7249d1a6SKrzysztof Kosiński            to_much      + indent
817*7249d1a6SKrzysztof Kosiński
818*7249d1a6SKrzysztof Kosiński            same
819*7249d1a6SKrzysztof Kosiński
820*7249d1a6SKrzysztof Kosiński
821*7249d1a6SKrzysztof Kosiński
822*7249d1a6SKrzysztof Kosiński        #comment
823*7249d1a6SKrzysztof Kosiński
824*7249d1a6SKrzysztof Kosiński        #   trailing whitespace
825*7249d1a6SKrzysztof Kosiński        """)
826*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
827*7249d1a6SKrzysztof Kosiński        if a: b
828*7249d1a6SKrzysztof Kosiński
829*7249d1a6SKrzysztof Kosiński
830*7249d1a6SKrzysztof Kosiński        if c:
831*7249d1a6SKrzysztof Kosiński            to_much      + indent
832*7249d1a6SKrzysztof Kosiński
833*7249d1a6SKrzysztof Kosiński            same
834*7249d1a6SKrzysztof Kosiński
835*7249d1a6SKrzysztof Kosiński
836*7249d1a6SKrzysztof Kosiński
837*7249d1a6SKrzysztof Kosiński        #comment
838*7249d1a6SKrzysztof Kosiński
839*7249d1a6SKrzysztof Kosiński        #   trailing whitespace
840*7249d1a6SKrzysztof Kosiński        """)
841*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
842*7249d1a6SKrzysztof Kosiński        unformatted_code,
843*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
844*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '3-3', '--lines', '13-13'])
845*7249d1a6SKrzysztof Kosiński
846*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
847*7249d1a6SKrzysztof Kosiński        '''
848*7249d1a6SKrzysztof Kosiński        docstring
849*7249d1a6SKrzysztof Kosiński
850*7249d1a6SKrzysztof Kosiński        '''
851*7249d1a6SKrzysztof Kosiński
852*7249d1a6SKrzysztof Kosiński        import blah
853*7249d1a6SKrzysztof Kosiński        """)
854*7249d1a6SKrzysztof Kosiński
855*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
856*7249d1a6SKrzysztof Kosiński        unformatted_code, unformatted_code, extra_options=['--lines', '2-2'])
857*7249d1a6SKrzysztof Kosiński
858*7249d1a6SKrzysztof Kosiński  def testVerticalSpacingWithCommentWithContinuationMarkers(self):
859*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
860*7249d1a6SKrzysztof Kosiński# \\
861*7249d1a6SKrzysztof Kosiński# \\
862*7249d1a6SKrzysztof Kosiński# \\
863*7249d1a6SKrzysztof Kosiński
864*7249d1a6SKrzysztof Kosińskix = {
865*7249d1a6SKrzysztof Kosiński}
866*7249d1a6SKrzysztof Kosiński"""
867*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
868*7249d1a6SKrzysztof Kosiński# \\
869*7249d1a6SKrzysztof Kosiński# \\
870*7249d1a6SKrzysztof Kosiński# \\
871*7249d1a6SKrzysztof Kosiński
872*7249d1a6SKrzysztof Kosińskix = {
873*7249d1a6SKrzysztof Kosiński}
874*7249d1a6SKrzysztof Kosiński"""
875*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
876*7249d1a6SKrzysztof Kosiński        unformatted_code,
877*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
878*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1'])
879*7249d1a6SKrzysztof Kosiński
880*7249d1a6SKrzysztof Kosiński  def testRetainingSemicolonsWhenSpecifyingLines(self):
881*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
882*7249d1a6SKrzysztof Kosiński        a = line_to_format
883*7249d1a6SKrzysztof Kosiński        def f():
884*7249d1a6SKrzysztof Kosiński            x = y + 42; z = n * 42
885*7249d1a6SKrzysztof Kosiński            if True: a += 1 ; b += 1 ; c += 1
886*7249d1a6SKrzysztof Kosiński        """)
887*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
888*7249d1a6SKrzysztof Kosiński        a = line_to_format
889*7249d1a6SKrzysztof Kosiński        def f():
890*7249d1a6SKrzysztof Kosiński            x = y + 42; z = n * 42
891*7249d1a6SKrzysztof Kosiński            if True: a += 1 ; b += 1 ; c += 1
892*7249d1a6SKrzysztof Kosiński        """)
893*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
894*7249d1a6SKrzysztof Kosiński        unformatted_code,
895*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
896*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1'])
897*7249d1a6SKrzysztof Kosiński
898*7249d1a6SKrzysztof Kosiński  def testDisabledMultilineStrings(self):
899*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
900*7249d1a6SKrzysztof Kosiński        foo=42
901*7249d1a6SKrzysztof Kosiński        def f():
902*7249d1a6SKrzysztof Kosiński            email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br>
903*7249d1a6SKrzysztof Kosiński        <b>Czar: </b>"""+despot["Nicholas"]+"""<br>
904*7249d1a6SKrzysztof Kosiński        <b>Minion: </b>"""+serf["Dmitri"]+"""<br>
905*7249d1a6SKrzysztof Kosiński        <b>Residence: </b>"""+palace["Winter"]+"""<br>
906*7249d1a6SKrzysztof Kosiński        </body>
907*7249d1a6SKrzysztof Kosiński        </html>"""
908*7249d1a6SKrzysztof Kosiński        ''')  # noqa
909*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
910*7249d1a6SKrzysztof Kosiński        foo = 42
911*7249d1a6SKrzysztof Kosiński        def f():
912*7249d1a6SKrzysztof Kosiński            email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br>
913*7249d1a6SKrzysztof Kosiński        <b>Czar: </b>"""+despot["Nicholas"]+"""<br>
914*7249d1a6SKrzysztof Kosiński        <b>Minion: </b>"""+serf["Dmitri"]+"""<br>
915*7249d1a6SKrzysztof Kosiński        <b>Residence: </b>"""+palace["Winter"]+"""<br>
916*7249d1a6SKrzysztof Kosiński        </body>
917*7249d1a6SKrzysztof Kosiński        </html>"""
918*7249d1a6SKrzysztof Kosiński        ''')  # noqa
919*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
920*7249d1a6SKrzysztof Kosiński        unformatted_code,
921*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
922*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1'])
923*7249d1a6SKrzysztof Kosiński
924*7249d1a6SKrzysztof Kosiński  def testDisableWhenSpecifyingLines(self):
925*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
926*7249d1a6SKrzysztof Kosiński        # yapf: disable
927*7249d1a6SKrzysztof Kosiński        A = set([
928*7249d1a6SKrzysztof Kosiński            'hello',
929*7249d1a6SKrzysztof Kosiński            'world',
930*7249d1a6SKrzysztof Kosiński        ])
931*7249d1a6SKrzysztof Kosiński        # yapf: enable
932*7249d1a6SKrzysztof Kosiński        B = set([
933*7249d1a6SKrzysztof Kosiński            'hello',
934*7249d1a6SKrzysztof Kosiński            'world',
935*7249d1a6SKrzysztof Kosiński        ])  # yapf: disable
936*7249d1a6SKrzysztof Kosiński        """)
937*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
938*7249d1a6SKrzysztof Kosiński        # yapf: disable
939*7249d1a6SKrzysztof Kosiński        A = set([
940*7249d1a6SKrzysztof Kosiński            'hello',
941*7249d1a6SKrzysztof Kosiński            'world',
942*7249d1a6SKrzysztof Kosiński        ])
943*7249d1a6SKrzysztof Kosiński        # yapf: enable
944*7249d1a6SKrzysztof Kosiński        B = set([
945*7249d1a6SKrzysztof Kosiński            'hello',
946*7249d1a6SKrzysztof Kosiński            'world',
947*7249d1a6SKrzysztof Kosiński        ])  # yapf: disable
948*7249d1a6SKrzysztof Kosiński        """)
949*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
950*7249d1a6SKrzysztof Kosiński        unformatted_code,
951*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
952*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-10'])
953*7249d1a6SKrzysztof Kosiński
954*7249d1a6SKrzysztof Kosiński  def testDisableFormattingInDataLiteral(self):
955*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
956*7249d1a6SKrzysztof Kosiński        def horrible():
957*7249d1a6SKrzysztof Kosiński          oh_god()
958*7249d1a6SKrzysztof Kosiński          why_would_you()
959*7249d1a6SKrzysztof Kosiński          [
960*7249d1a6SKrzysztof Kosiński             'do',
961*7249d1a6SKrzysztof Kosiński
962*7249d1a6SKrzysztof Kosiński              'that',
963*7249d1a6SKrzysztof Kosiński          ]
964*7249d1a6SKrzysztof Kosiński
965*7249d1a6SKrzysztof Kosiński        def still_horrible():
966*7249d1a6SKrzysztof Kosiński            oh_god()
967*7249d1a6SKrzysztof Kosiński            why_would_you()
968*7249d1a6SKrzysztof Kosiński            [
969*7249d1a6SKrzysztof Kosiński                'do',
970*7249d1a6SKrzysztof Kosiński
971*7249d1a6SKrzysztof Kosiński                'that'
972*7249d1a6SKrzysztof Kosiński            ]
973*7249d1a6SKrzysztof Kosiński        """)
974*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
975*7249d1a6SKrzysztof Kosiński        def horrible():
976*7249d1a6SKrzysztof Kosiński            oh_god()
977*7249d1a6SKrzysztof Kosiński            why_would_you()
978*7249d1a6SKrzysztof Kosiński            [
979*7249d1a6SKrzysztof Kosiński               'do',
980*7249d1a6SKrzysztof Kosiński
981*7249d1a6SKrzysztof Kosiński                'that',
982*7249d1a6SKrzysztof Kosiński            ]
983*7249d1a6SKrzysztof Kosiński
984*7249d1a6SKrzysztof Kosiński        def still_horrible():
985*7249d1a6SKrzysztof Kosiński            oh_god()
986*7249d1a6SKrzysztof Kosiński            why_would_you()
987*7249d1a6SKrzysztof Kosiński            ['do', 'that']
988*7249d1a6SKrzysztof Kosiński        """)
989*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
990*7249d1a6SKrzysztof Kosiński        unformatted_code,
991*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
992*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '14-15'])
993*7249d1a6SKrzysztof Kosiński
994*7249d1a6SKrzysztof Kosiński  def testRetainVerticalFormattingBetweenDisabledAndEnabledLines(self):
995*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
996*7249d1a6SKrzysztof Kosiński        class A(object):
997*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
998*7249d1a6SKrzysztof Kosiński                c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10)
999*7249d1a6SKrzysztof Kosiński                self.assertEqual(
1000*7249d1a6SKrzysztof Kosiński                    ('ddddddddddddddddddddddddd',
1001*7249d1a6SKrzysztof Kosiński             'eeeeeeeeeeeeeeeeeeeeeeeee.%s' %
1002*7249d1a6SKrzysztof Kosiński                     c.ffffffffffff),
1003*7249d1a6SKrzysztof Kosiński             gggggggggggg.hhhhhhhhh(c, c.ffffffffffff))
1004*7249d1a6SKrzysztof Kosiński                iiiii = jjjjjjjjjjjjjj.iiiii
1005*7249d1a6SKrzysztof Kosiński        """)
1006*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1007*7249d1a6SKrzysztof Kosiński        class A(object):
1008*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
1009*7249d1a6SKrzysztof Kosiński                c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10)
1010*7249d1a6SKrzysztof Kosiński                self.assertEqual(('ddddddddddddddddddddddddd',
1011*7249d1a6SKrzysztof Kosiński                                  'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff),
1012*7249d1a6SKrzysztof Kosiński                                 gggggggggggg.hhhhhhhhh(c, c.ffffffffffff))
1013*7249d1a6SKrzysztof Kosiński                iiiii = jjjjjjjjjjjjjj.iiiii
1014*7249d1a6SKrzysztof Kosiński        """)  # noqa
1015*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1016*7249d1a6SKrzysztof Kosiński        unformatted_code,
1017*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1018*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '4-7'])
1019*7249d1a6SKrzysztof Kosiński
1020*7249d1a6SKrzysztof Kosiński  def testRetainVerticalFormattingBetweenDisabledLines(self):
1021*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1022*7249d1a6SKrzysztof Kosiński        class A(object):
1023*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
1024*7249d1a6SKrzysztof Kosiński                pass
1025*7249d1a6SKrzysztof Kosiński
1026*7249d1a6SKrzysztof Kosiński
1027*7249d1a6SKrzysztof Kosiński            def bbbbbbbbbbbbb(self):  # 5
1028*7249d1a6SKrzysztof Kosiński                pass
1029*7249d1a6SKrzysztof Kosiński        """)
1030*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1031*7249d1a6SKrzysztof Kosiński        class A(object):
1032*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
1033*7249d1a6SKrzysztof Kosiński                pass
1034*7249d1a6SKrzysztof Kosiński
1035*7249d1a6SKrzysztof Kosiński
1036*7249d1a6SKrzysztof Kosiński            def bbbbbbbbbbbbb(self):  # 5
1037*7249d1a6SKrzysztof Kosiński                pass
1038*7249d1a6SKrzysztof Kosiński        """)
1039*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1040*7249d1a6SKrzysztof Kosiński        unformatted_code,
1041*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1042*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '4-4'])
1043*7249d1a6SKrzysztof Kosiński
1044*7249d1a6SKrzysztof Kosiński  def testFormatLinesSpecifiedInMiddleOfExpression(self):
1045*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1046*7249d1a6SKrzysztof Kosiński        class A(object):
1047*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
1048*7249d1a6SKrzysztof Kosiński                c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10)
1049*7249d1a6SKrzysztof Kosiński                self.assertEqual(
1050*7249d1a6SKrzysztof Kosiński                    ('ddddddddddddddddddddddddd',
1051*7249d1a6SKrzysztof Kosiński             'eeeeeeeeeeeeeeeeeeeeeeeee.%s' %
1052*7249d1a6SKrzysztof Kosiński                     c.ffffffffffff),
1053*7249d1a6SKrzysztof Kosiński             gggggggggggg.hhhhhhhhh(c, c.ffffffffffff))
1054*7249d1a6SKrzysztof Kosiński                iiiii = jjjjjjjjjjjjjj.iiiii
1055*7249d1a6SKrzysztof Kosiński        """)
1056*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1057*7249d1a6SKrzysztof Kosiński        class A(object):
1058*7249d1a6SKrzysztof Kosiński            def aaaaaaaaaaaaa(self):
1059*7249d1a6SKrzysztof Kosiński                c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10)
1060*7249d1a6SKrzysztof Kosiński                self.assertEqual(('ddddddddddddddddddddddddd',
1061*7249d1a6SKrzysztof Kosiński                                  'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff),
1062*7249d1a6SKrzysztof Kosiński                                 gggggggggggg.hhhhhhhhh(c, c.ffffffffffff))
1063*7249d1a6SKrzysztof Kosiński                iiiii = jjjjjjjjjjjjjj.iiiii
1064*7249d1a6SKrzysztof Kosiński        """)  # noqa
1065*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1066*7249d1a6SKrzysztof Kosiński        unformatted_code,
1067*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1068*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '5-6'])
1069*7249d1a6SKrzysztof Kosiński
1070*7249d1a6SKrzysztof Kosiński  def testCommentFollowingMultilineString(self):
1071*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1072*7249d1a6SKrzysztof Kosiński        def foo():
1073*7249d1a6SKrzysztof Kosiński            '''First line.
1074*7249d1a6SKrzysztof Kosiński            Second line.
1075*7249d1a6SKrzysztof Kosiński            '''  # comment
1076*7249d1a6SKrzysztof Kosiński            x = '''hello world'''  # second comment
1077*7249d1a6SKrzysztof Kosiński            return 42  # another comment
1078*7249d1a6SKrzysztof Kosiński        """)
1079*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1080*7249d1a6SKrzysztof Kosiński        def foo():
1081*7249d1a6SKrzysztof Kosiński            '''First line.
1082*7249d1a6SKrzysztof Kosiński            Second line.
1083*7249d1a6SKrzysztof Kosiński            '''  # comment
1084*7249d1a6SKrzysztof Kosiński            x = '''hello world'''  # second comment
1085*7249d1a6SKrzysztof Kosiński            return 42  # another comment
1086*7249d1a6SKrzysztof Kosiński        """)
1087*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1088*7249d1a6SKrzysztof Kosiński        unformatted_code,
1089*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1090*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1'])
1091*7249d1a6SKrzysztof Kosiński
1092*7249d1a6SKrzysztof Kosiński  def testDedentClosingBracket(self):
1093*7249d1a6SKrzysztof Kosiński    # no line-break on the first argument, not dedenting closing brackets
1094*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1095*7249d1a6SKrzysztof Kosiński      def overly_long_function_name(first_argument_on_the_same_line,
1096*7249d1a6SKrzysztof Kosiński      second_argument_makes_the_line_too_long):
1097*7249d1a6SKrzysztof Kosiński        pass
1098*7249d1a6SKrzysztof Kosiński    """)
1099*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1100*7249d1a6SKrzysztof Kosiński      def overly_long_function_name(first_argument_on_the_same_line,
1101*7249d1a6SKrzysztof Kosiński                                    second_argument_makes_the_line_too_long):
1102*7249d1a6SKrzysztof Kosiński          pass
1103*7249d1a6SKrzysztof Kosiński    """)
1104*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1105*7249d1a6SKrzysztof Kosiński        unformatted_code,
1106*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1107*7249d1a6SKrzysztof Kosiński        extra_options=['--style=pep8'])
1108*7249d1a6SKrzysztof Kosiński
1109*7249d1a6SKrzysztof Kosiński    # TODO(ambv): currently the following produces the closing bracket on a new
1110*7249d1a6SKrzysztof Kosiński    # line but indented to the opening bracket which is the worst of both
1111*7249d1a6SKrzysztof Kosiński    # worlds. Expected behaviour would be to format as --style=pep8 does in
1112*7249d1a6SKrzysztof Kosiński    # this case.
1113*7249d1a6SKrzysztof Kosiński    # self.assertYapfReformats(unformatted_code, expected_formatted_code,
1114*7249d1a6SKrzysztof Kosiński    #                          extra_options=['--style=facebook'])
1115*7249d1a6SKrzysztof Kosiński
1116*7249d1a6SKrzysztof Kosiński    # line-break before the first argument, dedenting closing brackets if set
1117*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1118*7249d1a6SKrzysztof Kosiński      def overly_long_function_name(
1119*7249d1a6SKrzysztof Kosiński        first_argument_on_the_same_line,
1120*7249d1a6SKrzysztof Kosiński        second_argument_makes_the_line_too_long):
1121*7249d1a6SKrzysztof Kosiński        pass
1122*7249d1a6SKrzysztof Kosiński    """)
1123*7249d1a6SKrzysztof Kosiński    # expected_formatted_pep8_code = textwrap.dedent("""\
1124*7249d1a6SKrzysztof Kosiński    #   def overly_long_function_name(
1125*7249d1a6SKrzysztof Kosiński    #           first_argument_on_the_same_line,
1126*7249d1a6SKrzysztof Kosiński    #           second_argument_makes_the_line_too_long):
1127*7249d1a6SKrzysztof Kosiński    #       pass
1128*7249d1a6SKrzysztof Kosiński    # """)
1129*7249d1a6SKrzysztof Kosiński    expected_formatted_fb_code = textwrap.dedent("""\
1130*7249d1a6SKrzysztof Kosiński      def overly_long_function_name(
1131*7249d1a6SKrzysztof Kosiński          first_argument_on_the_same_line, second_argument_makes_the_line_too_long
1132*7249d1a6SKrzysztof Kosiński      ):
1133*7249d1a6SKrzysztof Kosiński          pass
1134*7249d1a6SKrzysztof Kosiński    """)  # noqa
1135*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1136*7249d1a6SKrzysztof Kosiński        unformatted_code,
1137*7249d1a6SKrzysztof Kosiński        expected_formatted_fb_code,
1138*7249d1a6SKrzysztof Kosiński        extra_options=['--style=facebook'])
1139*7249d1a6SKrzysztof Kosiński    # TODO(ambv): currently the following produces code that is not PEP8
1140*7249d1a6SKrzysztof Kosiński    # compliant, raising "E125 continuation line with same indent as next
1141*7249d1a6SKrzysztof Kosiński    # logical line" with flake8. Expected behaviour for PEP8 would be to use
1142*7249d1a6SKrzysztof Kosiński    # double-indentation here.
1143*7249d1a6SKrzysztof Kosiński    # self.assertYapfReformats(unformatted_code, expected_formatted_pep8_code,
1144*7249d1a6SKrzysztof Kosiński    #                          extra_options=['--style=pep8'])
1145*7249d1a6SKrzysztof Kosiński
1146*7249d1a6SKrzysztof Kosiński  def testCoalesceBrackets(self):
1147*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1148*7249d1a6SKrzysztof Kosiński       some_long_function_name_foo(
1149*7249d1a6SKrzysztof Kosiński           {
1150*7249d1a6SKrzysztof Kosiński               'first_argument_of_the_thing': id,
1151*7249d1a6SKrzysztof Kosiński               'second_argument_of_the_thing': "some thing"
1152*7249d1a6SKrzysztof Kosiński           }
1153*7249d1a6SKrzysztof Kosiński       )""")
1154*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1155*7249d1a6SKrzysztof Kosiński       some_long_function_name_foo({
1156*7249d1a6SKrzysztof Kosiński           'first_argument_of_the_thing': id,
1157*7249d1a6SKrzysztof Kosiński           'second_argument_of_the_thing': "some thing"
1158*7249d1a6SKrzysztof Kosiński       })
1159*7249d1a6SKrzysztof Kosiński       """)
1160*7249d1a6SKrzysztof Kosiński    with utils.NamedTempFile(dirname=self.test_tmpdir, mode='w') as (f, name):
1161*7249d1a6SKrzysztof Kosiński      f.write(
1162*7249d1a6SKrzysztof Kosiński          textwrap.dedent(u'''\
1163*7249d1a6SKrzysztof Kosiński          [style]
1164*7249d1a6SKrzysztof Kosiński          column_limit=82
1165*7249d1a6SKrzysztof Kosiński          coalesce_brackets = True
1166*7249d1a6SKrzysztof Kosiński          '''))
1167*7249d1a6SKrzysztof Kosiński      f.flush()
1168*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1169*7249d1a6SKrzysztof Kosiński          unformatted_code,
1170*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1171*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(name)])
1172*7249d1a6SKrzysztof Kosiński
1173*7249d1a6SKrzysztof Kosiński  def testPseudoParenSpaces(self):
1174*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1175*7249d1a6SKrzysztof Kosiński        def   foo():
1176*7249d1a6SKrzysztof Kosiński          def bar():
1177*7249d1a6SKrzysztof Kosiński            return {msg_id: author for author, msg_id in reader}
1178*7249d1a6SKrzysztof Kosiński        """)
1179*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1180*7249d1a6SKrzysztof Kosiński        def foo():
1181*7249d1a6SKrzysztof Kosiński          def bar():
1182*7249d1a6SKrzysztof Kosiński            return {msg_id: author for author, msg_id in reader}
1183*7249d1a6SKrzysztof Kosiński        """)
1184*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1185*7249d1a6SKrzysztof Kosiński        unformatted_code,
1186*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1187*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1', '--style', 'yapf'])
1188*7249d1a6SKrzysztof Kosiński
1189*7249d1a6SKrzysztof Kosiński  def testMultilineCommentFormattingDisabled(self):
1190*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1191*7249d1a6SKrzysztof Kosiński        # This is a comment
1192*7249d1a6SKrzysztof Kosiński        FOO = {
1193*7249d1a6SKrzysztof Kosiński            aaaaaaaa.ZZZ: [
1194*7249d1a6SKrzysztof Kosiński                bbbbbbbbbb.Pop(),
1195*7249d1a6SKrzysztof Kosiński                # Multiline comment.
1196*7249d1a6SKrzysztof Kosiński                # Line two.
1197*7249d1a6SKrzysztof Kosiński                bbbbbbbbbb.Pop(),
1198*7249d1a6SKrzysztof Kosiński            ],
1199*7249d1a6SKrzysztof Kosiński            'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':
1200*7249d1a6SKrzysztof Kosiński                ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz),
1201*7249d1a6SKrzysztof Kosiński            '#': lambda x: x  # do nothing
1202*7249d1a6SKrzysztof Kosiński        }
1203*7249d1a6SKrzysztof Kosiński        """)
1204*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1205*7249d1a6SKrzysztof Kosiński        # This is a comment
1206*7249d1a6SKrzysztof Kosiński        FOO = {
1207*7249d1a6SKrzysztof Kosiński            aaaaaaaa.ZZZ: [
1208*7249d1a6SKrzysztof Kosiński                bbbbbbbbbb.Pop(),
1209*7249d1a6SKrzysztof Kosiński                # Multiline comment.
1210*7249d1a6SKrzysztof Kosiński                # Line two.
1211*7249d1a6SKrzysztof Kosiński                bbbbbbbbbb.Pop(),
1212*7249d1a6SKrzysztof Kosiński            ],
1213*7249d1a6SKrzysztof Kosiński            'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':
1214*7249d1a6SKrzysztof Kosiński                ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz),
1215*7249d1a6SKrzysztof Kosiński            '#': lambda x: x  # do nothing
1216*7249d1a6SKrzysztof Kosiński        }
1217*7249d1a6SKrzysztof Kosiński        """)
1218*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1219*7249d1a6SKrzysztof Kosiński        unformatted_code,
1220*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1221*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1', '--style', 'yapf'])
1222*7249d1a6SKrzysztof Kosiński
1223*7249d1a6SKrzysztof Kosiński  def testTrailingCommentsWithDisabledFormatting(self):
1224*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1225*7249d1a6SKrzysztof Kosiński        import os
1226*7249d1a6SKrzysztof Kosiński
1227*7249d1a6SKrzysztof Kosiński        SCOPES = [
1228*7249d1a6SKrzysztof Kosiński            'hello world'  # This is a comment.
1229*7249d1a6SKrzysztof Kosiński        ]
1230*7249d1a6SKrzysztof Kosiński        """)
1231*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1232*7249d1a6SKrzysztof Kosiński        import os
1233*7249d1a6SKrzysztof Kosiński
1234*7249d1a6SKrzysztof Kosiński        SCOPES = [
1235*7249d1a6SKrzysztof Kosiński            'hello world'  # This is a comment.
1236*7249d1a6SKrzysztof Kosiński        ]
1237*7249d1a6SKrzysztof Kosiński        """)
1238*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1239*7249d1a6SKrzysztof Kosiński        unformatted_code,
1240*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1241*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-1', '--style', 'yapf'])
1242*7249d1a6SKrzysztof Kosiński
1243*7249d1a6SKrzysztof Kosiński  def testUseTabs(self):
1244*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1245*7249d1a6SKrzysztof Kosińskidef foo_function():
1246*7249d1a6SKrzysztof Kosiński if True:
1247*7249d1a6SKrzysztof Kosiński  pass
1248*7249d1a6SKrzysztof Kosiński"""
1249*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1250*7249d1a6SKrzysztof Kosińskidef foo_function():
1251*7249d1a6SKrzysztof Kosiński	if True:
1252*7249d1a6SKrzysztof Kosiński		pass
1253*7249d1a6SKrzysztof Kosiński"""  # noqa: W191,E101
1254*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1255*7249d1a6SKrzysztof Kosiński[style]
1256*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1257*7249d1a6SKrzysztof KosińskiUSE_TABS = true
1258*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=1
1259*7249d1a6SKrzysztof Kosiński"""
1260*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1261*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1262*7249d1a6SKrzysztof Kosiński          unformatted_code,
1263*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1264*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1265*7249d1a6SKrzysztof Kosiński
1266*7249d1a6SKrzysztof Kosiński  def testUseTabsWith(self):
1267*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1268*7249d1a6SKrzysztof Kosińskidef f():
1269*7249d1a6SKrzysztof Kosiński  return ['hello', 'world',]
1270*7249d1a6SKrzysztof Kosiński"""
1271*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1272*7249d1a6SKrzysztof Kosińskidef f():
1273*7249d1a6SKrzysztof Kosiński	return [
1274*7249d1a6SKrzysztof Kosiński	    'hello',
1275*7249d1a6SKrzysztof Kosiński	    'world',
1276*7249d1a6SKrzysztof Kosiński	]
1277*7249d1a6SKrzysztof Kosiński"""  # noqa: W191,E101
1278*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1279*7249d1a6SKrzysztof Kosiński[style]
1280*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1281*7249d1a6SKrzysztof KosińskiUSE_TABS = true
1282*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=1
1283*7249d1a6SKrzysztof Kosiński"""
1284*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1285*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1286*7249d1a6SKrzysztof Kosiński          unformatted_code,
1287*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1288*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1289*7249d1a6SKrzysztof Kosiński
1290*7249d1a6SKrzysztof Kosiński  def testUseTabsContinuationAlignStyleFixed(self):
1291*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1292*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3):
1293*7249d1a6SKrzysztof Kosiński  return ['hello', 'world',]
1294*7249d1a6SKrzysztof Kosiński"""
1295*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1296*7249d1a6SKrzysztof Kosińskidef foo_function(
1297*7249d1a6SKrzysztof Kosiński		arg1, arg2, arg3):
1298*7249d1a6SKrzysztof Kosiński	return [
1299*7249d1a6SKrzysztof Kosiński			'hello',
1300*7249d1a6SKrzysztof Kosiński			'world',
1301*7249d1a6SKrzysztof Kosiński	]
1302*7249d1a6SKrzysztof Kosiński"""  # noqa: W191,E101
1303*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1304*7249d1a6SKrzysztof Kosiński[style]
1305*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1306*7249d1a6SKrzysztof KosińskiUSE_TABS = true
1307*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32
1308*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4
1309*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8
1310*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = fixed
1311*7249d1a6SKrzysztof Kosiński"""
1312*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1313*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1314*7249d1a6SKrzysztof Kosiński          unformatted_code,
1315*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1316*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1317*7249d1a6SKrzysztof Kosiński
1318*7249d1a6SKrzysztof Kosiński  def testUseTabsContinuationAlignStyleVAlignRight(self):
1319*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1320*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3):
1321*7249d1a6SKrzysztof Kosiński  return ['hello', 'world',]
1322*7249d1a6SKrzysztof Kosiński"""
1323*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1324*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2,
1325*7249d1a6SKrzysztof Kosiński					arg3):
1326*7249d1a6SKrzysztof Kosiński	return [
1327*7249d1a6SKrzysztof Kosiński			'hello',
1328*7249d1a6SKrzysztof Kosiński			'world',
1329*7249d1a6SKrzysztof Kosiński	]
1330*7249d1a6SKrzysztof Kosiński"""  # noqa: W191,E101
1331*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1332*7249d1a6SKrzysztof Kosiński[style]
1333*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1334*7249d1a6SKrzysztof KosińskiUSE_TABS = true
1335*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32
1336*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4
1337*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8
1338*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = valign-right
1339*7249d1a6SKrzysztof Kosiński"""
1340*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1341*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1342*7249d1a6SKrzysztof Kosiński          unformatted_code,
1343*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1344*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1345*7249d1a6SKrzysztof Kosiński
1346*7249d1a6SKrzysztof Kosiński  def testUseSpacesContinuationAlignStyleFixed(self):
1347*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1348*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3):
1349*7249d1a6SKrzysztof Kosiński  return ['hello', 'world',]
1350*7249d1a6SKrzysztof Kosiński"""
1351*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1352*7249d1a6SKrzysztof Kosińskidef foo_function(
1353*7249d1a6SKrzysztof Kosiński        arg1, arg2, arg3):
1354*7249d1a6SKrzysztof Kosiński    return [
1355*7249d1a6SKrzysztof Kosiński            'hello',
1356*7249d1a6SKrzysztof Kosiński            'world',
1357*7249d1a6SKrzysztof Kosiński    ]
1358*7249d1a6SKrzysztof Kosiński"""
1359*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1360*7249d1a6SKrzysztof Kosiński[style]
1361*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1362*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32
1363*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4
1364*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8
1365*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = fixed
1366*7249d1a6SKrzysztof Kosiński"""
1367*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1368*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1369*7249d1a6SKrzysztof Kosiński          unformatted_code,
1370*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1371*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1372*7249d1a6SKrzysztof Kosiński
1373*7249d1a6SKrzysztof Kosiński  def testUseSpacesContinuationAlignStyleVAlignRight(self):
1374*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1375*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3):
1376*7249d1a6SKrzysztof Kosiński  return ['hello', 'world',]
1377*7249d1a6SKrzysztof Kosiński"""
1378*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1379*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2,
1380*7249d1a6SKrzysztof Kosiński                    arg3):
1381*7249d1a6SKrzysztof Kosiński    return [
1382*7249d1a6SKrzysztof Kosiński            'hello',
1383*7249d1a6SKrzysztof Kosiński            'world',
1384*7249d1a6SKrzysztof Kosiński    ]
1385*7249d1a6SKrzysztof Kosiński"""
1386*7249d1a6SKrzysztof Kosiński    style_contents = u"""\
1387*7249d1a6SKrzysztof Kosiński[style]
1388*7249d1a6SKrzysztof Kosińskibased_on_style = yapf
1389*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32
1390*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4
1391*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8
1392*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = valign-right
1393*7249d1a6SKrzysztof Kosiński"""
1394*7249d1a6SKrzysztof Kosiński    with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath:
1395*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1396*7249d1a6SKrzysztof Kosiński          unformatted_code,
1397*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1398*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1399*7249d1a6SKrzysztof Kosiński
1400*7249d1a6SKrzysztof Kosiński  def testStyleOutputRoundTrip(self):
1401*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1402*7249d1a6SKrzysztof Kosiński        def foo_function():
1403*7249d1a6SKrzysztof Kosiński          pass
1404*7249d1a6SKrzysztof Kosiński        """)
1405*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1406*7249d1a6SKrzysztof Kosiński        def foo_function():
1407*7249d1a6SKrzysztof Kosiński            pass
1408*7249d1a6SKrzysztof Kosiński        """)
1409*7249d1a6SKrzysztof Kosiński
1410*7249d1a6SKrzysztof Kosiński    with utils.NamedTempFile(dirname=self.test_tmpdir) as (stylefile,
1411*7249d1a6SKrzysztof Kosiński                                                           stylepath):
1412*7249d1a6SKrzysztof Kosiński      p = subprocess.Popen(
1413*7249d1a6SKrzysztof Kosiński          YAPF_BINARY + ['--style-help'],
1414*7249d1a6SKrzysztof Kosiński          stdout=stylefile,
1415*7249d1a6SKrzysztof Kosiński          stdin=subprocess.PIPE,
1416*7249d1a6SKrzysztof Kosiński          stderr=subprocess.PIPE)
1417*7249d1a6SKrzysztof Kosiński      _, stderrdata = p.communicate()
1418*7249d1a6SKrzysztof Kosiński      self.assertEqual(stderrdata, b'')
1419*7249d1a6SKrzysztof Kosiński      self.assertYapfReformats(
1420*7249d1a6SKrzysztof Kosiński          unformatted_code,
1421*7249d1a6SKrzysztof Kosiński          expected_formatted_code,
1422*7249d1a6SKrzysztof Kosiński          extra_options=['--style={0}'.format(stylepath)])
1423*7249d1a6SKrzysztof Kosiński
1424*7249d1a6SKrzysztof Kosiński  def testSpacingBeforeComments(self):
1425*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1426*7249d1a6SKrzysztof Kosiński        A = 42
1427*7249d1a6SKrzysztof Kosiński
1428*7249d1a6SKrzysztof Kosiński
1429*7249d1a6SKrzysztof Kosiński        # A comment
1430*7249d1a6SKrzysztof Kosiński        def x():
1431*7249d1a6SKrzysztof Kosiński            pass
1432*7249d1a6SKrzysztof Kosiński        def _():
1433*7249d1a6SKrzysztof Kosiński            pass
1434*7249d1a6SKrzysztof Kosiński        """)
1435*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1436*7249d1a6SKrzysztof Kosiński        A = 42
1437*7249d1a6SKrzysztof Kosiński
1438*7249d1a6SKrzysztof Kosiński
1439*7249d1a6SKrzysztof Kosiński        # A comment
1440*7249d1a6SKrzysztof Kosiński        def x():
1441*7249d1a6SKrzysztof Kosiński            pass
1442*7249d1a6SKrzysztof Kosiński        def _():
1443*7249d1a6SKrzysztof Kosiński            pass
1444*7249d1a6SKrzysztof Kosiński        """)
1445*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1446*7249d1a6SKrzysztof Kosiński        unformatted_code,
1447*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1448*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-2'])
1449*7249d1a6SKrzysztof Kosiński
1450*7249d1a6SKrzysztof Kosiński  def testSpacingBeforeCommentsInDicts(self):
1451*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1452*7249d1a6SKrzysztof Kosiński        A=42
1453*7249d1a6SKrzysztof Kosiński
1454*7249d1a6SKrzysztof Kosiński        X = {
1455*7249d1a6SKrzysztof Kosiński            # 'Valid' statuses.
1456*7249d1a6SKrzysztof Kosiński            PASSED:  # Passed
1457*7249d1a6SKrzysztof Kosiński                'PASSED',
1458*7249d1a6SKrzysztof Kosiński            FAILED:  # Failed
1459*7249d1a6SKrzysztof Kosiński                'FAILED',
1460*7249d1a6SKrzysztof Kosiński            TIMED_OUT:  # Timed out.
1461*7249d1a6SKrzysztof Kosiński                'FAILED',
1462*7249d1a6SKrzysztof Kosiński            BORKED:  # Broken.
1463*7249d1a6SKrzysztof Kosiński                'BROKEN'
1464*7249d1a6SKrzysztof Kosiński        }
1465*7249d1a6SKrzysztof Kosiński        """)
1466*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1467*7249d1a6SKrzysztof Kosiński        A = 42
1468*7249d1a6SKrzysztof Kosiński
1469*7249d1a6SKrzysztof Kosiński        X = {
1470*7249d1a6SKrzysztof Kosiński            # 'Valid' statuses.
1471*7249d1a6SKrzysztof Kosiński            PASSED:  # Passed
1472*7249d1a6SKrzysztof Kosiński                'PASSED',
1473*7249d1a6SKrzysztof Kosiński            FAILED:  # Failed
1474*7249d1a6SKrzysztof Kosiński                'FAILED',
1475*7249d1a6SKrzysztof Kosiński            TIMED_OUT:  # Timed out.
1476*7249d1a6SKrzysztof Kosiński                'FAILED',
1477*7249d1a6SKrzysztof Kosiński            BORKED:  # Broken.
1478*7249d1a6SKrzysztof Kosiński                'BROKEN'
1479*7249d1a6SKrzysztof Kosiński        }
1480*7249d1a6SKrzysztof Kosiński        """)
1481*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1482*7249d1a6SKrzysztof Kosiński        unformatted_code,
1483*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1484*7249d1a6SKrzysztof Kosiński        extra_options=['--style', 'yapf', '--lines', '1-1'])
1485*7249d1a6SKrzysztof Kosiński
1486*7249d1a6SKrzysztof Kosiński  def testDisableWithLinesOption(self):
1487*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1488*7249d1a6SKrzysztof Kosiński        # yapf_lines_bug.py
1489*7249d1a6SKrzysztof Kosiński        # yapf: disable
1490*7249d1a6SKrzysztof Kosiński        def outer_func():
1491*7249d1a6SKrzysztof Kosiński            def inner_func():
1492*7249d1a6SKrzysztof Kosiński                return
1493*7249d1a6SKrzysztof Kosiński            return
1494*7249d1a6SKrzysztof Kosiński        # yapf: enable
1495*7249d1a6SKrzysztof Kosiński        """)
1496*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1497*7249d1a6SKrzysztof Kosiński        # yapf_lines_bug.py
1498*7249d1a6SKrzysztof Kosiński        # yapf: disable
1499*7249d1a6SKrzysztof Kosiński        def outer_func():
1500*7249d1a6SKrzysztof Kosiński            def inner_func():
1501*7249d1a6SKrzysztof Kosiński                return
1502*7249d1a6SKrzysztof Kosiński            return
1503*7249d1a6SKrzysztof Kosiński        # yapf: enable
1504*7249d1a6SKrzysztof Kosiński        """)
1505*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1506*7249d1a6SKrzysztof Kosiński        unformatted_code,
1507*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1508*7249d1a6SKrzysztof Kosiński        extra_options=['--lines', '1-8'])
1509*7249d1a6SKrzysztof Kosiński
1510*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6')
1511*7249d1a6SKrzysztof Kosiński  def testNoSpacesAroundBinaryOperators(self):
1512*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1513*7249d1a6SKrzysztof Kosińskia = 4-b/c@d**37
1514*7249d1a6SKrzysztof Kosiński"""
1515*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1516*7249d1a6SKrzysztof Kosińskia = 4-b / c@d**37
1517*7249d1a6SKrzysztof Kosiński"""
1518*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1519*7249d1a6SKrzysztof Kosiński        unformatted_code,
1520*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1521*7249d1a6SKrzysztof Kosiński        extra_options=[
1522*7249d1a6SKrzysztof Kosiński            '--style',
1523*7249d1a6SKrzysztof Kosiński            '{based_on_style: pep8, '
1524*7249d1a6SKrzysztof Kosiński            'no_spaces_around_selected_binary_operators: "@,**,-"}',
1525*7249d1a6SKrzysztof Kosiński        ])
1526*7249d1a6SKrzysztof Kosiński
1527*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6')
1528*7249d1a6SKrzysztof Kosiński  def testCP936Encoding(self):
1529*7249d1a6SKrzysztof Kosiński    unformatted_code = 'print("中文")\n'
1530*7249d1a6SKrzysztof Kosiński    expected_formatted_code = 'print("中文")\n'
1531*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1532*7249d1a6SKrzysztof Kosiński        unformatted_code,
1533*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1534*7249d1a6SKrzysztof Kosiński        env={'PYTHONIOENCODING': 'cp936'})
1535*7249d1a6SKrzysztof Kosiński
1536*7249d1a6SKrzysztof Kosiński  def testDisableWithLineRanges(self):
1537*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
1538*7249d1a6SKrzysztof Kosiński# yapf: disable
1539*7249d1a6SKrzysztof Kosińskia = [
1540*7249d1a6SKrzysztof Kosiński    1,
1541*7249d1a6SKrzysztof Kosiński    2,
1542*7249d1a6SKrzysztof Kosiński
1543*7249d1a6SKrzysztof Kosiński    3
1544*7249d1a6SKrzysztof Kosiński]
1545*7249d1a6SKrzysztof Kosiński"""
1546*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
1547*7249d1a6SKrzysztof Kosiński# yapf: disable
1548*7249d1a6SKrzysztof Kosińskia = [
1549*7249d1a6SKrzysztof Kosiński    1,
1550*7249d1a6SKrzysztof Kosiński    2,
1551*7249d1a6SKrzysztof Kosiński
1552*7249d1a6SKrzysztof Kosiński    3
1553*7249d1a6SKrzysztof Kosiński]
1554*7249d1a6SKrzysztof Kosiński"""
1555*7249d1a6SKrzysztof Kosiński    self.assertYapfReformats(
1556*7249d1a6SKrzysztof Kosiński        unformatted_code,
1557*7249d1a6SKrzysztof Kosiński        expected_formatted_code,
1558*7249d1a6SKrzysztof Kosiński        extra_options=['--style', 'yapf', '--lines', '1-100'])
1559*7249d1a6SKrzysztof Kosiński
1560*7249d1a6SKrzysztof Kosiński
1561*7249d1a6SKrzysztof Kosińskiclass BadInputTest(unittest.TestCase):
1562*7249d1a6SKrzysztof Kosiński  """Test yapf's behaviour when passed bad input."""
1563*7249d1a6SKrzysztof Kosiński
1564*7249d1a6SKrzysztof Kosiński  def testBadSyntax(self):
1565*7249d1a6SKrzysztof Kosiński    code = '  a = 1\n'
1566*7249d1a6SKrzysztof Kosiński    self.assertRaises(errors.YapfError, yapf_api.FormatCode, code)
1567*7249d1a6SKrzysztof Kosiński
1568*7249d1a6SKrzysztof Kosiński  def testBadCode(self):
1569*7249d1a6SKrzysztof Kosiński    code = 'x = """hello\n'
1570*7249d1a6SKrzysztof Kosiński    self.assertRaises(errors.YapfError, yapf_api.FormatCode, code)
1571*7249d1a6SKrzysztof Kosiński
1572*7249d1a6SKrzysztof Kosiński
1573*7249d1a6SKrzysztof Kosińskiclass DiffIndentTest(unittest.TestCase):
1574*7249d1a6SKrzysztof Kosiński
1575*7249d1a6SKrzysztof Kosiński  @staticmethod
1576*7249d1a6SKrzysztof Kosiński  def _OwnStyle():
1577*7249d1a6SKrzysztof Kosiński    my_style = style.CreatePEP8Style()
1578*7249d1a6SKrzysztof Kosiński    my_style['INDENT_WIDTH'] = 3
1579*7249d1a6SKrzysztof Kosiński    my_style['CONTINUATION_INDENT_WIDTH'] = 3
1580*7249d1a6SKrzysztof Kosiński    return my_style
1581*7249d1a6SKrzysztof Kosiński
1582*7249d1a6SKrzysztof Kosiński  def _Check(self, unformatted_code, expected_formatted_code):
1583*7249d1a6SKrzysztof Kosiński    formatted_code, _ = yapf_api.FormatCode(
1584*7249d1a6SKrzysztof Kosiński        unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle()))
1585*7249d1a6SKrzysztof Kosiński    self.assertEqual(expected_formatted_code, formatted_code)
1586*7249d1a6SKrzysztof Kosiński
1587*7249d1a6SKrzysztof Kosiński  def testSimple(self):
1588*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1589*7249d1a6SKrzysztof Kosiński        for i in range(5):
1590*7249d1a6SKrzysztof Kosiński         print('bar')
1591*7249d1a6SKrzysztof Kosiński         """)
1592*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1593*7249d1a6SKrzysztof Kosiński        for i in range(5):
1594*7249d1a6SKrzysztof Kosiński           print('bar')
1595*7249d1a6SKrzysztof Kosiński           """)
1596*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1597*7249d1a6SKrzysztof Kosiński
1598*7249d1a6SKrzysztof Kosiński
1599*7249d1a6SKrzysztof Kosińskiclass HorizontallyAlignedTrailingCommentsTest(yapf_test_helper.YAPFTest):
1600*7249d1a6SKrzysztof Kosiński
1601*7249d1a6SKrzysztof Kosiński  @staticmethod
1602*7249d1a6SKrzysztof Kosiński  def _OwnStyle():
1603*7249d1a6SKrzysztof Kosiński    my_style = style.CreatePEP8Style()
1604*7249d1a6SKrzysztof Kosiński    my_style['SPACES_BEFORE_COMMENT'] = [
1605*7249d1a6SKrzysztof Kosiński        15,
1606*7249d1a6SKrzysztof Kosiński        25,
1607*7249d1a6SKrzysztof Kosiński        35,
1608*7249d1a6SKrzysztof Kosiński    ]
1609*7249d1a6SKrzysztof Kosiński    return my_style
1610*7249d1a6SKrzysztof Kosiński
1611*7249d1a6SKrzysztof Kosiński  def _Check(self, unformatted_code, expected_formatted_code):
1612*7249d1a6SKrzysztof Kosiński    formatted_code, _ = yapf_api.FormatCode(
1613*7249d1a6SKrzysztof Kosiński        unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle()))
1614*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, formatted_code)
1615*7249d1a6SKrzysztof Kosiński
1616*7249d1a6SKrzysztof Kosiński  def testSimple(self):
1617*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1618*7249d1a6SKrzysztof Kosiński        foo = '1' # Aligned at first list value
1619*7249d1a6SKrzysztof Kosiński
1620*7249d1a6SKrzysztof Kosiński        foo = '2__<15>' # Aligned at second list value
1621*7249d1a6SKrzysztof Kosiński
1622*7249d1a6SKrzysztof Kosiński        foo = '3____________<25>' # Aligned at third list value
1623*7249d1a6SKrzysztof Kosiński
1624*7249d1a6SKrzysztof Kosiński        foo = '4______________________<35>' # Aligned beyond list values
1625*7249d1a6SKrzysztof Kosiński        """)
1626*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1627*7249d1a6SKrzysztof Kosiński        foo = '1'     # Aligned at first list value
1628*7249d1a6SKrzysztof Kosiński
1629*7249d1a6SKrzysztof Kosiński        foo = '2__<15>'         # Aligned at second list value
1630*7249d1a6SKrzysztof Kosiński
1631*7249d1a6SKrzysztof Kosiński        foo = '3____________<25>'         # Aligned at third list value
1632*7249d1a6SKrzysztof Kosiński
1633*7249d1a6SKrzysztof Kosiński        foo = '4______________________<35>' # Aligned beyond list values
1634*7249d1a6SKrzysztof Kosiński        """)
1635*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1636*7249d1a6SKrzysztof Kosiński
1637*7249d1a6SKrzysztof Kosiński  def testBlock(self):
1638*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1639*7249d1a6SKrzysztof Kosiński        func(1)     # Line 1
1640*7249d1a6SKrzysztof Kosiński        func(2) # Line 2
1641*7249d1a6SKrzysztof Kosiński        # Line 3
1642*7249d1a6SKrzysztof Kosiński        func(3)                             # Line 4
1643*7249d1a6SKrzysztof Kosiński                                            # Line 5
1644*7249d1a6SKrzysztof Kosiński                                            # Line 6
1645*7249d1a6SKrzysztof Kosiński        """)
1646*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1647*7249d1a6SKrzysztof Kosiński        func(1)       # Line 1
1648*7249d1a6SKrzysztof Kosiński        func(2)       # Line 2
1649*7249d1a6SKrzysztof Kosiński                      # Line 3
1650*7249d1a6SKrzysztof Kosiński        func(3)       # Line 4
1651*7249d1a6SKrzysztof Kosiński                      # Line 5
1652*7249d1a6SKrzysztof Kosiński                      # Line 6
1653*7249d1a6SKrzysztof Kosiński        """)
1654*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1655*7249d1a6SKrzysztof Kosiński
1656*7249d1a6SKrzysztof Kosiński  def testBlockWithLongLine(self):
1657*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1658*7249d1a6SKrzysztof Kosiński        func(1)     # Line 1
1659*7249d1a6SKrzysztof Kosiński        func___________________(2) # Line 2
1660*7249d1a6SKrzysztof Kosiński        # Line 3
1661*7249d1a6SKrzysztof Kosiński        func(3)                             # Line 4
1662*7249d1a6SKrzysztof Kosiński                                            # Line 5
1663*7249d1a6SKrzysztof Kosiński                                            # Line 6
1664*7249d1a6SKrzysztof Kosiński        """)
1665*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1666*7249d1a6SKrzysztof Kosiński        func(1)                           # Line 1
1667*7249d1a6SKrzysztof Kosiński        func___________________(2)        # Line 2
1668*7249d1a6SKrzysztof Kosiński                                          # Line 3
1669*7249d1a6SKrzysztof Kosiński        func(3)                           # Line 4
1670*7249d1a6SKrzysztof Kosiński                                          # Line 5
1671*7249d1a6SKrzysztof Kosiński                                          # Line 6
1672*7249d1a6SKrzysztof Kosiński        """)
1673*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1674*7249d1a6SKrzysztof Kosiński
1675*7249d1a6SKrzysztof Kosiński  def testBlockFuncSuffix(self):
1676*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1677*7249d1a6SKrzysztof Kosiński        func(1)     # Line 1
1678*7249d1a6SKrzysztof Kosiński        func(2) # Line 2
1679*7249d1a6SKrzysztof Kosiński        # Line 3
1680*7249d1a6SKrzysztof Kosiński        func(3)                             # Line 4
1681*7249d1a6SKrzysztof Kosiński                                        # Line 5
1682*7249d1a6SKrzysztof Kosiński                                    # Line 6
1683*7249d1a6SKrzysztof Kosiński
1684*7249d1a6SKrzysztof Kosiński        def Func():
1685*7249d1a6SKrzysztof Kosiński            pass
1686*7249d1a6SKrzysztof Kosiński        """)
1687*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1688*7249d1a6SKrzysztof Kosiński        func(1)       # Line 1
1689*7249d1a6SKrzysztof Kosiński        func(2)       # Line 2
1690*7249d1a6SKrzysztof Kosiński                      # Line 3
1691*7249d1a6SKrzysztof Kosiński        func(3)       # Line 4
1692*7249d1a6SKrzysztof Kosiński                      # Line 5
1693*7249d1a6SKrzysztof Kosiński                      # Line 6
1694*7249d1a6SKrzysztof Kosiński
1695*7249d1a6SKrzysztof Kosiński
1696*7249d1a6SKrzysztof Kosiński        def Func():
1697*7249d1a6SKrzysztof Kosiński            pass
1698*7249d1a6SKrzysztof Kosiński        """)
1699*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1700*7249d1a6SKrzysztof Kosiński
1701*7249d1a6SKrzysztof Kosiński  def testBlockCommentSuffix(self):
1702*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1703*7249d1a6SKrzysztof Kosiński        func(1)     # Line 1
1704*7249d1a6SKrzysztof Kosiński        func(2) # Line 2
1705*7249d1a6SKrzysztof Kosiński        # Line 3
1706*7249d1a6SKrzysztof Kosiński        func(3)                             # Line 4
1707*7249d1a6SKrzysztof Kosiński                                        # Line 5 - SpliceComments makes this part of the previous block
1708*7249d1a6SKrzysztof Kosiński                                    # Line 6
1709*7249d1a6SKrzysztof Kosiński
1710*7249d1a6SKrzysztof Kosiński                                            # Aligned with prev comment block
1711*7249d1a6SKrzysztof Kosiński        """)  # noqa
1712*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1713*7249d1a6SKrzysztof Kosiński        func(1)       # Line 1
1714*7249d1a6SKrzysztof Kosiński        func(2)       # Line 2
1715*7249d1a6SKrzysztof Kosiński                      # Line 3
1716*7249d1a6SKrzysztof Kosiński        func(3)       # Line 4
1717*7249d1a6SKrzysztof Kosiński                      # Line 5 - SpliceComments makes this part of the previous block
1718*7249d1a6SKrzysztof Kosiński                      # Line 6
1719*7249d1a6SKrzysztof Kosiński
1720*7249d1a6SKrzysztof Kosiński                      # Aligned with prev comment block
1721*7249d1a6SKrzysztof Kosiński        """)  # noqa
1722*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1723*7249d1a6SKrzysztof Kosiński
1724*7249d1a6SKrzysztof Kosiński  def testBlockIndentedFuncSuffix(self):
1725*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1726*7249d1a6SKrzysztof Kosiński        if True:
1727*7249d1a6SKrzysztof Kosiński            func(1)     # Line 1
1728*7249d1a6SKrzysztof Kosiński            func(2) # Line 2
1729*7249d1a6SKrzysztof Kosiński            # Line 3
1730*7249d1a6SKrzysztof Kosiński            func(3)                             # Line 4
1731*7249d1a6SKrzysztof Kosiński                                                # Line 5 - SpliceComments makes this a new block
1732*7249d1a6SKrzysztof Kosiński                                                # Line 6
1733*7249d1a6SKrzysztof Kosiński
1734*7249d1a6SKrzysztof Kosiński                                                # Aligned with Func
1735*7249d1a6SKrzysztof Kosiński
1736*7249d1a6SKrzysztof Kosiński            def Func():
1737*7249d1a6SKrzysztof Kosiński                pass
1738*7249d1a6SKrzysztof Kosiński        """)  # noqa
1739*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1740*7249d1a6SKrzysztof Kosiński        if True:
1741*7249d1a6SKrzysztof Kosiński            func(1)   # Line 1
1742*7249d1a6SKrzysztof Kosiński            func(2)   # Line 2
1743*7249d1a6SKrzysztof Kosiński                      # Line 3
1744*7249d1a6SKrzysztof Kosiński            func(3)   # Line 4
1745*7249d1a6SKrzysztof Kosiński
1746*7249d1a6SKrzysztof Kosiński            # Line 5 - SpliceComments makes this a new block
1747*7249d1a6SKrzysztof Kosiński            # Line 6
1748*7249d1a6SKrzysztof Kosiński
1749*7249d1a6SKrzysztof Kosiński            # Aligned with Func
1750*7249d1a6SKrzysztof Kosiński
1751*7249d1a6SKrzysztof Kosiński
1752*7249d1a6SKrzysztof Kosiński            def Func():
1753*7249d1a6SKrzysztof Kosiński                pass
1754*7249d1a6SKrzysztof Kosiński        """)
1755*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1756*7249d1a6SKrzysztof Kosiński
1757*7249d1a6SKrzysztof Kosiński  def testBlockIndentedCommentSuffix(self):
1758*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1759*7249d1a6SKrzysztof Kosiński        if True:
1760*7249d1a6SKrzysztof Kosiński            func(1)     # Line 1
1761*7249d1a6SKrzysztof Kosiński            func(2) # Line 2
1762*7249d1a6SKrzysztof Kosiński            # Line 3
1763*7249d1a6SKrzysztof Kosiński            func(3)                             # Line 4
1764*7249d1a6SKrzysztof Kosiński                                                # Line 5
1765*7249d1a6SKrzysztof Kosiński                                                # Line 6
1766*7249d1a6SKrzysztof Kosiński
1767*7249d1a6SKrzysztof Kosiński                                                # Not aligned
1768*7249d1a6SKrzysztof Kosiński        """)
1769*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1770*7249d1a6SKrzysztof Kosiński        if True:
1771*7249d1a6SKrzysztof Kosiński            func(1)   # Line 1
1772*7249d1a6SKrzysztof Kosiński            func(2)   # Line 2
1773*7249d1a6SKrzysztof Kosiński                      # Line 3
1774*7249d1a6SKrzysztof Kosiński            func(3)   # Line 4
1775*7249d1a6SKrzysztof Kosiński                      # Line 5
1776*7249d1a6SKrzysztof Kosiński                      # Line 6
1777*7249d1a6SKrzysztof Kosiński
1778*7249d1a6SKrzysztof Kosiński            # Not aligned
1779*7249d1a6SKrzysztof Kosiński        """)
1780*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1781*7249d1a6SKrzysztof Kosiński
1782*7249d1a6SKrzysztof Kosiński  def testBlockMultiIndented(self):
1783*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1784*7249d1a6SKrzysztof Kosiński        if True:
1785*7249d1a6SKrzysztof Kosiński            if True:
1786*7249d1a6SKrzysztof Kosiński                if True:
1787*7249d1a6SKrzysztof Kosiński                    func(1)     # Line 1
1788*7249d1a6SKrzysztof Kosiński                    func(2) # Line 2
1789*7249d1a6SKrzysztof Kosiński                    # Line 3
1790*7249d1a6SKrzysztof Kosiński                    func(3)                             # Line 4
1791*7249d1a6SKrzysztof Kosiński                                                        # Line 5
1792*7249d1a6SKrzysztof Kosiński                                                        # Line 6
1793*7249d1a6SKrzysztof Kosiński
1794*7249d1a6SKrzysztof Kosiński                                                        # Not aligned
1795*7249d1a6SKrzysztof Kosiński        """)  # noqa
1796*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1797*7249d1a6SKrzysztof Kosiński        if True:
1798*7249d1a6SKrzysztof Kosiński            if True:
1799*7249d1a6SKrzysztof Kosiński                if True:
1800*7249d1a6SKrzysztof Kosiński                    func(1)     # Line 1
1801*7249d1a6SKrzysztof Kosiński                    func(2)     # Line 2
1802*7249d1a6SKrzysztof Kosiński                                # Line 3
1803*7249d1a6SKrzysztof Kosiński                    func(3)     # Line 4
1804*7249d1a6SKrzysztof Kosiński                                # Line 5
1805*7249d1a6SKrzysztof Kosiński                                # Line 6
1806*7249d1a6SKrzysztof Kosiński
1807*7249d1a6SKrzysztof Kosiński                    # Not aligned
1808*7249d1a6SKrzysztof Kosiński        """)
1809*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1810*7249d1a6SKrzysztof Kosiński
1811*7249d1a6SKrzysztof Kosiński  def testArgs(self):
1812*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1813*7249d1a6SKrzysztof Kosiński        def MyFunc(
1814*7249d1a6SKrzysztof Kosiński            arg1,   # Desc 1
1815*7249d1a6SKrzysztof Kosiński            arg2,   # Desc 2
1816*7249d1a6SKrzysztof Kosiński            a_longer_var_name,  # Desc 3
1817*7249d1a6SKrzysztof Kosiński            arg4,
1818*7249d1a6SKrzysztof Kosiński            arg5,   # Desc 5
1819*7249d1a6SKrzysztof Kosiński            arg6,
1820*7249d1a6SKrzysztof Kosiński        ):
1821*7249d1a6SKrzysztof Kosiński            pass
1822*7249d1a6SKrzysztof Kosiński        """)
1823*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1824*7249d1a6SKrzysztof Kosiński        def MyFunc(
1825*7249d1a6SKrzysztof Kosiński            arg1,               # Desc 1
1826*7249d1a6SKrzysztof Kosiński            arg2,               # Desc 2
1827*7249d1a6SKrzysztof Kosiński            a_longer_var_name,  # Desc 3
1828*7249d1a6SKrzysztof Kosiński            arg4,
1829*7249d1a6SKrzysztof Kosiński            arg5,               # Desc 5
1830*7249d1a6SKrzysztof Kosiński            arg6,
1831*7249d1a6SKrzysztof Kosiński        ):
1832*7249d1a6SKrzysztof Kosiński            pass
1833*7249d1a6SKrzysztof Kosiński        """)
1834*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1835*7249d1a6SKrzysztof Kosiński
1836*7249d1a6SKrzysztof Kosiński  def testDisableBlock(self):
1837*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1838*7249d1a6SKrzysztof Kosiński        a() # comment 1
1839*7249d1a6SKrzysztof Kosiński        b() # comment 2
1840*7249d1a6SKrzysztof Kosiński
1841*7249d1a6SKrzysztof Kosiński        # yapf: disable
1842*7249d1a6SKrzysztof Kosiński        c() # comment 3
1843*7249d1a6SKrzysztof Kosiński        d()   # comment 4
1844*7249d1a6SKrzysztof Kosiński        # yapf: enable
1845*7249d1a6SKrzysztof Kosiński
1846*7249d1a6SKrzysztof Kosiński        e() # comment 5
1847*7249d1a6SKrzysztof Kosiński        f() # comment 6
1848*7249d1a6SKrzysztof Kosiński        """)
1849*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1850*7249d1a6SKrzysztof Kosiński        a()           # comment 1
1851*7249d1a6SKrzysztof Kosiński        b()           # comment 2
1852*7249d1a6SKrzysztof Kosiński
1853*7249d1a6SKrzysztof Kosiński        # yapf: disable
1854*7249d1a6SKrzysztof Kosiński        c() # comment 3
1855*7249d1a6SKrzysztof Kosiński        d()   # comment 4
1856*7249d1a6SKrzysztof Kosiński        # yapf: enable
1857*7249d1a6SKrzysztof Kosiński
1858*7249d1a6SKrzysztof Kosiński        e()           # comment 5
1859*7249d1a6SKrzysztof Kosiński        f()           # comment 6
1860*7249d1a6SKrzysztof Kosiński        """)
1861*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1862*7249d1a6SKrzysztof Kosiński
1863*7249d1a6SKrzysztof Kosiński  def testDisabledLine(self):
1864*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1865*7249d1a6SKrzysztof Kosiński        short # comment 1
1866*7249d1a6SKrzysztof Kosiński        do_not_touch1 # yapf: disable
1867*7249d1a6SKrzysztof Kosiński        do_not_touch2   # yapf: disable
1868*7249d1a6SKrzysztof Kosiński        a_longer_statement # comment 2
1869*7249d1a6SKrzysztof Kosiński        """)
1870*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1871*7249d1a6SKrzysztof Kosiński        short                   # comment 1
1872*7249d1a6SKrzysztof Kosiński        do_not_touch1 # yapf: disable
1873*7249d1a6SKrzysztof Kosiński        do_not_touch2   # yapf: disable
1874*7249d1a6SKrzysztof Kosiński        a_longer_statement      # comment 2
1875*7249d1a6SKrzysztof Kosiński        """)
1876*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1877*7249d1a6SKrzysztof Kosiński
1878*7249d1a6SKrzysztof Kosiński
1879*7249d1a6SKrzysztof Kosińskiclass _SpacesAroundDictListTupleTestImpl(unittest.TestCase):
1880*7249d1a6SKrzysztof Kosiński
1881*7249d1a6SKrzysztof Kosiński  @staticmethod
1882*7249d1a6SKrzysztof Kosiński  def _OwnStyle():
1883*7249d1a6SKrzysztof Kosiński    my_style = style.CreatePEP8Style()
1884*7249d1a6SKrzysztof Kosiński    my_style['DISABLE_ENDING_COMMA_HEURISTIC'] = True
1885*7249d1a6SKrzysztof Kosiński    my_style['SPLIT_ALL_COMMA_SEPARATED_VALUES'] = False
1886*7249d1a6SKrzysztof Kosiński    my_style['SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED'] = False
1887*7249d1a6SKrzysztof Kosiński    return my_style
1888*7249d1a6SKrzysztof Kosiński
1889*7249d1a6SKrzysztof Kosiński  def _Check(self, unformatted_code, expected_formatted_code):
1890*7249d1a6SKrzysztof Kosiński    formatted_code, _ = yapf_api.FormatCode(
1891*7249d1a6SKrzysztof Kosiński        unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle()))
1892*7249d1a6SKrzysztof Kosiński    self.assertEqual(expected_formatted_code, formatted_code)
1893*7249d1a6SKrzysztof Kosiński
1894*7249d1a6SKrzysztof Kosiński  def setUp(self):
1895*7249d1a6SKrzysztof Kosiński    self.maxDiff = None
1896*7249d1a6SKrzysztof Kosiński
1897*7249d1a6SKrzysztof Kosiński
1898*7249d1a6SKrzysztof Kosińskiclass SpacesAroundDictTest(_SpacesAroundDictListTupleTestImpl):
1899*7249d1a6SKrzysztof Kosiński
1900*7249d1a6SKrzysztof Kosiński  @classmethod
1901*7249d1a6SKrzysztof Kosiński  def _OwnStyle(cls):
1902*7249d1a6SKrzysztof Kosiński    style = super(SpacesAroundDictTest, cls)._OwnStyle()
1903*7249d1a6SKrzysztof Kosiński    style['SPACES_AROUND_DICT_DELIMITERS'] = True
1904*7249d1a6SKrzysztof Kosiński
1905*7249d1a6SKrzysztof Kosiński    return style
1906*7249d1a6SKrzysztof Kosiński
1907*7249d1a6SKrzysztof Kosiński  def testStandard(self):
1908*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1909*7249d1a6SKrzysztof Kosiński      {1 : 2}
1910*7249d1a6SKrzysztof Kosiński      {k:v for k, v in other.items()}
1911*7249d1a6SKrzysztof Kosiński      {k for k in [1, 2, 3]}
1912*7249d1a6SKrzysztof Kosiński
1913*7249d1a6SKrzysztof Kosiński      # The following statements should not change
1914*7249d1a6SKrzysztof Kosiński      {}
1915*7249d1a6SKrzysztof Kosiński      {1 : 2} # yapf: disable
1916*7249d1a6SKrzysztof Kosiński
1917*7249d1a6SKrzysztof Kosiński      # yapf: disable
1918*7249d1a6SKrzysztof Kosiński      {1 : 2}
1919*7249d1a6SKrzysztof Kosiński      # yapf: enable
1920*7249d1a6SKrzysztof Kosiński
1921*7249d1a6SKrzysztof Kosiński      # Dict settings should not impact lists or tuples
1922*7249d1a6SKrzysztof Kosiński      [1, 2]
1923*7249d1a6SKrzysztof Kosiński      (3, 4)
1924*7249d1a6SKrzysztof Kosiński      """)
1925*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1926*7249d1a6SKrzysztof Kosiński      { 1: 2 }
1927*7249d1a6SKrzysztof Kosiński      { k: v for k, v in other.items() }
1928*7249d1a6SKrzysztof Kosiński      { k for k in [1, 2, 3] }
1929*7249d1a6SKrzysztof Kosiński
1930*7249d1a6SKrzysztof Kosiński      # The following statements should not change
1931*7249d1a6SKrzysztof Kosiński      {}
1932*7249d1a6SKrzysztof Kosiński      {1 : 2} # yapf: disable
1933*7249d1a6SKrzysztof Kosiński
1934*7249d1a6SKrzysztof Kosiński      # yapf: disable
1935*7249d1a6SKrzysztof Kosiński      {1 : 2}
1936*7249d1a6SKrzysztof Kosiński      # yapf: enable
1937*7249d1a6SKrzysztof Kosiński
1938*7249d1a6SKrzysztof Kosiński      # Dict settings should not impact lists or tuples
1939*7249d1a6SKrzysztof Kosiński      [1, 2]
1940*7249d1a6SKrzysztof Kosiński      (3, 4)
1941*7249d1a6SKrzysztof Kosiński      """)
1942*7249d1a6SKrzysztof Kosiński
1943*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
1944*7249d1a6SKrzysztof Kosiński
1945*7249d1a6SKrzysztof Kosiński
1946*7249d1a6SKrzysztof Kosińskiclass SpacesAroundListTest(_SpacesAroundDictListTupleTestImpl):
1947*7249d1a6SKrzysztof Kosiński
1948*7249d1a6SKrzysztof Kosiński  @classmethod
1949*7249d1a6SKrzysztof Kosiński  def _OwnStyle(cls):
1950*7249d1a6SKrzysztof Kosiński    style = super(SpacesAroundListTest, cls)._OwnStyle()
1951*7249d1a6SKrzysztof Kosiński    style['SPACES_AROUND_LIST_DELIMITERS'] = True
1952*7249d1a6SKrzysztof Kosiński
1953*7249d1a6SKrzysztof Kosiński    return style
1954*7249d1a6SKrzysztof Kosiński
1955*7249d1a6SKrzysztof Kosiński  def testStandard(self):
1956*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1957*7249d1a6SKrzysztof Kosiński      [a,b,c]
1958*7249d1a6SKrzysztof Kosiński      [4,5,]
1959*7249d1a6SKrzysztof Kosiński      [6, [7, 8], 9]
1960*7249d1a6SKrzysztof Kosiński      [v for v in [1,2,3] if v & 1]
1961*7249d1a6SKrzysztof Kosiński
1962*7249d1a6SKrzysztof Kosiński      # The following statements should not change
1963*7249d1a6SKrzysztof Kosiński      index[0]
1964*7249d1a6SKrzysztof Kosiński      index[a, b]
1965*7249d1a6SKrzysztof Kosiński      []
1966*7249d1a6SKrzysztof Kosiński      [v for v in [1,2,3] if v & 1] # yapf: disable
1967*7249d1a6SKrzysztof Kosiński
1968*7249d1a6SKrzysztof Kosiński      # yapf: disable
1969*7249d1a6SKrzysztof Kosiński      [a,b,c]
1970*7249d1a6SKrzysztof Kosiński      [4,5,]
1971*7249d1a6SKrzysztof Kosiński      # yapf: enable
1972*7249d1a6SKrzysztof Kosiński
1973*7249d1a6SKrzysztof Kosiński      # List settings should not impact dicts or tuples
1974*7249d1a6SKrzysztof Kosiński      {a: b}
1975*7249d1a6SKrzysztof Kosiński      (1, 2)
1976*7249d1a6SKrzysztof Kosiński      """)
1977*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1978*7249d1a6SKrzysztof Kosiński      [ a, b, c ]
1979*7249d1a6SKrzysztof Kosiński      [ 4, 5, ]
1980*7249d1a6SKrzysztof Kosiński      [ 6, [ 7, 8 ], 9 ]
1981*7249d1a6SKrzysztof Kosiński      [ v for v in [ 1, 2, 3 ] if v & 1 ]
1982*7249d1a6SKrzysztof Kosiński
1983*7249d1a6SKrzysztof Kosiński      # The following statements should not change
1984*7249d1a6SKrzysztof Kosiński      index[0]
1985*7249d1a6SKrzysztof Kosiński      index[a, b]
1986*7249d1a6SKrzysztof Kosiński      []
1987*7249d1a6SKrzysztof Kosiński      [v for v in [1,2,3] if v & 1] # yapf: disable
1988*7249d1a6SKrzysztof Kosiński
1989*7249d1a6SKrzysztof Kosiński      # yapf: disable
1990*7249d1a6SKrzysztof Kosiński      [a,b,c]
1991*7249d1a6SKrzysztof Kosiński      [4,5,]
1992*7249d1a6SKrzysztof Kosiński      # yapf: enable
1993*7249d1a6SKrzysztof Kosiński
1994*7249d1a6SKrzysztof Kosiński      # List settings should not impact dicts or tuples
1995*7249d1a6SKrzysztof Kosiński      {a: b}
1996*7249d1a6SKrzysztof Kosiński      (1, 2)
1997*7249d1a6SKrzysztof Kosiński      """)
1998*7249d1a6SKrzysztof Kosiński
1999*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
2000*7249d1a6SKrzysztof Kosiński
2001*7249d1a6SKrzysztof Kosiński
2002*7249d1a6SKrzysztof Kosińskiclass SpacesAroundTupleTest(_SpacesAroundDictListTupleTestImpl):
2003*7249d1a6SKrzysztof Kosiński
2004*7249d1a6SKrzysztof Kosiński  @classmethod
2005*7249d1a6SKrzysztof Kosiński  def _OwnStyle(cls):
2006*7249d1a6SKrzysztof Kosiński    style = super(SpacesAroundTupleTest, cls)._OwnStyle()
2007*7249d1a6SKrzysztof Kosiński    style['SPACES_AROUND_TUPLE_DELIMITERS'] = True
2008*7249d1a6SKrzysztof Kosiński
2009*7249d1a6SKrzysztof Kosiński    return style
2010*7249d1a6SKrzysztof Kosiński
2011*7249d1a6SKrzysztof Kosiński  def testStandard(self):
2012*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2013*7249d1a6SKrzysztof Kosiński      (0, 1)
2014*7249d1a6SKrzysztof Kosiński      (2, 3)
2015*7249d1a6SKrzysztof Kosiński      (4, 5, 6,)
2016*7249d1a6SKrzysztof Kosiński      func((7, 8), 9)
2017*7249d1a6SKrzysztof Kosiński
2018*7249d1a6SKrzysztof Kosiński      # The following statements should not change
2019*7249d1a6SKrzysztof Kosiński      func(1, 2)
2020*7249d1a6SKrzysztof Kosiński      (this_func or that_func)(3, 4)
2021*7249d1a6SKrzysztof Kosiński      if (True and False): pass
2022*7249d1a6SKrzysztof Kosiński      ()
2023*7249d1a6SKrzysztof Kosiński
2024*7249d1a6SKrzysztof Kosiński      (0, 1) # yapf: disable
2025*7249d1a6SKrzysztof Kosiński
2026*7249d1a6SKrzysztof Kosiński      # yapf: disable
2027*7249d1a6SKrzysztof Kosiński      (0, 1)
2028*7249d1a6SKrzysztof Kosiński      (2, 3)
2029*7249d1a6SKrzysztof Kosiński      # yapf: enable
2030*7249d1a6SKrzysztof Kosiński
2031*7249d1a6SKrzysztof Kosiński      # Tuple settings should not impact dicts or lists
2032*7249d1a6SKrzysztof Kosiński      {a: b}
2033*7249d1a6SKrzysztof Kosiński      [3, 4]
2034*7249d1a6SKrzysztof Kosiński      """)
2035*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2036*7249d1a6SKrzysztof Kosiński      ( 0, 1 )
2037*7249d1a6SKrzysztof Kosiński      ( 2, 3 )
2038*7249d1a6SKrzysztof Kosiński      ( 4, 5, 6, )
2039*7249d1a6SKrzysztof Kosiński      func(( 7, 8 ), 9)
2040*7249d1a6SKrzysztof Kosiński
2041*7249d1a6SKrzysztof Kosiński      # The following statements should not change
2042*7249d1a6SKrzysztof Kosiński      func(1, 2)
2043*7249d1a6SKrzysztof Kosiński      (this_func or that_func)(3, 4)
2044*7249d1a6SKrzysztof Kosiński      if (True and False): pass
2045*7249d1a6SKrzysztof Kosiński      ()
2046*7249d1a6SKrzysztof Kosiński
2047*7249d1a6SKrzysztof Kosiński      (0, 1) # yapf: disable
2048*7249d1a6SKrzysztof Kosiński
2049*7249d1a6SKrzysztof Kosiński      # yapf: disable
2050*7249d1a6SKrzysztof Kosiński      (0, 1)
2051*7249d1a6SKrzysztof Kosiński      (2, 3)
2052*7249d1a6SKrzysztof Kosiński      # yapf: enable
2053*7249d1a6SKrzysztof Kosiński
2054*7249d1a6SKrzysztof Kosiński      # Tuple settings should not impact dicts or lists
2055*7249d1a6SKrzysztof Kosiński      {a: b}
2056*7249d1a6SKrzysztof Kosiński      [3, 4]
2057*7249d1a6SKrzysztof Kosiński      """)
2058*7249d1a6SKrzysztof Kosiński
2059*7249d1a6SKrzysztof Kosiński    self._Check(unformatted_code, expected_formatted_code)
2060*7249d1a6SKrzysztof Kosiński
2061*7249d1a6SKrzysztof Kosiński
2062*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__':
2063*7249d1a6SKrzysztof Kosiński  unittest.main()
2064