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.logical_line.""" 15*7249d1a6SKrzysztof Kosiński 16*7249d1a6SKrzysztof Kosińskiimport textwrap 17*7249d1a6SKrzysztof Kosińskiimport unittest 18*7249d1a6SKrzysztof Kosiński 19*7249d1a6SKrzysztof Kosińskifrom lib2to3 import pytree 20*7249d1a6SKrzysztof Kosińskifrom lib2to3.pgen2 import token 21*7249d1a6SKrzysztof Kosiński 22*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import format_token 23*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import logical_line 24*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import split_penalty 25*7249d1a6SKrzysztof Kosiński 26*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper 27*7249d1a6SKrzysztof Kosiński 28*7249d1a6SKrzysztof Kosiński 29*7249d1a6SKrzysztof Kosińskiclass LogicalLineBasicTest(unittest.TestCase): 30*7249d1a6SKrzysztof Kosiński 31*7249d1a6SKrzysztof Kosiński def testConstruction(self): 32*7249d1a6SKrzysztof Kosiński toks = _MakeFormatTokenList([(token.DOT, '.'), (token.VBAR, '|')]) 33*7249d1a6SKrzysztof Kosiński lline = logical_line.LogicalLine(20, toks) 34*7249d1a6SKrzysztof Kosiński self.assertEqual(20, lline.depth) 35*7249d1a6SKrzysztof Kosiński self.assertEqual(['DOT', 'VBAR'], [tok.name for tok in lline.tokens]) 36*7249d1a6SKrzysztof Kosiński 37*7249d1a6SKrzysztof Kosiński def testFirstLast(self): 38*7249d1a6SKrzysztof Kosiński toks = _MakeFormatTokenList([(token.DOT, '.'), (token.LPAR, '('), 39*7249d1a6SKrzysztof Kosiński (token.VBAR, '|')]) 40*7249d1a6SKrzysztof Kosiński lline = logical_line.LogicalLine(20, toks) 41*7249d1a6SKrzysztof Kosiński self.assertEqual(20, lline.depth) 42*7249d1a6SKrzysztof Kosiński self.assertEqual('DOT', lline.first.name) 43*7249d1a6SKrzysztof Kosiński self.assertEqual('VBAR', lline.last.name) 44*7249d1a6SKrzysztof Kosiński 45*7249d1a6SKrzysztof Kosiński def testAsCode(self): 46*7249d1a6SKrzysztof Kosiński toks = _MakeFormatTokenList([(token.DOT, '.'), (token.LPAR, '('), 47*7249d1a6SKrzysztof Kosiński (token.VBAR, '|')]) 48*7249d1a6SKrzysztof Kosiński lline = logical_line.LogicalLine(2, toks) 49*7249d1a6SKrzysztof Kosiński self.assertEqual(' . ( |', lline.AsCode()) 50*7249d1a6SKrzysztof Kosiński 51*7249d1a6SKrzysztof Kosiński def testAppendToken(self): 52*7249d1a6SKrzysztof Kosiński lline = logical_line.LogicalLine(0) 53*7249d1a6SKrzysztof Kosiński lline.AppendToken(_MakeFormatTokenLeaf(token.LPAR, '(')) 54*7249d1a6SKrzysztof Kosiński lline.AppendToken(_MakeFormatTokenLeaf(token.RPAR, ')')) 55*7249d1a6SKrzysztof Kosiński self.assertEqual(['LPAR', 'RPAR'], [tok.name for tok in lline.tokens]) 56*7249d1a6SKrzysztof Kosiński 57*7249d1a6SKrzysztof Kosiński def testAppendNode(self): 58*7249d1a6SKrzysztof Kosiński lline = logical_line.LogicalLine(0) 59*7249d1a6SKrzysztof Kosiński lline.AppendNode(pytree.Leaf(token.LPAR, '(')) 60*7249d1a6SKrzysztof Kosiński lline.AppendNode(pytree.Leaf(token.RPAR, ')')) 61*7249d1a6SKrzysztof Kosiński self.assertEqual(['LPAR', 'RPAR'], [tok.name for tok in lline.tokens]) 62*7249d1a6SKrzysztof Kosiński 63*7249d1a6SKrzysztof Kosiński 64*7249d1a6SKrzysztof Kosińskiclass LogicalLineFormattingInformationTest(yapf_test_helper.YAPFTest): 65*7249d1a6SKrzysztof Kosiński 66*7249d1a6SKrzysztof Kosiński def testFuncDef(self): 67*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(r""" 68*7249d1a6SKrzysztof Kosiński def f(a, b): 69*7249d1a6SKrzysztof Kosiński pass 70*7249d1a6SKrzysztof Kosiński """) 71*7249d1a6SKrzysztof Kosiński llines = yapf_test_helper.ParseAndUnwrap(code) 72*7249d1a6SKrzysztof Kosiński 73*7249d1a6SKrzysztof Kosiński f = llines[0].tokens[1] 74*7249d1a6SKrzysztof Kosiński self.assertFalse(f.can_break_before) 75*7249d1a6SKrzysztof Kosiński self.assertFalse(f.must_break_before) 76*7249d1a6SKrzysztof Kosiński self.assertEqual(f.split_penalty, split_penalty.UNBREAKABLE) 77*7249d1a6SKrzysztof Kosiński 78*7249d1a6SKrzysztof Kosiński lparen = llines[0].tokens[2] 79*7249d1a6SKrzysztof Kosiński self.assertFalse(lparen.can_break_before) 80*7249d1a6SKrzysztof Kosiński self.assertFalse(lparen.must_break_before) 81*7249d1a6SKrzysztof Kosiński self.assertEqual(lparen.split_penalty, split_penalty.UNBREAKABLE) 82*7249d1a6SKrzysztof Kosiński 83*7249d1a6SKrzysztof Kosiński 84*7249d1a6SKrzysztof Kosińskidef _MakeFormatTokenLeaf(token_type, token_value): 85*7249d1a6SKrzysztof Kosiński return format_token.FormatToken(pytree.Leaf(token_type, token_value)) 86*7249d1a6SKrzysztof Kosiński 87*7249d1a6SKrzysztof Kosiński 88*7249d1a6SKrzysztof Kosińskidef _MakeFormatTokenList(token_type_values): 89*7249d1a6SKrzysztof Kosiński return [ 90*7249d1a6SKrzysztof Kosiński _MakeFormatTokenLeaf(token_type, token_value) 91*7249d1a6SKrzysztof Kosiński for token_type, token_value in token_type_values 92*7249d1a6SKrzysztof Kosiński ] 93*7249d1a6SKrzysztof Kosiński 94*7249d1a6SKrzysztof Kosiński 95*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__': 96*7249d1a6SKrzysztof Kosiński unittest.main() 97