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