xref: /aosp_15_r20/external/yapf/yapftests/reformatter_basic_test.py (revision 7249d1a64f4850ccf838e62a46276f891f72998e)
1*7249d1a6SKrzysztof Kosiński# Copyright 2016 Google Inc. All Rights Reserved.
2*7249d1a6SKrzysztof Kosiński#
3*7249d1a6SKrzysztof Kosiński# Licensed under the Apache License, Version 2.0 (the "License");
4*7249d1a6SKrzysztof Kosiński# you may not use this file except in compliance with the License.
5*7249d1a6SKrzysztof Kosiński# You may obtain a copy of the License at
6*7249d1a6SKrzysztof Kosiński#
7*7249d1a6SKrzysztof Kosiński#     http://www.apache.org/licenses/LICENSE-2.0
8*7249d1a6SKrzysztof Kosiński#
9*7249d1a6SKrzysztof Kosiński# Unless required by applicable law or agreed to in writing, software
10*7249d1a6SKrzysztof Kosiński# distributed under the License is distributed on an "AS IS" BASIS,
11*7249d1a6SKrzysztof Kosiński# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7249d1a6SKrzysztof Kosiński# See the License for the specific language governing permissions and
13*7249d1a6SKrzysztof Kosiński# limitations under the License.
14*7249d1a6SKrzysztof Kosiński"""Basic tests for yapf.reformatter."""
15*7249d1a6SKrzysztof Kosiński
16*7249d1a6SKrzysztof Kosińskiimport textwrap
17*7249d1a6SKrzysztof Kosińskiimport unittest
18*7249d1a6SKrzysztof Kosiński
19*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import py3compat
20*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import reformatter
21*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import style
22*7249d1a6SKrzysztof Kosiński
23*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper
24*7249d1a6SKrzysztof Kosiński
25*7249d1a6SKrzysztof Kosiński
26*7249d1a6SKrzysztof Kosińskiclass BasicReformatterTest(yapf_test_helper.YAPFTest):
27*7249d1a6SKrzysztof Kosiński
28*7249d1a6SKrzysztof Kosiński  @classmethod
29*7249d1a6SKrzysztof Kosiński  def setUpClass(cls):
30*7249d1a6SKrzysztof Kosiński    style.SetGlobalStyle(style.CreateYapfStyle())
31*7249d1a6SKrzysztof Kosiński
32*7249d1a6SKrzysztof Kosiński  def testSplittingAllArgs(self):
33*7249d1a6SKrzysztof Kosiński    style.SetGlobalStyle(
34*7249d1a6SKrzysztof Kosiński        style.CreateStyleFromConfig(
35*7249d1a6SKrzysztof Kosiński            '{split_all_comma_separated_values: true, column_limit: 40}'))
36*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
37*7249d1a6SKrzysztof Kosiński          responseDict = {"timestamp": timestamp, "someValue":   value, "whatever": 120}
38*7249d1a6SKrzysztof Kosiński          """)  # noqa
39*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
40*7249d1a6SKrzysztof Kosiński          responseDict = {
41*7249d1a6SKrzysztof Kosiński              "timestamp": timestamp,
42*7249d1a6SKrzysztof Kosiński              "someValue": value,
43*7249d1a6SKrzysztof Kosiński              "whatever": 120
44*7249d1a6SKrzysztof Kosiński          }
45*7249d1a6SKrzysztof Kosiński          """)
46*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
47*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
48*7249d1a6SKrzysztof Kosiński
49*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
50*7249d1a6SKrzysztof Kosiński          yes = { 'yes': 'no', 'no': 'yes', }
51*7249d1a6SKrzysztof Kosiński          """)
52*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
53*7249d1a6SKrzysztof Kosiński          yes = {
54*7249d1a6SKrzysztof Kosiński              'yes': 'no',
55*7249d1a6SKrzysztof Kosiński              'no': 'yes',
56*7249d1a6SKrzysztof Kosiński          }
57*7249d1a6SKrzysztof Kosiński          """)
58*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
59*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
60*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
61*7249d1a6SKrzysztof Kosiński          def foo(long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args):
62*7249d1a6SKrzysztof Kosiński                pass
63*7249d1a6SKrzysztof Kosiński          """)  # noqa
64*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
65*7249d1a6SKrzysztof Kosiński          def foo(long_arg,
66*7249d1a6SKrzysztof Kosiński                  really_long_arg,
67*7249d1a6SKrzysztof Kosiński                  really_really_long_arg,
68*7249d1a6SKrzysztof Kosiński                  cant_keep_all_these_args):
69*7249d1a6SKrzysztof Kosiński            pass
70*7249d1a6SKrzysztof Kosiński          """)
71*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
72*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
73*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
74*7249d1a6SKrzysztof Kosiński          foo_tuple = [long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args]
75*7249d1a6SKrzysztof Kosiński          """)  # noqa
76*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
77*7249d1a6SKrzysztof Kosiński          foo_tuple = [
78*7249d1a6SKrzysztof Kosiński              long_arg,
79*7249d1a6SKrzysztof Kosiński              really_long_arg,
80*7249d1a6SKrzysztof Kosiński              really_really_long_arg,
81*7249d1a6SKrzysztof Kosiński              cant_keep_all_these_args
82*7249d1a6SKrzysztof Kosiński          ]
83*7249d1a6SKrzysztof Kosiński          """)
84*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
85*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
86*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
87*7249d1a6SKrzysztof Kosiński          foo_tuple = [short, arg]
88*7249d1a6SKrzysztof Kosiński          """)
89*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
90*7249d1a6SKrzysztof Kosiński          foo_tuple = [short, arg]
91*7249d1a6SKrzysztof Kosiński          """)
92*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
93*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
94*7249d1a6SKrzysztof Kosiński    # There is a test for split_all_top_level_comma_separated_values, with
95*7249d1a6SKrzysztof Kosiński    # different expected value
96*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
97*7249d1a6SKrzysztof Kosiński          someLongFunction(this_is_a_very_long_parameter,
98*7249d1a6SKrzysztof Kosiński              abc=(a, this_will_just_fit_xxxxxxx))
99*7249d1a6SKrzysztof Kosiński          """)
100*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
101*7249d1a6SKrzysztof Kosiński          someLongFunction(
102*7249d1a6SKrzysztof Kosiński              this_is_a_very_long_parameter,
103*7249d1a6SKrzysztof Kosiński              abc=(a,
104*7249d1a6SKrzysztof Kosiński                   this_will_just_fit_xxxxxxx))
105*7249d1a6SKrzysztof Kosiński          """)
106*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
107*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
108*7249d1a6SKrzysztof Kosiński
109*7249d1a6SKrzysztof Kosiński  def testSplittingTopLevelAllArgs(self):
110*7249d1a6SKrzysztof Kosiński    style.SetGlobalStyle(
111*7249d1a6SKrzysztof Kosiński        style.CreateStyleFromConfig(
112*7249d1a6SKrzysztof Kosiński            '{split_all_top_level_comma_separated_values: true, '
113*7249d1a6SKrzysztof Kosiński            'column_limit: 40}'))
114*7249d1a6SKrzysztof Kosiński    # Works the same way as split_all_comma_separated_values
115*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
116*7249d1a6SKrzysztof Kosiński          responseDict = {"timestamp": timestamp, "someValue":   value, "whatever": 120}
117*7249d1a6SKrzysztof Kosiński          """)  # noqa
118*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
119*7249d1a6SKrzysztof Kosiński          responseDict = {
120*7249d1a6SKrzysztof Kosiński              "timestamp": timestamp,
121*7249d1a6SKrzysztof Kosiński              "someValue": value,
122*7249d1a6SKrzysztof Kosiński              "whatever": 120
123*7249d1a6SKrzysztof Kosiński          }
124*7249d1a6SKrzysztof Kosiński          """)
125*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
126*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
127*7249d1a6SKrzysztof Kosiński    # Works the same way as split_all_comma_separated_values
128*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
129*7249d1a6SKrzysztof Kosiński          def foo(long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args):
130*7249d1a6SKrzysztof Kosiński                pass
131*7249d1a6SKrzysztof Kosiński          """)  # noqa
132*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
133*7249d1a6SKrzysztof Kosiński          def foo(long_arg,
134*7249d1a6SKrzysztof Kosiński                  really_long_arg,
135*7249d1a6SKrzysztof Kosiński                  really_really_long_arg,
136*7249d1a6SKrzysztof Kosiński                  cant_keep_all_these_args):
137*7249d1a6SKrzysztof Kosiński            pass
138*7249d1a6SKrzysztof Kosiński          """)
139*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
140*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
141*7249d1a6SKrzysztof Kosiński    # Works the same way as split_all_comma_separated_values
142*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
143*7249d1a6SKrzysztof Kosiński          foo_tuple = [long_arg, really_long_arg, really_really_long_arg, cant_keep_all_these_args]
144*7249d1a6SKrzysztof Kosiński          """)  # noqa
145*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
146*7249d1a6SKrzysztof Kosiński          foo_tuple = [
147*7249d1a6SKrzysztof Kosiński              long_arg,
148*7249d1a6SKrzysztof Kosiński              really_long_arg,
149*7249d1a6SKrzysztof Kosiński              really_really_long_arg,
150*7249d1a6SKrzysztof Kosiński              cant_keep_all_these_args
151*7249d1a6SKrzysztof Kosiński          ]
152*7249d1a6SKrzysztof Kosiński          """)
153*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
154*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
155*7249d1a6SKrzysztof Kosiński    # Works the same way as split_all_comma_separated_values
156*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
157*7249d1a6SKrzysztof Kosiński          foo_tuple = [short, arg]
158*7249d1a6SKrzysztof Kosiński          """)
159*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
160*7249d1a6SKrzysztof Kosiński          foo_tuple = [short, arg]
161*7249d1a6SKrzysztof Kosiński          """)
162*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
163*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
164*7249d1a6SKrzysztof Kosiński    # There is a test for split_all_comma_separated_values, with different
165*7249d1a6SKrzysztof Kosiński    # expected value
166*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
167*7249d1a6SKrzysztof Kosiński          someLongFunction(this_is_a_very_long_parameter,
168*7249d1a6SKrzysztof Kosiński              abc=(a, this_will_just_fit_xxxxxxx))
169*7249d1a6SKrzysztof Kosiński          """)
170*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
171*7249d1a6SKrzysztof Kosiński          someLongFunction(
172*7249d1a6SKrzysztof Kosiński              this_is_a_very_long_parameter,
173*7249d1a6SKrzysztof Kosiński              abc=(a, this_will_just_fit_xxxxxxx))
174*7249d1a6SKrzysztof Kosiński          """)
175*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
176*7249d1a6SKrzysztof Kosiński    actual_formatted_code = reformatter.Reformat(llines)
177*7249d1a6SKrzysztof Kosiński    self.assertEqual(40, len(actual_formatted_code.splitlines()[-1]))
178*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, actual_formatted_code)
179*7249d1a6SKrzysztof Kosiński
180*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
181*7249d1a6SKrzysztof Kosiński          someLongFunction(this_is_a_very_long_parameter,
182*7249d1a6SKrzysztof Kosiński              abc=(a, this_will_not_fit_xxxxxxxxx))
183*7249d1a6SKrzysztof Kosiński          """)
184*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
185*7249d1a6SKrzysztof Kosiński          someLongFunction(
186*7249d1a6SKrzysztof Kosiński              this_is_a_very_long_parameter,
187*7249d1a6SKrzysztof Kosiński              abc=(a,
188*7249d1a6SKrzysztof Kosiński                   this_will_not_fit_xxxxxxxxx))
189*7249d1a6SKrzysztof Kosiński          """)
190*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
191*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
192*7249d1a6SKrzysztof Kosiński
193*7249d1a6SKrzysztof Kosiński    # Exercise the case where there's no opening bracket (for a, b)
194*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
195*7249d1a6SKrzysztof Kosiński          a, b = f(
196*7249d1a6SKrzysztof Kosiński              a_very_long_parameter, yet_another_one, and_another)
197*7249d1a6SKrzysztof Kosiński          """)
198*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
199*7249d1a6SKrzysztof Kosiński          a, b = f(
200*7249d1a6SKrzysztof Kosiński              a_very_long_parameter, yet_another_one, and_another)
201*7249d1a6SKrzysztof Kosiński          """)
202*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
203*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
204*7249d1a6SKrzysztof Kosiński
205*7249d1a6SKrzysztof Kosiński    # Don't require splitting before comments.
206*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
207*7249d1a6SKrzysztof Kosiński          KO = {
208*7249d1a6SKrzysztof Kosiński              'ABC': Abc, # abc
209*7249d1a6SKrzysztof Kosiński              'DEF': Def, # def
210*7249d1a6SKrzysztof Kosiński              'LOL': Lol, # wtf
211*7249d1a6SKrzysztof Kosiński              'GHI': Ghi,
212*7249d1a6SKrzysztof Kosiński              'JKL': Jkl,
213*7249d1a6SKrzysztof Kosiński          }
214*7249d1a6SKrzysztof Kosiński          """)
215*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
216*7249d1a6SKrzysztof Kosiński          KO = {
217*7249d1a6SKrzysztof Kosiński              'ABC': Abc,  # abc
218*7249d1a6SKrzysztof Kosiński              'DEF': Def,  # def
219*7249d1a6SKrzysztof Kosiński              'LOL': Lol,  # wtf
220*7249d1a6SKrzysztof Kosiński              'GHI': Ghi,
221*7249d1a6SKrzysztof Kosiński              'JKL': Jkl,
222*7249d1a6SKrzysztof Kosiński          }
223*7249d1a6SKrzysztof Kosiński          """)
224*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
225*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
226*7249d1a6SKrzysztof Kosiński
227*7249d1a6SKrzysztof Kosiński  def testSimpleFunctionsWithTrailingComments(self):
228*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
229*7249d1a6SKrzysztof Kosiński        def g():  # Trailing comment
230*7249d1a6SKrzysztof Kosiński          if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
231*7249d1a6SKrzysztof Kosiński              xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
232*7249d1a6SKrzysztof Kosiński            pass
233*7249d1a6SKrzysztof Kosiński
234*7249d1a6SKrzysztof Kosiński        def f(  # Intermediate comment
235*7249d1a6SKrzysztof Kosiński        ):
236*7249d1a6SKrzysztof Kosiński          if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
237*7249d1a6SKrzysztof Kosiński              xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
238*7249d1a6SKrzysztof Kosiński            pass
239*7249d1a6SKrzysztof Kosiński        """)
240*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
241*7249d1a6SKrzysztof Kosiński        def g():  # Trailing comment
242*7249d1a6SKrzysztof Kosiński          if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
243*7249d1a6SKrzysztof Kosiński              xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
244*7249d1a6SKrzysztof Kosiński            pass
245*7249d1a6SKrzysztof Kosiński
246*7249d1a6SKrzysztof Kosiński
247*7249d1a6SKrzysztof Kosiński        def f(  # Intermediate comment
248*7249d1a6SKrzysztof Kosiński        ):
249*7249d1a6SKrzysztof Kosiński          if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and
250*7249d1a6SKrzysztof Kosiński              xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'):
251*7249d1a6SKrzysztof Kosiński            pass
252*7249d1a6SKrzysztof Kosiński        """)
253*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
254*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
255*7249d1a6SKrzysztof Kosiński
256*7249d1a6SKrzysztof Kosiński  def testBlankLinesBetweenTopLevelImportsAndVariables(self):
257*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
258*7249d1a6SKrzysztof Kosiński        import foo as bar
259*7249d1a6SKrzysztof Kosiński        VAR = 'baz'
260*7249d1a6SKrzysztof Kosiński        """)
261*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
262*7249d1a6SKrzysztof Kosiński        import foo as bar
263*7249d1a6SKrzysztof Kosiński
264*7249d1a6SKrzysztof Kosiński        VAR = 'baz'
265*7249d1a6SKrzysztof Kosiński        """)
266*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
267*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
268*7249d1a6SKrzysztof Kosiński
269*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
270*7249d1a6SKrzysztof Kosiński        import foo as bar
271*7249d1a6SKrzysztof Kosiński
272*7249d1a6SKrzysztof Kosiński        VAR = 'baz'
273*7249d1a6SKrzysztof Kosiński        """)
274*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
275*7249d1a6SKrzysztof Kosiński        import foo as bar
276*7249d1a6SKrzysztof Kosiński
277*7249d1a6SKrzysztof Kosiński
278*7249d1a6SKrzysztof Kosiński        VAR = 'baz'
279*7249d1a6SKrzysztof Kosiński        """)
280*7249d1a6SKrzysztof Kosiński    try:
281*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
282*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
283*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, '
284*7249d1a6SKrzysztof Kosiński              'blank_lines_between_top_level_imports_and_variables: 2}'))
285*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
286*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
287*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
288*7249d1a6SKrzysztof Kosiński    finally:
289*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
290*7249d1a6SKrzysztof Kosiński
291*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
292*7249d1a6SKrzysztof Kosiński        import foo as bar
293*7249d1a6SKrzysztof Kosiński        # Some comment
294*7249d1a6SKrzysztof Kosiński        """)
295*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
296*7249d1a6SKrzysztof Kosiński        import foo as bar
297*7249d1a6SKrzysztof Kosiński        # Some comment
298*7249d1a6SKrzysztof Kosiński        """)
299*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
300*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
301*7249d1a6SKrzysztof Kosiński
302*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
303*7249d1a6SKrzysztof Kosiński        import foo as bar
304*7249d1a6SKrzysztof Kosiński        class Baz():
305*7249d1a6SKrzysztof Kosiński          pass
306*7249d1a6SKrzysztof Kosiński        """)
307*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
308*7249d1a6SKrzysztof Kosiński        import foo as bar
309*7249d1a6SKrzysztof Kosiński
310*7249d1a6SKrzysztof Kosiński
311*7249d1a6SKrzysztof Kosiński        class Baz():
312*7249d1a6SKrzysztof Kosiński          pass
313*7249d1a6SKrzysztof Kosiński        """)
314*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
315*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
316*7249d1a6SKrzysztof Kosiński
317*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
318*7249d1a6SKrzysztof Kosiński        import foo as bar
319*7249d1a6SKrzysztof Kosiński        def foobar():
320*7249d1a6SKrzysztof Kosiński          pass
321*7249d1a6SKrzysztof Kosiński        """)
322*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
323*7249d1a6SKrzysztof Kosiński        import foo as bar
324*7249d1a6SKrzysztof Kosiński
325*7249d1a6SKrzysztof Kosiński
326*7249d1a6SKrzysztof Kosiński        def foobar():
327*7249d1a6SKrzysztof Kosiński          pass
328*7249d1a6SKrzysztof Kosiński        """)
329*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
330*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
331*7249d1a6SKrzysztof Kosiński
332*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
333*7249d1a6SKrzysztof Kosiński        def foobar():
334*7249d1a6SKrzysztof Kosiński          from foo import Bar
335*7249d1a6SKrzysztof Kosiński          Bar.baz()
336*7249d1a6SKrzysztof Kosiński        """)
337*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
338*7249d1a6SKrzysztof Kosiński        def foobar():
339*7249d1a6SKrzysztof Kosiński          from foo import Bar
340*7249d1a6SKrzysztof Kosiński          Bar.baz()
341*7249d1a6SKrzysztof Kosiński        """)
342*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
343*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
344*7249d1a6SKrzysztof Kosiński
345*7249d1a6SKrzysztof Kosiński  def testBlankLinesAtEndOfFile(self):
346*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
347*7249d1a6SKrzysztof Kosiński        def foobar(): # foo
348*7249d1a6SKrzysztof Kosiński         pass
349*7249d1a6SKrzysztof Kosiński
350*7249d1a6SKrzysztof Kosiński
351*7249d1a6SKrzysztof Kosiński
352*7249d1a6SKrzysztof Kosiński        """)
353*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
354*7249d1a6SKrzysztof Kosiński        def foobar():  # foo
355*7249d1a6SKrzysztof Kosiński          pass
356*7249d1a6SKrzysztof Kosiński        """)
357*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
358*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
359*7249d1a6SKrzysztof Kosiński
360*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
361*7249d1a6SKrzysztof Kosiński        x = {  'a':37,'b':42,
362*7249d1a6SKrzysztof Kosiński
363*7249d1a6SKrzysztof Kosiński        'c':927}
364*7249d1a6SKrzysztof Kosiński
365*7249d1a6SKrzysztof Kosiński        """)
366*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
367*7249d1a6SKrzysztof Kosiński        x = {'a': 37, 'b': 42, 'c': 927}
368*7249d1a6SKrzysztof Kosiński        """)
369*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
370*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
371*7249d1a6SKrzysztof Kosiński
372*7249d1a6SKrzysztof Kosiński  def testIndentBlankLines(self):
373*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
374*7249d1a6SKrzysztof Kosiński        class foo(object):
375*7249d1a6SKrzysztof Kosiński
376*7249d1a6SKrzysztof Kosiński          def foobar(self):
377*7249d1a6SKrzysztof Kosiński
378*7249d1a6SKrzysztof Kosiński            pass
379*7249d1a6SKrzysztof Kosiński
380*7249d1a6SKrzysztof Kosiński          def barfoo(self, x, y):  # bar
381*7249d1a6SKrzysztof Kosiński
382*7249d1a6SKrzysztof Kosiński            if x:
383*7249d1a6SKrzysztof Kosiński
384*7249d1a6SKrzysztof Kosiński              return y
385*7249d1a6SKrzysztof Kosiński
386*7249d1a6SKrzysztof Kosiński
387*7249d1a6SKrzysztof Kosiński        def bar():
388*7249d1a6SKrzysztof Kosiński
389*7249d1a6SKrzysztof Kosiński          return 0
390*7249d1a6SKrzysztof Kosiński        """)
391*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
392*7249d1a6SKrzysztof Kosińskiclass foo(object):\n  \n  def foobar(self):\n    \n    pass\n  \n  def barfoo(self, x, y):  # bar\n    \n    if x:\n      \n      return y\n\n\ndef bar():\n  \n  return 0
393*7249d1a6SKrzysztof Kosiński"""  # noqa
394*7249d1a6SKrzysztof Kosiński
395*7249d1a6SKrzysztof Kosiński    try:
396*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
397*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
398*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, indent_blank_lines: true}'))
399*7249d1a6SKrzysztof Kosiński
400*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
401*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
402*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
403*7249d1a6SKrzysztof Kosiński    finally:
404*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
405*7249d1a6SKrzysztof Kosiński
406*7249d1a6SKrzysztof Kosiński    unformatted_code, expected_formatted_code = (expected_formatted_code,
407*7249d1a6SKrzysztof Kosiński                                                 unformatted_code)
408*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
409*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
410*7249d1a6SKrzysztof Kosiński
411*7249d1a6SKrzysztof Kosiński  def testMultipleUgliness(self):
412*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
413*7249d1a6SKrzysztof Kosiński        x = {  'a':37,'b':42,
414*7249d1a6SKrzysztof Kosiński
415*7249d1a6SKrzysztof Kosiński        'c':927}
416*7249d1a6SKrzysztof Kosiński
417*7249d1a6SKrzysztof Kosiński        y = 'hello ''world'
418*7249d1a6SKrzysztof Kosiński        z = 'hello '+'world'
419*7249d1a6SKrzysztof Kosiński        a = 'hello {}'.format('world')
420*7249d1a6SKrzysztof Kosiński        class foo  (     object  ):
421*7249d1a6SKrzysztof Kosiński          def f    (self   ):
422*7249d1a6SKrzysztof Kosiński            return       37*-+2
423*7249d1a6SKrzysztof Kosiński          def g(self, x,y=42):
424*7249d1a6SKrzysztof Kosiński              return y
425*7249d1a6SKrzysztof Kosiński        def f  (   a ) :
426*7249d1a6SKrzysztof Kosiński          return      37+-+a[42-x :  y**3]
427*7249d1a6SKrzysztof Kosiński        """)
428*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
429*7249d1a6SKrzysztof Kosiński        x = {'a': 37, 'b': 42, 'c': 927}
430*7249d1a6SKrzysztof Kosiński
431*7249d1a6SKrzysztof Kosiński        y = 'hello ' 'world'
432*7249d1a6SKrzysztof Kosiński        z = 'hello ' + 'world'
433*7249d1a6SKrzysztof Kosiński        a = 'hello {}'.format('world')
434*7249d1a6SKrzysztof Kosiński
435*7249d1a6SKrzysztof Kosiński
436*7249d1a6SKrzysztof Kosiński        class foo(object):
437*7249d1a6SKrzysztof Kosiński
438*7249d1a6SKrzysztof Kosiński          def f(self):
439*7249d1a6SKrzysztof Kosiński            return 37 * -+2
440*7249d1a6SKrzysztof Kosiński
441*7249d1a6SKrzysztof Kosiński          def g(self, x, y=42):
442*7249d1a6SKrzysztof Kosiński            return y
443*7249d1a6SKrzysztof Kosiński
444*7249d1a6SKrzysztof Kosiński
445*7249d1a6SKrzysztof Kosiński        def f(a):
446*7249d1a6SKrzysztof Kosiński          return 37 + -+a[42 - x:y**3]
447*7249d1a6SKrzysztof Kosiński        """)
448*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
449*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
450*7249d1a6SKrzysztof Kosiński
451*7249d1a6SKrzysztof Kosiński  def testComments(self):
452*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
453*7249d1a6SKrzysztof Kosiński        class Foo(object):
454*7249d1a6SKrzysztof Kosiński          pass
455*7249d1a6SKrzysztof Kosiński
456*7249d1a6SKrzysztof Kosiński        # Attached comment
457*7249d1a6SKrzysztof Kosiński        class Bar(object):
458*7249d1a6SKrzysztof Kosiński          pass
459*7249d1a6SKrzysztof Kosiński
460*7249d1a6SKrzysztof Kosiński        global_assignment = 42
461*7249d1a6SKrzysztof Kosiński
462*7249d1a6SKrzysztof Kosiński        # Comment attached to class with decorator.
463*7249d1a6SKrzysztof Kosiński        # Comment attached to class with decorator.
464*7249d1a6SKrzysztof Kosiński        @noop
465*7249d1a6SKrzysztof Kosiński        @noop
466*7249d1a6SKrzysztof Kosiński        class Baz(object):
467*7249d1a6SKrzysztof Kosiński          pass
468*7249d1a6SKrzysztof Kosiński
469*7249d1a6SKrzysztof Kosiński        # Intermediate comment
470*7249d1a6SKrzysztof Kosiński
471*7249d1a6SKrzysztof Kosiński        class Qux(object):
472*7249d1a6SKrzysztof Kosiński          pass
473*7249d1a6SKrzysztof Kosiński        """)
474*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
475*7249d1a6SKrzysztof Kosiński        class Foo(object):
476*7249d1a6SKrzysztof Kosiński          pass
477*7249d1a6SKrzysztof Kosiński
478*7249d1a6SKrzysztof Kosiński
479*7249d1a6SKrzysztof Kosiński        # Attached comment
480*7249d1a6SKrzysztof Kosiński        class Bar(object):
481*7249d1a6SKrzysztof Kosiński          pass
482*7249d1a6SKrzysztof Kosiński
483*7249d1a6SKrzysztof Kosiński
484*7249d1a6SKrzysztof Kosiński        global_assignment = 42
485*7249d1a6SKrzysztof Kosiński
486*7249d1a6SKrzysztof Kosiński
487*7249d1a6SKrzysztof Kosiński        # Comment attached to class with decorator.
488*7249d1a6SKrzysztof Kosiński        # Comment attached to class with decorator.
489*7249d1a6SKrzysztof Kosiński        @noop
490*7249d1a6SKrzysztof Kosiński        @noop
491*7249d1a6SKrzysztof Kosiński        class Baz(object):
492*7249d1a6SKrzysztof Kosiński          pass
493*7249d1a6SKrzysztof Kosiński
494*7249d1a6SKrzysztof Kosiński
495*7249d1a6SKrzysztof Kosiński        # Intermediate comment
496*7249d1a6SKrzysztof Kosiński
497*7249d1a6SKrzysztof Kosiński
498*7249d1a6SKrzysztof Kosiński        class Qux(object):
499*7249d1a6SKrzysztof Kosiński          pass
500*7249d1a6SKrzysztof Kosiński        """)
501*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
502*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
503*7249d1a6SKrzysztof Kosiński
504*7249d1a6SKrzysztof Kosiński  def testSingleComment(self):
505*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
506*7249d1a6SKrzysztof Kosiński        # Thing 1
507*7249d1a6SKrzysztof Kosiński        """)
508*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
509*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
510*7249d1a6SKrzysztof Kosiński
511*7249d1a6SKrzysztof Kosiński  def testCommentsWithTrailingSpaces(self):
512*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
513*7249d1a6SKrzysztof Kosiński        # Thing 1    \n# Thing 2    \n""")
514*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
515*7249d1a6SKrzysztof Kosiński        # Thing 1
516*7249d1a6SKrzysztof Kosiński        # Thing 2
517*7249d1a6SKrzysztof Kosiński        """)
518*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
519*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
520*7249d1a6SKrzysztof Kosiński
521*7249d1a6SKrzysztof Kosiński  def testCommentsInDataLiteral(self):
522*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
523*7249d1a6SKrzysztof Kosiński        def f():
524*7249d1a6SKrzysztof Kosiński          return collections.OrderedDict({
525*7249d1a6SKrzysztof Kosiński              # First comment.
526*7249d1a6SKrzysztof Kosiński              'fnord': 37,
527*7249d1a6SKrzysztof Kosiński
528*7249d1a6SKrzysztof Kosiński              # Second comment.
529*7249d1a6SKrzysztof Kosiński              # Continuation of second comment.
530*7249d1a6SKrzysztof Kosiński              'bork': 42,
531*7249d1a6SKrzysztof Kosiński
532*7249d1a6SKrzysztof Kosiński              # Ending comment.
533*7249d1a6SKrzysztof Kosiński          })
534*7249d1a6SKrzysztof Kosiński        """)
535*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
536*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
537*7249d1a6SKrzysztof Kosiński
538*7249d1a6SKrzysztof Kosiński  def testEndingWhitespaceAfterSimpleStatement(self):
539*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
540*7249d1a6SKrzysztof Kosiński        import foo as bar
541*7249d1a6SKrzysztof Kosiński        # Thing 1
542*7249d1a6SKrzysztof Kosiński        # Thing 2
543*7249d1a6SKrzysztof Kosiński        """)
544*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
545*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
546*7249d1a6SKrzysztof Kosiński
547*7249d1a6SKrzysztof Kosiński  def testDocstrings(self):
548*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
549*7249d1a6SKrzysztof Kosiński        u"""Module-level docstring."""
550*7249d1a6SKrzysztof Kosiński        import os
551*7249d1a6SKrzysztof Kosiński        class Foo(object):
552*7249d1a6SKrzysztof Kosiński
553*7249d1a6SKrzysztof Kosiński          """Class-level docstring."""
554*7249d1a6SKrzysztof Kosiński          # A comment for qux.
555*7249d1a6SKrzysztof Kosiński          def qux(self):
556*7249d1a6SKrzysztof Kosiński
557*7249d1a6SKrzysztof Kosiński
558*7249d1a6SKrzysztof Kosiński            """Function-level docstring.
559*7249d1a6SKrzysztof Kosiński
560*7249d1a6SKrzysztof Kosiński            A multiline function docstring.
561*7249d1a6SKrzysztof Kosiński            """
562*7249d1a6SKrzysztof Kosiński            print('hello {}'.format('world'))
563*7249d1a6SKrzysztof Kosiński            return 42
564*7249d1a6SKrzysztof Kosiński        ''')
565*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
566*7249d1a6SKrzysztof Kosiński        u"""Module-level docstring."""
567*7249d1a6SKrzysztof Kosiński        import os
568*7249d1a6SKrzysztof Kosiński
569*7249d1a6SKrzysztof Kosiński
570*7249d1a6SKrzysztof Kosiński        class Foo(object):
571*7249d1a6SKrzysztof Kosiński          """Class-level docstring."""
572*7249d1a6SKrzysztof Kosiński
573*7249d1a6SKrzysztof Kosiński          # A comment for qux.
574*7249d1a6SKrzysztof Kosiński          def qux(self):
575*7249d1a6SKrzysztof Kosiński            """Function-level docstring.
576*7249d1a6SKrzysztof Kosiński
577*7249d1a6SKrzysztof Kosiński            A multiline function docstring.
578*7249d1a6SKrzysztof Kosiński            """
579*7249d1a6SKrzysztof Kosiński            print('hello {}'.format('world'))
580*7249d1a6SKrzysztof Kosiński            return 42
581*7249d1a6SKrzysztof Kosiński        ''')
582*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
583*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
584*7249d1a6SKrzysztof Kosiński
585*7249d1a6SKrzysztof Kosiński  def testDocstringAndMultilineComment(self):
586*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
587*7249d1a6SKrzysztof Kosiński        """Hello world"""
588*7249d1a6SKrzysztof Kosiński        # A multiline
589*7249d1a6SKrzysztof Kosiński        # comment
590*7249d1a6SKrzysztof Kosiński        class bar(object):
591*7249d1a6SKrzysztof Kosiński          """class docstring"""
592*7249d1a6SKrzysztof Kosiński          # class multiline
593*7249d1a6SKrzysztof Kosiński          # comment
594*7249d1a6SKrzysztof Kosiński          def foo(self):
595*7249d1a6SKrzysztof Kosiński            """Another docstring."""
596*7249d1a6SKrzysztof Kosiński            # Another multiline
597*7249d1a6SKrzysztof Kosiński            # comment
598*7249d1a6SKrzysztof Kosiński            pass
599*7249d1a6SKrzysztof Kosiński        ''')
600*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
601*7249d1a6SKrzysztof Kosiński        """Hello world"""
602*7249d1a6SKrzysztof Kosiński
603*7249d1a6SKrzysztof Kosiński
604*7249d1a6SKrzysztof Kosiński        # A multiline
605*7249d1a6SKrzysztof Kosiński        # comment
606*7249d1a6SKrzysztof Kosiński        class bar(object):
607*7249d1a6SKrzysztof Kosiński          """class docstring"""
608*7249d1a6SKrzysztof Kosiński
609*7249d1a6SKrzysztof Kosiński          # class multiline
610*7249d1a6SKrzysztof Kosiński          # comment
611*7249d1a6SKrzysztof Kosiński          def foo(self):
612*7249d1a6SKrzysztof Kosiński            """Another docstring."""
613*7249d1a6SKrzysztof Kosiński            # Another multiline
614*7249d1a6SKrzysztof Kosiński            # comment
615*7249d1a6SKrzysztof Kosiński            pass
616*7249d1a6SKrzysztof Kosiński        ''')
617*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
618*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
619*7249d1a6SKrzysztof Kosiński
620*7249d1a6SKrzysztof Kosiński  def testMultilineDocstringAndMultilineComment(self):
621*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
622*7249d1a6SKrzysztof Kosiński        """Hello world
623*7249d1a6SKrzysztof Kosiński
624*7249d1a6SKrzysztof Kosiński        RIP Dennis Richie.
625*7249d1a6SKrzysztof Kosiński        """
626*7249d1a6SKrzysztof Kosiński        # A multiline
627*7249d1a6SKrzysztof Kosiński        # comment
628*7249d1a6SKrzysztof Kosiński        class bar(object):
629*7249d1a6SKrzysztof Kosiński          """class docstring
630*7249d1a6SKrzysztof Kosiński
631*7249d1a6SKrzysztof Kosiński          A classy class.
632*7249d1a6SKrzysztof Kosiński          """
633*7249d1a6SKrzysztof Kosiński          # class multiline
634*7249d1a6SKrzysztof Kosiński          # comment
635*7249d1a6SKrzysztof Kosiński          def foo(self):
636*7249d1a6SKrzysztof Kosiński            """Another docstring.
637*7249d1a6SKrzysztof Kosiński
638*7249d1a6SKrzysztof Kosiński            A functional function.
639*7249d1a6SKrzysztof Kosiński            """
640*7249d1a6SKrzysztof Kosiński            # Another multiline
641*7249d1a6SKrzysztof Kosiński            # comment
642*7249d1a6SKrzysztof Kosiński            pass
643*7249d1a6SKrzysztof Kosiński        ''')
644*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
645*7249d1a6SKrzysztof Kosiński        """Hello world
646*7249d1a6SKrzysztof Kosiński
647*7249d1a6SKrzysztof Kosiński        RIP Dennis Richie.
648*7249d1a6SKrzysztof Kosiński        """
649*7249d1a6SKrzysztof Kosiński
650*7249d1a6SKrzysztof Kosiński
651*7249d1a6SKrzysztof Kosiński        # A multiline
652*7249d1a6SKrzysztof Kosiński        # comment
653*7249d1a6SKrzysztof Kosiński        class bar(object):
654*7249d1a6SKrzysztof Kosiński          """class docstring
655*7249d1a6SKrzysztof Kosiński
656*7249d1a6SKrzysztof Kosiński          A classy class.
657*7249d1a6SKrzysztof Kosiński          """
658*7249d1a6SKrzysztof Kosiński
659*7249d1a6SKrzysztof Kosiński          # class multiline
660*7249d1a6SKrzysztof Kosiński          # comment
661*7249d1a6SKrzysztof Kosiński          def foo(self):
662*7249d1a6SKrzysztof Kosiński            """Another docstring.
663*7249d1a6SKrzysztof Kosiński
664*7249d1a6SKrzysztof Kosiński            A functional function.
665*7249d1a6SKrzysztof Kosiński            """
666*7249d1a6SKrzysztof Kosiński            # Another multiline
667*7249d1a6SKrzysztof Kosiński            # comment
668*7249d1a6SKrzysztof Kosiński            pass
669*7249d1a6SKrzysztof Kosiński        ''')
670*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
671*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
672*7249d1a6SKrzysztof Kosiński
673*7249d1a6SKrzysztof Kosiński  def testTupleCommaBeforeLastParen(self):
674*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
675*7249d1a6SKrzysztof Kosiński        a = ( 1, )
676*7249d1a6SKrzysztof Kosiński        """)
677*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
678*7249d1a6SKrzysztof Kosiński        a = (1,)
679*7249d1a6SKrzysztof Kosiński        """)
680*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
681*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
682*7249d1a6SKrzysztof Kosiński
683*7249d1a6SKrzysztof Kosiński  def testNoBreakOutsideOfBracket(self):
684*7249d1a6SKrzysztof Kosiński    # FIXME(morbo): How this is formatted is not correct. But it's syntactically
685*7249d1a6SKrzysztof Kosiński    # correct.
686*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
687*7249d1a6SKrzysztof Kosiński        def f():
688*7249d1a6SKrzysztof Kosiński          assert port >= minimum, \
689*7249d1a6SKrzysztof Kosiński'Unexpected port %d when minimum was %d.' % (port, minimum)
690*7249d1a6SKrzysztof Kosiński        """)
691*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
692*7249d1a6SKrzysztof Kosiński        def f():
693*7249d1a6SKrzysztof Kosiński          assert port >= minimum, 'Unexpected port %d when minimum was %d.' % (port,
694*7249d1a6SKrzysztof Kosiński                                                                               minimum)
695*7249d1a6SKrzysztof Kosiński        """)  # noqa
696*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
697*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
698*7249d1a6SKrzysztof Kosiński
699*7249d1a6SKrzysztof Kosiński  def testBlankLinesBeforeDecorators(self):
700*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
701*7249d1a6SKrzysztof Kosiński        @foo()
702*7249d1a6SKrzysztof Kosiński        class A(object):
703*7249d1a6SKrzysztof Kosiński          @bar()
704*7249d1a6SKrzysztof Kosiński          @baz()
705*7249d1a6SKrzysztof Kosiński          def x(self):
706*7249d1a6SKrzysztof Kosiński            pass
707*7249d1a6SKrzysztof Kosiński        """)
708*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
709*7249d1a6SKrzysztof Kosiński        @foo()
710*7249d1a6SKrzysztof Kosiński        class A(object):
711*7249d1a6SKrzysztof Kosiński
712*7249d1a6SKrzysztof Kosiński          @bar()
713*7249d1a6SKrzysztof Kosiński          @baz()
714*7249d1a6SKrzysztof Kosiński          def x(self):
715*7249d1a6SKrzysztof Kosiński            pass
716*7249d1a6SKrzysztof Kosiński        """)
717*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
718*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
719*7249d1a6SKrzysztof Kosiński
720*7249d1a6SKrzysztof Kosiński  def testCommentBetweenDecorators(self):
721*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
722*7249d1a6SKrzysztof Kosiński        @foo()
723*7249d1a6SKrzysztof Kosiński        # frob
724*7249d1a6SKrzysztof Kosiński        @bar
725*7249d1a6SKrzysztof Kosiński        def x  (self):
726*7249d1a6SKrzysztof Kosiński            pass
727*7249d1a6SKrzysztof Kosiński        """)
728*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
729*7249d1a6SKrzysztof Kosiński        @foo()
730*7249d1a6SKrzysztof Kosiński        # frob
731*7249d1a6SKrzysztof Kosiński        @bar
732*7249d1a6SKrzysztof Kosiński        def x(self):
733*7249d1a6SKrzysztof Kosiński          pass
734*7249d1a6SKrzysztof Kosiński        """)
735*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
736*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
737*7249d1a6SKrzysztof Kosiński
738*7249d1a6SKrzysztof Kosiński  def testListComprehension(self):
739*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
740*7249d1a6SKrzysztof Kosiński        def given(y):
741*7249d1a6SKrzysztof Kosiński            [k for k in ()
742*7249d1a6SKrzysztof Kosiński              if k in y]
743*7249d1a6SKrzysztof Kosiński        """)
744*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
745*7249d1a6SKrzysztof Kosiński        def given(y):
746*7249d1a6SKrzysztof Kosiński          [k for k in () if k in y]
747*7249d1a6SKrzysztof Kosiński        """)
748*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
749*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
750*7249d1a6SKrzysztof Kosiński
751*7249d1a6SKrzysztof Kosiński  def testListComprehensionPreferOneLine(self):
752*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
753*7249d1a6SKrzysztof Kosiński        def given(y):
754*7249d1a6SKrzysztof Kosiński            long_variable_name = [
755*7249d1a6SKrzysztof Kosiński                long_var_name + 1
756*7249d1a6SKrzysztof Kosiński                for long_var_name in ()
757*7249d1a6SKrzysztof Kosiński                if long_var_name == 2]
758*7249d1a6SKrzysztof Kosiński        """)
759*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
760*7249d1a6SKrzysztof Kosiński        def given(y):
761*7249d1a6SKrzysztof Kosiński          long_variable_name = [
762*7249d1a6SKrzysztof Kosiński              long_var_name + 1 for long_var_name in () if long_var_name == 2
763*7249d1a6SKrzysztof Kosiński          ]
764*7249d1a6SKrzysztof Kosiński        """)
765*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
766*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
767*7249d1a6SKrzysztof Kosiński
768*7249d1a6SKrzysztof Kosiński  def testListComprehensionPreferOneLineOverArithmeticSplit(self):
769*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
770*7249d1a6SKrzysztof Kosiński        def given(used_identifiers):
771*7249d1a6SKrzysztof Kosiński          return (sum(len(identifier)
772*7249d1a6SKrzysztof Kosiński                      for identifier in used_identifiers) / len(used_identifiers))
773*7249d1a6SKrzysztof Kosiński        """)  # noqa
774*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
775*7249d1a6SKrzysztof Kosiński        def given(used_identifiers):
776*7249d1a6SKrzysztof Kosiński          return (sum(len(identifier) for identifier in used_identifiers) /
777*7249d1a6SKrzysztof Kosiński                  len(used_identifiers))
778*7249d1a6SKrzysztof Kosiński        """)
779*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
780*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
781*7249d1a6SKrzysztof Kosiński
782*7249d1a6SKrzysztof Kosiński  def testListComprehensionPreferThreeLinesForLineWrap(self):
783*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
784*7249d1a6SKrzysztof Kosiński        def given(y):
785*7249d1a6SKrzysztof Kosiński            long_variable_name = [
786*7249d1a6SKrzysztof Kosiński                long_var_name + 1
787*7249d1a6SKrzysztof Kosiński                for long_var_name, number_two in ()
788*7249d1a6SKrzysztof Kosiński                if long_var_name == 2 and number_two == 3]
789*7249d1a6SKrzysztof Kosiński        """)
790*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
791*7249d1a6SKrzysztof Kosiński        def given(y):
792*7249d1a6SKrzysztof Kosiński          long_variable_name = [
793*7249d1a6SKrzysztof Kosiński              long_var_name + 1
794*7249d1a6SKrzysztof Kosiński              for long_var_name, number_two in ()
795*7249d1a6SKrzysztof Kosiński              if long_var_name == 2 and number_two == 3
796*7249d1a6SKrzysztof Kosiński          ]
797*7249d1a6SKrzysztof Kosiński        """)
798*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
799*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
800*7249d1a6SKrzysztof Kosiński
801*7249d1a6SKrzysztof Kosiński  def testListComprehensionPreferNoBreakForTrivialExpression(self):
802*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
803*7249d1a6SKrzysztof Kosiński        def given(y):
804*7249d1a6SKrzysztof Kosiński            long_variable_name = [
805*7249d1a6SKrzysztof Kosiński                long_var_name
806*7249d1a6SKrzysztof Kosiński                for long_var_name, number_two in ()
807*7249d1a6SKrzysztof Kosiński                if long_var_name == 2 and number_two == 3]
808*7249d1a6SKrzysztof Kosiński        """)
809*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
810*7249d1a6SKrzysztof Kosiński        def given(y):
811*7249d1a6SKrzysztof Kosiński          long_variable_name = [
812*7249d1a6SKrzysztof Kosiński              long_var_name for long_var_name, number_two in ()
813*7249d1a6SKrzysztof Kosiński              if long_var_name == 2 and number_two == 3
814*7249d1a6SKrzysztof Kosiński          ]
815*7249d1a6SKrzysztof Kosiński        """)
816*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
817*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
818*7249d1a6SKrzysztof Kosiński
819*7249d1a6SKrzysztof Kosiński  def testOpeningAndClosingBrackets(self):
820*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
821*7249d1a6SKrzysztof Kosińskifoo( (1, ) )
822*7249d1a6SKrzysztof Kosińskifoo( ( 1, 2, 3  ) )
823*7249d1a6SKrzysztof Kosińskifoo( ( 1, 2, 3, ) )
824*7249d1a6SKrzysztof Kosiński"""
825*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
826*7249d1a6SKrzysztof Kosińskifoo((1,))
827*7249d1a6SKrzysztof Kosińskifoo((1, 2, 3))
828*7249d1a6SKrzysztof Kosińskifoo((
829*7249d1a6SKrzysztof Kosiński    1,
830*7249d1a6SKrzysztof Kosiński    2,
831*7249d1a6SKrzysztof Kosiński    3,
832*7249d1a6SKrzysztof Kosiński))
833*7249d1a6SKrzysztof Kosiński"""
834*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
835*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
836*7249d1a6SKrzysztof Kosiński
837*7249d1a6SKrzysztof Kosiński  def testSingleLineFunctions(self):
838*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
839*7249d1a6SKrzysztof Kosiński        def foo():  return 42
840*7249d1a6SKrzysztof Kosiński        """)
841*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
842*7249d1a6SKrzysztof Kosiński        def foo():
843*7249d1a6SKrzysztof Kosiński          return 42
844*7249d1a6SKrzysztof Kosiński        """)
845*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
846*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
847*7249d1a6SKrzysztof Kosiński
848*7249d1a6SKrzysztof Kosiński  def testNoQueueSeletionInMiddleOfLine(self):
849*7249d1a6SKrzysztof Kosiński    # If the queue isn't properly constructed, then a token in the middle of the
850*7249d1a6SKrzysztof Kosiński    # line may be selected as the one with least penalty. The tokens after that
851*7249d1a6SKrzysztof Kosiński    # one are then splatted at the end of the line with no formatting.
852*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
853*7249d1a6SKrzysztof Kosińskifind_symbol(node.type) + "< " + " ".join(find_pattern(n) for n in node.child) + " >"
854*7249d1a6SKrzysztof Kosiński"""  # noqa
855*7249d1a6SKrzysztof Kosiński    expected_formatted_code = """\
856*7249d1a6SKrzysztof Kosińskifind_symbol(node.type) + "< " + " ".join(
857*7249d1a6SKrzysztof Kosiński    find_pattern(n) for n in node.child) + " >"
858*7249d1a6SKrzysztof Kosiński"""
859*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
860*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
861*7249d1a6SKrzysztof Kosiński
862*7249d1a6SKrzysztof Kosiński  def testNoSpacesBetweenSubscriptsAndCalls(self):
863*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
864*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc() [42] (a, 2)
865*7249d1a6SKrzysztof Kosiński        """)
866*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
867*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc()[42](a, 2)
868*7249d1a6SKrzysztof Kosiński        """)
869*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
870*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
871*7249d1a6SKrzysztof Kosiński
872*7249d1a6SKrzysztof Kosiński  def testNoSpacesBetweenOpeningBracketAndStartingOperator(self):
873*7249d1a6SKrzysztof Kosiński    # Unary operator.
874*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
875*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc[ -1 ]( -42 )
876*7249d1a6SKrzysztof Kosiński        """)
877*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
878*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc[-1](-42)
879*7249d1a6SKrzysztof Kosiński        """)
880*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
881*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
882*7249d1a6SKrzysztof Kosiński
883*7249d1a6SKrzysztof Kosiński    # Varargs and kwargs.
884*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
885*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc( *varargs )
886*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc( **kwargs )
887*7249d1a6SKrzysztof Kosiński        """)
888*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
889*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc(*varargs)
890*7249d1a6SKrzysztof Kosiński        aaaaaaaaaa = bbbbbbbb.ccccccccc(**kwargs)
891*7249d1a6SKrzysztof Kosiński        """)
892*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
893*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
894*7249d1a6SKrzysztof Kosiński
895*7249d1a6SKrzysztof Kosiński  def testMultilineCommentReformatted(self):
896*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
897*7249d1a6SKrzysztof Kosiński        if True:
898*7249d1a6SKrzysztof Kosiński            # This is a multiline
899*7249d1a6SKrzysztof Kosiński            # comment.
900*7249d1a6SKrzysztof Kosiński            pass
901*7249d1a6SKrzysztof Kosiński        """)
902*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
903*7249d1a6SKrzysztof Kosiński        if True:
904*7249d1a6SKrzysztof Kosiński          # This is a multiline
905*7249d1a6SKrzysztof Kosiński          # comment.
906*7249d1a6SKrzysztof Kosiński          pass
907*7249d1a6SKrzysztof Kosiński        """)
908*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
909*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
910*7249d1a6SKrzysztof Kosiński
911*7249d1a6SKrzysztof Kosiński  def testDictionaryMakerFormatting(self):
912*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
913*7249d1a6SKrzysztof Kosiński        _PYTHON_STATEMENTS = frozenset({
914*7249d1a6SKrzysztof Kosiński            lambda x, y: 'simple_stmt': 'small_stmt', 'expr_stmt': 'print_stmt', 'del_stmt':
915*7249d1a6SKrzysztof Kosiński            'pass_stmt', lambda: 'break_stmt': 'continue_stmt', 'return_stmt': 'raise_stmt',
916*7249d1a6SKrzysztof Kosiński            'yield_stmt': 'import_stmt', lambda: 'global_stmt': 'exec_stmt', 'assert_stmt':
917*7249d1a6SKrzysztof Kosiński            'if_stmt', 'while_stmt': 'for_stmt',
918*7249d1a6SKrzysztof Kosiński        })
919*7249d1a6SKrzysztof Kosiński        """)  # noqa
920*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
921*7249d1a6SKrzysztof Kosiński        _PYTHON_STATEMENTS = frozenset({
922*7249d1a6SKrzysztof Kosiński            lambda x, y: 'simple_stmt': 'small_stmt',
923*7249d1a6SKrzysztof Kosiński            'expr_stmt': 'print_stmt',
924*7249d1a6SKrzysztof Kosiński            'del_stmt': 'pass_stmt',
925*7249d1a6SKrzysztof Kosiński            lambda: 'break_stmt': 'continue_stmt',
926*7249d1a6SKrzysztof Kosiński            'return_stmt': 'raise_stmt',
927*7249d1a6SKrzysztof Kosiński            'yield_stmt': 'import_stmt',
928*7249d1a6SKrzysztof Kosiński            lambda: 'global_stmt': 'exec_stmt',
929*7249d1a6SKrzysztof Kosiński            'assert_stmt': 'if_stmt',
930*7249d1a6SKrzysztof Kosiński            'while_stmt': 'for_stmt',
931*7249d1a6SKrzysztof Kosiński        })
932*7249d1a6SKrzysztof Kosiński        """)
933*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
934*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
935*7249d1a6SKrzysztof Kosiński
936*7249d1a6SKrzysztof Kosiński  def testSimpleMultilineCode(self):
937*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
938*7249d1a6SKrzysztof Kosiński        if True:
939*7249d1a6SKrzysztof Kosiński          aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, \
940*7249d1a6SKrzysztof Kosińskixxxxxxxxxxx, yyyyyyyyyyyy, vvvvvvvvv)
941*7249d1a6SKrzysztof Kosiński          aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, \
942*7249d1a6SKrzysztof Kosińskixxxxxxxxxxx, yyyyyyyyyyyy, vvvvvvvvv)
943*7249d1a6SKrzysztof Kosiński        """)
944*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
945*7249d1a6SKrzysztof Kosiński        if True:
946*7249d1a6SKrzysztof Kosiński          aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, xxxxxxxxxxx, yyyyyyyyyyyy,
947*7249d1a6SKrzysztof Kosiński                                                vvvvvvvvv)
948*7249d1a6SKrzysztof Kosiński          aaaaaaaaaaaaaa.bbbbbbbbbbbbbb.ccccccc(zzzzzzzzzzzz, xxxxxxxxxxx, yyyyyyyyyyyy,
949*7249d1a6SKrzysztof Kosiński                                                vvvvvvvvv)
950*7249d1a6SKrzysztof Kosiński        """)  # noqa
951*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
952*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
953*7249d1a6SKrzysztof Kosiński
954*7249d1a6SKrzysztof Kosiński  def testMultilineComment(self):
955*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
956*7249d1a6SKrzysztof Kosiński        if Foo:
957*7249d1a6SKrzysztof Kosiński          # Hello world
958*7249d1a6SKrzysztof Kosiński          # Yo man.
959*7249d1a6SKrzysztof Kosiński          # Yo man.
960*7249d1a6SKrzysztof Kosiński          # Yo man.
961*7249d1a6SKrzysztof Kosiński          # Yo man.
962*7249d1a6SKrzysztof Kosiński          a = 42
963*7249d1a6SKrzysztof Kosiński        """)
964*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
965*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
966*7249d1a6SKrzysztof Kosiński
967*7249d1a6SKrzysztof Kosiński  def testSpaceBetweenStringAndParentheses(self):
968*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
969*7249d1a6SKrzysztof Kosiński        b = '0' ('hello')
970*7249d1a6SKrzysztof Kosiński        """)
971*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
972*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
973*7249d1a6SKrzysztof Kosiński
974*7249d1a6SKrzysztof Kosiński  def testMultilineString(self):
975*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
976*7249d1a6SKrzysztof Kosiński        code = textwrap.dedent('''\
977*7249d1a6SKrzysztof Kosiński            if Foo:
978*7249d1a6SKrzysztof Kosiński              # Hello world
979*7249d1a6SKrzysztof Kosiński              # Yo man.
980*7249d1a6SKrzysztof Kosiński              # Yo man.
981*7249d1a6SKrzysztof Kosiński              # Yo man.
982*7249d1a6SKrzysztof Kosiński              # Yo man.
983*7249d1a6SKrzysztof Kosiński              a = 42
984*7249d1a6SKrzysztof Kosiński            ''')
985*7249d1a6SKrzysztof Kosiński        """)
986*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
987*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
988*7249d1a6SKrzysztof Kosiński
989*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
990*7249d1a6SKrzysztof Kosiński        def f():
991*7249d1a6SKrzysztof Kosiński            email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br>
992*7249d1a6SKrzysztof Kosiński        <b>Czar: </b>"""+despot["Nicholas"]+"""<br>
993*7249d1a6SKrzysztof Kosiński        <b>Minion: </b>"""+serf["Dmitri"]+"""<br>
994*7249d1a6SKrzysztof Kosiński        <b>Residence: </b>"""+palace["Winter"]+"""<br>
995*7249d1a6SKrzysztof Kosiński        </body>
996*7249d1a6SKrzysztof Kosiński        </html>"""
997*7249d1a6SKrzysztof Kosiński        ''')  # noqa
998*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
999*7249d1a6SKrzysztof Kosiński        def f():
1000*7249d1a6SKrzysztof Kosiński          email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br>
1001*7249d1a6SKrzysztof Kosiński        <b>Czar: </b>""" + despot["Nicholas"] + """<br>
1002*7249d1a6SKrzysztof Kosiński        <b>Minion: </b>""" + serf["Dmitri"] + """<br>
1003*7249d1a6SKrzysztof Kosiński        <b>Residence: </b>""" + palace["Winter"] + """<br>
1004*7249d1a6SKrzysztof Kosiński        </body>
1005*7249d1a6SKrzysztof Kosiński        </html>"""
1006*7249d1a6SKrzysztof Kosiński        ''')  # noqa
1007*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1008*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1009*7249d1a6SKrzysztof Kosiński
1010*7249d1a6SKrzysztof Kosiński  def testSimpleMultilineWithComments(self):
1011*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1012*7249d1a6SKrzysztof Kosiński        if (  # This is the first comment
1013*7249d1a6SKrzysztof Kosiński            a and  # This is the second comment
1014*7249d1a6SKrzysztof Kosiński            # This is the third comment
1015*7249d1a6SKrzysztof Kosiński            b):  # A trailing comment
1016*7249d1a6SKrzysztof Kosiński          # Whoa! A normal comment!!
1017*7249d1a6SKrzysztof Kosiński          pass  # Another trailing comment
1018*7249d1a6SKrzysztof Kosiński        """)
1019*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1020*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1021*7249d1a6SKrzysztof Kosiński
1022*7249d1a6SKrzysztof Kosiński  def testMatchingParenSplittingMatching(self):
1023*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1024*7249d1a6SKrzysztof Kosiński        def f():
1025*7249d1a6SKrzysztof Kosiński          raise RuntimeError('unable to find insertion point for target node',
1026*7249d1a6SKrzysztof Kosiński                             (target,))
1027*7249d1a6SKrzysztof Kosiński        """)
1028*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1029*7249d1a6SKrzysztof Kosiński        def f():
1030*7249d1a6SKrzysztof Kosiński          raise RuntimeError('unable to find insertion point for target node',
1031*7249d1a6SKrzysztof Kosiński                             (target,))
1032*7249d1a6SKrzysztof Kosiński        """)
1033*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1034*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1035*7249d1a6SKrzysztof Kosiński
1036*7249d1a6SKrzysztof Kosiński  def testContinuationIndent(self):
1037*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
1038*7249d1a6SKrzysztof Kosiński        class F:
1039*7249d1a6SKrzysztof Kosiński          def _ProcessArgLists(self, node):
1040*7249d1a6SKrzysztof Kosiński            """Common method for processing argument lists."""
1041*7249d1a6SKrzysztof Kosiński            for child in node.children:
1042*7249d1a6SKrzysztof Kosiński              if isinstance(child, pytree.Leaf):
1043*7249d1a6SKrzysztof Kosiński                self._SetTokenSubtype(
1044*7249d1a6SKrzysztof Kosiński                    child, subtype=_ARGLIST_TOKEN_TO_SUBTYPE.get(
1045*7249d1a6SKrzysztof Kosiński                        child.value, format_token.Subtype.NONE))
1046*7249d1a6SKrzysztof Kosiński        ''')
1047*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
1048*7249d1a6SKrzysztof Kosiński        class F:
1049*7249d1a6SKrzysztof Kosiński
1050*7249d1a6SKrzysztof Kosiński          def _ProcessArgLists(self, node):
1051*7249d1a6SKrzysztof Kosiński            """Common method for processing argument lists."""
1052*7249d1a6SKrzysztof Kosiński            for child in node.children:
1053*7249d1a6SKrzysztof Kosiński              if isinstance(child, pytree.Leaf):
1054*7249d1a6SKrzysztof Kosiński                self._SetTokenSubtype(
1055*7249d1a6SKrzysztof Kosiński                    child,
1056*7249d1a6SKrzysztof Kosiński                    subtype=_ARGLIST_TOKEN_TO_SUBTYPE.get(child.value,
1057*7249d1a6SKrzysztof Kosiński                                                          format_token.Subtype.NONE))
1058*7249d1a6SKrzysztof Kosiński        ''')  # noqa
1059*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1060*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1061*7249d1a6SKrzysztof Kosiński
1062*7249d1a6SKrzysztof Kosiński  def testTrailingCommaAndBracket(self):
1063*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
1064*7249d1a6SKrzysztof Kosiński        a = { 42, }
1065*7249d1a6SKrzysztof Kosiński        b = ( 42, )
1066*7249d1a6SKrzysztof Kosiński        c = [ 42, ]
1067*7249d1a6SKrzysztof Kosiński        ''')
1068*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
1069*7249d1a6SKrzysztof Kosiński        a = {
1070*7249d1a6SKrzysztof Kosiński            42,
1071*7249d1a6SKrzysztof Kosiński        }
1072*7249d1a6SKrzysztof Kosiński        b = (42,)
1073*7249d1a6SKrzysztof Kosiński        c = [
1074*7249d1a6SKrzysztof Kosiński            42,
1075*7249d1a6SKrzysztof Kosiński        ]
1076*7249d1a6SKrzysztof Kosiński        ''')
1077*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1078*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1079*7249d1a6SKrzysztof Kosiński
1080*7249d1a6SKrzysztof Kosiński  def testI18n(self):
1081*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1082*7249d1a6SKrzysztof Kosiński        N_('Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.')  # A comment is here.
1083*7249d1a6SKrzysztof Kosiński        """)  # noqa
1084*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1085*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1086*7249d1a6SKrzysztof Kosiński
1087*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1088*7249d1a6SKrzysztof Kosiński        foo('Fake function call')  #. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.
1089*7249d1a6SKrzysztof Kosiński        """)  # noqa
1090*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1091*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1092*7249d1a6SKrzysztof Kosiński
1093*7249d1a6SKrzysztof Kosiński  def testI18nCommentsInDataLiteral(self):
1094*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1095*7249d1a6SKrzysztof Kosiński        def f():
1096*7249d1a6SKrzysztof Kosiński          return collections.OrderedDict({
1097*7249d1a6SKrzysztof Kosiński              #. First i18n comment.
1098*7249d1a6SKrzysztof Kosiński              'bork': 'foo',
1099*7249d1a6SKrzysztof Kosiński
1100*7249d1a6SKrzysztof Kosiński              #. Second i18n comment.
1101*7249d1a6SKrzysztof Kosiński              'snork': 'bar#.*=\\\\0',
1102*7249d1a6SKrzysztof Kosiński          })
1103*7249d1a6SKrzysztof Kosiński        """)
1104*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1105*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1106*7249d1a6SKrzysztof Kosiński
1107*7249d1a6SKrzysztof Kosiński  def testClosingBracketIndent(self):
1108*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent('''\
1109*7249d1a6SKrzysztof Kosiński        def f():
1110*7249d1a6SKrzysztof Kosiński
1111*7249d1a6SKrzysztof Kosiński          def g():
1112*7249d1a6SKrzysztof Kosiński            while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and
1113*7249d1a6SKrzysztof Kosiński                   xxxxxxxxxxxxxxxxxxxxx(
1114*7249d1a6SKrzysztof Kosiński                       yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 'bbbbbbb'):
1115*7249d1a6SKrzysztof Kosiński              pass
1116*7249d1a6SKrzysztof Kosiński        ''')  # noqa
1117*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1118*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1119*7249d1a6SKrzysztof Kosiński
1120*7249d1a6SKrzysztof Kosiński  def testClosingBracketsInlinedInCall(self):
1121*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1122*7249d1a6SKrzysztof Kosiński        class Foo(object):
1123*7249d1a6SKrzysztof Kosiński
1124*7249d1a6SKrzysztof Kosiński          def bar(self):
1125*7249d1a6SKrzysztof Kosiński            self.aaaaaaaa = xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyy(
1126*7249d1a6SKrzysztof Kosiński                self.cccccc.ddddddddd.eeeeeeee,
1127*7249d1a6SKrzysztof Kosiński                options={
1128*7249d1a6SKrzysztof Kosiński                    "forkforkfork": 1,
1129*7249d1a6SKrzysztof Kosiński                    "borkborkbork": 2,
1130*7249d1a6SKrzysztof Kosiński                    "corkcorkcork": 3,
1131*7249d1a6SKrzysztof Kosiński                    "horkhorkhork": 4,
1132*7249d1a6SKrzysztof Kosiński                    "porkporkpork": 5,
1133*7249d1a6SKrzysztof Kosiński                    })
1134*7249d1a6SKrzysztof Kosiński        """)
1135*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1136*7249d1a6SKrzysztof Kosiński        class Foo(object):
1137*7249d1a6SKrzysztof Kosiński
1138*7249d1a6SKrzysztof Kosiński          def bar(self):
1139*7249d1a6SKrzysztof Kosiński            self.aaaaaaaa = xxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyy(
1140*7249d1a6SKrzysztof Kosiński                self.cccccc.ddddddddd.eeeeeeee,
1141*7249d1a6SKrzysztof Kosiński                options={
1142*7249d1a6SKrzysztof Kosiński                    "forkforkfork": 1,
1143*7249d1a6SKrzysztof Kosiński                    "borkborkbork": 2,
1144*7249d1a6SKrzysztof Kosiński                    "corkcorkcork": 3,
1145*7249d1a6SKrzysztof Kosiński                    "horkhorkhork": 4,
1146*7249d1a6SKrzysztof Kosiński                    "porkporkpork": 5,
1147*7249d1a6SKrzysztof Kosiński                })
1148*7249d1a6SKrzysztof Kosiński        """)
1149*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1150*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1151*7249d1a6SKrzysztof Kosiński
1152*7249d1a6SKrzysztof Kosiński  def testLineWrapInForExpression(self):
1153*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1154*7249d1a6SKrzysztof Kosiński        class A:
1155*7249d1a6SKrzysztof Kosiński
1156*7249d1a6SKrzysztof Kosiński          def x(self, node, name, n=1):
1157*7249d1a6SKrzysztof Kosiński            for i, child in enumerate(
1158*7249d1a6SKrzysztof Kosiński                itertools.ifilter(lambda c: pytree_utils.NodeName(c) == name,
1159*7249d1a6SKrzysztof Kosiński                                  node.pre_order())):
1160*7249d1a6SKrzysztof Kosiński              pass
1161*7249d1a6SKrzysztof Kosiński        """)
1162*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1163*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1164*7249d1a6SKrzysztof Kosiński
1165*7249d1a6SKrzysztof Kosiński  def testFunctionCallContinuationLine(self):
1166*7249d1a6SKrzysztof Kosiński    code = """\
1167*7249d1a6SKrzysztof Kosińskiclass foo:
1168*7249d1a6SKrzysztof Kosiński
1169*7249d1a6SKrzysztof Kosiński  def bar(self, node, name, n=1):
1170*7249d1a6SKrzysztof Kosiński    if True:
1171*7249d1a6SKrzysztof Kosiński      if True:
1172*7249d1a6SKrzysztof Kosiński        return [(aaaaaaaaaa,
1173*7249d1a6SKrzysztof Kosiński                 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(
1174*7249d1a6SKrzysztof Kosiński                     cccc, ddddddddddddddddddddddddddddddddddddd))]
1175*7249d1a6SKrzysztof Kosiński"""
1176*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1177*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1178*7249d1a6SKrzysztof Kosiński
1179*7249d1a6SKrzysztof Kosiński  def testI18nNonFormatting(self):
1180*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1181*7249d1a6SKrzysztof Kosiński        class F(object):
1182*7249d1a6SKrzysztof Kosiński
1183*7249d1a6SKrzysztof Kosiński          def __init__(self, fieldname,
1184*7249d1a6SKrzysztof Kosiński                       #. Error message indicating an invalid e-mail address.
1185*7249d1a6SKrzysztof Kosiński                       message=N_('Please check your email address.'), **kwargs):
1186*7249d1a6SKrzysztof Kosiński            pass
1187*7249d1a6SKrzysztof Kosiński        """)  # noqa
1188*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1189*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1190*7249d1a6SKrzysztof Kosiński
1191*7249d1a6SKrzysztof Kosiński  def testNoSpaceBetweenUnaryOpAndOpeningParen(self):
1192*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1193*7249d1a6SKrzysztof Kosiński        if ~(a or b):
1194*7249d1a6SKrzysztof Kosiński          pass
1195*7249d1a6SKrzysztof Kosiński        """)
1196*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1197*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1198*7249d1a6SKrzysztof Kosiński
1199*7249d1a6SKrzysztof Kosiński  def testCommentBeforeFuncDef(self):
1200*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1201*7249d1a6SKrzysztof Kosiński        class Foo(object):
1202*7249d1a6SKrzysztof Kosiński
1203*7249d1a6SKrzysztof Kosiński          a = 42
1204*7249d1a6SKrzysztof Kosiński
1205*7249d1a6SKrzysztof Kosiński          # This is a comment.
1206*7249d1a6SKrzysztof Kosiński          def __init__(self,
1207*7249d1a6SKrzysztof Kosiński                       xxxxxxx,
1208*7249d1a6SKrzysztof Kosiński                       yyyyy=0,
1209*7249d1a6SKrzysztof Kosiński                       zzzzzzz=None,
1210*7249d1a6SKrzysztof Kosiński                       aaaaaaaaaaaaaaaaaa=False,
1211*7249d1a6SKrzysztof Kosiński                       bbbbbbbbbbbbbbb=False):
1212*7249d1a6SKrzysztof Kosiński            pass
1213*7249d1a6SKrzysztof Kosiński        """)
1214*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1215*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1216*7249d1a6SKrzysztof Kosiński
1217*7249d1a6SKrzysztof Kosiński  def testExcessLineCountWithDefaultKeywords(self):
1218*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1219*7249d1a6SKrzysztof Kosiński        class Fnord(object):
1220*7249d1a6SKrzysztof Kosiński          def Moo(self):
1221*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaa = self._bbbbbbbbbbbbbbbbbbbbbbb(
1222*7249d1a6SKrzysztof Kosiński                ccccccccccccc=ccccccccccccc, ddddddd=ddddddd, eeee=eeee,
1223*7249d1a6SKrzysztof Kosiński                fffff=fffff, ggggggg=ggggggg, hhhhhhhhhhhhh=hhhhhhhhhhhhh,
1224*7249d1a6SKrzysztof Kosiński                iiiiiii=iiiiiiiiiiiiii)
1225*7249d1a6SKrzysztof Kosiński        """)
1226*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1227*7249d1a6SKrzysztof Kosiński        class Fnord(object):
1228*7249d1a6SKrzysztof Kosiński
1229*7249d1a6SKrzysztof Kosiński          def Moo(self):
1230*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaa = self._bbbbbbbbbbbbbbbbbbbbbbb(
1231*7249d1a6SKrzysztof Kosiński                ccccccccccccc=ccccccccccccc,
1232*7249d1a6SKrzysztof Kosiński                ddddddd=ddddddd,
1233*7249d1a6SKrzysztof Kosiński                eeee=eeee,
1234*7249d1a6SKrzysztof Kosiński                fffff=fffff,
1235*7249d1a6SKrzysztof Kosiński                ggggggg=ggggggg,
1236*7249d1a6SKrzysztof Kosiński                hhhhhhhhhhhhh=hhhhhhhhhhhhh,
1237*7249d1a6SKrzysztof Kosiński                iiiiiii=iiiiiiiiiiiiii)
1238*7249d1a6SKrzysztof Kosiński        """)
1239*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1240*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1241*7249d1a6SKrzysztof Kosiński
1242*7249d1a6SKrzysztof Kosiński  def testSpaceAfterNotOperator(self):
1243*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1244*7249d1a6SKrzysztof Kosiński        if not (this and that):
1245*7249d1a6SKrzysztof Kosiński          pass
1246*7249d1a6SKrzysztof Kosiński        """)
1247*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1248*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1249*7249d1a6SKrzysztof Kosiński
1250*7249d1a6SKrzysztof Kosiński  def testNoPenaltySplitting(self):
1251*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1252*7249d1a6SKrzysztof Kosiński        def f():
1253*7249d1a6SKrzysztof Kosiński          if True:
1254*7249d1a6SKrzysztof Kosiński            if True:
1255*7249d1a6SKrzysztof Kosiński              python_files.extend(
1256*7249d1a6SKrzysztof Kosiński                  os.path.join(filename, f)
1257*7249d1a6SKrzysztof Kosiński                  for f in os.listdir(filename)
1258*7249d1a6SKrzysztof Kosiński                  if IsPythonFile(os.path.join(filename, f)))
1259*7249d1a6SKrzysztof Kosiński        """)
1260*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1261*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1262*7249d1a6SKrzysztof Kosiński
1263*7249d1a6SKrzysztof Kosiński  def testExpressionPenalties(self):
1264*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1265*7249d1a6SKrzysztof Kosiński      def f():
1266*7249d1a6SKrzysztof Kosiński        if ((left.value == '(' and right.value == ')') or
1267*7249d1a6SKrzysztof Kosiński            (left.value == '[' and right.value == ']') or
1268*7249d1a6SKrzysztof Kosiński            (left.value == '{' and right.value == '}')):
1269*7249d1a6SKrzysztof Kosiński          return False
1270*7249d1a6SKrzysztof Kosiński        """)
1271*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1272*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1273*7249d1a6SKrzysztof Kosiński
1274*7249d1a6SKrzysztof Kosiński  def testLineDepthOfSingleLineStatement(self):
1275*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1276*7249d1a6SKrzysztof Kosiński        while True: continue
1277*7249d1a6SKrzysztof Kosiński        for x in range(3): continue
1278*7249d1a6SKrzysztof Kosiński        try: a = 42
1279*7249d1a6SKrzysztof Kosiński        except: b = 42
1280*7249d1a6SKrzysztof Kosiński        with open(a) as fd: a = fd.read()
1281*7249d1a6SKrzysztof Kosiński        """)
1282*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1283*7249d1a6SKrzysztof Kosiński        while True:
1284*7249d1a6SKrzysztof Kosiński          continue
1285*7249d1a6SKrzysztof Kosiński        for x in range(3):
1286*7249d1a6SKrzysztof Kosiński          continue
1287*7249d1a6SKrzysztof Kosiński        try:
1288*7249d1a6SKrzysztof Kosiński          a = 42
1289*7249d1a6SKrzysztof Kosiński        except:
1290*7249d1a6SKrzysztof Kosiński          b = 42
1291*7249d1a6SKrzysztof Kosiński        with open(a) as fd:
1292*7249d1a6SKrzysztof Kosiński          a = fd.read()
1293*7249d1a6SKrzysztof Kosiński        """)
1294*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1295*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1296*7249d1a6SKrzysztof Kosiński
1297*7249d1a6SKrzysztof Kosiński  def testSplitListWithTerminatingComma(self):
1298*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1299*7249d1a6SKrzysztof Kosiński        FOO = ['bar', 'baz', 'mux', 'qux', 'quux', 'quuux', 'quuuux',
1300*7249d1a6SKrzysztof Kosiński          'quuuuux', 'quuuuuux', 'quuuuuuux', lambda a, b: 37,]
1301*7249d1a6SKrzysztof Kosiński        """)
1302*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1303*7249d1a6SKrzysztof Kosiński        FOO = [
1304*7249d1a6SKrzysztof Kosiński            'bar',
1305*7249d1a6SKrzysztof Kosiński            'baz',
1306*7249d1a6SKrzysztof Kosiński            'mux',
1307*7249d1a6SKrzysztof Kosiński            'qux',
1308*7249d1a6SKrzysztof Kosiński            'quux',
1309*7249d1a6SKrzysztof Kosiński            'quuux',
1310*7249d1a6SKrzysztof Kosiński            'quuuux',
1311*7249d1a6SKrzysztof Kosiński            'quuuuux',
1312*7249d1a6SKrzysztof Kosiński            'quuuuuux',
1313*7249d1a6SKrzysztof Kosiński            'quuuuuuux',
1314*7249d1a6SKrzysztof Kosiński            lambda a, b: 37,
1315*7249d1a6SKrzysztof Kosiński        ]
1316*7249d1a6SKrzysztof Kosiński        """)
1317*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1318*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1319*7249d1a6SKrzysztof Kosiński
1320*7249d1a6SKrzysztof Kosiński  def testSplitListWithInterspersedComments(self):
1321*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1322*7249d1a6SKrzysztof Kosiński        FOO = [
1323*7249d1a6SKrzysztof Kosiński            'bar',  # bar
1324*7249d1a6SKrzysztof Kosiński            'baz',  # baz
1325*7249d1a6SKrzysztof Kosiński            'mux',  # mux
1326*7249d1a6SKrzysztof Kosiński            'qux',  # qux
1327*7249d1a6SKrzysztof Kosiński            'quux',  # quux
1328*7249d1a6SKrzysztof Kosiński            'quuux',  # quuux
1329*7249d1a6SKrzysztof Kosiński            'quuuux',  # quuuux
1330*7249d1a6SKrzysztof Kosiński            'quuuuux',  # quuuuux
1331*7249d1a6SKrzysztof Kosiński            'quuuuuux',  # quuuuuux
1332*7249d1a6SKrzysztof Kosiński            'quuuuuuux',  # quuuuuuux
1333*7249d1a6SKrzysztof Kosiński            lambda a, b: 37  # lambda
1334*7249d1a6SKrzysztof Kosiński        ]
1335*7249d1a6SKrzysztof Kosiński        """)
1336*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1337*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1338*7249d1a6SKrzysztof Kosiński
1339*7249d1a6SKrzysztof Kosiński  def testRelativeImportStatements(self):
1340*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1341*7249d1a6SKrzysztof Kosiński        from ... import bork
1342*7249d1a6SKrzysztof Kosiński        """)
1343*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1344*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1345*7249d1a6SKrzysztof Kosiński
1346*7249d1a6SKrzysztof Kosiński  def testSingleLineList(self):
1347*7249d1a6SKrzysztof Kosiński    # A list on a single line should prefer to remain contiguous.
1348*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1349*7249d1a6SKrzysztof Kosiński        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = aaaaaaaaaaa(
1350*7249d1a6SKrzysztof Kosiński            ("...", "."), "..",
1351*7249d1a6SKrzysztof Kosiński            ".............................................."
1352*7249d1a6SKrzysztof Kosiński        )
1353*7249d1a6SKrzysztof Kosiński        """)
1354*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1355*7249d1a6SKrzysztof Kosiński        bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = aaaaaaaaaaa(
1356*7249d1a6SKrzysztof Kosiński            ("...", "."), "..", "..............................................")
1357*7249d1a6SKrzysztof Kosiński        """)  # noqa
1358*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1359*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1360*7249d1a6SKrzysztof Kosiński
1361*7249d1a6SKrzysztof Kosiński  def testBlankLinesBeforeFunctionsNotInColumnZero(self):
1362*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1363*7249d1a6SKrzysztof Kosiński        import signal
1364*7249d1a6SKrzysztof Kosiński
1365*7249d1a6SKrzysztof Kosiński
1366*7249d1a6SKrzysztof Kosiński        try:
1367*7249d1a6SKrzysztof Kosiński          signal.SIGALRM
1368*7249d1a6SKrzysztof Kosiński          # ..................................................................
1369*7249d1a6SKrzysztof Kosiński          # ...............................................................
1370*7249d1a6SKrzysztof Kosiński
1371*7249d1a6SKrzysztof Kosiński
1372*7249d1a6SKrzysztof Kosiński          def timeout(seconds=1):
1373*7249d1a6SKrzysztof Kosiński            pass
1374*7249d1a6SKrzysztof Kosiński        except:
1375*7249d1a6SKrzysztof Kosiński          pass
1376*7249d1a6SKrzysztof Kosiński        """)
1377*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1378*7249d1a6SKrzysztof Kosiński        import signal
1379*7249d1a6SKrzysztof Kosiński
1380*7249d1a6SKrzysztof Kosiński        try:
1381*7249d1a6SKrzysztof Kosiński          signal.SIGALRM
1382*7249d1a6SKrzysztof Kosiński
1383*7249d1a6SKrzysztof Kosiński          # ..................................................................
1384*7249d1a6SKrzysztof Kosiński          # ...............................................................
1385*7249d1a6SKrzysztof Kosiński
1386*7249d1a6SKrzysztof Kosiński
1387*7249d1a6SKrzysztof Kosiński          def timeout(seconds=1):
1388*7249d1a6SKrzysztof Kosiński            pass
1389*7249d1a6SKrzysztof Kosiński        except:
1390*7249d1a6SKrzysztof Kosiński          pass
1391*7249d1a6SKrzysztof Kosiński        """)  # noqa
1392*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1393*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1394*7249d1a6SKrzysztof Kosiński
1395*7249d1a6SKrzysztof Kosiński  def testNoKeywordArgumentBreakage(self):
1396*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1397*7249d1a6SKrzysztof Kosiński        class A(object):
1398*7249d1a6SKrzysztof Kosiński
1399*7249d1a6SKrzysztof Kosiński          def b(self):
1400*7249d1a6SKrzysztof Kosiński            if self.aaaaaaaaaaaaaaaaaaaa not in self.bbbbbbbbbb(
1401*7249d1a6SKrzysztof Kosiński                cccccccccccccccccccc=True):
1402*7249d1a6SKrzysztof Kosiński              pass
1403*7249d1a6SKrzysztof Kosiński        """)
1404*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1405*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1406*7249d1a6SKrzysztof Kosiński
1407*7249d1a6SKrzysztof Kosiński  def testTrailerOnSingleLine(self):
1408*7249d1a6SKrzysztof Kosiński    code = """\
1409*7249d1a6SKrzysztof Kosińskiurlpatterns = patterns('', url(r'^$', 'homepage_view'),
1410*7249d1a6SKrzysztof Kosiński                       url(r'^/login/$', 'login_view'),
1411*7249d1a6SKrzysztof Kosiński                       url(r'^/login/$', 'logout_view'),
1412*7249d1a6SKrzysztof Kosiński                       url(r'^/user/(?P<username>\\w+)/$', 'profile_view'))
1413*7249d1a6SKrzysztof Kosiński"""
1414*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1415*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1416*7249d1a6SKrzysztof Kosiński
1417*7249d1a6SKrzysztof Kosiński  def testIfConditionalParens(self):
1418*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1419*7249d1a6SKrzysztof Kosiński        class Foo:
1420*7249d1a6SKrzysztof Kosiński
1421*7249d1a6SKrzysztof Kosiński          def bar():
1422*7249d1a6SKrzysztof Kosiński            if True:
1423*7249d1a6SKrzysztof Kosiński              if (child.type == grammar_token.NAME and
1424*7249d1a6SKrzysztof Kosiński                  child.value in substatement_names):
1425*7249d1a6SKrzysztof Kosiński                pass
1426*7249d1a6SKrzysztof Kosiński        """)
1427*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1428*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1429*7249d1a6SKrzysztof Kosiński
1430*7249d1a6SKrzysztof Kosiński  def testContinuationMarkers(self):
1431*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1432*7249d1a6SKrzysztof Kosiński        text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. "\\
1433*7249d1a6SKrzysztof Kosiński               "Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur "\\
1434*7249d1a6SKrzysztof Kosiński               "ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis "\\
1435*7249d1a6SKrzysztof Kosiński               "sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. "\\
1436*7249d1a6SKrzysztof Kosiński               "Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet"
1437*7249d1a6SKrzysztof Kosiński        """)  # noqa
1438*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1439*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1440*7249d1a6SKrzysztof Kosiński
1441*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1442*7249d1a6SKrzysztof Kosiński        from __future__ import nested_scopes, generators, division, absolute_import, with_statement, \\
1443*7249d1a6SKrzysztof Kosiński            print_function, unicode_literals
1444*7249d1a6SKrzysztof Kosiński        """)  # noqa
1445*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1446*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1447*7249d1a6SKrzysztof Kosiński
1448*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1449*7249d1a6SKrzysztof Kosiński        if aaaaaaaaa == 42 and bbbbbbbbbbbbbb == 42 and \\
1450*7249d1a6SKrzysztof Kosiński           cccccccc == 42:
1451*7249d1a6SKrzysztof Kosiński          pass
1452*7249d1a6SKrzysztof Kosiński        """)
1453*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1454*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1455*7249d1a6SKrzysztof Kosiński
1456*7249d1a6SKrzysztof Kosiński  def testCommentsWithContinuationMarkers(self):
1457*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1458*7249d1a6SKrzysztof Kosiński        def fn(arg):
1459*7249d1a6SKrzysztof Kosiński          v = fn2(key1=True,
1460*7249d1a6SKrzysztof Kosiński                  #c1
1461*7249d1a6SKrzysztof Kosiński                  key2=arg)\\
1462*7249d1a6SKrzysztof Kosiński                        .fn3()
1463*7249d1a6SKrzysztof Kosiński        """)
1464*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1465*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1466*7249d1a6SKrzysztof Kosiński
1467*7249d1a6SKrzysztof Kosiński  def testMultipleContinuationMarkers(self):
1468*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1469*7249d1a6SKrzysztof Kosiński        xyz = \\
1470*7249d1a6SKrzysztof Kosiński            \\
1471*7249d1a6SKrzysztof Kosiński            some_thing()
1472*7249d1a6SKrzysztof Kosiński        """)
1473*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1474*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1475*7249d1a6SKrzysztof Kosiński
1476*7249d1a6SKrzysztof Kosiński  def testContinuationMarkerAfterStringWithContinuation(self):
1477*7249d1a6SKrzysztof Kosiński    code = """\
1478*7249d1a6SKrzysztof Kosińskis = 'foo \\
1479*7249d1a6SKrzysztof Kosiński    bar' \\
1480*7249d1a6SKrzysztof Kosiński    .format()
1481*7249d1a6SKrzysztof Kosiński"""
1482*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1483*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1484*7249d1a6SKrzysztof Kosiński
1485*7249d1a6SKrzysztof Kosiński  def testEmptyContainers(self):
1486*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1487*7249d1a6SKrzysztof Kosiński        flags.DEFINE_list(
1488*7249d1a6SKrzysztof Kosiński            'output_dirs', [],
1489*7249d1a6SKrzysztof Kosiński            'Lorem ipsum dolor sit amet, consetetur adipiscing elit. Donec a diam lectus. '
1490*7249d1a6SKrzysztof Kosiński            'Sed sit amet ipsum mauris. Maecenas congue.')
1491*7249d1a6SKrzysztof Kosiński        """)  # noqa
1492*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1493*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1494*7249d1a6SKrzysztof Kosiński
1495*7249d1a6SKrzysztof Kosiński  def testSplitStringsIfSurroundedByParens(self):
1496*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1497*7249d1a6SKrzysztof Kosiński        a = foo.bar({'xxxxxxxxxxxxxxxxxxxxxxx' 'yyyyyyyyyyyyyyyyyyyyyyyyyy': baz[42]} + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 'bbbbbbbbbbbbbbbbbbbbbbbbbb' 'cccccccccccccccccccccccccccccccc' 'ddddddddddddddddddddddddddddd')
1498*7249d1a6SKrzysztof Kosiński        """)  # noqa
1499*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1500*7249d1a6SKrzysztof Kosiński        a = foo.bar({'xxxxxxxxxxxxxxxxxxxxxxx'
1501*7249d1a6SKrzysztof Kosiński                     'yyyyyyyyyyyyyyyyyyyyyyyyyy': baz[42]} +
1502*7249d1a6SKrzysztof Kosiński                    'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
1503*7249d1a6SKrzysztof Kosiński                    'bbbbbbbbbbbbbbbbbbbbbbbbbb'
1504*7249d1a6SKrzysztof Kosiński                    'cccccccccccccccccccccccccccccccc'
1505*7249d1a6SKrzysztof Kosiński                    'ddddddddddddddddddddddddddddd')
1506*7249d1a6SKrzysztof Kosiński        """)
1507*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1508*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1509*7249d1a6SKrzysztof Kosiński
1510*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1511*7249d1a6SKrzysztof Kosiński        a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \
1512*7249d1a6SKrzysztof Kosiński'bbbbbbbbbbbbbbbbbbbbbbbbbb' 'cccccccccccccccccccccccccccccccc' \
1513*7249d1a6SKrzysztof Kosiński'ddddddddddddddddddddddddddddd'
1514*7249d1a6SKrzysztof Kosiński        """)
1515*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1516*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1517*7249d1a6SKrzysztof Kosiński
1518*7249d1a6SKrzysztof Kosiński  def testMultilineShebang(self):
1519*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1520*7249d1a6SKrzysztof Kosiński        #!/bin/sh
1521*7249d1a6SKrzysztof Kosiński        if "true" : '''\'
1522*7249d1a6SKrzysztof Kosiński        then
1523*7249d1a6SKrzysztof Kosiński
1524*7249d1a6SKrzysztof Kosiński        export FOO=123
1525*7249d1a6SKrzysztof Kosiński        exec /usr/bin/env python "$0" "$@"
1526*7249d1a6SKrzysztof Kosiński
1527*7249d1a6SKrzysztof Kosiński        exit 127
1528*7249d1a6SKrzysztof Kosiński        fi
1529*7249d1a6SKrzysztof Kosiński        '''
1530*7249d1a6SKrzysztof Kosiński
1531*7249d1a6SKrzysztof Kosiński        import os
1532*7249d1a6SKrzysztof Kosiński
1533*7249d1a6SKrzysztof Kosiński        assert os.environ['FOO'] == '123'
1534*7249d1a6SKrzysztof Kosiński        """)
1535*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1536*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1537*7249d1a6SKrzysztof Kosiński
1538*7249d1a6SKrzysztof Kosiński  def testNoSplittingAroundTermOperators(self):
1539*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1540*7249d1a6SKrzysztof Kosiński        a_very_long_function_call_yada_yada_etc_etc_etc(long_arg1,
1541*7249d1a6SKrzysztof Kosiński                                                        long_arg2 / long_arg3)
1542*7249d1a6SKrzysztof Kosiński        """)
1543*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1544*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1545*7249d1a6SKrzysztof Kosiński
1546*7249d1a6SKrzysztof Kosiński  def testNoSplittingWithinSubscriptList(self):
1547*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1548*7249d1a6SKrzysztof Kosiński        somequitelongvariablename.somemember[(a, b)] = {
1549*7249d1a6SKrzysztof Kosiński            'somelongkey': 1,
1550*7249d1a6SKrzysztof Kosiński            'someotherlongkey': 2
1551*7249d1a6SKrzysztof Kosiński        }
1552*7249d1a6SKrzysztof Kosiński        """)
1553*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1554*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1555*7249d1a6SKrzysztof Kosiński
1556*7249d1a6SKrzysztof Kosiński  def testExcessCharacters(self):
1557*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1558*7249d1a6SKrzysztof Kosiński        class foo:
1559*7249d1a6SKrzysztof Kosiński
1560*7249d1a6SKrzysztof Kosiński          def bar(self):
1561*7249d1a6SKrzysztof Kosiński            self.write(s=[
1562*7249d1a6SKrzysztof Kosiński                '%s%s %s' % ('many of really', 'long strings', '+ just makes up 81')
1563*7249d1a6SKrzysztof Kosiński            ])
1564*7249d1a6SKrzysztof Kosiński        """)  # noqa
1565*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1566*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1567*7249d1a6SKrzysztof Kosiński
1568*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1569*7249d1a6SKrzysztof Kosiński        def _():
1570*7249d1a6SKrzysztof Kosiński          if True:
1571*7249d1a6SKrzysztof Kosiński            if True:
1572*7249d1a6SKrzysztof Kosiński              if contract == allow_contract and attr_dict.get(if_attribute) == has_value:
1573*7249d1a6SKrzysztof Kosiński                return True
1574*7249d1a6SKrzysztof Kosiński        """)  # noqa
1575*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
1576*7249d1a6SKrzysztof Kosiński        def _():
1577*7249d1a6SKrzysztof Kosiński          if True:
1578*7249d1a6SKrzysztof Kosiński            if True:
1579*7249d1a6SKrzysztof Kosiński              if contract == allow_contract and attr_dict.get(
1580*7249d1a6SKrzysztof Kosiński                  if_attribute) == has_value:
1581*7249d1a6SKrzysztof Kosiński                return True
1582*7249d1a6SKrzysztof Kosiński        """)
1583*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1584*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
1585*7249d1a6SKrzysztof Kosiński
1586*7249d1a6SKrzysztof Kosiński  def testDictSetGenerator(self):
1587*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1588*7249d1a6SKrzysztof Kosiński        foo = {
1589*7249d1a6SKrzysztof Kosiński            variable: 'hello world. How are you today?'
1590*7249d1a6SKrzysztof Kosiński            for variable in fnord
1591*7249d1a6SKrzysztof Kosiński            if variable != 37
1592*7249d1a6SKrzysztof Kosiński        }
1593*7249d1a6SKrzysztof Kosiński        """)
1594*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1595*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1596*7249d1a6SKrzysztof Kosiński
1597*7249d1a6SKrzysztof Kosiński  def testUnaryOpInDictionaryValue(self):
1598*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1599*7249d1a6SKrzysztof Kosiński        beta = "123"
1600*7249d1a6SKrzysztof Kosiński
1601*7249d1a6SKrzysztof Kosiński        test = {'alpha': beta[-1]}
1602*7249d1a6SKrzysztof Kosiński
1603*7249d1a6SKrzysztof Kosiński        print(beta[-1])
1604*7249d1a6SKrzysztof Kosiński        """)
1605*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1606*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1607*7249d1a6SKrzysztof Kosiński
1608*7249d1a6SKrzysztof Kosiński  def testUnaryNotOperator(self):
1609*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1610*7249d1a6SKrzysztof Kosiński        if True:
1611*7249d1a6SKrzysztof Kosiński          if True:
1612*7249d1a6SKrzysztof Kosiński            if True:
1613*7249d1a6SKrzysztof Kosiński              if True:
1614*7249d1a6SKrzysztof Kosiński                remote_checksum = self.get_checksum(conn, tmp, dest, inject,
1615*7249d1a6SKrzysztof Kosiński                                                    not directory_prepended, source)
1616*7249d1a6SKrzysztof Kosiński        """)  # noqa
1617*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1618*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1619*7249d1a6SKrzysztof Kosiński
1620*7249d1a6SKrzysztof Kosiński  def testRelaxArraySubscriptAffinity(self):
1621*7249d1a6SKrzysztof Kosiński    code = """\
1622*7249d1a6SKrzysztof Kosińskiclass A(object):
1623*7249d1a6SKrzysztof Kosiński
1624*7249d1a6SKrzysztof Kosiński  def f(self, aaaaaaaaa, bbbbbbbbbbbbb, row):
1625*7249d1a6SKrzysztof Kosiński    if True:
1626*7249d1a6SKrzysztof Kosiński      if True:
1627*7249d1a6SKrzysztof Kosiński        if True:
1628*7249d1a6SKrzysztof Kosiński          if True:
1629*7249d1a6SKrzysztof Kosiński            if row[4] is None or row[5] is None:
1630*7249d1a6SKrzysztof Kosiński              bbbbbbbbbbbbb[
1631*7249d1a6SKrzysztof Kosiński                  '..............'] = row[5] if row[5] is not None else 5
1632*7249d1a6SKrzysztof Kosiński"""
1633*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1634*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1635*7249d1a6SKrzysztof Kosiński
1636*7249d1a6SKrzysztof Kosiński  def testFunctionCallInDict(self):
1637*7249d1a6SKrzysztof Kosiński    code = "a = {'a': b(c=d, **e)}\n"
1638*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1639*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1640*7249d1a6SKrzysztof Kosiński
1641*7249d1a6SKrzysztof Kosiński  def testFunctionCallInNestedDict(self):
1642*7249d1a6SKrzysztof Kosiński    code = "a = {'a': {'a': {'a': b(c=d, **e)}}}\n"
1643*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1644*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1645*7249d1a6SKrzysztof Kosiński
1646*7249d1a6SKrzysztof Kosiński  def testUnbreakableNot(self):
1647*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1648*7249d1a6SKrzysztof Kosiński        def test():
1649*7249d1a6SKrzysztof Kosiński          if not "Foooooooooooooooooooooooooooooo" or "Foooooooooooooooooooooooooooooo" == "Foooooooooooooooooooooooooooooo":
1650*7249d1a6SKrzysztof Kosiński            pass
1651*7249d1a6SKrzysztof Kosiński        """)  # noqa
1652*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1653*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1654*7249d1a6SKrzysztof Kosiński
1655*7249d1a6SKrzysztof Kosiński  def testSplitListWithComment(self):
1656*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1657*7249d1a6SKrzysztof Kosiński      a = [
1658*7249d1a6SKrzysztof Kosiński          'a',
1659*7249d1a6SKrzysztof Kosiński          'b',
1660*7249d1a6SKrzysztof Kosiński          'c'  # hello world
1661*7249d1a6SKrzysztof Kosiński      ]
1662*7249d1a6SKrzysztof Kosiński      """)
1663*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1664*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1665*7249d1a6SKrzysztof Kosiński
1666*7249d1a6SKrzysztof Kosiński  def testOverColumnLimit(self):
1667*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1668*7249d1a6SKrzysztof Kosiński      class Test:
1669*7249d1a6SKrzysztof Kosiński
1670*7249d1a6SKrzysztof Kosiński        def testSomething(self):
1671*7249d1a6SKrzysztof Kosiński          expected = {
1672*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc',
1673*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc',
1674*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'): 'ccccccccccccccccccccccccccccccccccccccccccc',
1675*7249d1a6SKrzysztof Kosiński          }
1676*7249d1a6SKrzysztof Kosiński        """)  # noqa
1677*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1678*7249d1a6SKrzysztof Kosiński      class Test:
1679*7249d1a6SKrzysztof Kosiński
1680*7249d1a6SKrzysztof Kosiński        def testSomething(self):
1681*7249d1a6SKrzysztof Kosiński          expected = {
1682*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'):
1683*7249d1a6SKrzysztof Kosiński                  'ccccccccccccccccccccccccccccccccccccccccccc',
1684*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'):
1685*7249d1a6SKrzysztof Kosiński                  'ccccccccccccccccccccccccccccccccccccccccccc',
1686*7249d1a6SKrzysztof Kosiński              ('aaaaaaaaaaaaa', 'bbbb'):
1687*7249d1a6SKrzysztof Kosiński                  'ccccccccccccccccccccccccccccccccccccccccccc',
1688*7249d1a6SKrzysztof Kosiński          }
1689*7249d1a6SKrzysztof Kosiński        """)
1690*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1691*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1692*7249d1a6SKrzysztof Kosiński
1693*7249d1a6SKrzysztof Kosiński  def testEndingComment(self):
1694*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1695*7249d1a6SKrzysztof Kosiński      a = f(
1696*7249d1a6SKrzysztof Kosiński          a="something",
1697*7249d1a6SKrzysztof Kosiński          b="something requiring comment which is quite long",  # comment about b (pushes line over 79)
1698*7249d1a6SKrzysztof Kosiński          c="something else, about which comment doesn't make sense")
1699*7249d1a6SKrzysztof Kosiński      """)  # noqa
1700*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1701*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1702*7249d1a6SKrzysztof Kosiński
1703*7249d1a6SKrzysztof Kosiński  def testContinuationSpaceRetention(self):
1704*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1705*7249d1a6SKrzysztof Kosiński      def fn():
1706*7249d1a6SKrzysztof Kosiński        return module \\
1707*7249d1a6SKrzysztof Kosiński               .method(Object(data,
1708*7249d1a6SKrzysztof Kosiński                   fn2(arg)
1709*7249d1a6SKrzysztof Kosiński               ))
1710*7249d1a6SKrzysztof Kosiński      """)
1711*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1712*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1713*7249d1a6SKrzysztof Kosiński
1714*7249d1a6SKrzysztof Kosiński  def testIfExpressionWithFunctionCall(self):
1715*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1716*7249d1a6SKrzysztof Kosiński      if x or z.y(
1717*7249d1a6SKrzysztof Kosiński          a,
1718*7249d1a6SKrzysztof Kosiński          c,
1719*7249d1a6SKrzysztof Kosiński          aaaaaaaaaaaaaaaaaaaaa=aaaaaaaaaaaaaaaaaa,
1720*7249d1a6SKrzysztof Kosiński          bbbbbbbbbbbbbbbbbbbbb=bbbbbbbbbbbbbbbbbb):
1721*7249d1a6SKrzysztof Kosiński        pass
1722*7249d1a6SKrzysztof Kosiński      """)
1723*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1724*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1725*7249d1a6SKrzysztof Kosiński
1726*7249d1a6SKrzysztof Kosiński  def testUnformattedAfterMultilineString(self):
1727*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1728*7249d1a6SKrzysztof Kosiński      def foo():
1729*7249d1a6SKrzysztof Kosiński        com_text = \\
1730*7249d1a6SKrzysztof Kosiński      '''
1731*7249d1a6SKrzysztof Kosiński      TEST
1732*7249d1a6SKrzysztof Kosiński      ''' % (input_fname, output_fname)
1733*7249d1a6SKrzysztof Kosiński      """)
1734*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1735*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1736*7249d1a6SKrzysztof Kosiński
1737*7249d1a6SKrzysztof Kosiński  def testNoSpacesAroundKeywordDefaultValues(self):
1738*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1739*7249d1a6SKrzysztof Kosiński      sources = {
1740*7249d1a6SKrzysztof Kosiński          'json': request.get_json(silent=True) or {},
1741*7249d1a6SKrzysztof Kosiński          'json2': request.get_json(silent=True),
1742*7249d1a6SKrzysztof Kosiński      }
1743*7249d1a6SKrzysztof Kosiński      json = request.get_json(silent=True) or {}
1744*7249d1a6SKrzysztof Kosiński      """)
1745*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1746*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1747*7249d1a6SKrzysztof Kosiński
1748*7249d1a6SKrzysztof Kosiński  def testNoSplittingBeforeEndingSubscriptBracket(self):
1749*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1750*7249d1a6SKrzysztof Kosiński        if True:
1751*7249d1a6SKrzysztof Kosiński          if True:
1752*7249d1a6SKrzysztof Kosiński            status = cf.describe_stacks(StackName=stackname)[u'Stacks'][0][u'StackStatus']
1753*7249d1a6SKrzysztof Kosiński        """)  # noqa
1754*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1755*7249d1a6SKrzysztof Kosiński        if True:
1756*7249d1a6SKrzysztof Kosiński          if True:
1757*7249d1a6SKrzysztof Kosiński            status = cf.describe_stacks(
1758*7249d1a6SKrzysztof Kosiński                StackName=stackname)[u'Stacks'][0][u'StackStatus']
1759*7249d1a6SKrzysztof Kosiński        """)
1760*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1761*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1762*7249d1a6SKrzysztof Kosiński
1763*7249d1a6SKrzysztof Kosiński  def testNoSplittingOnSingleArgument(self):
1764*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1765*7249d1a6SKrzysztof Kosiński        xxxxxxxxxxxxxx = (re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+',
1766*7249d1a6SKrzysztof Kosiński                                    aaaaaaa.bbbbbbbbbbbb).group(1) +
1767*7249d1a6SKrzysztof Kosiński                          re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)',
1768*7249d1a6SKrzysztof Kosiński                                    ccccccc).group(1))
1769*7249d1a6SKrzysztof Kosiński        xxxxxxxxxxxxxx = (re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+',
1770*7249d1a6SKrzysztof Kosiński                                    aaaaaaa.bbbbbbbbbbbb).group(a.b) +
1771*7249d1a6SKrzysztof Kosiński                          re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)',
1772*7249d1a6SKrzysztof Kosiński                                    ccccccc).group(c.d))
1773*7249d1a6SKrzysztof Kosiński        """)
1774*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1775*7249d1a6SKrzysztof Kosiński        xxxxxxxxxxxxxx = (
1776*7249d1a6SKrzysztof Kosiński            re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', aaaaaaa.bbbbbbbbbbbb).group(1) +
1777*7249d1a6SKrzysztof Kosiński            re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', ccccccc).group(1))
1778*7249d1a6SKrzysztof Kosiński        xxxxxxxxxxxxxx = (
1779*7249d1a6SKrzysztof Kosiński            re.search(r'(\\d+\\.\\d+\\.\\d+\\.)\\d+', aaaaaaa.bbbbbbbbbbbb).group(a.b) +
1780*7249d1a6SKrzysztof Kosiński            re.search(r'\\d+\\.\\d+\\.\\d+\\.(\\d+)', ccccccc).group(c.d))
1781*7249d1a6SKrzysztof Kosiński        """)  # noqa
1782*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1783*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1784*7249d1a6SKrzysztof Kosiński
1785*7249d1a6SKrzysztof Kosiński  def testSplittingArraysSensibly(self):
1786*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1787*7249d1a6SKrzysztof Kosiński        while True:
1788*7249d1a6SKrzysztof Kosiński          while True:
1789*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list['bbbbbbbbbbbbbbbbbbbbbbbbb'].split(',')
1790*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list('bbbbbbbbbbbbbbbbbbbbbbbbb').split(',')
1791*7249d1a6SKrzysztof Kosiński        """)  # noqa
1792*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1793*7249d1a6SKrzysztof Kosiński        while True:
1794*7249d1a6SKrzysztof Kosiński          while True:
1795*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list[
1796*7249d1a6SKrzysztof Kosiński                'bbbbbbbbbbbbbbbbbbbbbbbbb'].split(',')
1797*7249d1a6SKrzysztof Kosiński            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = list(
1798*7249d1a6SKrzysztof Kosiński                'bbbbbbbbbbbbbbbbbbbbbbbbb').split(',')
1799*7249d1a6SKrzysztof Kosiński        """)
1800*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1801*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1802*7249d1a6SKrzysztof Kosiński
1803*7249d1a6SKrzysztof Kosiński  def testComprehensionForAndIf(self):
1804*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1805*7249d1a6SKrzysztof Kosiński        class f:
1806*7249d1a6SKrzysztof Kosiński
1807*7249d1a6SKrzysztof Kosiński          def __repr__(self):
1808*7249d1a6SKrzysztof Kosiński            tokens_repr = ','.join(['{0}({1!r})'.format(tok.name, tok.value) for tok in self._tokens])
1809*7249d1a6SKrzysztof Kosiński        """)  # noqa
1810*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1811*7249d1a6SKrzysztof Kosiński        class f:
1812*7249d1a6SKrzysztof Kosiński
1813*7249d1a6SKrzysztof Kosiński          def __repr__(self):
1814*7249d1a6SKrzysztof Kosiński            tokens_repr = ','.join(
1815*7249d1a6SKrzysztof Kosiński                ['{0}({1!r})'.format(tok.name, tok.value) for tok in self._tokens])
1816*7249d1a6SKrzysztof Kosiński        """)  # noqa
1817*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1818*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1819*7249d1a6SKrzysztof Kosiński
1820*7249d1a6SKrzysztof Kosiński  def testFunctionCallArguments(self):
1821*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1822*7249d1a6SKrzysztof Kosiński        def f():
1823*7249d1a6SKrzysztof Kosiński          if True:
1824*7249d1a6SKrzysztof Kosiński            pytree_utils.InsertNodesBefore(_CreateCommentsFromPrefix(
1825*7249d1a6SKrzysztof Kosiński                comment_prefix, comment_lineno, comment_column,
1826*7249d1a6SKrzysztof Kosiński                standalone=True), ancestor_at_indent)
1827*7249d1a6SKrzysztof Kosiński            pytree_utils.InsertNodesBefore(_CreateCommentsFromPrefix(
1828*7249d1a6SKrzysztof Kosiński                comment_prefix, comment_lineno, comment_column,
1829*7249d1a6SKrzysztof Kosiński                standalone=True))
1830*7249d1a6SKrzysztof Kosiński        """)
1831*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1832*7249d1a6SKrzysztof Kosiński        def f():
1833*7249d1a6SKrzysztof Kosiński          if True:
1834*7249d1a6SKrzysztof Kosiński            pytree_utils.InsertNodesBefore(
1835*7249d1a6SKrzysztof Kosiński                _CreateCommentsFromPrefix(
1836*7249d1a6SKrzysztof Kosiński                    comment_prefix, comment_lineno, comment_column, standalone=True),
1837*7249d1a6SKrzysztof Kosiński                ancestor_at_indent)
1838*7249d1a6SKrzysztof Kosiński            pytree_utils.InsertNodesBefore(
1839*7249d1a6SKrzysztof Kosiński                _CreateCommentsFromPrefix(
1840*7249d1a6SKrzysztof Kosiński                    comment_prefix, comment_lineno, comment_column, standalone=True))
1841*7249d1a6SKrzysztof Kosiński        """)  # noqa
1842*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1843*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1844*7249d1a6SKrzysztof Kosiński
1845*7249d1a6SKrzysztof Kosiński  def testBinaryOperators(self):
1846*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1847*7249d1a6SKrzysztof Kosiński        a = b ** 37
1848*7249d1a6SKrzysztof Kosiński        c = (20 ** -3) / (_GRID_ROWS ** (code_length - 10))
1849*7249d1a6SKrzysztof Kosiński        """)
1850*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1851*7249d1a6SKrzysztof Kosiński        a = b**37
1852*7249d1a6SKrzysztof Kosiński        c = (20**-3) / (_GRID_ROWS**(code_length - 10))
1853*7249d1a6SKrzysztof Kosiński        """)
1854*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1855*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
1856*7249d1a6SKrzysztof Kosiński
1857*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1858*7249d1a6SKrzysztof Kosiński      def f():
1859*7249d1a6SKrzysztof Kosiński        if True:
1860*7249d1a6SKrzysztof Kosiński          if (self.stack[-1].split_before_closing_bracket and
1861*7249d1a6SKrzysztof Kosiński              # FIXME(morbo): Use the 'matching_bracket' instead of this.
1862*7249d1a6SKrzysztof Kosiński              # FIXME(morbo): Don't forget about tuples!
1863*7249d1a6SKrzysztof Kosiński              current.value in ']}'):
1864*7249d1a6SKrzysztof Kosiński            pass
1865*7249d1a6SKrzysztof Kosiński      """)
1866*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1867*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1868*7249d1a6SKrzysztof Kosiński
1869*7249d1a6SKrzysztof Kosiński  def testContiguousList(self):
1870*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1871*7249d1a6SKrzysztof Kosiński      [retval1, retval2] = a_very_long_function(argument_1, argument2, argument_3,
1872*7249d1a6SKrzysztof Kosiński                                                argument_4)
1873*7249d1a6SKrzysztof Kosiński      """)  # noqa
1874*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1875*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1876*7249d1a6SKrzysztof Kosiński
1877*7249d1a6SKrzysztof Kosiński  def testArgsAndKwargsFormatting(self):
1878*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1879*7249d1a6SKrzysztof Kosiński      a(a=aaaaaaaaaaaaaaaaaaaaa,
1880*7249d1a6SKrzysztof Kosiński        b=aaaaaaaaaaaaaaaaaaaaaaaa,
1881*7249d1a6SKrzysztof Kosiński        c=aaaaaaaaaaaaaaaaaa,
1882*7249d1a6SKrzysztof Kosiński        *d,
1883*7249d1a6SKrzysztof Kosiński        **e)
1884*7249d1a6SKrzysztof Kosiński      """)
1885*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1886*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1887*7249d1a6SKrzysztof Kosiński
1888*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1889*7249d1a6SKrzysztof Kosiński      def foo():
1890*7249d1a6SKrzysztof Kosiński        return [
1891*7249d1a6SKrzysztof Kosiński            Bar(xxx='some string',
1892*7249d1a6SKrzysztof Kosiński                yyy='another long string',
1893*7249d1a6SKrzysztof Kosiński                zzz='a third long string')
1894*7249d1a6SKrzysztof Kosiński        ]
1895*7249d1a6SKrzysztof Kosiński      """)
1896*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1897*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1898*7249d1a6SKrzysztof Kosiński
1899*7249d1a6SKrzysztof Kosiński  def testCommentColumnLimitOverflow(self):
1900*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1901*7249d1a6SKrzysztof Kosiński      def f():
1902*7249d1a6SKrzysztof Kosiński        if True:
1903*7249d1a6SKrzysztof Kosiński          TaskManager.get_tags = MagicMock(
1904*7249d1a6SKrzysztof Kosiński              name='get_tags_mock',
1905*7249d1a6SKrzysztof Kosiński              return_value=[157031694470475],
1906*7249d1a6SKrzysztof Kosiński              # side_effect=[(157031694470475), (157031694470475),],
1907*7249d1a6SKrzysztof Kosiński          )
1908*7249d1a6SKrzysztof Kosiński      """)
1909*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
1910*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
1911*7249d1a6SKrzysztof Kosiński
1912*7249d1a6SKrzysztof Kosiński  def testMultilineLambdas(self):
1913*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1914*7249d1a6SKrzysztof Kosiński        class SomeClass(object):
1915*7249d1a6SKrzysztof Kosiński          do_something = True
1916*7249d1a6SKrzysztof Kosiński
1917*7249d1a6SKrzysztof Kosiński          def succeeded(self, dddddddddddddd):
1918*7249d1a6SKrzysztof Kosiński            d = defer.succeed(None)
1919*7249d1a6SKrzysztof Kosiński
1920*7249d1a6SKrzysztof Kosiński            if self.do_something:
1921*7249d1a6SKrzysztof Kosiński              d.addCallback(lambda _: self.aaaaaa.bbbbbbbbbbbbbbbb.cccccccccccccccccccccccccccccccc(dddddddddddddd))
1922*7249d1a6SKrzysztof Kosiński            return d
1923*7249d1a6SKrzysztof Kosiński        """)  # noqa
1924*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1925*7249d1a6SKrzysztof Kosiński        class SomeClass(object):
1926*7249d1a6SKrzysztof Kosiński          do_something = True
1927*7249d1a6SKrzysztof Kosiński
1928*7249d1a6SKrzysztof Kosiński          def succeeded(self, dddddddddddddd):
1929*7249d1a6SKrzysztof Kosiński            d = defer.succeed(None)
1930*7249d1a6SKrzysztof Kosiński
1931*7249d1a6SKrzysztof Kosiński            if self.do_something:
1932*7249d1a6SKrzysztof Kosiński              d.addCallback(lambda _: self.aaaaaa.bbbbbbbbbbbbbbbb.
1933*7249d1a6SKrzysztof Kosiński                            cccccccccccccccccccccccccccccccc(dddddddddddddd))
1934*7249d1a6SKrzysztof Kosiński            return d
1935*7249d1a6SKrzysztof Kosiński        """)
1936*7249d1a6SKrzysztof Kosiński
1937*7249d1a6SKrzysztof Kosiński    try:
1938*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
1939*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
1940*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, allow_multiline_lambdas: true}'))
1941*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1942*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
1943*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
1944*7249d1a6SKrzysztof Kosiński    finally:
1945*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
1946*7249d1a6SKrzysztof Kosiński
1947*7249d1a6SKrzysztof Kosiński  def testMultilineDictionaryKeys(self):
1948*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
1949*7249d1a6SKrzysztof Kosiński        MAP_WITH_LONG_KEYS = {
1950*7249d1a6SKrzysztof Kosiński            ('lorem ipsum', 'dolor sit amet'):
1951*7249d1a6SKrzysztof Kosiński                1,
1952*7249d1a6SKrzysztof Kosiński            ('consectetur adipiscing elit.', 'Vestibulum mauris justo, ornare eget dolor eget'):
1953*7249d1a6SKrzysztof Kosiński                2,
1954*7249d1a6SKrzysztof Kosiński            ('vehicula convallis nulla. Vestibulum dictum nisl in malesuada finibus.',):
1955*7249d1a6SKrzysztof Kosiński                3
1956*7249d1a6SKrzysztof Kosiński        }
1957*7249d1a6SKrzysztof Kosiński        """)  # noqa
1958*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
1959*7249d1a6SKrzysztof Kosiński        MAP_WITH_LONG_KEYS = {
1960*7249d1a6SKrzysztof Kosiński            ('lorem ipsum', 'dolor sit amet'):
1961*7249d1a6SKrzysztof Kosiński                1,
1962*7249d1a6SKrzysztof Kosiński            ('consectetur adipiscing elit.',
1963*7249d1a6SKrzysztof Kosiński             'Vestibulum mauris justo, ornare eget dolor eget'):
1964*7249d1a6SKrzysztof Kosiński                2,
1965*7249d1a6SKrzysztof Kosiński            ('vehicula convallis nulla. Vestibulum dictum nisl in malesuada finibus.',):
1966*7249d1a6SKrzysztof Kosiński                3
1967*7249d1a6SKrzysztof Kosiński        }
1968*7249d1a6SKrzysztof Kosiński        """)  # noqa
1969*7249d1a6SKrzysztof Kosiński
1970*7249d1a6SKrzysztof Kosiński    try:
1971*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
1972*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf, '
1973*7249d1a6SKrzysztof Kosiński                                      'allow_multiline_dictionary_keys: true}'))
1974*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
1975*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
1976*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
1977*7249d1a6SKrzysztof Kosiński    finally:
1978*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
1979*7249d1a6SKrzysztof Kosiński
1980*7249d1a6SKrzysztof Kosiński  def testStableDictionaryFormatting(self):
1981*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
1982*7249d1a6SKrzysztof Kosiński        class A(object):
1983*7249d1a6SKrzysztof Kosiński
1984*7249d1a6SKrzysztof Kosiński          def method(self):
1985*7249d1a6SKrzysztof Kosiński            filters = {
1986*7249d1a6SKrzysztof Kosiński                'expressions': [{
1987*7249d1a6SKrzysztof Kosiński                    'field': {
1988*7249d1a6SKrzysztof Kosiński                        'search_field': {
1989*7249d1a6SKrzysztof Kosiński                            'user_field': 'latest_party__number_of_guests'
1990*7249d1a6SKrzysztof Kosiński                        },
1991*7249d1a6SKrzysztof Kosiński                    }
1992*7249d1a6SKrzysztof Kosiński                }]
1993*7249d1a6SKrzysztof Kosiński            }
1994*7249d1a6SKrzysztof Kosiński        """)  # noqa
1995*7249d1a6SKrzysztof Kosiński
1996*7249d1a6SKrzysztof Kosiński    try:
1997*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
1998*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: pep8, indent_width: 2, '
1999*7249d1a6SKrzysztof Kosiński                                      'continuation_indent_width: 4, '
2000*7249d1a6SKrzysztof Kosiński                                      'indent_dictionary_value: True}'))
2001*7249d1a6SKrzysztof Kosiński
2002*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(code)
2003*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2004*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatted_code)
2005*7249d1a6SKrzysztof Kosiński
2006*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(reformatted_code)
2007*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2008*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatted_code)
2009*7249d1a6SKrzysztof Kosiński    finally:
2010*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2011*7249d1a6SKrzysztof Kosiński
2012*7249d1a6SKrzysztof Kosiński  def testStableInlinedDictionaryFormatting(self):
2013*7249d1a6SKrzysztof Kosiński    try:
2014*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreatePEP8Style())
2015*7249d1a6SKrzysztof Kosiński      unformatted_code = textwrap.dedent("""\
2016*7249d1a6SKrzysztof Kosiński          def _():
2017*7249d1a6SKrzysztof Kosiński              url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format(
2018*7249d1a6SKrzysztof Kosiński                  value, urllib.urlencode({'action': 'update', 'parameter': value}))
2019*7249d1a6SKrzysztof Kosiński          """)  # noqa
2020*7249d1a6SKrzysztof Kosiński      expected_formatted_code = textwrap.dedent("""\
2021*7249d1a6SKrzysztof Kosiński          def _():
2022*7249d1a6SKrzysztof Kosiński              url = "http://{0}/axis-cgi/admin/param.cgi?{1}".format(
2023*7249d1a6SKrzysztof Kosiński                  value, urllib.urlencode({
2024*7249d1a6SKrzysztof Kosiński                      'action': 'update',
2025*7249d1a6SKrzysztof Kosiński                      'parameter': value
2026*7249d1a6SKrzysztof Kosiński                  }))
2027*7249d1a6SKrzysztof Kosiński          """)
2028*7249d1a6SKrzysztof Kosiński
2029*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2030*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2031*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, reformatted_code)
2032*7249d1a6SKrzysztof Kosiński
2033*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(reformatted_code)
2034*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2035*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, reformatted_code)
2036*7249d1a6SKrzysztof Kosiński    finally:
2037*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2038*7249d1a6SKrzysztof Kosiński
2039*7249d1a6SKrzysztof Kosiński  def testDontSplitKeywordValueArguments(self):
2040*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2041*7249d1a6SKrzysztof Kosiński        def mark_game_scored(gid):
2042*7249d1a6SKrzysztof Kosiński          _connect.execute(_games.update().where(_games.c.gid == gid).values(
2043*7249d1a6SKrzysztof Kosiński              scored=True))
2044*7249d1a6SKrzysztof Kosiński        """)
2045*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2046*7249d1a6SKrzysztof Kosiński        def mark_game_scored(gid):
2047*7249d1a6SKrzysztof Kosiński          _connect.execute(
2048*7249d1a6SKrzysztof Kosiński              _games.update().where(_games.c.gid == gid).values(scored=True))
2049*7249d1a6SKrzysztof Kosiński        """)
2050*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2051*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2052*7249d1a6SKrzysztof Kosiński
2053*7249d1a6SKrzysztof Kosiński  def testDontAddBlankLineAfterMultilineString(self):
2054*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2055*7249d1a6SKrzysztof Kosiński      query = '''SELECT id
2056*7249d1a6SKrzysztof Kosiński      FROM table
2057*7249d1a6SKrzysztof Kosiński      WHERE day in {}'''
2058*7249d1a6SKrzysztof Kosiński      days = ",".join(days)
2059*7249d1a6SKrzysztof Kosiński      """)
2060*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
2061*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
2062*7249d1a6SKrzysztof Kosiński
2063*7249d1a6SKrzysztof Kosiński  def testFormattingListComprehensions(self):
2064*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2065*7249d1a6SKrzysztof Kosiński      def a():
2066*7249d1a6SKrzysztof Kosiński        if True:
2067*7249d1a6SKrzysztof Kosiński          if True:
2068*7249d1a6SKrzysztof Kosiński            if True:
2069*7249d1a6SKrzysztof Kosiński              columns = [
2070*7249d1a6SKrzysztof Kosiński                  x for x, y in self._heap_this_is_very_long if x.route[0] == choice
2071*7249d1a6SKrzysztof Kosiński              ]
2072*7249d1a6SKrzysztof Kosiński              self._heap = [x for x in self._heap if x.route and x.route[0] == choice]
2073*7249d1a6SKrzysztof Kosiński      """)  # noqa
2074*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
2075*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
2076*7249d1a6SKrzysztof Kosiński
2077*7249d1a6SKrzysztof Kosiński  def testNoSplittingWhenBinPacking(self):
2078*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2079*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(
2080*7249d1a6SKrzysztof Kosiński            long_argument_name_1=1,
2081*7249d1a6SKrzysztof Kosiński            long_argument_name_2=2,
2082*7249d1a6SKrzysztof Kosiński            long_argument_name_3=3,
2083*7249d1a6SKrzysztof Kosiński            long_argument_name_4=4,
2084*7249d1a6SKrzysztof Kosiński        )
2085*7249d1a6SKrzysztof Kosiński
2086*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(
2087*7249d1a6SKrzysztof Kosiński            long_argument_name_1=1, long_argument_name_2=2, long_argument_name_3=3,
2088*7249d1a6SKrzysztof Kosiński            long_argument_name_4=4
2089*7249d1a6SKrzysztof Kosiński        )
2090*7249d1a6SKrzysztof Kosiński        """)  # noqa
2091*7249d1a6SKrzysztof Kosiński
2092*7249d1a6SKrzysztof Kosiński    try:
2093*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2094*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2095*7249d1a6SKrzysztof Kosiński              '{based_on_style: pep8, indent_width: 2, '
2096*7249d1a6SKrzysztof Kosiński              'continuation_indent_width: 4, indent_dictionary_value: True, '
2097*7249d1a6SKrzysztof Kosiński              'dedent_closing_brackets: True, '
2098*7249d1a6SKrzysztof Kosiński              'split_before_named_assigns: False}'))
2099*7249d1a6SKrzysztof Kosiński
2100*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(code)
2101*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2102*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatted_code)
2103*7249d1a6SKrzysztof Kosiński
2104*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(reformatted_code)
2105*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2106*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatted_code)
2107*7249d1a6SKrzysztof Kosiński    finally:
2108*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2109*7249d1a6SKrzysztof Kosiński
2110*7249d1a6SKrzysztof Kosiński  def testNotSplittingAfterSubscript(self):
2111*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2112*7249d1a6SKrzysztof Kosiński        if not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b(c == d[
2113*7249d1a6SKrzysztof Kosiński                'eeeeee']).ffffff():
2114*7249d1a6SKrzysztof Kosiński          pass
2115*7249d1a6SKrzysztof Kosiński        """)
2116*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2117*7249d1a6SKrzysztof Kosiński        if not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b(
2118*7249d1a6SKrzysztof Kosiński            c == d['eeeeee']).ffffff():
2119*7249d1a6SKrzysztof Kosiński          pass
2120*7249d1a6SKrzysztof Kosiński        """)
2121*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2122*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2123*7249d1a6SKrzysztof Kosiński
2124*7249d1a6SKrzysztof Kosiński  def testSplittingOneArgumentList(self):
2125*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2126*7249d1a6SKrzysztof Kosiński        def _():
2127*7249d1a6SKrzysztof Kosiński          if True:
2128*7249d1a6SKrzysztof Kosiński            if True:
2129*7249d1a6SKrzysztof Kosiński              if True:
2130*7249d1a6SKrzysztof Kosiński                if True:
2131*7249d1a6SKrzysztof Kosiński                  if True:
2132*7249d1a6SKrzysztof Kosiński                    boxes[id_] = np.concatenate((points.min(axis=0), qoints.max(axis=0)))
2133*7249d1a6SKrzysztof Kosiński        """)  # noqa
2134*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2135*7249d1a6SKrzysztof Kosiński        def _():
2136*7249d1a6SKrzysztof Kosiński          if True:
2137*7249d1a6SKrzysztof Kosiński            if True:
2138*7249d1a6SKrzysztof Kosiński              if True:
2139*7249d1a6SKrzysztof Kosiński                if True:
2140*7249d1a6SKrzysztof Kosiński                  if True:
2141*7249d1a6SKrzysztof Kosiński                    boxes[id_] = np.concatenate(
2142*7249d1a6SKrzysztof Kosiński                        (points.min(axis=0), qoints.max(axis=0)))
2143*7249d1a6SKrzysztof Kosiński        """)
2144*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2145*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2146*7249d1a6SKrzysztof Kosiński
2147*7249d1a6SKrzysztof Kosiński  def testSplittingBeforeFirstElementListArgument(self):
2148*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2149*7249d1a6SKrzysztof Kosiński        class _():
2150*7249d1a6SKrzysztof Kosiński          @classmethod
2151*7249d1a6SKrzysztof Kosiński          def _pack_results_for_constraint_or(cls, combination, constraints):
2152*7249d1a6SKrzysztof Kosiński            if True:
2153*7249d1a6SKrzysztof Kosiński              if True:
2154*7249d1a6SKrzysztof Kosiński                if True:
2155*7249d1a6SKrzysztof Kosiński                  return cls._create_investigation_result(
2156*7249d1a6SKrzysztof Kosiński                          (
2157*7249d1a6SKrzysztof Kosiński                                  clue for clue in combination if not clue == Verifier.UNMATCHED
2158*7249d1a6SKrzysztof Kosiński                          ), constraints, InvestigationResult.OR
2159*7249d1a6SKrzysztof Kosiński                  )
2160*7249d1a6SKrzysztof Kosiński        """)  # noqa
2161*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2162*7249d1a6SKrzysztof Kosiński        class _():
2163*7249d1a6SKrzysztof Kosiński
2164*7249d1a6SKrzysztof Kosiński          @classmethod
2165*7249d1a6SKrzysztof Kosiński          def _pack_results_for_constraint_or(cls, combination, constraints):
2166*7249d1a6SKrzysztof Kosiński            if True:
2167*7249d1a6SKrzysztof Kosiński              if True:
2168*7249d1a6SKrzysztof Kosiński                if True:
2169*7249d1a6SKrzysztof Kosiński                  return cls._create_investigation_result(
2170*7249d1a6SKrzysztof Kosiński                      (clue for clue in combination if not clue == Verifier.UNMATCHED),
2171*7249d1a6SKrzysztof Kosiński                      constraints, InvestigationResult.OR)
2172*7249d1a6SKrzysztof Kosiński        """)  # noqa
2173*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2174*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2175*7249d1a6SKrzysztof Kosiński
2176*7249d1a6SKrzysztof Kosiński  def testSplittingArgumentsTerminatedByComma(self):
2177*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2178*7249d1a6SKrzysztof Kosiński        function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3)
2179*7249d1a6SKrzysztof Kosiński
2180*7249d1a6SKrzysztof Kosiński        function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3,)
2181*7249d1a6SKrzysztof Kosiński
2182*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(long_argument_name_1=1, long_argument_name_2=2, long_argument_name_3=3, long_argument_name_4=4)
2183*7249d1a6SKrzysztof Kosiński
2184*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(long_argument_name_1, long_argument_name_2, long_argument_name_3, long_argument_name_4,)
2185*7249d1a6SKrzysztof Kosiński
2186*7249d1a6SKrzysztof Kosiński        r =f0 (1,  2,3,)
2187*7249d1a6SKrzysztof Kosiński        """)  # noqa
2188*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2189*7249d1a6SKrzysztof Kosiński        function_name(argument_name_1=1, argument_name_2=2, argument_name_3=3)
2190*7249d1a6SKrzysztof Kosiński
2191*7249d1a6SKrzysztof Kosiński        function_name(
2192*7249d1a6SKrzysztof Kosiński            argument_name_1=1,
2193*7249d1a6SKrzysztof Kosiński            argument_name_2=2,
2194*7249d1a6SKrzysztof Kosiński            argument_name_3=3,
2195*7249d1a6SKrzysztof Kosiński        )
2196*7249d1a6SKrzysztof Kosiński
2197*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(
2198*7249d1a6SKrzysztof Kosiński            long_argument_name_1=1,
2199*7249d1a6SKrzysztof Kosiński            long_argument_name_2=2,
2200*7249d1a6SKrzysztof Kosiński            long_argument_name_3=3,
2201*7249d1a6SKrzysztof Kosiński            long_argument_name_4=4)
2202*7249d1a6SKrzysztof Kosiński
2203*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(
2204*7249d1a6SKrzysztof Kosiński            long_argument_name_1,
2205*7249d1a6SKrzysztof Kosiński            long_argument_name_2,
2206*7249d1a6SKrzysztof Kosiński            long_argument_name_3,
2207*7249d1a6SKrzysztof Kosiński            long_argument_name_4,
2208*7249d1a6SKrzysztof Kosiński        )
2209*7249d1a6SKrzysztof Kosiński
2210*7249d1a6SKrzysztof Kosiński        r = f0(
2211*7249d1a6SKrzysztof Kosiński            1,
2212*7249d1a6SKrzysztof Kosiński            2,
2213*7249d1a6SKrzysztof Kosiński            3,
2214*7249d1a6SKrzysztof Kosiński        )
2215*7249d1a6SKrzysztof Kosiński        """)
2216*7249d1a6SKrzysztof Kosiński
2217*7249d1a6SKrzysztof Kosiński    try:
2218*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2219*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2220*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, '
2221*7249d1a6SKrzysztof Kosiński              'split_arguments_when_comma_terminated: True}'))
2222*7249d1a6SKrzysztof Kosiński
2223*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2224*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2225*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, reformatted_code)
2226*7249d1a6SKrzysztof Kosiński
2227*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(reformatted_code)
2228*7249d1a6SKrzysztof Kosiński      reformatted_code = reformatter.Reformat(llines)
2229*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code, reformatted_code)
2230*7249d1a6SKrzysztof Kosiński    finally:
2231*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2232*7249d1a6SKrzysztof Kosiński
2233*7249d1a6SKrzysztof Kosiński  def testImportAsList(self):
2234*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2235*7249d1a6SKrzysztof Kosiński        from toto import titi, tata, tutu  # noqa
2236*7249d1a6SKrzysztof Kosiński        from toto import titi, tata, tutu
2237*7249d1a6SKrzysztof Kosiński        from toto import (titi, tata, tutu)
2238*7249d1a6SKrzysztof Kosiński        """)
2239*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
2240*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
2241*7249d1a6SKrzysztof Kosiński
2242*7249d1a6SKrzysztof Kosiński  def testDictionaryValuesOnOwnLines(self):
2243*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2244*7249d1a6SKrzysztof Kosiński        a = {
2245*7249d1a6SKrzysztof Kosiński        'aaaaaaaaaaaaaaaaaaaaaaaa':
2246*7249d1a6SKrzysztof Kosiński            Check('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', '=', True),
2247*7249d1a6SKrzysztof Kosiński        'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb':
2248*7249d1a6SKrzysztof Kosiński            Check('YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY', '=', True),
2249*7249d1a6SKrzysztof Kosiński        'ccccccccccccccc':
2250*7249d1a6SKrzysztof Kosiński            Check('XXXXXXXXXXXXXXXXXXX', '!=', 'SUSPENDED'),
2251*7249d1a6SKrzysztof Kosiński        'dddddddddddddddddddddddddddddd':
2252*7249d1a6SKrzysztof Kosiński            Check('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW', '=', False),
2253*7249d1a6SKrzysztof Kosiński        'eeeeeeeeeeeeeeeeeeeeeeeeeeeee':
2254*7249d1a6SKrzysztof Kosiński            Check('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV', '=', False),
2255*7249d1a6SKrzysztof Kosiński        'ffffffffffffffffffffffffff':
2256*7249d1a6SKrzysztof Kosiński            Check('UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU', '=', True),
2257*7249d1a6SKrzysztof Kosiński        'ggggggggggggggggg':
2258*7249d1a6SKrzysztof Kosiński            Check('TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', '=', True),
2259*7249d1a6SKrzysztof Kosiński        'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh':
2260*7249d1a6SKrzysztof Kosiński            Check('SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS', '=', True),
2261*7249d1a6SKrzysztof Kosiński        'iiiiiiiiiiiiiiiiiiiiiiii':
2262*7249d1a6SKrzysztof Kosiński            Check('RRRRRRRRRRRRRRRRRRRRRRRRRRR', '=', True),
2263*7249d1a6SKrzysztof Kosiński        'jjjjjjjjjjjjjjjjjjjjjjjjjj':
2264*7249d1a6SKrzysztof Kosiński            Check('QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ', '=', False),
2265*7249d1a6SKrzysztof Kosiński        }
2266*7249d1a6SKrzysztof Kosiński        """)
2267*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2268*7249d1a6SKrzysztof Kosiński        a = {
2269*7249d1a6SKrzysztof Kosiński            'aaaaaaaaaaaaaaaaaaaaaaaa':
2270*7249d1a6SKrzysztof Kosiński                Check('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', '=', True),
2271*7249d1a6SKrzysztof Kosiński            'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb':
2272*7249d1a6SKrzysztof Kosiński                Check('YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY', '=', True),
2273*7249d1a6SKrzysztof Kosiński            'ccccccccccccccc':
2274*7249d1a6SKrzysztof Kosiński                Check('XXXXXXXXXXXXXXXXXXX', '!=', 'SUSPENDED'),
2275*7249d1a6SKrzysztof Kosiński            'dddddddddddddddddddddddddddddd':
2276*7249d1a6SKrzysztof Kosiński                Check('WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW', '=', False),
2277*7249d1a6SKrzysztof Kosiński            'eeeeeeeeeeeeeeeeeeeeeeeeeeeee':
2278*7249d1a6SKrzysztof Kosiński                Check('VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV', '=', False),
2279*7249d1a6SKrzysztof Kosiński            'ffffffffffffffffffffffffff':
2280*7249d1a6SKrzysztof Kosiński                Check('UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU', '=', True),
2281*7249d1a6SKrzysztof Kosiński            'ggggggggggggggggg':
2282*7249d1a6SKrzysztof Kosiński                Check('TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', '=', True),
2283*7249d1a6SKrzysztof Kosiński            'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh':
2284*7249d1a6SKrzysztof Kosiński                Check('SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS', '=', True),
2285*7249d1a6SKrzysztof Kosiński            'iiiiiiiiiiiiiiiiiiiiiiii':
2286*7249d1a6SKrzysztof Kosiński                Check('RRRRRRRRRRRRRRRRRRRRRRRRRRR', '=', True),
2287*7249d1a6SKrzysztof Kosiński            'jjjjjjjjjjjjjjjjjjjjjjjjjj':
2288*7249d1a6SKrzysztof Kosiński                Check('QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ', '=', False),
2289*7249d1a6SKrzysztof Kosiński        }
2290*7249d1a6SKrzysztof Kosiński        """)  # noqa
2291*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2292*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2293*7249d1a6SKrzysztof Kosiński
2294*7249d1a6SKrzysztof Kosiński  def testDictionaryOnOwnLine(self):
2295*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2296*7249d1a6SKrzysztof Kosiński        doc = test_utils.CreateTestDocumentViaController(
2297*7249d1a6SKrzysztof Kosiński            content={ 'a': 'b' },
2298*7249d1a6SKrzysztof Kosiński            branch_key=branch.key,
2299*7249d1a6SKrzysztof Kosiński            collection_key=collection.key)
2300*7249d1a6SKrzysztof Kosiński        """)
2301*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2302*7249d1a6SKrzysztof Kosiński        doc = test_utils.CreateTestDocumentViaController(
2303*7249d1a6SKrzysztof Kosiński            content={'a': 'b'}, branch_key=branch.key, collection_key=collection.key)
2304*7249d1a6SKrzysztof Kosiński        """)  # noqa
2305*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2306*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2307*7249d1a6SKrzysztof Kosiński
2308*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2309*7249d1a6SKrzysztof Kosiński        doc = test_utils.CreateTestDocumentViaController(
2310*7249d1a6SKrzysztof Kosiński            content={ 'a': 'b' },
2311*7249d1a6SKrzysztof Kosiński            branch_key=branch.key,
2312*7249d1a6SKrzysztof Kosiński            collection_key=collection.key,
2313*7249d1a6SKrzysztof Kosiński            collection_key2=collection.key2)
2314*7249d1a6SKrzysztof Kosiński        """)
2315*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2316*7249d1a6SKrzysztof Kosiński        doc = test_utils.CreateTestDocumentViaController(
2317*7249d1a6SKrzysztof Kosiński            content={'a': 'b'},
2318*7249d1a6SKrzysztof Kosiński            branch_key=branch.key,
2319*7249d1a6SKrzysztof Kosiński            collection_key=collection.key,
2320*7249d1a6SKrzysztof Kosiński            collection_key2=collection.key2)
2321*7249d1a6SKrzysztof Kosiński        """)
2322*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2323*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2324*7249d1a6SKrzysztof Kosiński
2325*7249d1a6SKrzysztof Kosiński  def testNestedListsInDictionary(self):
2326*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2327*7249d1a6SKrzysztof Kosiński        _A = {
2328*7249d1a6SKrzysztof Kosiński            'cccccccccc': ('^^1',),
2329*7249d1a6SKrzysztof Kosiński            'rrrrrrrrrrrrrrrrrrrrrrrrr': ('^7913',  # AAAAAAAAAAAAAA.
2330*7249d1a6SKrzysztof Kosiński                                         ),
2331*7249d1a6SKrzysztof Kosiński            'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': ('^6242',  # BBBBBBBBBBBBBBB.
2332*7249d1a6SKrzysztof Kosiński                                                  ),
2333*7249d1a6SKrzysztof Kosiński            'vvvvvvvvvvvvvvvvvvv': ('^27959',  # CCCCCCCCCCCCCCCCCC.
2334*7249d1a6SKrzysztof Kosiński                                    '^19746',  # DDDDDDDDDDDDDDDDDDDDDDD.
2335*7249d1a6SKrzysztof Kosiński                                    '^22907',  # EEEEEEEEEEEEEEEEEEEEEEEE.
2336*7249d1a6SKrzysztof Kosiński                                    '^21098',  # FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.
2337*7249d1a6SKrzysztof Kosiński                                    '^22826',  # GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG.
2338*7249d1a6SKrzysztof Kosiński                                    '^22769',  # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH.
2339*7249d1a6SKrzysztof Kosiński                                    '^22935',  # IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.
2340*7249d1a6SKrzysztof Kosiński                                    '^3982',  # JJJJJJJJJJJJJ.
2341*7249d1a6SKrzysztof Kosiński                                   ),
2342*7249d1a6SKrzysztof Kosiński            'uuuuuuuuuuuu': ('^19745',  # LLLLLLLLLLLLLLLLLLLLLLLLLL.
2343*7249d1a6SKrzysztof Kosiński                             '^21324',  # MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.
2344*7249d1a6SKrzysztof Kosiński                             '^22831',  # NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.
2345*7249d1a6SKrzysztof Kosiński                             '^17081',  # OOOOOOOOOOOOOOOOOOOOO.
2346*7249d1a6SKrzysztof Kosiński                            ),
2347*7249d1a6SKrzysztof Kosiński            'eeeeeeeeeeeeee': (
2348*7249d1a6SKrzysztof Kosiński                '^9416',  # Reporter email. Not necessarily the reporter.
2349*7249d1a6SKrzysztof Kosiński                '^^3',  # This appears to be the raw email field.
2350*7249d1a6SKrzysztof Kosiński            ),
2351*7249d1a6SKrzysztof Kosiński            'cccccccccc': ('^21109',  # PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.
2352*7249d1a6SKrzysztof Kosiński                          ),
2353*7249d1a6SKrzysztof Kosiński        }
2354*7249d1a6SKrzysztof Kosiński        """)  # noqa
2355*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2356*7249d1a6SKrzysztof Kosiński        _A = {
2357*7249d1a6SKrzysztof Kosiński            'cccccccccc': ('^^1',),
2358*7249d1a6SKrzysztof Kosiński            'rrrrrrrrrrrrrrrrrrrrrrrrr': (
2359*7249d1a6SKrzysztof Kosiński                '^7913',  # AAAAAAAAAAAAAA.
2360*7249d1a6SKrzysztof Kosiński            ),
2361*7249d1a6SKrzysztof Kosiński            'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee': (
2362*7249d1a6SKrzysztof Kosiński                '^6242',  # BBBBBBBBBBBBBBB.
2363*7249d1a6SKrzysztof Kosiński            ),
2364*7249d1a6SKrzysztof Kosiński            'vvvvvvvvvvvvvvvvvvv': (
2365*7249d1a6SKrzysztof Kosiński                '^27959',  # CCCCCCCCCCCCCCCCCC.
2366*7249d1a6SKrzysztof Kosiński                '^19746',  # DDDDDDDDDDDDDDDDDDDDDDD.
2367*7249d1a6SKrzysztof Kosiński                '^22907',  # EEEEEEEEEEEEEEEEEEEEEEEE.
2368*7249d1a6SKrzysztof Kosiński                '^21098',  # FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.
2369*7249d1a6SKrzysztof Kosiński                '^22826',  # GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG.
2370*7249d1a6SKrzysztof Kosiński                '^22769',  # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH.
2371*7249d1a6SKrzysztof Kosiński                '^22935',  # IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.
2372*7249d1a6SKrzysztof Kosiński                '^3982',  # JJJJJJJJJJJJJ.
2373*7249d1a6SKrzysztof Kosiński            ),
2374*7249d1a6SKrzysztof Kosiński            'uuuuuuuuuuuu': (
2375*7249d1a6SKrzysztof Kosiński                '^19745',  # LLLLLLLLLLLLLLLLLLLLLLLLLL.
2376*7249d1a6SKrzysztof Kosiński                '^21324',  # MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.
2377*7249d1a6SKrzysztof Kosiński                '^22831',  # NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.
2378*7249d1a6SKrzysztof Kosiński                '^17081',  # OOOOOOOOOOOOOOOOOOOOO.
2379*7249d1a6SKrzysztof Kosiński            ),
2380*7249d1a6SKrzysztof Kosiński            'eeeeeeeeeeeeee': (
2381*7249d1a6SKrzysztof Kosiński                '^9416',  # Reporter email. Not necessarily the reporter.
2382*7249d1a6SKrzysztof Kosiński                '^^3',  # This appears to be the raw email field.
2383*7249d1a6SKrzysztof Kosiński            ),
2384*7249d1a6SKrzysztof Kosiński            'cccccccccc': (
2385*7249d1a6SKrzysztof Kosiński                '^21109',  # PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.
2386*7249d1a6SKrzysztof Kosiński            ),
2387*7249d1a6SKrzysztof Kosiński        }
2388*7249d1a6SKrzysztof Kosiński        """)
2389*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2390*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2391*7249d1a6SKrzysztof Kosiński
2392*7249d1a6SKrzysztof Kosiński  def testNestedDictionary(self):
2393*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2394*7249d1a6SKrzysztof Kosiński        class _():
2395*7249d1a6SKrzysztof Kosiński          def _():
2396*7249d1a6SKrzysztof Kosiński            breadcrumbs = [{'name': 'Admin',
2397*7249d1a6SKrzysztof Kosiński                            'url': url_for(".home")},
2398*7249d1a6SKrzysztof Kosiński                           {'title': title},]
2399*7249d1a6SKrzysztof Kosiński            breadcrumbs = [{'name': 'Admin',
2400*7249d1a6SKrzysztof Kosiński                            'url': url_for(".home")},
2401*7249d1a6SKrzysztof Kosiński                           {'title': title}]
2402*7249d1a6SKrzysztof Kosiński        """)
2403*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2404*7249d1a6SKrzysztof Kosiński        class _():
2405*7249d1a6SKrzysztof Kosiński          def _():
2406*7249d1a6SKrzysztof Kosiński            breadcrumbs = [
2407*7249d1a6SKrzysztof Kosiński                {
2408*7249d1a6SKrzysztof Kosiński                    'name': 'Admin',
2409*7249d1a6SKrzysztof Kosiński                    'url': url_for(".home")
2410*7249d1a6SKrzysztof Kosiński                },
2411*7249d1a6SKrzysztof Kosiński                {
2412*7249d1a6SKrzysztof Kosiński                    'title': title
2413*7249d1a6SKrzysztof Kosiński                },
2414*7249d1a6SKrzysztof Kosiński            ]
2415*7249d1a6SKrzysztof Kosiński            breadcrumbs = [{'name': 'Admin', 'url': url_for(".home")}, {'title': title}]
2416*7249d1a6SKrzysztof Kosiński        """)  # noqa
2417*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2418*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
2419*7249d1a6SKrzysztof Kosiński
2420*7249d1a6SKrzysztof Kosiński  def testDictionaryElementsOnOneLine(self):
2421*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2422*7249d1a6SKrzysztof Kosiński        class _():
2423*7249d1a6SKrzysztof Kosiński
2424*7249d1a6SKrzysztof Kosiński          @mock.patch.dict(
2425*7249d1a6SKrzysztof Kosiński              os.environ,
2426*7249d1a6SKrzysztof Kosiński              {'HTTP_' + xsrf._XSRF_TOKEN_HEADER.replace('-', '_'): 'atoken'})
2427*7249d1a6SKrzysztof Kosiński          def _():
2428*7249d1a6SKrzysztof Kosiński            pass
2429*7249d1a6SKrzysztof Kosiński
2430*7249d1a6SKrzysztof Kosiński
2431*7249d1a6SKrzysztof Kosiński        AAAAAAAAAAAAAAAAAAAAAAAA = {
2432*7249d1a6SKrzysztof Kosiński            Environment.XXXXXXXXXX: 'some text more text even more tex',
2433*7249d1a6SKrzysztof Kosiński            Environment.YYYYYYY: 'some text more text even more text yet ag',
2434*7249d1a6SKrzysztof Kosiński            Environment.ZZZZZZZZZZZ: 'some text more text even more text yet again tex',
2435*7249d1a6SKrzysztof Kosiński        }
2436*7249d1a6SKrzysztof Kosiński        """)  # noqa
2437*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
2438*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
2439*7249d1a6SKrzysztof Kosiński
2440*7249d1a6SKrzysztof Kosiński  def testNotInParams(self):
2441*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2442*7249d1a6SKrzysztof Kosiński        list("a long line to break the line. a long line to break the brk a long lin", not True)
2443*7249d1a6SKrzysztof Kosiński        """)  # noqa
2444*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
2445*7249d1a6SKrzysztof Kosiński        list("a long line to break the line. a long line to break the brk a long lin",
2446*7249d1a6SKrzysztof Kosiński             not True)
2447*7249d1a6SKrzysztof Kosiński        """)  # noqa
2448*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2449*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2450*7249d1a6SKrzysztof Kosiński
2451*7249d1a6SKrzysztof Kosiński  def testNamedAssignNotAtEndOfLine(self):
2452*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2453*7249d1a6SKrzysztof Kosiński        def _():
2454*7249d1a6SKrzysztof Kosiński          if True:
2455*7249d1a6SKrzysztof Kosiński            with py3compat.open_with_encoding(filename, mode='w',
2456*7249d1a6SKrzysztof Kosiński                                              encoding=encoding) as fd:
2457*7249d1a6SKrzysztof Kosiński              pass
2458*7249d1a6SKrzysztof Kosiński        """)
2459*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
2460*7249d1a6SKrzysztof Kosiński        def _():
2461*7249d1a6SKrzysztof Kosiński          if True:
2462*7249d1a6SKrzysztof Kosiński            with py3compat.open_with_encoding(
2463*7249d1a6SKrzysztof Kosiński                filename, mode='w', encoding=encoding) as fd:
2464*7249d1a6SKrzysztof Kosiński              pass
2465*7249d1a6SKrzysztof Kosiński        """)
2466*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2467*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2468*7249d1a6SKrzysztof Kosiński
2469*7249d1a6SKrzysztof Kosiński  def testBlankLineBeforeClassDocstring(self):
2470*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
2471*7249d1a6SKrzysztof Kosiński        class A:
2472*7249d1a6SKrzysztof Kosiński
2473*7249d1a6SKrzysztof Kosiński          """Does something.
2474*7249d1a6SKrzysztof Kosiński
2475*7249d1a6SKrzysztof Kosiński          Also, here are some details.
2476*7249d1a6SKrzysztof Kosiński          """
2477*7249d1a6SKrzysztof Kosiński
2478*7249d1a6SKrzysztof Kosiński          def __init__(self):
2479*7249d1a6SKrzysztof Kosiński            pass
2480*7249d1a6SKrzysztof Kosiński        ''')
2481*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent('''\
2482*7249d1a6SKrzysztof Kosiński        class A:
2483*7249d1a6SKrzysztof Kosiński          """Does something.
2484*7249d1a6SKrzysztof Kosiński
2485*7249d1a6SKrzysztof Kosiński          Also, here are some details.
2486*7249d1a6SKrzysztof Kosiński          """
2487*7249d1a6SKrzysztof Kosiński
2488*7249d1a6SKrzysztof Kosiński          def __init__(self):
2489*7249d1a6SKrzysztof Kosiński            pass
2490*7249d1a6SKrzysztof Kosiński        ''')
2491*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2492*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2493*7249d1a6SKrzysztof Kosiński
2494*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
2495*7249d1a6SKrzysztof Kosiński        class A:
2496*7249d1a6SKrzysztof Kosiński
2497*7249d1a6SKrzysztof Kosiński          """Does something.
2498*7249d1a6SKrzysztof Kosiński
2499*7249d1a6SKrzysztof Kosiński          Also, here are some details.
2500*7249d1a6SKrzysztof Kosiński          """
2501*7249d1a6SKrzysztof Kosiński
2502*7249d1a6SKrzysztof Kosiński          def __init__(self):
2503*7249d1a6SKrzysztof Kosiński            pass
2504*7249d1a6SKrzysztof Kosiński        ''')
2505*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
2506*7249d1a6SKrzysztof Kosiński        class A:
2507*7249d1a6SKrzysztof Kosiński
2508*7249d1a6SKrzysztof Kosiński          """Does something.
2509*7249d1a6SKrzysztof Kosiński
2510*7249d1a6SKrzysztof Kosiński          Also, here are some details.
2511*7249d1a6SKrzysztof Kosiński          """
2512*7249d1a6SKrzysztof Kosiński
2513*7249d1a6SKrzysztof Kosiński          def __init__(self):
2514*7249d1a6SKrzysztof Kosiński            pass
2515*7249d1a6SKrzysztof Kosiński        ''')
2516*7249d1a6SKrzysztof Kosiński
2517*7249d1a6SKrzysztof Kosiński    try:
2518*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2519*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2520*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, '
2521*7249d1a6SKrzysztof Kosiński              'blank_line_before_class_docstring: True}'))
2522*7249d1a6SKrzysztof Kosiński
2523*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2524*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2525*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2526*7249d1a6SKrzysztof Kosiński    finally:
2527*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2528*7249d1a6SKrzysztof Kosiński
2529*7249d1a6SKrzysztof Kosiński  def testBlankLineBeforeModuleDocstring(self):
2530*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
2531*7249d1a6SKrzysztof Kosiński        #!/usr/bin/env python
2532*7249d1a6SKrzysztof Kosiński        # -*- coding: utf-8 name> -*-
2533*7249d1a6SKrzysztof Kosiński
2534*7249d1a6SKrzysztof Kosiński        """Some module docstring."""
2535*7249d1a6SKrzysztof Kosiński
2536*7249d1a6SKrzysztof Kosiński
2537*7249d1a6SKrzysztof Kosiński        def foobar():
2538*7249d1a6SKrzysztof Kosiński          pass
2539*7249d1a6SKrzysztof Kosiński        ''')
2540*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent('''\
2541*7249d1a6SKrzysztof Kosiński        #!/usr/bin/env python
2542*7249d1a6SKrzysztof Kosiński        # -*- coding: utf-8 name> -*-
2543*7249d1a6SKrzysztof Kosiński        """Some module docstring."""
2544*7249d1a6SKrzysztof Kosiński
2545*7249d1a6SKrzysztof Kosiński
2546*7249d1a6SKrzysztof Kosiński        def foobar():
2547*7249d1a6SKrzysztof Kosiński          pass
2548*7249d1a6SKrzysztof Kosiński        ''')
2549*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2550*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2551*7249d1a6SKrzysztof Kosiński
2552*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent('''\
2553*7249d1a6SKrzysztof Kosiński        #!/usr/bin/env python
2554*7249d1a6SKrzysztof Kosiński        # -*- coding: utf-8 name> -*-
2555*7249d1a6SKrzysztof Kosiński        """Some module docstring."""
2556*7249d1a6SKrzysztof Kosiński
2557*7249d1a6SKrzysztof Kosiński
2558*7249d1a6SKrzysztof Kosiński        def foobar():
2559*7249d1a6SKrzysztof Kosiński            pass
2560*7249d1a6SKrzysztof Kosiński        ''')
2561*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent('''\
2562*7249d1a6SKrzysztof Kosiński        #!/usr/bin/env python
2563*7249d1a6SKrzysztof Kosiński        # -*- coding: utf-8 name> -*-
2564*7249d1a6SKrzysztof Kosiński
2565*7249d1a6SKrzysztof Kosiński        """Some module docstring."""
2566*7249d1a6SKrzysztof Kosiński
2567*7249d1a6SKrzysztof Kosiński
2568*7249d1a6SKrzysztof Kosiński        def foobar():
2569*7249d1a6SKrzysztof Kosiński            pass
2570*7249d1a6SKrzysztof Kosiński        ''')
2571*7249d1a6SKrzysztof Kosiński
2572*7249d1a6SKrzysztof Kosiński    try:
2573*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2574*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2575*7249d1a6SKrzysztof Kosiński              '{based_on_style: pep8, '
2576*7249d1a6SKrzysztof Kosiński              'blank_line_before_module_docstring: True}'))
2577*7249d1a6SKrzysztof Kosiński
2578*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2579*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2580*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2581*7249d1a6SKrzysztof Kosiński    finally:
2582*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2583*7249d1a6SKrzysztof Kosiński
2584*7249d1a6SKrzysztof Kosiński  def testTupleCohesion(self):
2585*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2586*7249d1a6SKrzysztof Kosiński        def f():
2587*7249d1a6SKrzysztof Kosiński          this_is_a_very_long_function_name(an_extremely_long_variable_name, (
2588*7249d1a6SKrzysztof Kosiński              'a string that may be too long %s' % 'M15'))
2589*7249d1a6SKrzysztof Kosiński        """)
2590*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
2591*7249d1a6SKrzysztof Kosiński        def f():
2592*7249d1a6SKrzysztof Kosiński          this_is_a_very_long_function_name(
2593*7249d1a6SKrzysztof Kosiński              an_extremely_long_variable_name,
2594*7249d1a6SKrzysztof Kosiński              ('a string that may be too long %s' % 'M15'))
2595*7249d1a6SKrzysztof Kosiński        """)
2596*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2597*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2598*7249d1a6SKrzysztof Kosiński
2599*7249d1a6SKrzysztof Kosiński  def testSubscriptExpression(self):
2600*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2601*7249d1a6SKrzysztof Kosiński        foo = d[not a]
2602*7249d1a6SKrzysztof Kosiński        """)
2603*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
2604*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(code, reformatter.Reformat(llines))
2605*7249d1a6SKrzysztof Kosiński
2606*7249d1a6SKrzysztof Kosiński  def testListWithFunctionCalls(self):
2607*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2608*7249d1a6SKrzysztof Kosiński        def foo():
2609*7249d1a6SKrzysztof Kosiński          return [
2610*7249d1a6SKrzysztof Kosiński              Bar(
2611*7249d1a6SKrzysztof Kosiński                  xxx='some string',
2612*7249d1a6SKrzysztof Kosiński                  yyy='another long string',
2613*7249d1a6SKrzysztof Kosiński                  zzz='a third long string'), Bar(
2614*7249d1a6SKrzysztof Kosiński                      xxx='some string',
2615*7249d1a6SKrzysztof Kosiński                      yyy='another long string',
2616*7249d1a6SKrzysztof Kosiński                      zzz='a third long string')
2617*7249d1a6SKrzysztof Kosiński          ]
2618*7249d1a6SKrzysztof Kosiński        """)
2619*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
2620*7249d1a6SKrzysztof Kosiński        def foo():
2621*7249d1a6SKrzysztof Kosiński          return [
2622*7249d1a6SKrzysztof Kosiński              Bar(xxx='some string',
2623*7249d1a6SKrzysztof Kosiński                  yyy='another long string',
2624*7249d1a6SKrzysztof Kosiński                  zzz='a third long string'),
2625*7249d1a6SKrzysztof Kosiński              Bar(xxx='some string',
2626*7249d1a6SKrzysztof Kosiński                  yyy='another long string',
2627*7249d1a6SKrzysztof Kosiński                  zzz='a third long string')
2628*7249d1a6SKrzysztof Kosiński          ]
2629*7249d1a6SKrzysztof Kosiński        """)
2630*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2631*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2632*7249d1a6SKrzysztof Kosiński
2633*7249d1a6SKrzysztof Kosiński  def testEllipses(self):
2634*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2635*7249d1a6SKrzysztof Kosiński        X=...
2636*7249d1a6SKrzysztof Kosiński        Y = X if ... else X
2637*7249d1a6SKrzysztof Kosiński        """)
2638*7249d1a6SKrzysztof Kosiński    expected_code = textwrap.dedent("""\
2639*7249d1a6SKrzysztof Kosiński        X = ...
2640*7249d1a6SKrzysztof Kosiński        Y = X if ... else X
2641*7249d1a6SKrzysztof Kosiński        """)
2642*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2643*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2644*7249d1a6SKrzysztof Kosiński
2645*7249d1a6SKrzysztof Kosiński  def testPseudoParens(self):
2646*7249d1a6SKrzysztof Kosiński    unformatted_code = """\
2647*7249d1a6SKrzysztof Kosińskimy_dict = {
2648*7249d1a6SKrzysztof Kosiński    'key':  # Some comment about the key
2649*7249d1a6SKrzysztof Kosiński        {'nested_key': 1, },
2650*7249d1a6SKrzysztof Kosiński}
2651*7249d1a6SKrzysztof Kosiński"""
2652*7249d1a6SKrzysztof Kosiński    expected_code = """\
2653*7249d1a6SKrzysztof Kosińskimy_dict = {
2654*7249d1a6SKrzysztof Kosiński    'key':  # Some comment about the key
2655*7249d1a6SKrzysztof Kosiński        {
2656*7249d1a6SKrzysztof Kosiński            'nested_key': 1,
2657*7249d1a6SKrzysztof Kosiński        },
2658*7249d1a6SKrzysztof Kosiński}
2659*7249d1a6SKrzysztof Kosiński"""
2660*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2661*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_code, reformatter.Reformat(llines))
2662*7249d1a6SKrzysztof Kosiński
2663*7249d1a6SKrzysztof Kosiński  def testSplittingBeforeFirstArgumentOnFunctionCall(self):
2664*7249d1a6SKrzysztof Kosiński    """Tests split_before_first_argument on a function call."""
2665*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2666*7249d1a6SKrzysztof Kosiński        a_very_long_function_name("long string with formatting {0:s}".format(
2667*7249d1a6SKrzysztof Kosiński            "mystring"))
2668*7249d1a6SKrzysztof Kosiński        """)
2669*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2670*7249d1a6SKrzysztof Kosiński        a_very_long_function_name(
2671*7249d1a6SKrzysztof Kosiński            "long string with formatting {0:s}".format("mystring"))
2672*7249d1a6SKrzysztof Kosiński        """)
2673*7249d1a6SKrzysztof Kosiński
2674*7249d1a6SKrzysztof Kosiński    try:
2675*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2676*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2677*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, split_before_first_argument: True}'))
2678*7249d1a6SKrzysztof Kosiński
2679*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2680*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2681*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2682*7249d1a6SKrzysztof Kosiński    finally:
2683*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2684*7249d1a6SKrzysztof Kosiński
2685*7249d1a6SKrzysztof Kosiński  def testSplittingBeforeFirstArgumentOnFunctionDefinition(self):
2686*7249d1a6SKrzysztof Kosiński    """Tests split_before_first_argument on a function definition."""
2687*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2688*7249d1a6SKrzysztof Kosiński        def _GetNumberOfSecondsFromElements(year, month, day, hours,
2689*7249d1a6SKrzysztof Kosiński                                            minutes, seconds, microseconds):
2690*7249d1a6SKrzysztof Kosiński          return
2691*7249d1a6SKrzysztof Kosiński        """)
2692*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2693*7249d1a6SKrzysztof Kosiński        def _GetNumberOfSecondsFromElements(
2694*7249d1a6SKrzysztof Kosiński            year, month, day, hours, minutes, seconds, microseconds):
2695*7249d1a6SKrzysztof Kosiński          return
2696*7249d1a6SKrzysztof Kosiński        """)
2697*7249d1a6SKrzysztof Kosiński
2698*7249d1a6SKrzysztof Kosiński    try:
2699*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2700*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2701*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, split_before_first_argument: True}'))
2702*7249d1a6SKrzysztof Kosiński
2703*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2704*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2705*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2706*7249d1a6SKrzysztof Kosiński    finally:
2707*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2708*7249d1a6SKrzysztof Kosiński
2709*7249d1a6SKrzysztof Kosiński  def testSplittingBeforeFirstArgumentOnCompoundStatement(self):
2710*7249d1a6SKrzysztof Kosiński    """Tests split_before_first_argument on a compound statement."""
2711*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2712*7249d1a6SKrzysztof Kosiński        if (long_argument_name_1 == 1 or
2713*7249d1a6SKrzysztof Kosiński            long_argument_name_2 == 2 or
2714*7249d1a6SKrzysztof Kosiński            long_argument_name_3 == 3 or
2715*7249d1a6SKrzysztof Kosiński            long_argument_name_4 == 4):
2716*7249d1a6SKrzysztof Kosiński          pass
2717*7249d1a6SKrzysztof Kosiński        """)
2718*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2719*7249d1a6SKrzysztof Kosiński        if (long_argument_name_1 == 1 or long_argument_name_2 == 2 or
2720*7249d1a6SKrzysztof Kosiński            long_argument_name_3 == 3 or long_argument_name_4 == 4):
2721*7249d1a6SKrzysztof Kosiński          pass
2722*7249d1a6SKrzysztof Kosiński        """)
2723*7249d1a6SKrzysztof Kosiński
2724*7249d1a6SKrzysztof Kosiński    try:
2725*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2726*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2727*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, split_before_first_argument: True}'))
2728*7249d1a6SKrzysztof Kosiński
2729*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2730*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2731*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2732*7249d1a6SKrzysztof Kosiński    finally:
2733*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2734*7249d1a6SKrzysztof Kosiński
2735*7249d1a6SKrzysztof Kosiński  def testCoalesceBracketsOnDict(self):
2736*7249d1a6SKrzysztof Kosiński    """Tests coalesce_brackets on a dictionary."""
2737*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2738*7249d1a6SKrzysztof Kosiński        date_time_values = (
2739*7249d1a6SKrzysztof Kosiński            {
2740*7249d1a6SKrzysztof Kosiński                u'year': year,
2741*7249d1a6SKrzysztof Kosiński                u'month': month,
2742*7249d1a6SKrzysztof Kosiński                u'day_of_month': day_of_month,
2743*7249d1a6SKrzysztof Kosiński                u'hours': hours,
2744*7249d1a6SKrzysztof Kosiński                u'minutes': minutes,
2745*7249d1a6SKrzysztof Kosiński                u'seconds': seconds
2746*7249d1a6SKrzysztof Kosiński            }
2747*7249d1a6SKrzysztof Kosiński        )
2748*7249d1a6SKrzysztof Kosiński        """)
2749*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2750*7249d1a6SKrzysztof Kosiński        date_time_values = ({
2751*7249d1a6SKrzysztof Kosiński            u'year': year,
2752*7249d1a6SKrzysztof Kosiński            u'month': month,
2753*7249d1a6SKrzysztof Kosiński            u'day_of_month': day_of_month,
2754*7249d1a6SKrzysztof Kosiński            u'hours': hours,
2755*7249d1a6SKrzysztof Kosiński            u'minutes': minutes,
2756*7249d1a6SKrzysztof Kosiński            u'seconds': seconds
2757*7249d1a6SKrzysztof Kosiński        })
2758*7249d1a6SKrzysztof Kosiński        """)
2759*7249d1a6SKrzysztof Kosiński
2760*7249d1a6SKrzysztof Kosiński    try:
2761*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2762*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2763*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, coalesce_brackets: True}'))
2764*7249d1a6SKrzysztof Kosiński
2765*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2766*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2767*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2768*7249d1a6SKrzysztof Kosiński    finally:
2769*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2770*7249d1a6SKrzysztof Kosiński
2771*7249d1a6SKrzysztof Kosiński  def testSplitAfterComment(self):
2772*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2773*7249d1a6SKrzysztof Kosiński        if __name__ == "__main__":
2774*7249d1a6SKrzysztof Kosiński          with another_resource:
2775*7249d1a6SKrzysztof Kosiński            account = {
2776*7249d1a6SKrzysztof Kosiński                "validUntil":
2777*7249d1a6SKrzysztof Kosiński                    int(time() + (6 * 7 * 24 * 60 * 60))  # in 6 weeks time
2778*7249d1a6SKrzysztof Kosiński            }
2779*7249d1a6SKrzysztof Kosiński        """)
2780*7249d1a6SKrzysztof Kosiński
2781*7249d1a6SKrzysztof Kosiński    try:
2782*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2783*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig(
2784*7249d1a6SKrzysztof Kosiński              '{based_on_style: yapf, coalesce_brackets: True, '
2785*7249d1a6SKrzysztof Kosiński              'dedent_closing_brackets: true}'))
2786*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(code)
2787*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatter.Reformat(llines))
2788*7249d1a6SKrzysztof Kosiński    finally:
2789*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2790*7249d1a6SKrzysztof Kosiński
2791*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(not py3compat.PY3, 'Requires Python 2.7')
2792*7249d1a6SKrzysztof Kosiński  def testAsyncAsNonKeyword(self):
2793*7249d1a6SKrzysztof Kosiński    try:
2794*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreatePEP8Style())
2795*7249d1a6SKrzysztof Kosiński
2796*7249d1a6SKrzysztof Kosiński      # In Python 2, async may be used as a non-keyword identifier.
2797*7249d1a6SKrzysztof Kosiński      code = textwrap.dedent("""\
2798*7249d1a6SKrzysztof Kosiński          from util import async
2799*7249d1a6SKrzysztof Kosiński
2800*7249d1a6SKrzysztof Kosiński
2801*7249d1a6SKrzysztof Kosiński          class A(object):
2802*7249d1a6SKrzysztof Kosiński
2803*7249d1a6SKrzysztof Kosiński              def foo(self):
2804*7249d1a6SKrzysztof Kosiński                  async.run()
2805*7249d1a6SKrzysztof Kosiński          """)
2806*7249d1a6SKrzysztof Kosiński
2807*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(code)
2808*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatter.Reformat(llines))
2809*7249d1a6SKrzysztof Kosiński    finally:
2810*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2811*7249d1a6SKrzysztof Kosiński
2812*7249d1a6SKrzysztof Kosiński  def testDisableEndingCommaHeuristic(self):
2813*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
2814*7249d1a6SKrzysztof Kosiński        x = [1, 2, 3, 4, 5, 6, 7,]
2815*7249d1a6SKrzysztof Kosiński        """)
2816*7249d1a6SKrzysztof Kosiński
2817*7249d1a6SKrzysztof Kosiński    try:
2818*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2819*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2820*7249d1a6SKrzysztof Kosiński                                      ' disable_ending_comma_heuristic: True}'))
2821*7249d1a6SKrzysztof Kosiński
2822*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(code)
2823*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(code, reformatter.Reformat(llines))
2824*7249d1a6SKrzysztof Kosiński    finally:
2825*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2826*7249d1a6SKrzysztof Kosiński
2827*7249d1a6SKrzysztof Kosiński  def testDedentClosingBracketsWithTypeAnnotationExceedingLineLength(self):
2828*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2829*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None:
2830*7249d1a6SKrzysztof Kosiński          pass
2831*7249d1a6SKrzysztof Kosiński
2832*7249d1a6SKrzysztof Kosiński
2833*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None:
2834*7249d1a6SKrzysztof Kosiński          pass
2835*7249d1a6SKrzysztof Kosiński        """)  # noqa
2836*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2837*7249d1a6SKrzysztof Kosiński        def function(
2838*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None
2839*7249d1a6SKrzysztof Kosiński        ) -> None:
2840*7249d1a6SKrzysztof Kosiński          pass
2841*7249d1a6SKrzysztof Kosiński
2842*7249d1a6SKrzysztof Kosiński
2843*7249d1a6SKrzysztof Kosiński        def function(
2844*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None
2845*7249d1a6SKrzysztof Kosiński        ) -> None:
2846*7249d1a6SKrzysztof Kosiński          pass
2847*7249d1a6SKrzysztof Kosiński        """)  # noqa
2848*7249d1a6SKrzysztof Kosiński
2849*7249d1a6SKrzysztof Kosiński    try:
2850*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2851*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2852*7249d1a6SKrzysztof Kosiński                                      ' dedent_closing_brackets: True}'))
2853*7249d1a6SKrzysztof Kosiński
2854*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2855*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2856*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2857*7249d1a6SKrzysztof Kosiński    finally:
2858*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2859*7249d1a6SKrzysztof Kosiński
2860*7249d1a6SKrzysztof Kosiński  def testIndentClosingBracketsWithTypeAnnotationExceedingLineLength(self):
2861*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2862*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None:
2863*7249d1a6SKrzysztof Kosiński          pass
2864*7249d1a6SKrzysztof Kosiński
2865*7249d1a6SKrzysztof Kosiński
2866*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None) -> None:
2867*7249d1a6SKrzysztof Kosiński          pass
2868*7249d1a6SKrzysztof Kosiński        """)  # noqa
2869*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2870*7249d1a6SKrzysztof Kosiński        def function(
2871*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None
2872*7249d1a6SKrzysztof Kosiński            ) -> None:
2873*7249d1a6SKrzysztof Kosiński          pass
2874*7249d1a6SKrzysztof Kosiński
2875*7249d1a6SKrzysztof Kosiński
2876*7249d1a6SKrzysztof Kosiński        def function(
2877*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_argument=None
2878*7249d1a6SKrzysztof Kosiński            ) -> None:
2879*7249d1a6SKrzysztof Kosiński          pass
2880*7249d1a6SKrzysztof Kosiński        """)  # noqa
2881*7249d1a6SKrzysztof Kosiński
2882*7249d1a6SKrzysztof Kosiński    try:
2883*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2884*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2885*7249d1a6SKrzysztof Kosiński                                      ' indent_closing_brackets: True}'))
2886*7249d1a6SKrzysztof Kosiński
2887*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2888*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2889*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2890*7249d1a6SKrzysztof Kosiński    finally:
2891*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2892*7249d1a6SKrzysztof Kosiński
2893*7249d1a6SKrzysztof Kosiński  def testIndentClosingBracketsInFunctionCall(self):
2894*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2895*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxx=(0,), second_argument=None, third_and_final_argument=True):
2896*7249d1a6SKrzysztof Kosiński          pass
2897*7249d1a6SKrzysztof Kosiński
2898*7249d1a6SKrzysztof Kosiński
2899*7249d1a6SKrzysztof Kosiński        def function(first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_and_last_argument=None):
2900*7249d1a6SKrzysztof Kosiński          pass
2901*7249d1a6SKrzysztof Kosiński        """)  # noqa
2902*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2903*7249d1a6SKrzysztof Kosiński        def function(
2904*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxx=(0,),
2905*7249d1a6SKrzysztof Kosiński            second_argument=None,
2906*7249d1a6SKrzysztof Kosiński            third_and_final_argument=True
2907*7249d1a6SKrzysztof Kosiński            ):
2908*7249d1a6SKrzysztof Kosiński          pass
2909*7249d1a6SKrzysztof Kosiński
2910*7249d1a6SKrzysztof Kosiński
2911*7249d1a6SKrzysztof Kosiński        def function(
2912*7249d1a6SKrzysztof Kosiński            first_argument_xxxxxxxxxxxxxxxxxxxxxxx=(0,), second_and_last_argument=None
2913*7249d1a6SKrzysztof Kosiński            ):
2914*7249d1a6SKrzysztof Kosiński          pass
2915*7249d1a6SKrzysztof Kosiński        """)  # noqa
2916*7249d1a6SKrzysztof Kosiński
2917*7249d1a6SKrzysztof Kosiński    try:
2918*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2919*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2920*7249d1a6SKrzysztof Kosiński                                      ' indent_closing_brackets: True}'))
2921*7249d1a6SKrzysztof Kosiński
2922*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2923*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2924*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2925*7249d1a6SKrzysztof Kosiński    finally:
2926*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2927*7249d1a6SKrzysztof Kosiński
2928*7249d1a6SKrzysztof Kosiński  def testIndentClosingBracketsInTuple(self):
2929*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2930*7249d1a6SKrzysztof Kosiński        def function():
2931*7249d1a6SKrzysztof Kosiński          some_var = ('a long element', 'another long element', 'short element', 'really really long element')
2932*7249d1a6SKrzysztof Kosiński          return True
2933*7249d1a6SKrzysztof Kosiński
2934*7249d1a6SKrzysztof Kosiński        def function():
2935*7249d1a6SKrzysztof Kosiński          some_var = ('a couple', 'small', 'elemens')
2936*7249d1a6SKrzysztof Kosiński          return False
2937*7249d1a6SKrzysztof Kosiński        """)  # noqa
2938*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2939*7249d1a6SKrzysztof Kosiński        def function():
2940*7249d1a6SKrzysztof Kosiński          some_var = (
2941*7249d1a6SKrzysztof Kosiński              'a long element', 'another long element', 'short element',
2942*7249d1a6SKrzysztof Kosiński              'really really long element'
2943*7249d1a6SKrzysztof Kosiński              )
2944*7249d1a6SKrzysztof Kosiński          return True
2945*7249d1a6SKrzysztof Kosiński
2946*7249d1a6SKrzysztof Kosiński
2947*7249d1a6SKrzysztof Kosiński        def function():
2948*7249d1a6SKrzysztof Kosiński          some_var = ('a couple', 'small', 'elemens')
2949*7249d1a6SKrzysztof Kosiński          return False
2950*7249d1a6SKrzysztof Kosiński        """)  # noqa
2951*7249d1a6SKrzysztof Kosiński
2952*7249d1a6SKrzysztof Kosiński    try:
2953*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2954*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2955*7249d1a6SKrzysztof Kosiński                                      ' indent_closing_brackets: True}'))
2956*7249d1a6SKrzysztof Kosiński
2957*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2958*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2959*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2960*7249d1a6SKrzysztof Kosiński    finally:
2961*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2962*7249d1a6SKrzysztof Kosiński
2963*7249d1a6SKrzysztof Kosiński  def testIndentClosingBracketsInList(self):
2964*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
2965*7249d1a6SKrzysztof Kosiński        def function():
2966*7249d1a6SKrzysztof Kosiński          some_var = ['a long element', 'another long element', 'short element', 'really really long element']
2967*7249d1a6SKrzysztof Kosiński          return True
2968*7249d1a6SKrzysztof Kosiński
2969*7249d1a6SKrzysztof Kosiński        def function():
2970*7249d1a6SKrzysztof Kosiński          some_var = ['a couple', 'small', 'elemens']
2971*7249d1a6SKrzysztof Kosiński          return False
2972*7249d1a6SKrzysztof Kosiński        """)  # noqa
2973*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
2974*7249d1a6SKrzysztof Kosiński        def function():
2975*7249d1a6SKrzysztof Kosiński          some_var = [
2976*7249d1a6SKrzysztof Kosiński              'a long element', 'another long element', 'short element',
2977*7249d1a6SKrzysztof Kosiński              'really really long element'
2978*7249d1a6SKrzysztof Kosiński              ]
2979*7249d1a6SKrzysztof Kosiński          return True
2980*7249d1a6SKrzysztof Kosiński
2981*7249d1a6SKrzysztof Kosiński
2982*7249d1a6SKrzysztof Kosiński        def function():
2983*7249d1a6SKrzysztof Kosiński          some_var = ['a couple', 'small', 'elemens']
2984*7249d1a6SKrzysztof Kosiński          return False
2985*7249d1a6SKrzysztof Kosiński        """)
2986*7249d1a6SKrzysztof Kosiński
2987*7249d1a6SKrzysztof Kosiński    try:
2988*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
2989*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
2990*7249d1a6SKrzysztof Kosiński                                      ' indent_closing_brackets: True}'))
2991*7249d1a6SKrzysztof Kosiński
2992*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
2993*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
2994*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
2995*7249d1a6SKrzysztof Kosiński    finally:
2996*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
2997*7249d1a6SKrzysztof Kosiński
2998*7249d1a6SKrzysztof Kosiński  def testIndentClosingBracketsInDict(self):
2999*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
3000*7249d1a6SKrzysztof Kosiński        def function():
3001*7249d1a6SKrzysztof Kosiński          some_var = {1: ('a long element', 'and another really really long element that is really really amazingly long'), 2: 'another long element', 3: 'short element', 4: 'really really long element'}
3002*7249d1a6SKrzysztof Kosiński          return True
3003*7249d1a6SKrzysztof Kosiński
3004*7249d1a6SKrzysztof Kosiński        def function():
3005*7249d1a6SKrzysztof Kosiński          some_var = {1: 'a couple', 2: 'small', 3: 'elemens'}
3006*7249d1a6SKrzysztof Kosiński          return False
3007*7249d1a6SKrzysztof Kosiński        """)  # noqa
3008*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
3009*7249d1a6SKrzysztof Kosiński        def function():
3010*7249d1a6SKrzysztof Kosiński          some_var = {
3011*7249d1a6SKrzysztof Kosiński              1:
3012*7249d1a6SKrzysztof Kosiński                  (
3013*7249d1a6SKrzysztof Kosiński                      'a long element',
3014*7249d1a6SKrzysztof Kosiński                      'and another really really long element that is really really amazingly long'
3015*7249d1a6SKrzysztof Kosiński                      ),
3016*7249d1a6SKrzysztof Kosiński              2: 'another long element',
3017*7249d1a6SKrzysztof Kosiński              3: 'short element',
3018*7249d1a6SKrzysztof Kosiński              4: 'really really long element'
3019*7249d1a6SKrzysztof Kosiński              }
3020*7249d1a6SKrzysztof Kosiński          return True
3021*7249d1a6SKrzysztof Kosiński
3022*7249d1a6SKrzysztof Kosiński
3023*7249d1a6SKrzysztof Kosiński        def function():
3024*7249d1a6SKrzysztof Kosiński          some_var = {1: 'a couple', 2: 'small', 3: 'elemens'}
3025*7249d1a6SKrzysztof Kosiński          return False
3026*7249d1a6SKrzysztof Kosiński        """)  # noqa
3027*7249d1a6SKrzysztof Kosiński
3028*7249d1a6SKrzysztof Kosiński    try:
3029*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
3030*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{based_on_style: yapf,'
3031*7249d1a6SKrzysztof Kosiński                                      ' indent_closing_brackets: True}'))
3032*7249d1a6SKrzysztof Kosiński
3033*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
3034*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
3035*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
3036*7249d1a6SKrzysztof Kosiński    finally:
3037*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
3038*7249d1a6SKrzysztof Kosiński
3039*7249d1a6SKrzysztof Kosiński  def testMultipleDictionariesInList(self):
3040*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
3041*7249d1a6SKrzysztof Kosiński        class A:
3042*7249d1a6SKrzysztof Kosiński            def b():
3043*7249d1a6SKrzysztof Kosiński                d = {
3044*7249d1a6SKrzysztof Kosiński                    "123456": [
3045*7249d1a6SKrzysztof Kosiński                        {
3046*7249d1a6SKrzysztof Kosiński                            "12": "aa"
3047*7249d1a6SKrzysztof Kosiński                        },
3048*7249d1a6SKrzysztof Kosiński                        {
3049*7249d1a6SKrzysztof Kosiński                            "12": "bb"
3050*7249d1a6SKrzysztof Kosiński                        },
3051*7249d1a6SKrzysztof Kosiński                        {
3052*7249d1a6SKrzysztof Kosiński                            "12": "cc",
3053*7249d1a6SKrzysztof Kosiński                            "1234567890": {
3054*7249d1a6SKrzysztof Kosiński                                "1234567": [{
3055*7249d1a6SKrzysztof Kosiński                                    "12": "dd",
3056*7249d1a6SKrzysztof Kosiński                                    "12345": "text 1"
3057*7249d1a6SKrzysztof Kosiński                                }, {
3058*7249d1a6SKrzysztof Kosiński                                    "12": "ee",
3059*7249d1a6SKrzysztof Kosiński                                    "12345": "text 2"
3060*7249d1a6SKrzysztof Kosiński                                }]
3061*7249d1a6SKrzysztof Kosiński                            }
3062*7249d1a6SKrzysztof Kosiński                        }
3063*7249d1a6SKrzysztof Kosiński                    ]
3064*7249d1a6SKrzysztof Kosiński                }
3065*7249d1a6SKrzysztof Kosiński        """)
3066*7249d1a6SKrzysztof Kosiński    expected_formatted_code = textwrap.dedent("""\
3067*7249d1a6SKrzysztof Kosiński        class A:
3068*7249d1a6SKrzysztof Kosiński
3069*7249d1a6SKrzysztof Kosiński          def b():
3070*7249d1a6SKrzysztof Kosiński            d = {
3071*7249d1a6SKrzysztof Kosiński                "123456": [{
3072*7249d1a6SKrzysztof Kosiński                    "12": "aa"
3073*7249d1a6SKrzysztof Kosiński                }, {
3074*7249d1a6SKrzysztof Kosiński                    "12": "bb"
3075*7249d1a6SKrzysztof Kosiński                }, {
3076*7249d1a6SKrzysztof Kosiński                    "12": "cc",
3077*7249d1a6SKrzysztof Kosiński                    "1234567890": {
3078*7249d1a6SKrzysztof Kosiński                        "1234567": [{
3079*7249d1a6SKrzysztof Kosiński                            "12": "dd",
3080*7249d1a6SKrzysztof Kosiński                            "12345": "text 1"
3081*7249d1a6SKrzysztof Kosiński                        }, {
3082*7249d1a6SKrzysztof Kosiński                            "12": "ee",
3083*7249d1a6SKrzysztof Kosiński                            "12345": "text 2"
3084*7249d1a6SKrzysztof Kosiński                        }]
3085*7249d1a6SKrzysztof Kosiński                    }
3086*7249d1a6SKrzysztof Kosiński                }]
3087*7249d1a6SKrzysztof Kosiński            }
3088*7249d1a6SKrzysztof Kosiński        """)
3089*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
3090*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
3091*7249d1a6SKrzysztof Kosiński
3092*7249d1a6SKrzysztof Kosiński  def testForceMultilineDict_True(self):
3093*7249d1a6SKrzysztof Kosiński    try:
3094*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
3095*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{force_multiline_dict: true}'))
3096*7249d1a6SKrzysztof Kosiński      unformatted_code = textwrap.dedent(
3097*7249d1a6SKrzysztof Kosiński          "responseDict = {'childDict': {'spam': 'eggs'}}\n")
3098*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
3099*7249d1a6SKrzysztof Kosiński      actual = reformatter.Reformat(llines)
3100*7249d1a6SKrzysztof Kosiński      expected = textwrap.dedent("""\
3101*7249d1a6SKrzysztof Kosiński        responseDict = {
3102*7249d1a6SKrzysztof Kosiński            'childDict': {
3103*7249d1a6SKrzysztof Kosiński                'spam': 'eggs'
3104*7249d1a6SKrzysztof Kosiński            }
3105*7249d1a6SKrzysztof Kosiński        }
3106*7249d1a6SKrzysztof Kosiński      """)
3107*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected, actual)
3108*7249d1a6SKrzysztof Kosiński    finally:
3109*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
3110*7249d1a6SKrzysztof Kosiński
3111*7249d1a6SKrzysztof Kosiński  def testForceMultilineDict_False(self):
3112*7249d1a6SKrzysztof Kosiński    try:
3113*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(
3114*7249d1a6SKrzysztof Kosiński          style.CreateStyleFromConfig('{force_multiline_dict: false}'))
3115*7249d1a6SKrzysztof Kosiński      unformatted_code = textwrap.dedent("""\
3116*7249d1a6SKrzysztof Kosiński        responseDict = {'childDict': {'spam': 'eggs'}}
3117*7249d1a6SKrzysztof Kosiński      """)
3118*7249d1a6SKrzysztof Kosiński      expected_formatted_code = unformatted_code
3119*7249d1a6SKrzysztof Kosiński      llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
3120*7249d1a6SKrzysztof Kosiński      self.assertCodeEqual(expected_formatted_code,
3121*7249d1a6SKrzysztof Kosiński                           reformatter.Reformat(llines))
3122*7249d1a6SKrzysztof Kosiński    finally:
3123*7249d1a6SKrzysztof Kosiński      style.SetGlobalStyle(style.CreateYapfStyle())
3124*7249d1a6SKrzysztof Kosiński
3125*7249d1a6SKrzysztof Kosiński  @unittest.skipUnless(py3compat.PY38, 'Requires Python 3.8')
3126*7249d1a6SKrzysztof Kosiński  def testWalrus(self):
3127*7249d1a6SKrzysztof Kosiński    unformatted_code = textwrap.dedent("""\
3128*7249d1a6SKrzysztof Kosiński      if (x  :=  len([1]*1000)>100):
3129*7249d1a6SKrzysztof Kosiński        print(f'{x} is pretty big' )
3130*7249d1a6SKrzysztof Kosiński    """)
3131*7249d1a6SKrzysztof Kosiński    expected = textwrap.dedent("""\
3132*7249d1a6SKrzysztof Kosiński      if (x := len([1] * 1000) > 100):
3133*7249d1a6SKrzysztof Kosiński        print(f'{x} is pretty big')
3134*7249d1a6SKrzysztof Kosiński    """)
3135*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
3136*7249d1a6SKrzysztof Kosiński    self.assertCodeEqual(expected, reformatter.Reformat(llines))
3137*7249d1a6SKrzysztof Kosiński
3138*7249d1a6SKrzysztof Kosiński
3139*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__':
3140*7249d1a6SKrzysztof Kosiński  unittest.main()
3141