xref: /aosp_15_r20/external/yapf/yapftests/pytree_unwrapper_test.py (revision 7249d1a64f4850ccf838e62a46276f891f72998e)
1*7249d1a6SKrzysztof Kosiński# Copyright 2015 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"""Tests for yapf.pytree_unwrapper."""
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 pytree_utils
20*7249d1a6SKrzysztof Kosiński
21*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper
22*7249d1a6SKrzysztof Kosiński
23*7249d1a6SKrzysztof Kosiński
24*7249d1a6SKrzysztof Kosińskiclass PytreeUnwrapperTest(yapf_test_helper.YAPFTest):
25*7249d1a6SKrzysztof Kosiński
26*7249d1a6SKrzysztof Kosiński  def _CheckLogicalLines(self, llines, list_of_expected):
27*7249d1a6SKrzysztof Kosiński    """Check that the given LogicalLines match expectations.
28*7249d1a6SKrzysztof Kosiński
29*7249d1a6SKrzysztof Kosiński    Args:
30*7249d1a6SKrzysztof Kosiński      llines: list of LogicalLine
31*7249d1a6SKrzysztof Kosiński      list_of_expected: list of (depth, values) pairs. Non-semantic tokens are
32*7249d1a6SKrzysztof Kosiński        filtered out from the expected values.
33*7249d1a6SKrzysztof Kosiński    """
34*7249d1a6SKrzysztof Kosiński    actual = []
35*7249d1a6SKrzysztof Kosiński    for lline in llines:
36*7249d1a6SKrzysztof Kosiński      filtered_values = [
37*7249d1a6SKrzysztof Kosiński          ft.value
38*7249d1a6SKrzysztof Kosiński          for ft in lline.tokens
39*7249d1a6SKrzysztof Kosiński          if ft.name not in pytree_utils.NONSEMANTIC_TOKENS
40*7249d1a6SKrzysztof Kosiński      ]
41*7249d1a6SKrzysztof Kosiński      actual.append((lline.depth, filtered_values))
42*7249d1a6SKrzysztof Kosiński
43*7249d1a6SKrzysztof Kosiński    self.assertEqual(list_of_expected, actual)
44*7249d1a6SKrzysztof Kosiński
45*7249d1a6SKrzysztof Kosiński  def testSimpleFileScope(self):
46*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
47*7249d1a6SKrzysztof Kosiński      x = 1
48*7249d1a6SKrzysztof Kosiński      # a comment
49*7249d1a6SKrzysztof Kosiński      y = 2
50*7249d1a6SKrzysztof Kosiński      """)
51*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
52*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
53*7249d1a6SKrzysztof Kosiński        (0, ['x', '=', '1']),
54*7249d1a6SKrzysztof Kosiński        (0, ['# a comment']),
55*7249d1a6SKrzysztof Kosiński        (0, ['y', '=', '2']),
56*7249d1a6SKrzysztof Kosiński    ])
57*7249d1a6SKrzysztof Kosiński
58*7249d1a6SKrzysztof Kosiński  def testSimpleMultilineStatement(self):
59*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
60*7249d1a6SKrzysztof Kosiński      y = (1 +
61*7249d1a6SKrzysztof Kosiński           x)
62*7249d1a6SKrzysztof Kosiński      """)
63*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
64*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
65*7249d1a6SKrzysztof Kosiński        (0, ['y', '=', '(', '1', '+', 'x', ')']),
66*7249d1a6SKrzysztof Kosiński    ])
67*7249d1a6SKrzysztof Kosiński
68*7249d1a6SKrzysztof Kosiński  def testFileScopeWithInlineComment(self):
69*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
70*7249d1a6SKrzysztof Kosiński      x = 1    # a comment
71*7249d1a6SKrzysztof Kosiński      y = 2
72*7249d1a6SKrzysztof Kosiński      """)
73*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
74*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
75*7249d1a6SKrzysztof Kosiński        (0, ['x', '=', '1', '# a comment']),
76*7249d1a6SKrzysztof Kosiński        (0, ['y', '=', '2']),
77*7249d1a6SKrzysztof Kosiński    ])
78*7249d1a6SKrzysztof Kosiński
79*7249d1a6SKrzysztof Kosiński  def testSimpleIf(self):
80*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
81*7249d1a6SKrzysztof Kosiński      if foo:
82*7249d1a6SKrzysztof Kosiński          x = 1
83*7249d1a6SKrzysztof Kosiński          y = 2
84*7249d1a6SKrzysztof Kosiński      """)
85*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
86*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
87*7249d1a6SKrzysztof Kosiński        (0, ['if', 'foo', ':']),
88*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1']),
89*7249d1a6SKrzysztof Kosiński        (1, ['y', '=', '2']),
90*7249d1a6SKrzysztof Kosiński    ])
91*7249d1a6SKrzysztof Kosiński
92*7249d1a6SKrzysztof Kosiński  def testSimpleIfWithComments(self):
93*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
94*7249d1a6SKrzysztof Kosiński      # c1
95*7249d1a6SKrzysztof Kosiński      if foo: # c2
96*7249d1a6SKrzysztof Kosiński          x = 1
97*7249d1a6SKrzysztof Kosiński          y = 2
98*7249d1a6SKrzysztof Kosiński      """)
99*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
100*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
101*7249d1a6SKrzysztof Kosiński        (0, ['# c1']),
102*7249d1a6SKrzysztof Kosiński        (0, ['if', 'foo', ':', '# c2']),
103*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1']),
104*7249d1a6SKrzysztof Kosiński        (1, ['y', '=', '2']),
105*7249d1a6SKrzysztof Kosiński    ])
106*7249d1a6SKrzysztof Kosiński
107*7249d1a6SKrzysztof Kosiński  def testIfWithCommentsInside(self):
108*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
109*7249d1a6SKrzysztof Kosiński      if foo:
110*7249d1a6SKrzysztof Kosiński          # c1
111*7249d1a6SKrzysztof Kosiński          x = 1 # c2
112*7249d1a6SKrzysztof Kosiński          # c3
113*7249d1a6SKrzysztof Kosiński          y = 2
114*7249d1a6SKrzysztof Kosiński      """)
115*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
116*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
117*7249d1a6SKrzysztof Kosiński        (0, ['if', 'foo', ':']),
118*7249d1a6SKrzysztof Kosiński        (1, ['# c1']),
119*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1', '# c2']),
120*7249d1a6SKrzysztof Kosiński        (1, ['# c3']),
121*7249d1a6SKrzysztof Kosiński        (1, ['y', '=', '2']),
122*7249d1a6SKrzysztof Kosiński    ])
123*7249d1a6SKrzysztof Kosiński
124*7249d1a6SKrzysztof Kosiński  def testIfElifElse(self):
125*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
126*7249d1a6SKrzysztof Kosiński       if x:
127*7249d1a6SKrzysztof Kosiński         x = 1 # c1
128*7249d1a6SKrzysztof Kosiński       elif y: # c2
129*7249d1a6SKrzysztof Kosiński         y = 1
130*7249d1a6SKrzysztof Kosiński       else:
131*7249d1a6SKrzysztof Kosiński         # c3
132*7249d1a6SKrzysztof Kosiński         z = 1
133*7249d1a6SKrzysztof Kosiński      """)
134*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
135*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
136*7249d1a6SKrzysztof Kosiński        (0, ['if', 'x', ':']),
137*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1', '# c1']),
138*7249d1a6SKrzysztof Kosiński        (0, ['elif', 'y', ':', '# c2']),
139*7249d1a6SKrzysztof Kosiński        (1, ['y', '=', '1']),
140*7249d1a6SKrzysztof Kosiński        (0, ['else', ':']),
141*7249d1a6SKrzysztof Kosiński        (1, ['# c3']),
142*7249d1a6SKrzysztof Kosiński        (1, ['z', '=', '1']),
143*7249d1a6SKrzysztof Kosiński    ])
144*7249d1a6SKrzysztof Kosiński
145*7249d1a6SKrzysztof Kosiński  def testNestedCompoundTwoLevel(self):
146*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
147*7249d1a6SKrzysztof Kosiński       if x:
148*7249d1a6SKrzysztof Kosiński         x = 1 # c1
149*7249d1a6SKrzysztof Kosiński         while t:
150*7249d1a6SKrzysztof Kosiński           # c2
151*7249d1a6SKrzysztof Kosiński           j = 1
152*7249d1a6SKrzysztof Kosiński         k = 1
153*7249d1a6SKrzysztof Kosiński      """)
154*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
155*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
156*7249d1a6SKrzysztof Kosiński        (0, ['if', 'x', ':']),
157*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1', '# c1']),
158*7249d1a6SKrzysztof Kosiński        (1, ['while', 't', ':']),
159*7249d1a6SKrzysztof Kosiński        (2, ['# c2']),
160*7249d1a6SKrzysztof Kosiński        (2, ['j', '=', '1']),
161*7249d1a6SKrzysztof Kosiński        (1, ['k', '=', '1']),
162*7249d1a6SKrzysztof Kosiński    ])
163*7249d1a6SKrzysztof Kosiński
164*7249d1a6SKrzysztof Kosiński  def testSimpleWhile(self):
165*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
166*7249d1a6SKrzysztof Kosiński       while x > 1: # c1
167*7249d1a6SKrzysztof Kosiński          # c2
168*7249d1a6SKrzysztof Kosiński          x = 1
169*7249d1a6SKrzysztof Kosiński      """)
170*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
171*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
172*7249d1a6SKrzysztof Kosiński        (0, ['while', 'x', '>', '1', ':', '# c1']),
173*7249d1a6SKrzysztof Kosiński        (1, ['# c2']),
174*7249d1a6SKrzysztof Kosiński        (1, ['x', '=', '1']),
175*7249d1a6SKrzysztof Kosiński    ])
176*7249d1a6SKrzysztof Kosiński
177*7249d1a6SKrzysztof Kosiński  def testSimpleTry(self):
178*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
179*7249d1a6SKrzysztof Kosiński      try:
180*7249d1a6SKrzysztof Kosiński        pass
181*7249d1a6SKrzysztof Kosiński      except:
182*7249d1a6SKrzysztof Kosiński        pass
183*7249d1a6SKrzysztof Kosiński      except:
184*7249d1a6SKrzysztof Kosiński        pass
185*7249d1a6SKrzysztof Kosiński      else:
186*7249d1a6SKrzysztof Kosiński        pass
187*7249d1a6SKrzysztof Kosiński      finally:
188*7249d1a6SKrzysztof Kosiński        pass
189*7249d1a6SKrzysztof Kosiński      """)
190*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
191*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
192*7249d1a6SKrzysztof Kosiński        (0, ['try', ':']),
193*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
194*7249d1a6SKrzysztof Kosiński        (0, ['except', ':']),
195*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
196*7249d1a6SKrzysztof Kosiński        (0, ['except', ':']),
197*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
198*7249d1a6SKrzysztof Kosiński        (0, ['else', ':']),
199*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
200*7249d1a6SKrzysztof Kosiński        (0, ['finally', ':']),
201*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
202*7249d1a6SKrzysztof Kosiński    ])
203*7249d1a6SKrzysztof Kosiński
204*7249d1a6SKrzysztof Kosiński  def testSimpleFuncdef(self):
205*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
206*7249d1a6SKrzysztof Kosiński      def foo(x): # c1
207*7249d1a6SKrzysztof Kosiński        # c2
208*7249d1a6SKrzysztof Kosiński        return x
209*7249d1a6SKrzysztof Kosiński      """)
210*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
211*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
212*7249d1a6SKrzysztof Kosiński        (0, ['def', 'foo', '(', 'x', ')', ':', '# c1']),
213*7249d1a6SKrzysztof Kosiński        (1, ['# c2']),
214*7249d1a6SKrzysztof Kosiński        (1, ['return', 'x']),
215*7249d1a6SKrzysztof Kosiński    ])
216*7249d1a6SKrzysztof Kosiński
217*7249d1a6SKrzysztof Kosiński  def testTwoFuncDefs(self):
218*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
219*7249d1a6SKrzysztof Kosiński      def foo(x): # c1
220*7249d1a6SKrzysztof Kosiński        # c2
221*7249d1a6SKrzysztof Kosiński        return x
222*7249d1a6SKrzysztof Kosiński
223*7249d1a6SKrzysztof Kosiński      def bar(): # c3
224*7249d1a6SKrzysztof Kosiński        # c4
225*7249d1a6SKrzysztof Kosiński        return x
226*7249d1a6SKrzysztof Kosiński      """)
227*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
228*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
229*7249d1a6SKrzysztof Kosiński        (0, ['def', 'foo', '(', 'x', ')', ':', '# c1']),
230*7249d1a6SKrzysztof Kosiński        (1, ['# c2']),
231*7249d1a6SKrzysztof Kosiński        (1, ['return', 'x']),
232*7249d1a6SKrzysztof Kosiński        (0, ['def', 'bar', '(', ')', ':', '# c3']),
233*7249d1a6SKrzysztof Kosiński        (1, ['# c4']),
234*7249d1a6SKrzysztof Kosiński        (1, ['return', 'x']),
235*7249d1a6SKrzysztof Kosiński    ])
236*7249d1a6SKrzysztof Kosiński
237*7249d1a6SKrzysztof Kosiński  def testSimpleClassDef(self):
238*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
239*7249d1a6SKrzysztof Kosiński      class Klass: # c1
240*7249d1a6SKrzysztof Kosiński        # c2
241*7249d1a6SKrzysztof Kosiński        p = 1
242*7249d1a6SKrzysztof Kosiński      """)
243*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
244*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
245*7249d1a6SKrzysztof Kosiński        (0, ['class', 'Klass', ':', '# c1']),
246*7249d1a6SKrzysztof Kosiński        (1, ['# c2']),
247*7249d1a6SKrzysztof Kosiński        (1, ['p', '=', '1']),
248*7249d1a6SKrzysztof Kosiński    ])
249*7249d1a6SKrzysztof Kosiński
250*7249d1a6SKrzysztof Kosiński  def testSingleLineStmtInFunc(self):
251*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
252*7249d1a6SKrzysztof Kosiński        def f(): return 37
253*7249d1a6SKrzysztof Kosiński      """)
254*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
255*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
256*7249d1a6SKrzysztof Kosiński        (0, ['def', 'f', '(', ')', ':']),
257*7249d1a6SKrzysztof Kosiński        (1, ['return', '37']),
258*7249d1a6SKrzysztof Kosiński    ])
259*7249d1a6SKrzysztof Kosiński
260*7249d1a6SKrzysztof Kosiński  def testMultipleComments(self):
261*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
262*7249d1a6SKrzysztof Kosiński        # Comment #1
263*7249d1a6SKrzysztof Kosiński
264*7249d1a6SKrzysztof Kosiński        # Comment #2
265*7249d1a6SKrzysztof Kosiński        def f():
266*7249d1a6SKrzysztof Kosiński          pass
267*7249d1a6SKrzysztof Kosiński      """)
268*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
269*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [
270*7249d1a6SKrzysztof Kosiński        (0, ['# Comment #1']),
271*7249d1a6SKrzysztof Kosiński        (0, ['# Comment #2']),
272*7249d1a6SKrzysztof Kosiński        (0, ['def', 'f', '(', ')', ':']),
273*7249d1a6SKrzysztof Kosiński        (1, ['pass']),
274*7249d1a6SKrzysztof Kosiński    ])
275*7249d1a6SKrzysztof Kosiński
276*7249d1a6SKrzysztof Kosiński  def testSplitListWithComment(self):
277*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r"""
278*7249d1a6SKrzysztof Kosiński      a = [
279*7249d1a6SKrzysztof Kosiński          'a',
280*7249d1a6SKrzysztof Kosiński          'b',
281*7249d1a6SKrzysztof Kosiński          'c',  # hello world
282*7249d1a6SKrzysztof Kosiński      ]
283*7249d1a6SKrzysztof Kosiński      """)
284*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
285*7249d1a6SKrzysztof Kosiński    self._CheckLogicalLines(llines, [(0, [
286*7249d1a6SKrzysztof Kosiński        'a', '=', '[', "'a'", ',', "'b'", ',', "'c'", ',', '# hello world', ']'
287*7249d1a6SKrzysztof Kosiński    ])])
288*7249d1a6SKrzysztof Kosiński
289*7249d1a6SKrzysztof Kosiński
290*7249d1a6SKrzysztof Kosińskiclass MatchBracketsTest(yapf_test_helper.YAPFTest):
291*7249d1a6SKrzysztof Kosiński
292*7249d1a6SKrzysztof Kosiński  def _CheckMatchingBrackets(self, llines, list_of_expected):
293*7249d1a6SKrzysztof Kosiński    """Check that the tokens have the expected matching bracket.
294*7249d1a6SKrzysztof Kosiński
295*7249d1a6SKrzysztof Kosiński    Arguments:
296*7249d1a6SKrzysztof Kosiński      llines: list of LogicalLine.
297*7249d1a6SKrzysztof Kosiński      list_of_expected: list of (index, index) pairs. The matching brackets at
298*7249d1a6SKrzysztof Kosiński        the indexes need to match. Non-semantic tokens are filtered out from the
299*7249d1a6SKrzysztof Kosiński        expected values.
300*7249d1a6SKrzysztof Kosiński    """
301*7249d1a6SKrzysztof Kosiński    actual = []
302*7249d1a6SKrzysztof Kosiński    for lline in llines:
303*7249d1a6SKrzysztof Kosiński      filtered_values = [(ft, ft.matching_bracket)
304*7249d1a6SKrzysztof Kosiński                         for ft in lline.tokens
305*7249d1a6SKrzysztof Kosiński                         if ft.name not in pytree_utils.NONSEMANTIC_TOKENS]
306*7249d1a6SKrzysztof Kosiński      if filtered_values:
307*7249d1a6SKrzysztof Kosiński        actual.append(filtered_values)
308*7249d1a6SKrzysztof Kosiński
309*7249d1a6SKrzysztof Kosiński    for index, bracket_list in enumerate(list_of_expected):
310*7249d1a6SKrzysztof Kosiński      lline = actual[index]
311*7249d1a6SKrzysztof Kosiński      if not bracket_list:
312*7249d1a6SKrzysztof Kosiński        for value in lline:
313*7249d1a6SKrzysztof Kosiński          self.assertIsNone(value[1])
314*7249d1a6SKrzysztof Kosiński      else:
315*7249d1a6SKrzysztof Kosiński        for open_bracket, close_bracket in bracket_list:
316*7249d1a6SKrzysztof Kosiński          self.assertEqual(lline[open_bracket][0], lline[close_bracket][1])
317*7249d1a6SKrzysztof Kosiński          self.assertEqual(lline[close_bracket][0], lline[open_bracket][1])
318*7249d1a6SKrzysztof Kosiński
319*7249d1a6SKrzysztof Kosiński  def testFunctionDef(self):
320*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
321*7249d1a6SKrzysztof Kosiński        def foo(a, b=['w','d'], c=[42, 37]):
322*7249d1a6SKrzysztof Kosiński          pass
323*7249d1a6SKrzysztof Kosiński        """)
324*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
325*7249d1a6SKrzysztof Kosiński    self._CheckMatchingBrackets(llines, [
326*7249d1a6SKrzysztof Kosiński        [(2, 20), (7, 11), (15, 19)],
327*7249d1a6SKrzysztof Kosiński        [],
328*7249d1a6SKrzysztof Kosiński    ])
329*7249d1a6SKrzysztof Kosiński
330*7249d1a6SKrzysztof Kosiński  def testDecorator(self):
331*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
332*7249d1a6SKrzysztof Kosiński        @bar()
333*7249d1a6SKrzysztof Kosiński        def foo(a, b, c):
334*7249d1a6SKrzysztof Kosiński          pass
335*7249d1a6SKrzysztof Kosiński        """)
336*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
337*7249d1a6SKrzysztof Kosiński    self._CheckMatchingBrackets(llines, [
338*7249d1a6SKrzysztof Kosiński        [(2, 3)],
339*7249d1a6SKrzysztof Kosiński        [(2, 8)],
340*7249d1a6SKrzysztof Kosiński        [],
341*7249d1a6SKrzysztof Kosiński    ])
342*7249d1a6SKrzysztof Kosiński
343*7249d1a6SKrzysztof Kosiński  def testClassDef(self):
344*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent("""\
345*7249d1a6SKrzysztof Kosiński        class A(B, C, D):
346*7249d1a6SKrzysztof Kosiński          pass
347*7249d1a6SKrzysztof Kosiński        """)
348*7249d1a6SKrzysztof Kosiński    llines = yapf_test_helper.ParseAndUnwrap(code)
349*7249d1a6SKrzysztof Kosiński    self._CheckMatchingBrackets(llines, [
350*7249d1a6SKrzysztof Kosiński        [(2, 8)],
351*7249d1a6SKrzysztof Kosiński        [],
352*7249d1a6SKrzysztof Kosiński    ])
353*7249d1a6SKrzysztof Kosiński
354*7249d1a6SKrzysztof Kosiński
355*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__':
356*7249d1a6SKrzysztof Kosiński  unittest.main()
357