xref: /aosp_15_r20/external/yapf/yapftests/comment_splicer_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.comment_splicer."""
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 comment_splicer
20*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import py3compat
21*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import pytree_utils
22*7249d1a6SKrzysztof Kosiński
23*7249d1a6SKrzysztof Kosiński
24*7249d1a6SKrzysztof Kosińskiclass CommentSplicerTest(unittest.TestCase):
25*7249d1a6SKrzysztof Kosiński
26*7249d1a6SKrzysztof Kosiński  def _AssertNodeType(self, expected_type, node):
27*7249d1a6SKrzysztof Kosiński    self.assertEqual(expected_type, pytree_utils.NodeName(node))
28*7249d1a6SKrzysztof Kosiński
29*7249d1a6SKrzysztof Kosiński  def _AssertNodeIsComment(self, node, text_in_comment=None):
30*7249d1a6SKrzysztof Kosiński    if pytree_utils.NodeName(node) == 'simple_stmt':
31*7249d1a6SKrzysztof Kosiński      self._AssertNodeType('COMMENT', node.children[0])
32*7249d1a6SKrzysztof Kosiński      node_value = node.children[0].value
33*7249d1a6SKrzysztof Kosiński    else:
34*7249d1a6SKrzysztof Kosiński      self._AssertNodeType('COMMENT', node)
35*7249d1a6SKrzysztof Kosiński      node_value = node.value
36*7249d1a6SKrzysztof Kosiński    if text_in_comment is not None:
37*7249d1a6SKrzysztof Kosiński      self.assertIn(text_in_comment, node_value)
38*7249d1a6SKrzysztof Kosiński
39*7249d1a6SKrzysztof Kosiński  def _FindNthChildNamed(self, node, name, n=1):
40*7249d1a6SKrzysztof Kosiński    for i, child in enumerate(
41*7249d1a6SKrzysztof Kosiński        py3compat.ifilter(lambda c: pytree_utils.NodeName(c) == name,
42*7249d1a6SKrzysztof Kosiński                          node.pre_order())):
43*7249d1a6SKrzysztof Kosiński      if i == n - 1:
44*7249d1a6SKrzysztof Kosiński        return child
45*7249d1a6SKrzysztof Kosiński    raise RuntimeError('No Nth child for n={0}'.format(n))
46*7249d1a6SKrzysztof Kosiński
47*7249d1a6SKrzysztof Kosiński  def testSimpleInline(self):
48*7249d1a6SKrzysztof Kosiński    code = 'foo = 1 # and a comment\n'
49*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
50*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
51*7249d1a6SKrzysztof Kosiński
52*7249d1a6SKrzysztof Kosiński    expr = tree.children[0].children[0]
53*7249d1a6SKrzysztof Kosiński    # Check that the expected node is still expr_stmt, but now it has 4 children
54*7249d1a6SKrzysztof Kosiński    # (before comment splicing it had 3), the last child being the comment.
55*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('expr_stmt', expr)
56*7249d1a6SKrzysztof Kosiński    self.assertEqual(4, len(expr.children))
57*7249d1a6SKrzysztof Kosiński    comment_node = expr.children[3]
58*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(comment_node, '# and a comment')
59*7249d1a6SKrzysztof Kosiński
60*7249d1a6SKrzysztof Kosiński  def testSimpleSeparateLine(self):
61*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
62*7249d1a6SKrzysztof Kosiński      foo = 1
63*7249d1a6SKrzysztof Kosiński      # first comment
64*7249d1a6SKrzysztof Kosiński      bar = 2
65*7249d1a6SKrzysztof Kosiński      ''')
66*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
67*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
68*7249d1a6SKrzysztof Kosiński
69*7249d1a6SKrzysztof Kosiński    # The comment should've been added to the root's children (now 4, including
70*7249d1a6SKrzysztof Kosiński    # the ENDMARKER in the end.
71*7249d1a6SKrzysztof Kosiński    self.assertEqual(4, len(tree.children))
72*7249d1a6SKrzysztof Kosiński    comment_node = tree.children[1]
73*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(comment_node)
74*7249d1a6SKrzysztof Kosiński
75*7249d1a6SKrzysztof Kosiński  def testTwoLineComment(self):
76*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
77*7249d1a6SKrzysztof Kosiński      foo = 1
78*7249d1a6SKrzysztof Kosiński      # first comment
79*7249d1a6SKrzysztof Kosiński      # second comment
80*7249d1a6SKrzysztof Kosiński      bar = 2
81*7249d1a6SKrzysztof Kosiński      ''')
82*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
83*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
84*7249d1a6SKrzysztof Kosiński
85*7249d1a6SKrzysztof Kosiński    # This is similar to the single-line standalone comment.
86*7249d1a6SKrzysztof Kosiński    self.assertEqual(4, len(tree.children))
87*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(tree.children[1])
88*7249d1a6SKrzysztof Kosiński
89*7249d1a6SKrzysztof Kosiński  def testCommentIsFirstChildInCompound(self):
90*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
91*7249d1a6SKrzysztof Kosiński      if x:
92*7249d1a6SKrzysztof Kosiński        # a comment
93*7249d1a6SKrzysztof Kosiński        foo = 1
94*7249d1a6SKrzysztof Kosiński      ''')
95*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
96*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
97*7249d1a6SKrzysztof Kosiński
98*7249d1a6SKrzysztof Kosiński    # Look into the suite node under the 'if'. We don't care about the NEWLINE
99*7249d1a6SKrzysztof Kosiński    # leaf but the new COMMENT must be a child of the suite and before the
100*7249d1a6SKrzysztof Kosiński    # actual code leaf.
101*7249d1a6SKrzysztof Kosiński    if_suite = tree.children[0].children[3]
102*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('NEWLINE', if_suite.children[0])
103*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite.children[1])
104*7249d1a6SKrzysztof Kosiński
105*7249d1a6SKrzysztof Kosiński  def testCommentIsLastChildInCompound(self):
106*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
107*7249d1a6SKrzysztof Kosiński      if x:
108*7249d1a6SKrzysztof Kosiński        foo = 1
109*7249d1a6SKrzysztof Kosiński        # a comment
110*7249d1a6SKrzysztof Kosiński      ''')
111*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
112*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
113*7249d1a6SKrzysztof Kosiński
114*7249d1a6SKrzysztof Kosiński    # Look into the suite node under the 'if'. We don't care about the DEDENT
115*7249d1a6SKrzysztof Kosiński    # leaf but the new COMMENT must be a child of the suite and after the
116*7249d1a6SKrzysztof Kosiński    # actual code leaf.
117*7249d1a6SKrzysztof Kosiński    if_suite = tree.children[0].children[3]
118*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite.children[-1])
119*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite.children[-2])
120*7249d1a6SKrzysztof Kosiński
121*7249d1a6SKrzysztof Kosiński  def testInlineAfterSeparateLine(self):
122*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
123*7249d1a6SKrzysztof Kosiński      bar = 1
124*7249d1a6SKrzysztof Kosiński      # line comment
125*7249d1a6SKrzysztof Kosiński      foo = 1 # inline comment
126*7249d1a6SKrzysztof Kosiński      ''')
127*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
128*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
129*7249d1a6SKrzysztof Kosiński
130*7249d1a6SKrzysztof Kosiński    # The separate line comment should become a child of the root, while
131*7249d1a6SKrzysztof Kosiński    # the inline comment remains within its simple_node.
132*7249d1a6SKrzysztof Kosiński    sep_comment_node = tree.children[1]
133*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(sep_comment_node, '# line comment')
134*7249d1a6SKrzysztof Kosiński
135*7249d1a6SKrzysztof Kosiński    expr = tree.children[2].children[0]
136*7249d1a6SKrzysztof Kosiński    inline_comment_node = expr.children[-1]
137*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(inline_comment_node, '# inline comment')
138*7249d1a6SKrzysztof Kosiński
139*7249d1a6SKrzysztof Kosiński  def testSeparateLineAfterInline(self):
140*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
141*7249d1a6SKrzysztof Kosiński      bar = 1
142*7249d1a6SKrzysztof Kosiński      foo = 1 # inline comment
143*7249d1a6SKrzysztof Kosiński      # line comment
144*7249d1a6SKrzysztof Kosiński      ''')
145*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
146*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
147*7249d1a6SKrzysztof Kosiński
148*7249d1a6SKrzysztof Kosiński    # The separate line comment should become a child of the root, while
149*7249d1a6SKrzysztof Kosiński    # the inline comment remains within its simple_node.
150*7249d1a6SKrzysztof Kosiński    sep_comment_node = tree.children[-2]
151*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(sep_comment_node, '# line comment')
152*7249d1a6SKrzysztof Kosiński
153*7249d1a6SKrzysztof Kosiński    expr = tree.children[1].children[0]
154*7249d1a6SKrzysztof Kosiński    inline_comment_node = expr.children[-1]
155*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(inline_comment_node, '# inline comment')
156*7249d1a6SKrzysztof Kosiński
157*7249d1a6SKrzysztof Kosiński  def testCommentBeforeDedent(self):
158*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
159*7249d1a6SKrzysztof Kosiński      if bar:
160*7249d1a6SKrzysztof Kosiński        z = 1
161*7249d1a6SKrzysztof Kosiński      # a comment
162*7249d1a6SKrzysztof Kosiński      j = 2
163*7249d1a6SKrzysztof Kosiński      ''')
164*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
165*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
166*7249d1a6SKrzysztof Kosiński
167*7249d1a6SKrzysztof Kosiński    # The comment should go under the tree root, not under the 'if'.
168*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(tree.children[1])
169*7249d1a6SKrzysztof Kosiński    if_suite = tree.children[0].children[3]
170*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite.children[-1])
171*7249d1a6SKrzysztof Kosiński
172*7249d1a6SKrzysztof Kosiński  def testCommentBeforeDedentTwoLevel(self):
173*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
174*7249d1a6SKrzysztof Kosiński      if foo:
175*7249d1a6SKrzysztof Kosiński        if bar:
176*7249d1a6SKrzysztof Kosiński          z = 1
177*7249d1a6SKrzysztof Kosiński        # a comment
178*7249d1a6SKrzysztof Kosiński      y = 1
179*7249d1a6SKrzysztof Kosiński      ''')
180*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
181*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
182*7249d1a6SKrzysztof Kosiński
183*7249d1a6SKrzysztof Kosiński    if_suite = tree.children[0].children[3]
184*7249d1a6SKrzysztof Kosiński    # The comment is in the first if_suite, not the nested if under it. It's
185*7249d1a6SKrzysztof Kosiński    # right before the DEDENT
186*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite.children[-2])
187*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite.children[-1])
188*7249d1a6SKrzysztof Kosiński
189*7249d1a6SKrzysztof Kosiński  def testCommentBeforeDedentTwoLevelImproperlyIndented(self):
190*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
191*7249d1a6SKrzysztof Kosiński      if foo:
192*7249d1a6SKrzysztof Kosiński        if bar:
193*7249d1a6SKrzysztof Kosiński          z = 1
194*7249d1a6SKrzysztof Kosiński         # comment 2
195*7249d1a6SKrzysztof Kosiński      y = 1
196*7249d1a6SKrzysztof Kosiński      ''')
197*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
198*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
199*7249d1a6SKrzysztof Kosiński
200*7249d1a6SKrzysztof Kosiński    # The comment here is indented by 3 spaces, which is unlike any of the
201*7249d1a6SKrzysztof Kosiński    # surrounding statement indentation levels. The splicer attaches it to the
202*7249d1a6SKrzysztof Kosiński    # "closest" parent with smaller indentation.
203*7249d1a6SKrzysztof Kosiński    if_suite = tree.children[0].children[3]
204*7249d1a6SKrzysztof Kosiński    # The comment is in the first if_suite, not the nested if under it. It's
205*7249d1a6SKrzysztof Kosiński    # right before the DEDENT
206*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite.children[-2])
207*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite.children[-1])
208*7249d1a6SKrzysztof Kosiński
209*7249d1a6SKrzysztof Kosiński  def testCommentBeforeDedentThreeLevel(self):
210*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
211*7249d1a6SKrzysztof Kosiński      if foo:
212*7249d1a6SKrzysztof Kosiński        if bar:
213*7249d1a6SKrzysztof Kosiński          z = 1
214*7249d1a6SKrzysztof Kosiński          # comment 2
215*7249d1a6SKrzysztof Kosiński        # comment 1
216*7249d1a6SKrzysztof Kosiński      # comment 0
217*7249d1a6SKrzysztof Kosiński      j = 2
218*7249d1a6SKrzysztof Kosiński      ''')
219*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
220*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
221*7249d1a6SKrzysztof Kosiński
222*7249d1a6SKrzysztof Kosiński    # comment 0 should go under the tree root
223*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(tree.children[1], '# comment 0')
224*7249d1a6SKrzysztof Kosiński
225*7249d1a6SKrzysztof Kosiński    # comment 1 is in the first if_suite, right before the DEDENT
226*7249d1a6SKrzysztof Kosiński    if_suite_1 = self._FindNthChildNamed(tree, 'suite', n=1)
227*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite_1.children[-2], '# comment 1')
228*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite_1.children[-1])
229*7249d1a6SKrzysztof Kosiński
230*7249d1a6SKrzysztof Kosiński    # comment 2 is in if_suite nested under the first if suite,
231*7249d1a6SKrzysztof Kosiński    # right before the DEDENT
232*7249d1a6SKrzysztof Kosiński    if_suite_2 = self._FindNthChildNamed(tree, 'suite', n=2)
233*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(if_suite_2.children[-2], '# comment 2')
234*7249d1a6SKrzysztof Kosiński    self._AssertNodeType('DEDENT', if_suite_2.children[-1])
235*7249d1a6SKrzysztof Kosiński
236*7249d1a6SKrzysztof Kosiński  def testCommentsInClass(self):
237*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
238*7249d1a6SKrzysztof Kosiński      class Foo:
239*7249d1a6SKrzysztof Kosiński        """docstring abc..."""
240*7249d1a6SKrzysztof Kosiński        # top-level comment
241*7249d1a6SKrzysztof Kosiński        def foo(): pass
242*7249d1a6SKrzysztof Kosiński        # another comment
243*7249d1a6SKrzysztof Kosiński      ''')
244*7249d1a6SKrzysztof Kosiński
245*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
246*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
247*7249d1a6SKrzysztof Kosiński
248*7249d1a6SKrzysztof Kosiński    class_suite = tree.children[0].children[3]
249*7249d1a6SKrzysztof Kosiński    another_comment = class_suite.children[-2]
250*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(another_comment, '# another')
251*7249d1a6SKrzysztof Kosiński
252*7249d1a6SKrzysztof Kosiński    # It's OK for the comment to be a child of funcdef, as long as it's
253*7249d1a6SKrzysztof Kosiński    # the first child and thus comes before the 'def'.
254*7249d1a6SKrzysztof Kosiński    funcdef = class_suite.children[3]
255*7249d1a6SKrzysztof Kosiński    toplevel_comment = funcdef.children[0]
256*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(toplevel_comment, '# top-level')
257*7249d1a6SKrzysztof Kosiński
258*7249d1a6SKrzysztof Kosiński  def testMultipleBlockComments(self):
259*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
260*7249d1a6SKrzysztof Kosiński        # Block comment number 1
261*7249d1a6SKrzysztof Kosiński
262*7249d1a6SKrzysztof Kosiński        # Block comment number 2
263*7249d1a6SKrzysztof Kosiński        def f():
264*7249d1a6SKrzysztof Kosiński          pass
265*7249d1a6SKrzysztof Kosiński        ''')
266*7249d1a6SKrzysztof Kosiński
267*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
268*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
269*7249d1a6SKrzysztof Kosiński
270*7249d1a6SKrzysztof Kosiński    funcdef = tree.children[0]
271*7249d1a6SKrzysztof Kosiński    block_comment_1 = funcdef.children[0]
272*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(block_comment_1, '# Block comment number 1')
273*7249d1a6SKrzysztof Kosiński
274*7249d1a6SKrzysztof Kosiński    block_comment_2 = funcdef.children[1]
275*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(block_comment_2, '# Block comment number 2')
276*7249d1a6SKrzysztof Kosiński
277*7249d1a6SKrzysztof Kosiński  def testCommentsOnDedents(self):
278*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
279*7249d1a6SKrzysztof Kosiński        class Foo(object):
280*7249d1a6SKrzysztof Kosiński          # A comment for qux.
281*7249d1a6SKrzysztof Kosiński          def qux(self):
282*7249d1a6SKrzysztof Kosiński            pass
283*7249d1a6SKrzysztof Kosiński
284*7249d1a6SKrzysztof Kosiński          # Interim comment.
285*7249d1a6SKrzysztof Kosiński
286*7249d1a6SKrzysztof Kosiński          def mux(self):
287*7249d1a6SKrzysztof Kosiński            pass
288*7249d1a6SKrzysztof Kosiński        ''')
289*7249d1a6SKrzysztof Kosiński
290*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
291*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
292*7249d1a6SKrzysztof Kosiński
293*7249d1a6SKrzysztof Kosiński    classdef = tree.children[0]
294*7249d1a6SKrzysztof Kosiński    class_suite = classdef.children[6]
295*7249d1a6SKrzysztof Kosiński    qux_comment = class_suite.children[1]
296*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(qux_comment, '# A comment for qux.')
297*7249d1a6SKrzysztof Kosiński
298*7249d1a6SKrzysztof Kosiński    interim_comment = class_suite.children[4]
299*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(interim_comment, '# Interim comment.')
300*7249d1a6SKrzysztof Kosiński
301*7249d1a6SKrzysztof Kosiński  def testExprComments(self):
302*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
303*7249d1a6SKrzysztof Kosiński      foo( # Request fractions of an hour.
304*7249d1a6SKrzysztof Kosiński        948.0/3600, 20)
305*7249d1a6SKrzysztof Kosiński    ''')
306*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
307*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
308*7249d1a6SKrzysztof Kosiński
309*7249d1a6SKrzysztof Kosiński    trailer = self._FindNthChildNamed(tree, 'trailer', 1)
310*7249d1a6SKrzysztof Kosiński    comment = trailer.children[1]
311*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(comment, '# Request fractions of an hour.')
312*7249d1a6SKrzysztof Kosiński
313*7249d1a6SKrzysztof Kosiński  def testMultipleCommentsInOneExpr(self):
314*7249d1a6SKrzysztof Kosiński    code = textwrap.dedent(r'''
315*7249d1a6SKrzysztof Kosiński      foo( # com 1
316*7249d1a6SKrzysztof Kosiński        948.0/3600, # com 2
317*7249d1a6SKrzysztof Kosiński        20 + 12 # com 3
318*7249d1a6SKrzysztof Kosiński        )
319*7249d1a6SKrzysztof Kosiński    ''')
320*7249d1a6SKrzysztof Kosiński    tree = pytree_utils.ParseCodeToTree(code)
321*7249d1a6SKrzysztof Kosiński    comment_splicer.SpliceComments(tree)
322*7249d1a6SKrzysztof Kosiński
323*7249d1a6SKrzysztof Kosiński    trailer = self._FindNthChildNamed(tree, 'trailer', 1)
324*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(trailer.children[1], '# com 1')
325*7249d1a6SKrzysztof Kosiński
326*7249d1a6SKrzysztof Kosiński    arglist = self._FindNthChildNamed(tree, 'arglist', 1)
327*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(arglist.children[2], '# com 2')
328*7249d1a6SKrzysztof Kosiński
329*7249d1a6SKrzysztof Kosiński    arith_expr = self._FindNthChildNamed(tree, 'arith_expr', 1)
330*7249d1a6SKrzysztof Kosiński    self._AssertNodeIsComment(arith_expr.children[-1], '# com 3')
331*7249d1a6SKrzysztof Kosiński
332*7249d1a6SKrzysztof Kosiński
333*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__':
334*7249d1a6SKrzysztof Kosiński  unittest.main()
335