1*7249d1a6SKrzysztof Kosiński# -*- coding: utf-8 -*- 2*7249d1a6SKrzysztof Kosiński# Copyright 2015 Google Inc. All Rights Reserved. 3*7249d1a6SKrzysztof Kosiński# 4*7249d1a6SKrzysztof Kosiński# Licensed under the Apache License, Version 2.0 (the "License"); 5*7249d1a6SKrzysztof Kosiński# you may not use this file except in compliance with the License. 6*7249d1a6SKrzysztof Kosiński# You may obtain a copy of the License at 7*7249d1a6SKrzysztof Kosiński# 8*7249d1a6SKrzysztof Kosiński# http://www.apache.org/licenses/LICENSE-2.0 9*7249d1a6SKrzysztof Kosiński# 10*7249d1a6SKrzysztof Kosiński# Unless required by applicable law or agreed to in writing, software 11*7249d1a6SKrzysztof Kosiński# distributed under the License is distributed on an "AS IS" BASIS, 12*7249d1a6SKrzysztof Kosiński# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*7249d1a6SKrzysztof Kosiński# See the License for the specific language governing permissions and 14*7249d1a6SKrzysztof Kosiński# limitations under the License. 15*7249d1a6SKrzysztof Kosiński"""Tests for yapf.yapf.""" 16*7249d1a6SKrzysztof Kosiński 17*7249d1a6SKrzysztof Kosińskiimport io 18*7249d1a6SKrzysztof Kosińskiimport logging 19*7249d1a6SKrzysztof Kosińskiimport os 20*7249d1a6SKrzysztof Kosińskiimport shutil 21*7249d1a6SKrzysztof Kosińskiimport subprocess 22*7249d1a6SKrzysztof Kosińskiimport sys 23*7249d1a6SKrzysztof Kosińskiimport tempfile 24*7249d1a6SKrzysztof Kosińskiimport textwrap 25*7249d1a6SKrzysztof Kosińskiimport unittest 26*7249d1a6SKrzysztof Kosiński 27*7249d1a6SKrzysztof Kosińskifrom lib2to3.pgen2 import tokenize 28*7249d1a6SKrzysztof Kosiński 29*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import errors 30*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import py3compat 31*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import style 32*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import yapf_api 33*7249d1a6SKrzysztof Kosiński 34*7249d1a6SKrzysztof Kosińskifrom yapftests import utils 35*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper 36*7249d1a6SKrzysztof Kosiński 37*7249d1a6SKrzysztof KosińskiROOT_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) 38*7249d1a6SKrzysztof Kosiński 39*7249d1a6SKrzysztof Kosiński# Verification is turned off by default, but want to enable it for testing. 40*7249d1a6SKrzysztof KosińskiYAPF_BINARY = [sys.executable, '-m', 'yapf', '--verify', '--no-local-style'] 41*7249d1a6SKrzysztof Kosiński 42*7249d1a6SKrzysztof Kosiński 43*7249d1a6SKrzysztof Kosińskiclass FormatCodeTest(yapf_test_helper.YAPFTest): 44*7249d1a6SKrzysztof Kosiński 45*7249d1a6SKrzysztof Kosiński def _Check(self, unformatted_code, expected_formatted_code): 46*7249d1a6SKrzysztof Kosiński formatted_code, _ = yapf_api.FormatCode( 47*7249d1a6SKrzysztof Kosiński unformatted_code, style_config='yapf') 48*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 49*7249d1a6SKrzysztof Kosiński 50*7249d1a6SKrzysztof Kosiński def testSimple(self): 51*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 52*7249d1a6SKrzysztof Kosiński print('foo') 53*7249d1a6SKrzysztof Kosiński """) 54*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, unformatted_code) 55*7249d1a6SKrzysztof Kosiński 56*7249d1a6SKrzysztof Kosiński def testNoEndingNewline(self): 57*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 58*7249d1a6SKrzysztof Kosiński if True: 59*7249d1a6SKrzysztof Kosiński pass""") 60*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 61*7249d1a6SKrzysztof Kosiński if True: 62*7249d1a6SKrzysztof Kosiński pass 63*7249d1a6SKrzysztof Kosiński """) 64*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 65*7249d1a6SKrzysztof Kosiński 66*7249d1a6SKrzysztof Kosiński @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') 67*7249d1a6SKrzysztof Kosiński def testPrintAfterPeriod(self): 68*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""a.print\n""") 69*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""a.print\n""") 70*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 71*7249d1a6SKrzysztof Kosiński 72*7249d1a6SKrzysztof Kosiński 73*7249d1a6SKrzysztof Kosińskiclass FormatFileTest(unittest.TestCase): 74*7249d1a6SKrzysztof Kosiński 75*7249d1a6SKrzysztof Kosiński def setUp(self): # pylint: disable=g-missing-super-call 76*7249d1a6SKrzysztof Kosiński self.test_tmpdir = tempfile.mkdtemp() 77*7249d1a6SKrzysztof Kosiński 78*7249d1a6SKrzysztof Kosiński def tearDown(self): # pylint: disable=g-missing-super-call 79*7249d1a6SKrzysztof Kosiński shutil.rmtree(self.test_tmpdir) 80*7249d1a6SKrzysztof Kosiński 81*7249d1a6SKrzysztof Kosiński def assertCodeEqual(self, expected_code, code): 82*7249d1a6SKrzysztof Kosiński if code != expected_code: 83*7249d1a6SKrzysztof Kosiński msg = 'Code format mismatch:\n' 84*7249d1a6SKrzysztof Kosiński msg += 'Expected:\n >' 85*7249d1a6SKrzysztof Kosiński msg += '\n > '.join(expected_code.splitlines()) 86*7249d1a6SKrzysztof Kosiński msg += '\nActual:\n >' 87*7249d1a6SKrzysztof Kosiński msg += '\n > '.join(code.splitlines()) 88*7249d1a6SKrzysztof Kosiński # TODO(sbc): maybe using difflib here to produce easy to read deltas? 89*7249d1a6SKrzysztof Kosiński self.fail(msg) 90*7249d1a6SKrzysztof Kosiński 91*7249d1a6SKrzysztof Kosiński def testFormatFile(self): 92*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 93*7249d1a6SKrzysztof Kosiński if True: 94*7249d1a6SKrzysztof Kosiński pass 95*7249d1a6SKrzysztof Kosiński """) 96*7249d1a6SKrzysztof Kosiński expected_formatted_code_pep8 = textwrap.dedent(u"""\ 97*7249d1a6SKrzysztof Kosiński if True: 98*7249d1a6SKrzysztof Kosiński pass 99*7249d1a6SKrzysztof Kosiński """) 100*7249d1a6SKrzysztof Kosiński expected_formatted_code_yapf = textwrap.dedent(u"""\ 101*7249d1a6SKrzysztof Kosiński if True: 102*7249d1a6SKrzysztof Kosiński pass 103*7249d1a6SKrzysztof Kosiński """) 104*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 105*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 106*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code_pep8, formatted_code) 107*7249d1a6SKrzysztof Kosiński 108*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') 109*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code_yapf, formatted_code) 110*7249d1a6SKrzysztof Kosiński 111*7249d1a6SKrzysztof Kosiński def testDisableLinesPattern(self): 112*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 113*7249d1a6SKrzysztof Kosiński if a: b 114*7249d1a6SKrzysztof Kosiński 115*7249d1a6SKrzysztof Kosiński # yapf: disable 116*7249d1a6SKrzysztof Kosiński if f: g 117*7249d1a6SKrzysztof Kosiński 118*7249d1a6SKrzysztof Kosiński if h: i 119*7249d1a6SKrzysztof Kosiński """) 120*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent(u"""\ 121*7249d1a6SKrzysztof Kosiński if a: b 122*7249d1a6SKrzysztof Kosiński 123*7249d1a6SKrzysztof Kosiński # yapf: disable 124*7249d1a6SKrzysztof Kosiński if f: g 125*7249d1a6SKrzysztof Kosiński 126*7249d1a6SKrzysztof Kosiński if h: i 127*7249d1a6SKrzysztof Kosiński """) 128*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 129*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 130*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 131*7249d1a6SKrzysztof Kosiński 132*7249d1a6SKrzysztof Kosiński def testDisableAndReenableLinesPattern(self): 133*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 134*7249d1a6SKrzysztof Kosiński if a: b 135*7249d1a6SKrzysztof Kosiński 136*7249d1a6SKrzysztof Kosiński # yapf: disable 137*7249d1a6SKrzysztof Kosiński if f: g 138*7249d1a6SKrzysztof Kosiński # yapf: enable 139*7249d1a6SKrzysztof Kosiński 140*7249d1a6SKrzysztof Kosiński if h: i 141*7249d1a6SKrzysztof Kosiński """) 142*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent(u"""\ 143*7249d1a6SKrzysztof Kosiński if a: b 144*7249d1a6SKrzysztof Kosiński 145*7249d1a6SKrzysztof Kosiński # yapf: disable 146*7249d1a6SKrzysztof Kosiński if f: g 147*7249d1a6SKrzysztof Kosiński # yapf: enable 148*7249d1a6SKrzysztof Kosiński 149*7249d1a6SKrzysztof Kosiński if h: i 150*7249d1a6SKrzysztof Kosiński """) 151*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 152*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 153*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 154*7249d1a6SKrzysztof Kosiński 155*7249d1a6SKrzysztof Kosiński def testDisablePartOfMultilineComment(self): 156*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 157*7249d1a6SKrzysztof Kosiński if a: b 158*7249d1a6SKrzysztof Kosiński 159*7249d1a6SKrzysztof Kosiński # This is a multiline comment that disables YAPF. 160*7249d1a6SKrzysztof Kosiński # yapf: disable 161*7249d1a6SKrzysztof Kosiński if f: g 162*7249d1a6SKrzysztof Kosiński # yapf: enable 163*7249d1a6SKrzysztof Kosiński # This is a multiline comment that enables YAPF. 164*7249d1a6SKrzysztof Kosiński 165*7249d1a6SKrzysztof Kosiński if h: i 166*7249d1a6SKrzysztof Kosiński """) 167*7249d1a6SKrzysztof Kosiński 168*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent(u"""\ 169*7249d1a6SKrzysztof Kosiński if a: b 170*7249d1a6SKrzysztof Kosiński 171*7249d1a6SKrzysztof Kosiński # This is a multiline comment that disables YAPF. 172*7249d1a6SKrzysztof Kosiński # yapf: disable 173*7249d1a6SKrzysztof Kosiński if f: g 174*7249d1a6SKrzysztof Kosiński # yapf: enable 175*7249d1a6SKrzysztof Kosiński # This is a multiline comment that enables YAPF. 176*7249d1a6SKrzysztof Kosiński 177*7249d1a6SKrzysztof Kosiński if h: i 178*7249d1a6SKrzysztof Kosiński """) 179*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 180*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 181*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 182*7249d1a6SKrzysztof Kosiński 183*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 184*7249d1a6SKrzysztof Kosiński def foo_function(): 185*7249d1a6SKrzysztof Kosiński # some comment 186*7249d1a6SKrzysztof Kosiński # yapf: disable 187*7249d1a6SKrzysztof Kosiński 188*7249d1a6SKrzysztof Kosiński foo( 189*7249d1a6SKrzysztof Kosiński bar, 190*7249d1a6SKrzysztof Kosiński baz 191*7249d1a6SKrzysztof Kosiński ) 192*7249d1a6SKrzysztof Kosiński 193*7249d1a6SKrzysztof Kosiński # yapf: enable 194*7249d1a6SKrzysztof Kosiński """) 195*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 196*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 197*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 198*7249d1a6SKrzysztof Kosiński 199*7249d1a6SKrzysztof Kosiński def testEnabledDisabledSameComment(self): 200*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 201*7249d1a6SKrzysztof Kosiński # yapf: disable 202*7249d1a6SKrzysztof Kosiński a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee) 203*7249d1a6SKrzysztof Kosiński # yapf: enable 204*7249d1a6SKrzysztof Kosiński # yapf: disable 205*7249d1a6SKrzysztof Kosiński a(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, ccccccccccccccccccccccccccccccc, ddddddddddddddddddddddd, eeeeeeeeeeeeeeeeeeeeeeeeeee) 206*7249d1a6SKrzysztof Kosiński # yapf: enable 207*7249d1a6SKrzysztof Kosiński """) # noqa 208*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 209*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 210*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 211*7249d1a6SKrzysztof Kosiński 212*7249d1a6SKrzysztof Kosiński def testFormatFileLinesSelection(self): 213*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 214*7249d1a6SKrzysztof Kosiński if a: b 215*7249d1a6SKrzysztof Kosiński 216*7249d1a6SKrzysztof Kosiński if f: g 217*7249d1a6SKrzysztof Kosiński 218*7249d1a6SKrzysztof Kosiński if h: i 219*7249d1a6SKrzysztof Kosiński """) 220*7249d1a6SKrzysztof Kosiński expected_formatted_code_lines1and2 = textwrap.dedent(u"""\ 221*7249d1a6SKrzysztof Kosiński if a: b 222*7249d1a6SKrzysztof Kosiński 223*7249d1a6SKrzysztof Kosiński if f: g 224*7249d1a6SKrzysztof Kosiński 225*7249d1a6SKrzysztof Kosiński if h: i 226*7249d1a6SKrzysztof Kosiński """) 227*7249d1a6SKrzysztof Kosiński expected_formatted_code_lines3 = textwrap.dedent(u"""\ 228*7249d1a6SKrzysztof Kosiński if a: b 229*7249d1a6SKrzysztof Kosiński 230*7249d1a6SKrzysztof Kosiński if f: g 231*7249d1a6SKrzysztof Kosiński 232*7249d1a6SKrzysztof Kosiński if h: i 233*7249d1a6SKrzysztof Kosiński """) 234*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 235*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile( 236*7249d1a6SKrzysztof Kosiński filepath, style_config='pep8', lines=[(1, 2)]) 237*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code_lines1and2, formatted_code) 238*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile( 239*7249d1a6SKrzysztof Kosiński filepath, style_config='pep8', lines=[(3, 3)]) 240*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code_lines3, formatted_code) 241*7249d1a6SKrzysztof Kosiński 242*7249d1a6SKrzysztof Kosiński def testFormatFileDiff(self): 243*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 244*7249d1a6SKrzysztof Kosiński if True: 245*7249d1a6SKrzysztof Kosiński pass 246*7249d1a6SKrzysztof Kosiński """) 247*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 248*7249d1a6SKrzysztof Kosiński diff, _, _ = yapf_api.FormatFile(filepath, print_diff=True) 249*7249d1a6SKrzysztof Kosiński self.assertIn(u'+ pass', diff) 250*7249d1a6SKrzysztof Kosiński 251*7249d1a6SKrzysztof Kosiński def testFormatFileInPlace(self): 252*7249d1a6SKrzysztof Kosiński unformatted_code = u'True==False\n' 253*7249d1a6SKrzysztof Kosiński formatted_code = u'True == False\n' 254*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 255*7249d1a6SKrzysztof Kosiński result, _, _ = yapf_api.FormatFile(filepath, in_place=True) 256*7249d1a6SKrzysztof Kosiński self.assertEqual(result, None) 257*7249d1a6SKrzysztof Kosiński with open(filepath) as fd: 258*7249d1a6SKrzysztof Kosiński if sys.version_info[0] <= 2: 259*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(formatted_code, fd.read().decode('ascii')) 260*7249d1a6SKrzysztof Kosiński else: 261*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(formatted_code, fd.read()) 262*7249d1a6SKrzysztof Kosiński 263*7249d1a6SKrzysztof Kosiński self.assertRaises( 264*7249d1a6SKrzysztof Kosiński ValueError, 265*7249d1a6SKrzysztof Kosiński yapf_api.FormatFile, 266*7249d1a6SKrzysztof Kosiński filepath, 267*7249d1a6SKrzysztof Kosiński in_place=True, 268*7249d1a6SKrzysztof Kosiński print_diff=True) 269*7249d1a6SKrzysztof Kosiński 270*7249d1a6SKrzysztof Kosiński def testNoFile(self): 271*7249d1a6SKrzysztof Kosiński stream = py3compat.StringIO() 272*7249d1a6SKrzysztof Kosiński handler = logging.StreamHandler(stream) 273*7249d1a6SKrzysztof Kosiński logger = logging.getLogger('mylogger') 274*7249d1a6SKrzysztof Kosiński logger.addHandler(handler) 275*7249d1a6SKrzysztof Kosiński self.assertRaises( 276*7249d1a6SKrzysztof Kosiński IOError, yapf_api.FormatFile, 'not_a_file.py', logger=logger.error) 277*7249d1a6SKrzysztof Kosiński self.assertEqual(stream.getvalue(), 278*7249d1a6SKrzysztof Kosiński "[Errno 2] No such file or directory: 'not_a_file.py'\n") 279*7249d1a6SKrzysztof Kosiński 280*7249d1a6SKrzysztof Kosiński def testCommentsUnformatted(self): 281*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 282*7249d1a6SKrzysztof Kosiński foo = [# A list of things 283*7249d1a6SKrzysztof Kosiński # bork 284*7249d1a6SKrzysztof Kosiński 'one', 285*7249d1a6SKrzysztof Kosiński # quark 286*7249d1a6SKrzysztof Kosiński 'two'] # yapf: disable 287*7249d1a6SKrzysztof Kosiński """) 288*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 289*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 290*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 291*7249d1a6SKrzysztof Kosiński 292*7249d1a6SKrzysztof Kosiński def testDisabledHorizontalFormattingOnNewLine(self): 293*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 294*7249d1a6SKrzysztof Kosiński # yapf: disable 295*7249d1a6SKrzysztof Kosiński a = [ 296*7249d1a6SKrzysztof Kosiński 1] 297*7249d1a6SKrzysztof Kosiński # yapf: enable 298*7249d1a6SKrzysztof Kosiński """) 299*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 300*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 301*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 302*7249d1a6SKrzysztof Kosiński 303*7249d1a6SKrzysztof Kosiński def testSplittingSemicolonStatements(self): 304*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 305*7249d1a6SKrzysztof Kosiński def f(): 306*7249d1a6SKrzysztof Kosiński x = y + 42 ; z = n * 42 307*7249d1a6SKrzysztof Kosiński if True: a += 1 ; b += 1; c += 1 308*7249d1a6SKrzysztof Kosiński """) 309*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent(u"""\ 310*7249d1a6SKrzysztof Kosiński def f(): 311*7249d1a6SKrzysztof Kosiński x = y + 42 312*7249d1a6SKrzysztof Kosiński z = n * 42 313*7249d1a6SKrzysztof Kosiński if True: 314*7249d1a6SKrzysztof Kosiński a += 1 315*7249d1a6SKrzysztof Kosiński b += 1 316*7249d1a6SKrzysztof Kosiński c += 1 317*7249d1a6SKrzysztof Kosiński """) 318*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 319*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 320*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 321*7249d1a6SKrzysztof Kosiński 322*7249d1a6SKrzysztof Kosiński def testSemicolonStatementsDisabled(self): 323*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 324*7249d1a6SKrzysztof Kosiński def f(): 325*7249d1a6SKrzysztof Kosiński x = y + 42 ; z = n * 42 # yapf: disable 326*7249d1a6SKrzysztof Kosiński if True: a += 1 ; b += 1; c += 1 327*7249d1a6SKrzysztof Kosiński """) 328*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent(u"""\ 329*7249d1a6SKrzysztof Kosiński def f(): 330*7249d1a6SKrzysztof Kosiński x = y + 42 ; z = n * 42 # yapf: disable 331*7249d1a6SKrzysztof Kosiński if True: 332*7249d1a6SKrzysztof Kosiński a += 1 333*7249d1a6SKrzysztof Kosiński b += 1 334*7249d1a6SKrzysztof Kosiński c += 1 335*7249d1a6SKrzysztof Kosiński """) 336*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, unformatted_code) as filepath: 337*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 338*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 339*7249d1a6SKrzysztof Kosiński 340*7249d1a6SKrzysztof Kosiński def testDisabledSemiColonSeparatedStatements(self): 341*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 342*7249d1a6SKrzysztof Kosiński # yapf: disable 343*7249d1a6SKrzysztof Kosiński if True: a ; b 344*7249d1a6SKrzysztof Kosiński """) 345*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 346*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='pep8') 347*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 348*7249d1a6SKrzysztof Kosiński 349*7249d1a6SKrzysztof Kosiński def testDisabledMultilineStringInDictionary(self): 350*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 351*7249d1a6SKrzysztof Kosiński # yapf: disable 352*7249d1a6SKrzysztof Kosiński 353*7249d1a6SKrzysztof Kosiński A = [ 354*7249d1a6SKrzysztof Kosiński { 355*7249d1a6SKrzysztof Kosiński "aaaaaaaaaaaaaaaaaaa": ''' 356*7249d1a6SKrzysztof Kosiński bbbbbbbbbbb: "ccccccccccc" 357*7249d1a6SKrzysztof Kosiński dddddddddddddd: 1 358*7249d1a6SKrzysztof Kosiński eeeeeeee: 0 359*7249d1a6SKrzysztof Kosiński ffffffffff: "ggggggg" 360*7249d1a6SKrzysztof Kosiński ''', 361*7249d1a6SKrzysztof Kosiński }, 362*7249d1a6SKrzysztof Kosiński ] 363*7249d1a6SKrzysztof Kosiński """) 364*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 365*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') 366*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 367*7249d1a6SKrzysztof Kosiński 368*7249d1a6SKrzysztof Kosiński def testDisabledWithPrecedingText(self): 369*7249d1a6SKrzysztof Kosiński code = textwrap.dedent(u"""\ 370*7249d1a6SKrzysztof Kosiński # TODO(fix formatting): yapf: disable 371*7249d1a6SKrzysztof Kosiński 372*7249d1a6SKrzysztof Kosiński A = [ 373*7249d1a6SKrzysztof Kosiński { 374*7249d1a6SKrzysztof Kosiński "aaaaaaaaaaaaaaaaaaa": ''' 375*7249d1a6SKrzysztof Kosiński bbbbbbbbbbb: "ccccccccccc" 376*7249d1a6SKrzysztof Kosiński dddddddddddddd: 1 377*7249d1a6SKrzysztof Kosiński eeeeeeee: 0 378*7249d1a6SKrzysztof Kosiński ffffffffff: "ggggggg" 379*7249d1a6SKrzysztof Kosiński ''', 380*7249d1a6SKrzysztof Kosiński }, 381*7249d1a6SKrzysztof Kosiński ] 382*7249d1a6SKrzysztof Kosiński """) 383*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 384*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') 385*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 386*7249d1a6SKrzysztof Kosiński 387*7249d1a6SKrzysztof Kosiński def testCRLFLineEnding(self): 388*7249d1a6SKrzysztof Kosiński code = u'class _():\r\n pass\r\n' 389*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, code) as filepath: 390*7249d1a6SKrzysztof Kosiński formatted_code, _, _ = yapf_api.FormatFile(filepath, style_config='yapf') 391*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(code, formatted_code) 392*7249d1a6SKrzysztof Kosiński 393*7249d1a6SKrzysztof Kosiński 394*7249d1a6SKrzysztof Kosińskiclass CommandLineTest(unittest.TestCase): 395*7249d1a6SKrzysztof Kosiński """Test how calling yapf from the command line acts.""" 396*7249d1a6SKrzysztof Kosiński 397*7249d1a6SKrzysztof Kosiński @classmethod 398*7249d1a6SKrzysztof Kosiński def setUpClass(cls): # pylint: disable=g-missing-super-call 399*7249d1a6SKrzysztof Kosiński cls.test_tmpdir = tempfile.mkdtemp() 400*7249d1a6SKrzysztof Kosiński 401*7249d1a6SKrzysztof Kosiński @classmethod 402*7249d1a6SKrzysztof Kosiński def tearDownClass(cls): # pylint: disable=g-missing-super-call 403*7249d1a6SKrzysztof Kosiński shutil.rmtree(cls.test_tmpdir) 404*7249d1a6SKrzysztof Kosiński 405*7249d1a6SKrzysztof Kosiński def assertYapfReformats(self, 406*7249d1a6SKrzysztof Kosiński unformatted, 407*7249d1a6SKrzysztof Kosiński expected, 408*7249d1a6SKrzysztof Kosiński extra_options=None, 409*7249d1a6SKrzysztof Kosiński env=None): 410*7249d1a6SKrzysztof Kosiński """Check that yapf reformats the given code as expected. 411*7249d1a6SKrzysztof Kosiński 412*7249d1a6SKrzysztof Kosiński Invokes yapf in a subprocess, piping the unformatted code into its stdin. 413*7249d1a6SKrzysztof Kosiński Checks that the formatted output is as expected. 414*7249d1a6SKrzysztof Kosiński 415*7249d1a6SKrzysztof Kosiński Arguments: 416*7249d1a6SKrzysztof Kosiński unformatted: unformatted code - input to yapf 417*7249d1a6SKrzysztof Kosiński expected: expected formatted code at the output of yapf 418*7249d1a6SKrzysztof Kosiński extra_options: iterable of extra command-line options to pass to yapf 419*7249d1a6SKrzysztof Kosiński env: dict of environment variables. 420*7249d1a6SKrzysztof Kosiński """ 421*7249d1a6SKrzysztof Kosiński cmdline = YAPF_BINARY + (extra_options or []) 422*7249d1a6SKrzysztof Kosiński p = subprocess.Popen( 423*7249d1a6SKrzysztof Kosiński cmdline, 424*7249d1a6SKrzysztof Kosiński stdout=subprocess.PIPE, 425*7249d1a6SKrzysztof Kosiński stdin=subprocess.PIPE, 426*7249d1a6SKrzysztof Kosiński stderr=subprocess.PIPE, 427*7249d1a6SKrzysztof Kosiński env=env) 428*7249d1a6SKrzysztof Kosiński reformatted_code, stderrdata = p.communicate( 429*7249d1a6SKrzysztof Kosiński unformatted.encode('utf-8-sig')) 430*7249d1a6SKrzysztof Kosiński self.assertEqual(stderrdata, b'') 431*7249d1a6SKrzysztof Kosiński self.assertMultiLineEqual(reformatted_code.decode('utf-8'), expected) 432*7249d1a6SKrzysztof Kosiński 433*7249d1a6SKrzysztof Kosiński @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') 434*7249d1a6SKrzysztof Kosiński def testUnicodeEncodingPipedToFile(self): 435*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 436*7249d1a6SKrzysztof Kosiński def foo(): 437*7249d1a6SKrzysztof Kosiński print('⇒') 438*7249d1a6SKrzysztof Kosiński """) 439*7249d1a6SKrzysztof Kosiński with utils.NamedTempFile( 440*7249d1a6SKrzysztof Kosiński dirname=self.test_tmpdir, suffix='.py') as (out, _): 441*7249d1a6SKrzysztof Kosiński with utils.TempFileContents( 442*7249d1a6SKrzysztof Kosiński self.test_tmpdir, unformatted_code, suffix='.py') as filepath: 443*7249d1a6SKrzysztof Kosiński subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out) 444*7249d1a6SKrzysztof Kosiński 445*7249d1a6SKrzysztof Kosiński def testInPlaceReformatting(self): 446*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 447*7249d1a6SKrzysztof Kosiński def foo(): 448*7249d1a6SKrzysztof Kosiński x = 37 449*7249d1a6SKrzysztof Kosiński """) 450*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 451*7249d1a6SKrzysztof Kosiński def foo(): 452*7249d1a6SKrzysztof Kosiński x = 37 453*7249d1a6SKrzysztof Kosiński """) 454*7249d1a6SKrzysztof Kosiński with utils.TempFileContents( 455*7249d1a6SKrzysztof Kosiński self.test_tmpdir, unformatted_code, suffix='.py') as filepath: 456*7249d1a6SKrzysztof Kosiński p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) 457*7249d1a6SKrzysztof Kosiński p.wait() 458*7249d1a6SKrzysztof Kosiński with io.open(filepath, mode='r', newline='') as fd: 459*7249d1a6SKrzysztof Kosiński reformatted_code = fd.read() 460*7249d1a6SKrzysztof Kosiński self.assertEqual(reformatted_code, expected_formatted_code) 461*7249d1a6SKrzysztof Kosiński 462*7249d1a6SKrzysztof Kosiński def testInPlaceReformattingBlank(self): 463*7249d1a6SKrzysztof Kosiński unformatted_code = u'\n\n' 464*7249d1a6SKrzysztof Kosiński expected_formatted_code = u'\n' 465*7249d1a6SKrzysztof Kosiński with utils.TempFileContents( 466*7249d1a6SKrzysztof Kosiński self.test_tmpdir, unformatted_code, suffix='.py') as filepath: 467*7249d1a6SKrzysztof Kosiński p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) 468*7249d1a6SKrzysztof Kosiński p.wait() 469*7249d1a6SKrzysztof Kosiński with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd: 470*7249d1a6SKrzysztof Kosiński reformatted_code = fd.read() 471*7249d1a6SKrzysztof Kosiński self.assertEqual(reformatted_code, expected_formatted_code) 472*7249d1a6SKrzysztof Kosiński 473*7249d1a6SKrzysztof Kosiński def testInPlaceReformattingEmpty(self): 474*7249d1a6SKrzysztof Kosiński unformatted_code = u'' 475*7249d1a6SKrzysztof Kosiński expected_formatted_code = u'' 476*7249d1a6SKrzysztof Kosiński with utils.TempFileContents( 477*7249d1a6SKrzysztof Kosiński self.test_tmpdir, unformatted_code, suffix='.py') as filepath: 478*7249d1a6SKrzysztof Kosiński p = subprocess.Popen(YAPF_BINARY + ['--in-place', filepath]) 479*7249d1a6SKrzysztof Kosiński p.wait() 480*7249d1a6SKrzysztof Kosiński with io.open(filepath, mode='r', encoding='utf-8', newline='') as fd: 481*7249d1a6SKrzysztof Kosiński reformatted_code = fd.read() 482*7249d1a6SKrzysztof Kosiński self.assertEqual(reformatted_code, expected_formatted_code) 483*7249d1a6SKrzysztof Kosiński 484*7249d1a6SKrzysztof Kosiński def testReadFromStdin(self): 485*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 486*7249d1a6SKrzysztof Kosiński def foo(): 487*7249d1a6SKrzysztof Kosiński x = 37 488*7249d1a6SKrzysztof Kosiński """) 489*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 490*7249d1a6SKrzysztof Kosiński def foo(): 491*7249d1a6SKrzysztof Kosiński x = 37 492*7249d1a6SKrzysztof Kosiński """) 493*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 494*7249d1a6SKrzysztof Kosiński 495*7249d1a6SKrzysztof Kosiński def testReadFromStdinWithEscapedStrings(self): 496*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 497*7249d1a6SKrzysztof Kosiński s = "foo\\nbar" 498*7249d1a6SKrzysztof Kosiński """) 499*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 500*7249d1a6SKrzysztof Kosiński s = "foo\\nbar" 501*7249d1a6SKrzysztof Kosiński """) 502*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 503*7249d1a6SKrzysztof Kosiński 504*7249d1a6SKrzysztof Kosiński def testSetYapfStyle(self): 505*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 506*7249d1a6SKrzysztof Kosiński def foo(): # trail 507*7249d1a6SKrzysztof Kosiński x = 37 508*7249d1a6SKrzysztof Kosiński """) 509*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 510*7249d1a6SKrzysztof Kosiński def foo(): # trail 511*7249d1a6SKrzysztof Kosiński x = 37 512*7249d1a6SKrzysztof Kosiński """) 513*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 514*7249d1a6SKrzysztof Kosiński unformatted_code, 515*7249d1a6SKrzysztof Kosiński expected_formatted_code, 516*7249d1a6SKrzysztof Kosiński extra_options=['--style=yapf']) 517*7249d1a6SKrzysztof Kosiński 518*7249d1a6SKrzysztof Kosiński def testSetCustomStyleBasedOnYapf(self): 519*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 520*7249d1a6SKrzysztof Kosiński def foo(): # trail 521*7249d1a6SKrzysztof Kosiński x = 37 522*7249d1a6SKrzysztof Kosiński """) 523*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 524*7249d1a6SKrzysztof Kosiński def foo(): # trail 525*7249d1a6SKrzysztof Kosiński x = 37 526*7249d1a6SKrzysztof Kosiński """) 527*7249d1a6SKrzysztof Kosiński style_file = textwrap.dedent(u'''\ 528*7249d1a6SKrzysztof Kosiński [style] 529*7249d1a6SKrzysztof Kosiński based_on_style = yapf 530*7249d1a6SKrzysztof Kosiński spaces_before_comment = 4 531*7249d1a6SKrzysztof Kosiński ''') 532*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath: 533*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 534*7249d1a6SKrzysztof Kosiński unformatted_code, 535*7249d1a6SKrzysztof Kosiński expected_formatted_code, 536*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 537*7249d1a6SKrzysztof Kosiński 538*7249d1a6SKrzysztof Kosiński def testSetCustomStyleSpacesBeforeComment(self): 539*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 540*7249d1a6SKrzysztof Kosiński a_very_long_statement_that_extends_way_beyond # Comment 541*7249d1a6SKrzysztof Kosiński short # This is a shorter statement 542*7249d1a6SKrzysztof Kosiński """) 543*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 544*7249d1a6SKrzysztof Kosiński a_very_long_statement_that_extends_way_beyond # Comment 545*7249d1a6SKrzysztof Kosiński short # This is a shorter statement 546*7249d1a6SKrzysztof Kosiński """) # noqa 547*7249d1a6SKrzysztof Kosiński style_file = textwrap.dedent(u'''\ 548*7249d1a6SKrzysztof Kosiński [style] 549*7249d1a6SKrzysztof Kosiński spaces_before_comment = 15, 20 550*7249d1a6SKrzysztof Kosiński ''') 551*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_file) as stylepath: 552*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 553*7249d1a6SKrzysztof Kosiński unformatted_code, 554*7249d1a6SKrzysztof Kosiński expected_formatted_code, 555*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 556*7249d1a6SKrzysztof Kosiński 557*7249d1a6SKrzysztof Kosiński def testReadSingleLineCodeFromStdin(self): 558*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 559*7249d1a6SKrzysztof Kosiński if True: pass 560*7249d1a6SKrzysztof Kosiński """) 561*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 562*7249d1a6SKrzysztof Kosiński if True: pass 563*7249d1a6SKrzysztof Kosiński """) 564*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 565*7249d1a6SKrzysztof Kosiński 566*7249d1a6SKrzysztof Kosiński def testEncodingVerification(self): 567*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent(u"""\ 568*7249d1a6SKrzysztof Kosiński '''The module docstring.''' 569*7249d1a6SKrzysztof Kosiński # -*- coding: utf-8 -*- 570*7249d1a6SKrzysztof Kosiński def f(): 571*7249d1a6SKrzysztof Kosiński x = 37 572*7249d1a6SKrzysztof Kosiński """) 573*7249d1a6SKrzysztof Kosiński 574*7249d1a6SKrzysztof Kosiński with utils.NamedTempFile( 575*7249d1a6SKrzysztof Kosiński suffix='.py', dirname=self.test_tmpdir) as (out, _): 576*7249d1a6SKrzysztof Kosiński with utils.TempFileContents( 577*7249d1a6SKrzysztof Kosiński self.test_tmpdir, unformatted_code, suffix='.py') as filepath: 578*7249d1a6SKrzysztof Kosiński try: 579*7249d1a6SKrzysztof Kosiński subprocess.check_call(YAPF_BINARY + ['--diff', filepath], stdout=out) 580*7249d1a6SKrzysztof Kosiński except subprocess.CalledProcessError as e: 581*7249d1a6SKrzysztof Kosiński # Indicates the text changed. 582*7249d1a6SKrzysztof Kosiński self.assertEqual(e.returncode, 1) # pylint: disable=g-assert-in-except # noqa 583*7249d1a6SKrzysztof Kosiński 584*7249d1a6SKrzysztof Kosiński def testReformattingSpecificLines(self): 585*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 586*7249d1a6SKrzysztof Kosiński def h(): 587*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 588*7249d1a6SKrzysztof Kosiński pass 589*7249d1a6SKrzysztof Kosiński 590*7249d1a6SKrzysztof Kosiński 591*7249d1a6SKrzysztof Kosiński def g(): 592*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 593*7249d1a6SKrzysztof Kosiński pass 594*7249d1a6SKrzysztof Kosiński """) # noqa 595*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 596*7249d1a6SKrzysztof Kosiński def h(): 597*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 598*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 599*7249d1a6SKrzysztof Kosiński pass 600*7249d1a6SKrzysztof Kosiński 601*7249d1a6SKrzysztof Kosiński 602*7249d1a6SKrzysztof Kosiński def g(): 603*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 604*7249d1a6SKrzysztof Kosiński pass 605*7249d1a6SKrzysztof Kosiński """) # noqa 606*7249d1a6SKrzysztof Kosiński # TODO(ambv): the `expected_formatted_code` here is not PEP8 compliant, 607*7249d1a6SKrzysztof Kosiński # raising "E129 visually indented line with same indent as next logical 608*7249d1a6SKrzysztof Kosiński # line" with flake8. 609*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 610*7249d1a6SKrzysztof Kosiński unformatted_code, 611*7249d1a6SKrzysztof Kosiński expected_formatted_code, 612*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-2']) 613*7249d1a6SKrzysztof Kosiński 614*7249d1a6SKrzysztof Kosiński def testOmitFormattingLinesBeforeDisabledFunctionComment(self): 615*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 616*7249d1a6SKrzysztof Kosiński import sys 617*7249d1a6SKrzysztof Kosiński 618*7249d1a6SKrzysztof Kosiński # Comment 619*7249d1a6SKrzysztof Kosiński def some_func(x): 620*7249d1a6SKrzysztof Kosiński x = ["badly" , "formatted","line" ] 621*7249d1a6SKrzysztof Kosiński """) 622*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 623*7249d1a6SKrzysztof Kosiński import sys 624*7249d1a6SKrzysztof Kosiński 625*7249d1a6SKrzysztof Kosiński # Comment 626*7249d1a6SKrzysztof Kosiński def some_func(x): 627*7249d1a6SKrzysztof Kosiński x = ["badly", "formatted", "line"] 628*7249d1a6SKrzysztof Kosiński """) 629*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 630*7249d1a6SKrzysztof Kosiński unformatted_code, 631*7249d1a6SKrzysztof Kosiński expected_formatted_code, 632*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '5-5']) 633*7249d1a6SKrzysztof Kosiński 634*7249d1a6SKrzysztof Kosiński def testReformattingSkippingLines(self): 635*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 636*7249d1a6SKrzysztof Kosiński def h(): 637*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 638*7249d1a6SKrzysztof Kosiński pass 639*7249d1a6SKrzysztof Kosiński 640*7249d1a6SKrzysztof Kosiński # yapf: disable 641*7249d1a6SKrzysztof Kosiński def g(): 642*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 643*7249d1a6SKrzysztof Kosiński pass 644*7249d1a6SKrzysztof Kosiński # yapf: enable 645*7249d1a6SKrzysztof Kosiński """) # noqa 646*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 647*7249d1a6SKrzysztof Kosiński def h(): 648*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 649*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 650*7249d1a6SKrzysztof Kosiński pass 651*7249d1a6SKrzysztof Kosiński 652*7249d1a6SKrzysztof Kosiński 653*7249d1a6SKrzysztof Kosiński # yapf: disable 654*7249d1a6SKrzysztof Kosiński def g(): 655*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 656*7249d1a6SKrzysztof Kosiński pass 657*7249d1a6SKrzysztof Kosiński # yapf: enable 658*7249d1a6SKrzysztof Kosiński """) # noqa 659*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 660*7249d1a6SKrzysztof Kosiński 661*7249d1a6SKrzysztof Kosiński def testReformattingSkippingToEndOfFile(self): 662*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 663*7249d1a6SKrzysztof Kosiński def h(): 664*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 665*7249d1a6SKrzysztof Kosiński pass 666*7249d1a6SKrzysztof Kosiński 667*7249d1a6SKrzysztof Kosiński # yapf: disable 668*7249d1a6SKrzysztof Kosiński def g(): 669*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 670*7249d1a6SKrzysztof Kosiński pass 671*7249d1a6SKrzysztof Kosiński 672*7249d1a6SKrzysztof Kosiński def f(): 673*7249d1a6SKrzysztof Kosiński def e(): 674*7249d1a6SKrzysztof Kosiński while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and 675*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 676*7249d1a6SKrzysztof Kosiński 'bbbbbbb'): 677*7249d1a6SKrzysztof Kosiński pass 678*7249d1a6SKrzysztof Kosiński """) # noqa 679*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 680*7249d1a6SKrzysztof Kosiński def h(): 681*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 682*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 683*7249d1a6SKrzysztof Kosiński pass 684*7249d1a6SKrzysztof Kosiński 685*7249d1a6SKrzysztof Kosiński 686*7249d1a6SKrzysztof Kosiński # yapf: disable 687*7249d1a6SKrzysztof Kosiński def g(): 688*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 689*7249d1a6SKrzysztof Kosiński pass 690*7249d1a6SKrzysztof Kosiński 691*7249d1a6SKrzysztof Kosiński def f(): 692*7249d1a6SKrzysztof Kosiński def e(): 693*7249d1a6SKrzysztof Kosiński while (xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz]) == 'aaaaaaaaaaa' and 694*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxxxxxxxxxxx(yyyyyyyyyyyyy[zzzzz].aaaaaaaa[0]) == 695*7249d1a6SKrzysztof Kosiński 'bbbbbbb'): 696*7249d1a6SKrzysztof Kosiński pass 697*7249d1a6SKrzysztof Kosiński """) # noqa 698*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 699*7249d1a6SKrzysztof Kosiński 700*7249d1a6SKrzysztof Kosiński def testReformattingSkippingSingleLine(self): 701*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 702*7249d1a6SKrzysztof Kosiński def h(): 703*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 704*7249d1a6SKrzysztof Kosiński pass 705*7249d1a6SKrzysztof Kosiński 706*7249d1a6SKrzysztof Kosiński def g(): 707*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable 708*7249d1a6SKrzysztof Kosiński pass 709*7249d1a6SKrzysztof Kosiński """) # noqa 710*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 711*7249d1a6SKrzysztof Kosiński def h(): 712*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 713*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 714*7249d1a6SKrzysztof Kosiński pass 715*7249d1a6SKrzysztof Kosiński 716*7249d1a6SKrzysztof Kosiński 717*7249d1a6SKrzysztof Kosiński def g(): 718*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable 719*7249d1a6SKrzysztof Kosiński pass 720*7249d1a6SKrzysztof Kosiński """) # noqa 721*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 722*7249d1a6SKrzysztof Kosiński 723*7249d1a6SKrzysztof Kosiński def testDisableWholeDataStructure(self): 724*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 725*7249d1a6SKrzysztof Kosiński A = set([ 726*7249d1a6SKrzysztof Kosiński 'hello', 727*7249d1a6SKrzysztof Kosiński 'world', 728*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 729*7249d1a6SKrzysztof Kosiński """) 730*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 731*7249d1a6SKrzysztof Kosiński A = set([ 732*7249d1a6SKrzysztof Kosiński 'hello', 733*7249d1a6SKrzysztof Kosiński 'world', 734*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 735*7249d1a6SKrzysztof Kosiński """) 736*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 737*7249d1a6SKrzysztof Kosiński 738*7249d1a6SKrzysztof Kosiński def testDisableButAdjustIndentations(self): 739*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 740*7249d1a6SKrzysztof Kosiński class SplitPenaltyTest(unittest.TestCase): 741*7249d1a6SKrzysztof Kosiński 742*7249d1a6SKrzysztof Kosiński def testUnbreakable(self): 743*7249d1a6SKrzysztof Kosiński self._CheckPenalties(tree, [ 744*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 745*7249d1a6SKrzysztof Kosiński """) 746*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 747*7249d1a6SKrzysztof Kosiński class SplitPenaltyTest(unittest.TestCase): 748*7249d1a6SKrzysztof Kosiński 749*7249d1a6SKrzysztof Kosiński def testUnbreakable(self): 750*7249d1a6SKrzysztof Kosiński self._CheckPenalties(tree, [ 751*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 752*7249d1a6SKrzysztof Kosiński """) 753*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 754*7249d1a6SKrzysztof Kosiński 755*7249d1a6SKrzysztof Kosiński def testRetainingHorizontalWhitespace(self): 756*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 757*7249d1a6SKrzysztof Kosiński def h(): 758*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 759*7249d1a6SKrzysztof Kosiński pass 760*7249d1a6SKrzysztof Kosiński 761*7249d1a6SKrzysztof Kosiński def g(): 762*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy (zzzzzzzzzzzzz [0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable 763*7249d1a6SKrzysztof Kosiński pass 764*7249d1a6SKrzysztof Kosiński """) # noqa 765*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 766*7249d1a6SKrzysztof Kosiński def h(): 767*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 768*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 769*7249d1a6SKrzysztof Kosiński pass 770*7249d1a6SKrzysztof Kosiński 771*7249d1a6SKrzysztof Kosiński 772*7249d1a6SKrzysztof Kosiński def g(): 773*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy (zzzzzzzzzzzzz [0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): # yapf: disable 774*7249d1a6SKrzysztof Kosiński pass 775*7249d1a6SKrzysztof Kosiński """) # noqa 776*7249d1a6SKrzysztof Kosiński self.assertYapfReformats(unformatted_code, expected_formatted_code) 777*7249d1a6SKrzysztof Kosiński 778*7249d1a6SKrzysztof Kosiński def testRetainingVerticalWhitespace(self): 779*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 780*7249d1a6SKrzysztof Kosiński def h(): 781*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 782*7249d1a6SKrzysztof Kosiński pass 783*7249d1a6SKrzysztof Kosiński 784*7249d1a6SKrzysztof Kosiński def g(): 785*7249d1a6SKrzysztof Kosiński 786*7249d1a6SKrzysztof Kosiński 787*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 788*7249d1a6SKrzysztof Kosiński 789*7249d1a6SKrzysztof Kosiński pass 790*7249d1a6SKrzysztof Kosiński """) # noqa 791*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 792*7249d1a6SKrzysztof Kosiński def h(): 793*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and 794*7249d1a6SKrzysztof Kosiński xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 795*7249d1a6SKrzysztof Kosiński pass 796*7249d1a6SKrzysztof Kosiński 797*7249d1a6SKrzysztof Kosiński def g(): 798*7249d1a6SKrzysztof Kosiński 799*7249d1a6SKrzysztof Kosiński 800*7249d1a6SKrzysztof Kosiński if (xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0]) == 'aaaaaaaaaaa' and xxxxxxxxxxxx.yyyyyyyy(zzzzzzzzzzzzz[0].mmmmmmmm[0]) == 'bbbbbbb'): 801*7249d1a6SKrzysztof Kosiński 802*7249d1a6SKrzysztof Kosiński pass 803*7249d1a6SKrzysztof Kosiński """) # noqa 804*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 805*7249d1a6SKrzysztof Kosiński unformatted_code, 806*7249d1a6SKrzysztof Kosiński expected_formatted_code, 807*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-2']) 808*7249d1a6SKrzysztof Kosiński 809*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 810*7249d1a6SKrzysztof Kosiński 811*7249d1a6SKrzysztof Kosiński 812*7249d1a6SKrzysztof Kosiński if a: b 813*7249d1a6SKrzysztof Kosiński 814*7249d1a6SKrzysztof Kosiński 815*7249d1a6SKrzysztof Kosiński if c: 816*7249d1a6SKrzysztof Kosiński to_much + indent 817*7249d1a6SKrzysztof Kosiński 818*7249d1a6SKrzysztof Kosiński same 819*7249d1a6SKrzysztof Kosiński 820*7249d1a6SKrzysztof Kosiński 821*7249d1a6SKrzysztof Kosiński 822*7249d1a6SKrzysztof Kosiński #comment 823*7249d1a6SKrzysztof Kosiński 824*7249d1a6SKrzysztof Kosiński # trailing whitespace 825*7249d1a6SKrzysztof Kosiński """) 826*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 827*7249d1a6SKrzysztof Kosiński if a: b 828*7249d1a6SKrzysztof Kosiński 829*7249d1a6SKrzysztof Kosiński 830*7249d1a6SKrzysztof Kosiński if c: 831*7249d1a6SKrzysztof Kosiński to_much + indent 832*7249d1a6SKrzysztof Kosiński 833*7249d1a6SKrzysztof Kosiński same 834*7249d1a6SKrzysztof Kosiński 835*7249d1a6SKrzysztof Kosiński 836*7249d1a6SKrzysztof Kosiński 837*7249d1a6SKrzysztof Kosiński #comment 838*7249d1a6SKrzysztof Kosiński 839*7249d1a6SKrzysztof Kosiński # trailing whitespace 840*7249d1a6SKrzysztof Kosiński """) 841*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 842*7249d1a6SKrzysztof Kosiński unformatted_code, 843*7249d1a6SKrzysztof Kosiński expected_formatted_code, 844*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '3-3', '--lines', '13-13']) 845*7249d1a6SKrzysztof Kosiński 846*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 847*7249d1a6SKrzysztof Kosiński ''' 848*7249d1a6SKrzysztof Kosiński docstring 849*7249d1a6SKrzysztof Kosiński 850*7249d1a6SKrzysztof Kosiński ''' 851*7249d1a6SKrzysztof Kosiński 852*7249d1a6SKrzysztof Kosiński import blah 853*7249d1a6SKrzysztof Kosiński """) 854*7249d1a6SKrzysztof Kosiński 855*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 856*7249d1a6SKrzysztof Kosiński unformatted_code, unformatted_code, extra_options=['--lines', '2-2']) 857*7249d1a6SKrzysztof Kosiński 858*7249d1a6SKrzysztof Kosiński def testVerticalSpacingWithCommentWithContinuationMarkers(self): 859*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 860*7249d1a6SKrzysztof Kosiński# \\ 861*7249d1a6SKrzysztof Kosiński# \\ 862*7249d1a6SKrzysztof Kosiński# \\ 863*7249d1a6SKrzysztof Kosiński 864*7249d1a6SKrzysztof Kosińskix = { 865*7249d1a6SKrzysztof Kosiński} 866*7249d1a6SKrzysztof Kosiński""" 867*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 868*7249d1a6SKrzysztof Kosiński# \\ 869*7249d1a6SKrzysztof Kosiński# \\ 870*7249d1a6SKrzysztof Kosiński# \\ 871*7249d1a6SKrzysztof Kosiński 872*7249d1a6SKrzysztof Kosińskix = { 873*7249d1a6SKrzysztof Kosiński} 874*7249d1a6SKrzysztof Kosiński""" 875*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 876*7249d1a6SKrzysztof Kosiński unformatted_code, 877*7249d1a6SKrzysztof Kosiński expected_formatted_code, 878*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1']) 879*7249d1a6SKrzysztof Kosiński 880*7249d1a6SKrzysztof Kosiński def testRetainingSemicolonsWhenSpecifyingLines(self): 881*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 882*7249d1a6SKrzysztof Kosiński a = line_to_format 883*7249d1a6SKrzysztof Kosiński def f(): 884*7249d1a6SKrzysztof Kosiński x = y + 42; z = n * 42 885*7249d1a6SKrzysztof Kosiński if True: a += 1 ; b += 1 ; c += 1 886*7249d1a6SKrzysztof Kosiński """) 887*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 888*7249d1a6SKrzysztof Kosiński a = line_to_format 889*7249d1a6SKrzysztof Kosiński def f(): 890*7249d1a6SKrzysztof Kosiński x = y + 42; z = n * 42 891*7249d1a6SKrzysztof Kosiński if True: a += 1 ; b += 1 ; c += 1 892*7249d1a6SKrzysztof Kosiński """) 893*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 894*7249d1a6SKrzysztof Kosiński unformatted_code, 895*7249d1a6SKrzysztof Kosiński expected_formatted_code, 896*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1']) 897*7249d1a6SKrzysztof Kosiński 898*7249d1a6SKrzysztof Kosiński def testDisabledMultilineStrings(self): 899*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent('''\ 900*7249d1a6SKrzysztof Kosiński foo=42 901*7249d1a6SKrzysztof Kosiński def f(): 902*7249d1a6SKrzysztof Kosiński email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br> 903*7249d1a6SKrzysztof Kosiński <b>Czar: </b>"""+despot["Nicholas"]+"""<br> 904*7249d1a6SKrzysztof Kosiński <b>Minion: </b>"""+serf["Dmitri"]+"""<br> 905*7249d1a6SKrzysztof Kosiński <b>Residence: </b>"""+palace["Winter"]+"""<br> 906*7249d1a6SKrzysztof Kosiński </body> 907*7249d1a6SKrzysztof Kosiński </html>""" 908*7249d1a6SKrzysztof Kosiński ''') # noqa 909*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent('''\ 910*7249d1a6SKrzysztof Kosiński foo = 42 911*7249d1a6SKrzysztof Kosiński def f(): 912*7249d1a6SKrzysztof Kosiński email_text += """<html>This is a really long docstring that goes over the column limit and is multi-line.<br><br> 913*7249d1a6SKrzysztof Kosiński <b>Czar: </b>"""+despot["Nicholas"]+"""<br> 914*7249d1a6SKrzysztof Kosiński <b>Minion: </b>"""+serf["Dmitri"]+"""<br> 915*7249d1a6SKrzysztof Kosiński <b>Residence: </b>"""+palace["Winter"]+"""<br> 916*7249d1a6SKrzysztof Kosiński </body> 917*7249d1a6SKrzysztof Kosiński </html>""" 918*7249d1a6SKrzysztof Kosiński ''') # noqa 919*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 920*7249d1a6SKrzysztof Kosiński unformatted_code, 921*7249d1a6SKrzysztof Kosiński expected_formatted_code, 922*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1']) 923*7249d1a6SKrzysztof Kosiński 924*7249d1a6SKrzysztof Kosiński def testDisableWhenSpecifyingLines(self): 925*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 926*7249d1a6SKrzysztof Kosiński # yapf: disable 927*7249d1a6SKrzysztof Kosiński A = set([ 928*7249d1a6SKrzysztof Kosiński 'hello', 929*7249d1a6SKrzysztof Kosiński 'world', 930*7249d1a6SKrzysztof Kosiński ]) 931*7249d1a6SKrzysztof Kosiński # yapf: enable 932*7249d1a6SKrzysztof Kosiński B = set([ 933*7249d1a6SKrzysztof Kosiński 'hello', 934*7249d1a6SKrzysztof Kosiński 'world', 935*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 936*7249d1a6SKrzysztof Kosiński """) 937*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 938*7249d1a6SKrzysztof Kosiński # yapf: disable 939*7249d1a6SKrzysztof Kosiński A = set([ 940*7249d1a6SKrzysztof Kosiński 'hello', 941*7249d1a6SKrzysztof Kosiński 'world', 942*7249d1a6SKrzysztof Kosiński ]) 943*7249d1a6SKrzysztof Kosiński # yapf: enable 944*7249d1a6SKrzysztof Kosiński B = set([ 945*7249d1a6SKrzysztof Kosiński 'hello', 946*7249d1a6SKrzysztof Kosiński 'world', 947*7249d1a6SKrzysztof Kosiński ]) # yapf: disable 948*7249d1a6SKrzysztof Kosiński """) 949*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 950*7249d1a6SKrzysztof Kosiński unformatted_code, 951*7249d1a6SKrzysztof Kosiński expected_formatted_code, 952*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-10']) 953*7249d1a6SKrzysztof Kosiński 954*7249d1a6SKrzysztof Kosiński def testDisableFormattingInDataLiteral(self): 955*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 956*7249d1a6SKrzysztof Kosiński def horrible(): 957*7249d1a6SKrzysztof Kosiński oh_god() 958*7249d1a6SKrzysztof Kosiński why_would_you() 959*7249d1a6SKrzysztof Kosiński [ 960*7249d1a6SKrzysztof Kosiński 'do', 961*7249d1a6SKrzysztof Kosiński 962*7249d1a6SKrzysztof Kosiński 'that', 963*7249d1a6SKrzysztof Kosiński ] 964*7249d1a6SKrzysztof Kosiński 965*7249d1a6SKrzysztof Kosiński def still_horrible(): 966*7249d1a6SKrzysztof Kosiński oh_god() 967*7249d1a6SKrzysztof Kosiński why_would_you() 968*7249d1a6SKrzysztof Kosiński [ 969*7249d1a6SKrzysztof Kosiński 'do', 970*7249d1a6SKrzysztof Kosiński 971*7249d1a6SKrzysztof Kosiński 'that' 972*7249d1a6SKrzysztof Kosiński ] 973*7249d1a6SKrzysztof Kosiński """) 974*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 975*7249d1a6SKrzysztof Kosiński def horrible(): 976*7249d1a6SKrzysztof Kosiński oh_god() 977*7249d1a6SKrzysztof Kosiński why_would_you() 978*7249d1a6SKrzysztof Kosiński [ 979*7249d1a6SKrzysztof Kosiński 'do', 980*7249d1a6SKrzysztof Kosiński 981*7249d1a6SKrzysztof Kosiński 'that', 982*7249d1a6SKrzysztof Kosiński ] 983*7249d1a6SKrzysztof Kosiński 984*7249d1a6SKrzysztof Kosiński def still_horrible(): 985*7249d1a6SKrzysztof Kosiński oh_god() 986*7249d1a6SKrzysztof Kosiński why_would_you() 987*7249d1a6SKrzysztof Kosiński ['do', 'that'] 988*7249d1a6SKrzysztof Kosiński """) 989*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 990*7249d1a6SKrzysztof Kosiński unformatted_code, 991*7249d1a6SKrzysztof Kosiński expected_formatted_code, 992*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '14-15']) 993*7249d1a6SKrzysztof Kosiński 994*7249d1a6SKrzysztof Kosiński def testRetainVerticalFormattingBetweenDisabledAndEnabledLines(self): 995*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 996*7249d1a6SKrzysztof Kosiński class A(object): 997*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 998*7249d1a6SKrzysztof Kosiński c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) 999*7249d1a6SKrzysztof Kosiński self.assertEqual( 1000*7249d1a6SKrzysztof Kosiński ('ddddddddddddddddddddddddd', 1001*7249d1a6SKrzysztof Kosiński 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % 1002*7249d1a6SKrzysztof Kosiński c.ffffffffffff), 1003*7249d1a6SKrzysztof Kosiński gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) 1004*7249d1a6SKrzysztof Kosiński iiiii = jjjjjjjjjjjjjj.iiiii 1005*7249d1a6SKrzysztof Kosiński """) 1006*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1007*7249d1a6SKrzysztof Kosiński class A(object): 1008*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 1009*7249d1a6SKrzysztof Kosiński c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) 1010*7249d1a6SKrzysztof Kosiński self.assertEqual(('ddddddddddddddddddddddddd', 1011*7249d1a6SKrzysztof Kosiński 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff), 1012*7249d1a6SKrzysztof Kosiński gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) 1013*7249d1a6SKrzysztof Kosiński iiiii = jjjjjjjjjjjjjj.iiiii 1014*7249d1a6SKrzysztof Kosiński """) # noqa 1015*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1016*7249d1a6SKrzysztof Kosiński unformatted_code, 1017*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1018*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '4-7']) 1019*7249d1a6SKrzysztof Kosiński 1020*7249d1a6SKrzysztof Kosiński def testRetainVerticalFormattingBetweenDisabledLines(self): 1021*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1022*7249d1a6SKrzysztof Kosiński class A(object): 1023*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 1024*7249d1a6SKrzysztof Kosiński pass 1025*7249d1a6SKrzysztof Kosiński 1026*7249d1a6SKrzysztof Kosiński 1027*7249d1a6SKrzysztof Kosiński def bbbbbbbbbbbbb(self): # 5 1028*7249d1a6SKrzysztof Kosiński pass 1029*7249d1a6SKrzysztof Kosiński """) 1030*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1031*7249d1a6SKrzysztof Kosiński class A(object): 1032*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 1033*7249d1a6SKrzysztof Kosiński pass 1034*7249d1a6SKrzysztof Kosiński 1035*7249d1a6SKrzysztof Kosiński 1036*7249d1a6SKrzysztof Kosiński def bbbbbbbbbbbbb(self): # 5 1037*7249d1a6SKrzysztof Kosiński pass 1038*7249d1a6SKrzysztof Kosiński """) 1039*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1040*7249d1a6SKrzysztof Kosiński unformatted_code, 1041*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1042*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '4-4']) 1043*7249d1a6SKrzysztof Kosiński 1044*7249d1a6SKrzysztof Kosiński def testFormatLinesSpecifiedInMiddleOfExpression(self): 1045*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1046*7249d1a6SKrzysztof Kosiński class A(object): 1047*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 1048*7249d1a6SKrzysztof Kosiński c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) 1049*7249d1a6SKrzysztof Kosiński self.assertEqual( 1050*7249d1a6SKrzysztof Kosiński ('ddddddddddddddddddddddddd', 1051*7249d1a6SKrzysztof Kosiński 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % 1052*7249d1a6SKrzysztof Kosiński c.ffffffffffff), 1053*7249d1a6SKrzysztof Kosiński gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) 1054*7249d1a6SKrzysztof Kosiński iiiii = jjjjjjjjjjjjjj.iiiii 1055*7249d1a6SKrzysztof Kosiński """) 1056*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1057*7249d1a6SKrzysztof Kosiński class A(object): 1058*7249d1a6SKrzysztof Kosiński def aaaaaaaaaaaaa(self): 1059*7249d1a6SKrzysztof Kosiński c = bbbbbbbbb.ccccccccc('challenge', 0, 1, 10) 1060*7249d1a6SKrzysztof Kosiński self.assertEqual(('ddddddddddddddddddddddddd', 1061*7249d1a6SKrzysztof Kosiński 'eeeeeeeeeeeeeeeeeeeeeeeee.%s' % c.ffffffffffff), 1062*7249d1a6SKrzysztof Kosiński gggggggggggg.hhhhhhhhh(c, c.ffffffffffff)) 1063*7249d1a6SKrzysztof Kosiński iiiii = jjjjjjjjjjjjjj.iiiii 1064*7249d1a6SKrzysztof Kosiński """) # noqa 1065*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1066*7249d1a6SKrzysztof Kosiński unformatted_code, 1067*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1068*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '5-6']) 1069*7249d1a6SKrzysztof Kosiński 1070*7249d1a6SKrzysztof Kosiński def testCommentFollowingMultilineString(self): 1071*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1072*7249d1a6SKrzysztof Kosiński def foo(): 1073*7249d1a6SKrzysztof Kosiński '''First line. 1074*7249d1a6SKrzysztof Kosiński Second line. 1075*7249d1a6SKrzysztof Kosiński ''' # comment 1076*7249d1a6SKrzysztof Kosiński x = '''hello world''' # second comment 1077*7249d1a6SKrzysztof Kosiński return 42 # another comment 1078*7249d1a6SKrzysztof Kosiński """) 1079*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1080*7249d1a6SKrzysztof Kosiński def foo(): 1081*7249d1a6SKrzysztof Kosiński '''First line. 1082*7249d1a6SKrzysztof Kosiński Second line. 1083*7249d1a6SKrzysztof Kosiński ''' # comment 1084*7249d1a6SKrzysztof Kosiński x = '''hello world''' # second comment 1085*7249d1a6SKrzysztof Kosiński return 42 # another comment 1086*7249d1a6SKrzysztof Kosiński """) 1087*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1088*7249d1a6SKrzysztof Kosiński unformatted_code, 1089*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1090*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1']) 1091*7249d1a6SKrzysztof Kosiński 1092*7249d1a6SKrzysztof Kosiński def testDedentClosingBracket(self): 1093*7249d1a6SKrzysztof Kosiński # no line-break on the first argument, not dedenting closing brackets 1094*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1095*7249d1a6SKrzysztof Kosiński def overly_long_function_name(first_argument_on_the_same_line, 1096*7249d1a6SKrzysztof Kosiński second_argument_makes_the_line_too_long): 1097*7249d1a6SKrzysztof Kosiński pass 1098*7249d1a6SKrzysztof Kosiński """) 1099*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1100*7249d1a6SKrzysztof Kosiński def overly_long_function_name(first_argument_on_the_same_line, 1101*7249d1a6SKrzysztof Kosiński second_argument_makes_the_line_too_long): 1102*7249d1a6SKrzysztof Kosiński pass 1103*7249d1a6SKrzysztof Kosiński """) 1104*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1105*7249d1a6SKrzysztof Kosiński unformatted_code, 1106*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1107*7249d1a6SKrzysztof Kosiński extra_options=['--style=pep8']) 1108*7249d1a6SKrzysztof Kosiński 1109*7249d1a6SKrzysztof Kosiński # TODO(ambv): currently the following produces the closing bracket on a new 1110*7249d1a6SKrzysztof Kosiński # line but indented to the opening bracket which is the worst of both 1111*7249d1a6SKrzysztof Kosiński # worlds. Expected behaviour would be to format as --style=pep8 does in 1112*7249d1a6SKrzysztof Kosiński # this case. 1113*7249d1a6SKrzysztof Kosiński # self.assertYapfReformats(unformatted_code, expected_formatted_code, 1114*7249d1a6SKrzysztof Kosiński # extra_options=['--style=facebook']) 1115*7249d1a6SKrzysztof Kosiński 1116*7249d1a6SKrzysztof Kosiński # line-break before the first argument, dedenting closing brackets if set 1117*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1118*7249d1a6SKrzysztof Kosiński def overly_long_function_name( 1119*7249d1a6SKrzysztof Kosiński first_argument_on_the_same_line, 1120*7249d1a6SKrzysztof Kosiński second_argument_makes_the_line_too_long): 1121*7249d1a6SKrzysztof Kosiński pass 1122*7249d1a6SKrzysztof Kosiński """) 1123*7249d1a6SKrzysztof Kosiński # expected_formatted_pep8_code = textwrap.dedent("""\ 1124*7249d1a6SKrzysztof Kosiński # def overly_long_function_name( 1125*7249d1a6SKrzysztof Kosiński # first_argument_on_the_same_line, 1126*7249d1a6SKrzysztof Kosiński # second_argument_makes_the_line_too_long): 1127*7249d1a6SKrzysztof Kosiński # pass 1128*7249d1a6SKrzysztof Kosiński # """) 1129*7249d1a6SKrzysztof Kosiński expected_formatted_fb_code = textwrap.dedent("""\ 1130*7249d1a6SKrzysztof Kosiński def overly_long_function_name( 1131*7249d1a6SKrzysztof Kosiński first_argument_on_the_same_line, second_argument_makes_the_line_too_long 1132*7249d1a6SKrzysztof Kosiński ): 1133*7249d1a6SKrzysztof Kosiński pass 1134*7249d1a6SKrzysztof Kosiński """) # noqa 1135*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1136*7249d1a6SKrzysztof Kosiński unformatted_code, 1137*7249d1a6SKrzysztof Kosiński expected_formatted_fb_code, 1138*7249d1a6SKrzysztof Kosiński extra_options=['--style=facebook']) 1139*7249d1a6SKrzysztof Kosiński # TODO(ambv): currently the following produces code that is not PEP8 1140*7249d1a6SKrzysztof Kosiński # compliant, raising "E125 continuation line with same indent as next 1141*7249d1a6SKrzysztof Kosiński # logical line" with flake8. Expected behaviour for PEP8 would be to use 1142*7249d1a6SKrzysztof Kosiński # double-indentation here. 1143*7249d1a6SKrzysztof Kosiński # self.assertYapfReformats(unformatted_code, expected_formatted_pep8_code, 1144*7249d1a6SKrzysztof Kosiński # extra_options=['--style=pep8']) 1145*7249d1a6SKrzysztof Kosiński 1146*7249d1a6SKrzysztof Kosiński def testCoalesceBrackets(self): 1147*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1148*7249d1a6SKrzysztof Kosiński some_long_function_name_foo( 1149*7249d1a6SKrzysztof Kosiński { 1150*7249d1a6SKrzysztof Kosiński 'first_argument_of_the_thing': id, 1151*7249d1a6SKrzysztof Kosiński 'second_argument_of_the_thing': "some thing" 1152*7249d1a6SKrzysztof Kosiński } 1153*7249d1a6SKrzysztof Kosiński )""") 1154*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1155*7249d1a6SKrzysztof Kosiński some_long_function_name_foo({ 1156*7249d1a6SKrzysztof Kosiński 'first_argument_of_the_thing': id, 1157*7249d1a6SKrzysztof Kosiński 'second_argument_of_the_thing': "some thing" 1158*7249d1a6SKrzysztof Kosiński }) 1159*7249d1a6SKrzysztof Kosiński """) 1160*7249d1a6SKrzysztof Kosiński with utils.NamedTempFile(dirname=self.test_tmpdir, mode='w') as (f, name): 1161*7249d1a6SKrzysztof Kosiński f.write( 1162*7249d1a6SKrzysztof Kosiński textwrap.dedent(u'''\ 1163*7249d1a6SKrzysztof Kosiński [style] 1164*7249d1a6SKrzysztof Kosiński column_limit=82 1165*7249d1a6SKrzysztof Kosiński coalesce_brackets = True 1166*7249d1a6SKrzysztof Kosiński ''')) 1167*7249d1a6SKrzysztof Kosiński f.flush() 1168*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1169*7249d1a6SKrzysztof Kosiński unformatted_code, 1170*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1171*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(name)]) 1172*7249d1a6SKrzysztof Kosiński 1173*7249d1a6SKrzysztof Kosiński def testPseudoParenSpaces(self): 1174*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1175*7249d1a6SKrzysztof Kosiński def foo(): 1176*7249d1a6SKrzysztof Kosiński def bar(): 1177*7249d1a6SKrzysztof Kosiński return {msg_id: author for author, msg_id in reader} 1178*7249d1a6SKrzysztof Kosiński """) 1179*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1180*7249d1a6SKrzysztof Kosiński def foo(): 1181*7249d1a6SKrzysztof Kosiński def bar(): 1182*7249d1a6SKrzysztof Kosiński return {msg_id: author for author, msg_id in reader} 1183*7249d1a6SKrzysztof Kosiński """) 1184*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1185*7249d1a6SKrzysztof Kosiński unformatted_code, 1186*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1187*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1', '--style', 'yapf']) 1188*7249d1a6SKrzysztof Kosiński 1189*7249d1a6SKrzysztof Kosiński def testMultilineCommentFormattingDisabled(self): 1190*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1191*7249d1a6SKrzysztof Kosiński # This is a comment 1192*7249d1a6SKrzysztof Kosiński FOO = { 1193*7249d1a6SKrzysztof Kosiński aaaaaaaa.ZZZ: [ 1194*7249d1a6SKrzysztof Kosiński bbbbbbbbbb.Pop(), 1195*7249d1a6SKrzysztof Kosiński # Multiline comment. 1196*7249d1a6SKrzysztof Kosiński # Line two. 1197*7249d1a6SKrzysztof Kosiński bbbbbbbbbb.Pop(), 1198*7249d1a6SKrzysztof Kosiński ], 1199*7249d1a6SKrzysztof Kosiński 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': 1200*7249d1a6SKrzysztof Kosiński ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz), 1201*7249d1a6SKrzysztof Kosiński '#': lambda x: x # do nothing 1202*7249d1a6SKrzysztof Kosiński } 1203*7249d1a6SKrzysztof Kosiński """) 1204*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1205*7249d1a6SKrzysztof Kosiński # This is a comment 1206*7249d1a6SKrzysztof Kosiński FOO = { 1207*7249d1a6SKrzysztof Kosiński aaaaaaaa.ZZZ: [ 1208*7249d1a6SKrzysztof Kosiński bbbbbbbbbb.Pop(), 1209*7249d1a6SKrzysztof Kosiński # Multiline comment. 1210*7249d1a6SKrzysztof Kosiński # Line two. 1211*7249d1a6SKrzysztof Kosiński bbbbbbbbbb.Pop(), 1212*7249d1a6SKrzysztof Kosiński ], 1213*7249d1a6SKrzysztof Kosiński 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': 1214*7249d1a6SKrzysztof Kosiński ('yyyyy', zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz), 1215*7249d1a6SKrzysztof Kosiński '#': lambda x: x # do nothing 1216*7249d1a6SKrzysztof Kosiński } 1217*7249d1a6SKrzysztof Kosiński """) 1218*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1219*7249d1a6SKrzysztof Kosiński unformatted_code, 1220*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1221*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1', '--style', 'yapf']) 1222*7249d1a6SKrzysztof Kosiński 1223*7249d1a6SKrzysztof Kosiński def testTrailingCommentsWithDisabledFormatting(self): 1224*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1225*7249d1a6SKrzysztof Kosiński import os 1226*7249d1a6SKrzysztof Kosiński 1227*7249d1a6SKrzysztof Kosiński SCOPES = [ 1228*7249d1a6SKrzysztof Kosiński 'hello world' # This is a comment. 1229*7249d1a6SKrzysztof Kosiński ] 1230*7249d1a6SKrzysztof Kosiński """) 1231*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1232*7249d1a6SKrzysztof Kosiński import os 1233*7249d1a6SKrzysztof Kosiński 1234*7249d1a6SKrzysztof Kosiński SCOPES = [ 1235*7249d1a6SKrzysztof Kosiński 'hello world' # This is a comment. 1236*7249d1a6SKrzysztof Kosiński ] 1237*7249d1a6SKrzysztof Kosiński """) 1238*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1239*7249d1a6SKrzysztof Kosiński unformatted_code, 1240*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1241*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-1', '--style', 'yapf']) 1242*7249d1a6SKrzysztof Kosiński 1243*7249d1a6SKrzysztof Kosiński def testUseTabs(self): 1244*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1245*7249d1a6SKrzysztof Kosińskidef foo_function(): 1246*7249d1a6SKrzysztof Kosiński if True: 1247*7249d1a6SKrzysztof Kosiński pass 1248*7249d1a6SKrzysztof Kosiński""" 1249*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1250*7249d1a6SKrzysztof Kosińskidef foo_function(): 1251*7249d1a6SKrzysztof Kosiński if True: 1252*7249d1a6SKrzysztof Kosiński pass 1253*7249d1a6SKrzysztof Kosiński""" # noqa: W191,E101 1254*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1255*7249d1a6SKrzysztof Kosiński[style] 1256*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1257*7249d1a6SKrzysztof KosińskiUSE_TABS = true 1258*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=1 1259*7249d1a6SKrzysztof Kosiński""" 1260*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1261*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1262*7249d1a6SKrzysztof Kosiński unformatted_code, 1263*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1264*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1265*7249d1a6SKrzysztof Kosiński 1266*7249d1a6SKrzysztof Kosiński def testUseTabsWith(self): 1267*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1268*7249d1a6SKrzysztof Kosińskidef f(): 1269*7249d1a6SKrzysztof Kosiński return ['hello', 'world',] 1270*7249d1a6SKrzysztof Kosiński""" 1271*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1272*7249d1a6SKrzysztof Kosińskidef f(): 1273*7249d1a6SKrzysztof Kosiński return [ 1274*7249d1a6SKrzysztof Kosiński 'hello', 1275*7249d1a6SKrzysztof Kosiński 'world', 1276*7249d1a6SKrzysztof Kosiński ] 1277*7249d1a6SKrzysztof Kosiński""" # noqa: W191,E101 1278*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1279*7249d1a6SKrzysztof Kosiński[style] 1280*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1281*7249d1a6SKrzysztof KosińskiUSE_TABS = true 1282*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=1 1283*7249d1a6SKrzysztof Kosiński""" 1284*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1285*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1286*7249d1a6SKrzysztof Kosiński unformatted_code, 1287*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1288*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1289*7249d1a6SKrzysztof Kosiński 1290*7249d1a6SKrzysztof Kosiński def testUseTabsContinuationAlignStyleFixed(self): 1291*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1292*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3): 1293*7249d1a6SKrzysztof Kosiński return ['hello', 'world',] 1294*7249d1a6SKrzysztof Kosiński""" 1295*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1296*7249d1a6SKrzysztof Kosińskidef foo_function( 1297*7249d1a6SKrzysztof Kosiński arg1, arg2, arg3): 1298*7249d1a6SKrzysztof Kosiński return [ 1299*7249d1a6SKrzysztof Kosiński 'hello', 1300*7249d1a6SKrzysztof Kosiński 'world', 1301*7249d1a6SKrzysztof Kosiński ] 1302*7249d1a6SKrzysztof Kosiński""" # noqa: W191,E101 1303*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1304*7249d1a6SKrzysztof Kosiński[style] 1305*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1306*7249d1a6SKrzysztof KosińskiUSE_TABS = true 1307*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32 1308*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4 1309*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8 1310*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = fixed 1311*7249d1a6SKrzysztof Kosiński""" 1312*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1313*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1314*7249d1a6SKrzysztof Kosiński unformatted_code, 1315*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1316*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1317*7249d1a6SKrzysztof Kosiński 1318*7249d1a6SKrzysztof Kosiński def testUseTabsContinuationAlignStyleVAlignRight(self): 1319*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1320*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3): 1321*7249d1a6SKrzysztof Kosiński return ['hello', 'world',] 1322*7249d1a6SKrzysztof Kosiński""" 1323*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1324*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, 1325*7249d1a6SKrzysztof Kosiński arg3): 1326*7249d1a6SKrzysztof Kosiński return [ 1327*7249d1a6SKrzysztof Kosiński 'hello', 1328*7249d1a6SKrzysztof Kosiński 'world', 1329*7249d1a6SKrzysztof Kosiński ] 1330*7249d1a6SKrzysztof Kosiński""" # noqa: W191,E101 1331*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1332*7249d1a6SKrzysztof Kosiński[style] 1333*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1334*7249d1a6SKrzysztof KosińskiUSE_TABS = true 1335*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32 1336*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4 1337*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8 1338*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = valign-right 1339*7249d1a6SKrzysztof Kosiński""" 1340*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1341*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1342*7249d1a6SKrzysztof Kosiński unformatted_code, 1343*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1344*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1345*7249d1a6SKrzysztof Kosiński 1346*7249d1a6SKrzysztof Kosiński def testUseSpacesContinuationAlignStyleFixed(self): 1347*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1348*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3): 1349*7249d1a6SKrzysztof Kosiński return ['hello', 'world',] 1350*7249d1a6SKrzysztof Kosiński""" 1351*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1352*7249d1a6SKrzysztof Kosińskidef foo_function( 1353*7249d1a6SKrzysztof Kosiński arg1, arg2, arg3): 1354*7249d1a6SKrzysztof Kosiński return [ 1355*7249d1a6SKrzysztof Kosiński 'hello', 1356*7249d1a6SKrzysztof Kosiński 'world', 1357*7249d1a6SKrzysztof Kosiński ] 1358*7249d1a6SKrzysztof Kosiński""" 1359*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1360*7249d1a6SKrzysztof Kosiński[style] 1361*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1362*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32 1363*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4 1364*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8 1365*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = fixed 1366*7249d1a6SKrzysztof Kosiński""" 1367*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1368*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1369*7249d1a6SKrzysztof Kosiński unformatted_code, 1370*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1371*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1372*7249d1a6SKrzysztof Kosiński 1373*7249d1a6SKrzysztof Kosiński def testUseSpacesContinuationAlignStyleVAlignRight(self): 1374*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1375*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, arg3): 1376*7249d1a6SKrzysztof Kosiński return ['hello', 'world',] 1377*7249d1a6SKrzysztof Kosiński""" 1378*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1379*7249d1a6SKrzysztof Kosińskidef foo_function(arg1, arg2, 1380*7249d1a6SKrzysztof Kosiński arg3): 1381*7249d1a6SKrzysztof Kosiński return [ 1382*7249d1a6SKrzysztof Kosiński 'hello', 1383*7249d1a6SKrzysztof Kosiński 'world', 1384*7249d1a6SKrzysztof Kosiński ] 1385*7249d1a6SKrzysztof Kosiński""" 1386*7249d1a6SKrzysztof Kosiński style_contents = u"""\ 1387*7249d1a6SKrzysztof Kosiński[style] 1388*7249d1a6SKrzysztof Kosińskibased_on_style = yapf 1389*7249d1a6SKrzysztof KosińskiCOLUMN_LIMIT=32 1390*7249d1a6SKrzysztof KosińskiINDENT_WIDTH=4 1391*7249d1a6SKrzysztof KosińskiCONTINUATION_INDENT_WIDTH=8 1392*7249d1a6SKrzysztof KosińskiCONTINUATION_ALIGN_STYLE = valign-right 1393*7249d1a6SKrzysztof Kosiński""" 1394*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, style_contents) as stylepath: 1395*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1396*7249d1a6SKrzysztof Kosiński unformatted_code, 1397*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1398*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1399*7249d1a6SKrzysztof Kosiński 1400*7249d1a6SKrzysztof Kosiński def testStyleOutputRoundTrip(self): 1401*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1402*7249d1a6SKrzysztof Kosiński def foo_function(): 1403*7249d1a6SKrzysztof Kosiński pass 1404*7249d1a6SKrzysztof Kosiński """) 1405*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1406*7249d1a6SKrzysztof Kosiński def foo_function(): 1407*7249d1a6SKrzysztof Kosiński pass 1408*7249d1a6SKrzysztof Kosiński """) 1409*7249d1a6SKrzysztof Kosiński 1410*7249d1a6SKrzysztof Kosiński with utils.NamedTempFile(dirname=self.test_tmpdir) as (stylefile, 1411*7249d1a6SKrzysztof Kosiński stylepath): 1412*7249d1a6SKrzysztof Kosiński p = subprocess.Popen( 1413*7249d1a6SKrzysztof Kosiński YAPF_BINARY + ['--style-help'], 1414*7249d1a6SKrzysztof Kosiński stdout=stylefile, 1415*7249d1a6SKrzysztof Kosiński stdin=subprocess.PIPE, 1416*7249d1a6SKrzysztof Kosiński stderr=subprocess.PIPE) 1417*7249d1a6SKrzysztof Kosiński _, stderrdata = p.communicate() 1418*7249d1a6SKrzysztof Kosiński self.assertEqual(stderrdata, b'') 1419*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1420*7249d1a6SKrzysztof Kosiński unformatted_code, 1421*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1422*7249d1a6SKrzysztof Kosiński extra_options=['--style={0}'.format(stylepath)]) 1423*7249d1a6SKrzysztof Kosiński 1424*7249d1a6SKrzysztof Kosiński def testSpacingBeforeComments(self): 1425*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1426*7249d1a6SKrzysztof Kosiński A = 42 1427*7249d1a6SKrzysztof Kosiński 1428*7249d1a6SKrzysztof Kosiński 1429*7249d1a6SKrzysztof Kosiński # A comment 1430*7249d1a6SKrzysztof Kosiński def x(): 1431*7249d1a6SKrzysztof Kosiński pass 1432*7249d1a6SKrzysztof Kosiński def _(): 1433*7249d1a6SKrzysztof Kosiński pass 1434*7249d1a6SKrzysztof Kosiński """) 1435*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1436*7249d1a6SKrzysztof Kosiński A = 42 1437*7249d1a6SKrzysztof Kosiński 1438*7249d1a6SKrzysztof Kosiński 1439*7249d1a6SKrzysztof Kosiński # A comment 1440*7249d1a6SKrzysztof Kosiński def x(): 1441*7249d1a6SKrzysztof Kosiński pass 1442*7249d1a6SKrzysztof Kosiński def _(): 1443*7249d1a6SKrzysztof Kosiński pass 1444*7249d1a6SKrzysztof Kosiński """) 1445*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1446*7249d1a6SKrzysztof Kosiński unformatted_code, 1447*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1448*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-2']) 1449*7249d1a6SKrzysztof Kosiński 1450*7249d1a6SKrzysztof Kosiński def testSpacingBeforeCommentsInDicts(self): 1451*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1452*7249d1a6SKrzysztof Kosiński A=42 1453*7249d1a6SKrzysztof Kosiński 1454*7249d1a6SKrzysztof Kosiński X = { 1455*7249d1a6SKrzysztof Kosiński # 'Valid' statuses. 1456*7249d1a6SKrzysztof Kosiński PASSED: # Passed 1457*7249d1a6SKrzysztof Kosiński 'PASSED', 1458*7249d1a6SKrzysztof Kosiński FAILED: # Failed 1459*7249d1a6SKrzysztof Kosiński 'FAILED', 1460*7249d1a6SKrzysztof Kosiński TIMED_OUT: # Timed out. 1461*7249d1a6SKrzysztof Kosiński 'FAILED', 1462*7249d1a6SKrzysztof Kosiński BORKED: # Broken. 1463*7249d1a6SKrzysztof Kosiński 'BROKEN' 1464*7249d1a6SKrzysztof Kosiński } 1465*7249d1a6SKrzysztof Kosiński """) 1466*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1467*7249d1a6SKrzysztof Kosiński A = 42 1468*7249d1a6SKrzysztof Kosiński 1469*7249d1a6SKrzysztof Kosiński X = { 1470*7249d1a6SKrzysztof Kosiński # 'Valid' statuses. 1471*7249d1a6SKrzysztof Kosiński PASSED: # Passed 1472*7249d1a6SKrzysztof Kosiński 'PASSED', 1473*7249d1a6SKrzysztof Kosiński FAILED: # Failed 1474*7249d1a6SKrzysztof Kosiński 'FAILED', 1475*7249d1a6SKrzysztof Kosiński TIMED_OUT: # Timed out. 1476*7249d1a6SKrzysztof Kosiński 'FAILED', 1477*7249d1a6SKrzysztof Kosiński BORKED: # Broken. 1478*7249d1a6SKrzysztof Kosiński 'BROKEN' 1479*7249d1a6SKrzysztof Kosiński } 1480*7249d1a6SKrzysztof Kosiński """) 1481*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1482*7249d1a6SKrzysztof Kosiński unformatted_code, 1483*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1484*7249d1a6SKrzysztof Kosiński extra_options=['--style', 'yapf', '--lines', '1-1']) 1485*7249d1a6SKrzysztof Kosiński 1486*7249d1a6SKrzysztof Kosiński def testDisableWithLinesOption(self): 1487*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1488*7249d1a6SKrzysztof Kosiński # yapf_lines_bug.py 1489*7249d1a6SKrzysztof Kosiński # yapf: disable 1490*7249d1a6SKrzysztof Kosiński def outer_func(): 1491*7249d1a6SKrzysztof Kosiński def inner_func(): 1492*7249d1a6SKrzysztof Kosiński return 1493*7249d1a6SKrzysztof Kosiński return 1494*7249d1a6SKrzysztof Kosiński # yapf: enable 1495*7249d1a6SKrzysztof Kosiński """) 1496*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1497*7249d1a6SKrzysztof Kosiński # yapf_lines_bug.py 1498*7249d1a6SKrzysztof Kosiński # yapf: disable 1499*7249d1a6SKrzysztof Kosiński def outer_func(): 1500*7249d1a6SKrzysztof Kosiński def inner_func(): 1501*7249d1a6SKrzysztof Kosiński return 1502*7249d1a6SKrzysztof Kosiński return 1503*7249d1a6SKrzysztof Kosiński # yapf: enable 1504*7249d1a6SKrzysztof Kosiński """) 1505*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1506*7249d1a6SKrzysztof Kosiński unformatted_code, 1507*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1508*7249d1a6SKrzysztof Kosiński extra_options=['--lines', '1-8']) 1509*7249d1a6SKrzysztof Kosiński 1510*7249d1a6SKrzysztof Kosiński @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') 1511*7249d1a6SKrzysztof Kosiński def testNoSpacesAroundBinaryOperators(self): 1512*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1513*7249d1a6SKrzysztof Kosińskia = 4-b/c@d**37 1514*7249d1a6SKrzysztof Kosiński""" 1515*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1516*7249d1a6SKrzysztof Kosińskia = 4-b / c@d**37 1517*7249d1a6SKrzysztof Kosiński""" 1518*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1519*7249d1a6SKrzysztof Kosiński unformatted_code, 1520*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1521*7249d1a6SKrzysztof Kosiński extra_options=[ 1522*7249d1a6SKrzysztof Kosiński '--style', 1523*7249d1a6SKrzysztof Kosiński '{based_on_style: pep8, ' 1524*7249d1a6SKrzysztof Kosiński 'no_spaces_around_selected_binary_operators: "@,**,-"}', 1525*7249d1a6SKrzysztof Kosiński ]) 1526*7249d1a6SKrzysztof Kosiński 1527*7249d1a6SKrzysztof Kosiński @unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6') 1528*7249d1a6SKrzysztof Kosiński def testCP936Encoding(self): 1529*7249d1a6SKrzysztof Kosiński unformatted_code = 'print("中文")\n' 1530*7249d1a6SKrzysztof Kosiński expected_formatted_code = 'print("中文")\n' 1531*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1532*7249d1a6SKrzysztof Kosiński unformatted_code, 1533*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1534*7249d1a6SKrzysztof Kosiński env={'PYTHONIOENCODING': 'cp936'}) 1535*7249d1a6SKrzysztof Kosiński 1536*7249d1a6SKrzysztof Kosiński def testDisableWithLineRanges(self): 1537*7249d1a6SKrzysztof Kosiński unformatted_code = """\ 1538*7249d1a6SKrzysztof Kosiński# yapf: disable 1539*7249d1a6SKrzysztof Kosińskia = [ 1540*7249d1a6SKrzysztof Kosiński 1, 1541*7249d1a6SKrzysztof Kosiński 2, 1542*7249d1a6SKrzysztof Kosiński 1543*7249d1a6SKrzysztof Kosiński 3 1544*7249d1a6SKrzysztof Kosiński] 1545*7249d1a6SKrzysztof Kosiński""" 1546*7249d1a6SKrzysztof Kosiński expected_formatted_code = """\ 1547*7249d1a6SKrzysztof Kosiński# yapf: disable 1548*7249d1a6SKrzysztof Kosińskia = [ 1549*7249d1a6SKrzysztof Kosiński 1, 1550*7249d1a6SKrzysztof Kosiński 2, 1551*7249d1a6SKrzysztof Kosiński 1552*7249d1a6SKrzysztof Kosiński 3 1553*7249d1a6SKrzysztof Kosiński] 1554*7249d1a6SKrzysztof Kosiński""" 1555*7249d1a6SKrzysztof Kosiński self.assertYapfReformats( 1556*7249d1a6SKrzysztof Kosiński unformatted_code, 1557*7249d1a6SKrzysztof Kosiński expected_formatted_code, 1558*7249d1a6SKrzysztof Kosiński extra_options=['--style', 'yapf', '--lines', '1-100']) 1559*7249d1a6SKrzysztof Kosiński 1560*7249d1a6SKrzysztof Kosiński 1561*7249d1a6SKrzysztof Kosińskiclass BadInputTest(unittest.TestCase): 1562*7249d1a6SKrzysztof Kosiński """Test yapf's behaviour when passed bad input.""" 1563*7249d1a6SKrzysztof Kosiński 1564*7249d1a6SKrzysztof Kosiński def testBadSyntax(self): 1565*7249d1a6SKrzysztof Kosiński code = ' a = 1\n' 1566*7249d1a6SKrzysztof Kosiński self.assertRaises(errors.YapfError, yapf_api.FormatCode, code) 1567*7249d1a6SKrzysztof Kosiński 1568*7249d1a6SKrzysztof Kosiński def testBadCode(self): 1569*7249d1a6SKrzysztof Kosiński code = 'x = """hello\n' 1570*7249d1a6SKrzysztof Kosiński self.assertRaises(errors.YapfError, yapf_api.FormatCode, code) 1571*7249d1a6SKrzysztof Kosiński 1572*7249d1a6SKrzysztof Kosiński 1573*7249d1a6SKrzysztof Kosińskiclass DiffIndentTest(unittest.TestCase): 1574*7249d1a6SKrzysztof Kosiński 1575*7249d1a6SKrzysztof Kosiński @staticmethod 1576*7249d1a6SKrzysztof Kosiński def _OwnStyle(): 1577*7249d1a6SKrzysztof Kosiński my_style = style.CreatePEP8Style() 1578*7249d1a6SKrzysztof Kosiński my_style['INDENT_WIDTH'] = 3 1579*7249d1a6SKrzysztof Kosiński my_style['CONTINUATION_INDENT_WIDTH'] = 3 1580*7249d1a6SKrzysztof Kosiński return my_style 1581*7249d1a6SKrzysztof Kosiński 1582*7249d1a6SKrzysztof Kosiński def _Check(self, unformatted_code, expected_formatted_code): 1583*7249d1a6SKrzysztof Kosiński formatted_code, _ = yapf_api.FormatCode( 1584*7249d1a6SKrzysztof Kosiński unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) 1585*7249d1a6SKrzysztof Kosiński self.assertEqual(expected_formatted_code, formatted_code) 1586*7249d1a6SKrzysztof Kosiński 1587*7249d1a6SKrzysztof Kosiński def testSimple(self): 1588*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1589*7249d1a6SKrzysztof Kosiński for i in range(5): 1590*7249d1a6SKrzysztof Kosiński print('bar') 1591*7249d1a6SKrzysztof Kosiński """) 1592*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1593*7249d1a6SKrzysztof Kosiński for i in range(5): 1594*7249d1a6SKrzysztof Kosiński print('bar') 1595*7249d1a6SKrzysztof Kosiński """) 1596*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1597*7249d1a6SKrzysztof Kosiński 1598*7249d1a6SKrzysztof Kosiński 1599*7249d1a6SKrzysztof Kosińskiclass HorizontallyAlignedTrailingCommentsTest(yapf_test_helper.YAPFTest): 1600*7249d1a6SKrzysztof Kosiński 1601*7249d1a6SKrzysztof Kosiński @staticmethod 1602*7249d1a6SKrzysztof Kosiński def _OwnStyle(): 1603*7249d1a6SKrzysztof Kosiński my_style = style.CreatePEP8Style() 1604*7249d1a6SKrzysztof Kosiński my_style['SPACES_BEFORE_COMMENT'] = [ 1605*7249d1a6SKrzysztof Kosiński 15, 1606*7249d1a6SKrzysztof Kosiński 25, 1607*7249d1a6SKrzysztof Kosiński 35, 1608*7249d1a6SKrzysztof Kosiński ] 1609*7249d1a6SKrzysztof Kosiński return my_style 1610*7249d1a6SKrzysztof Kosiński 1611*7249d1a6SKrzysztof Kosiński def _Check(self, unformatted_code, expected_formatted_code): 1612*7249d1a6SKrzysztof Kosiński formatted_code, _ = yapf_api.FormatCode( 1613*7249d1a6SKrzysztof Kosiński unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) 1614*7249d1a6SKrzysztof Kosiński self.assertCodeEqual(expected_formatted_code, formatted_code) 1615*7249d1a6SKrzysztof Kosiński 1616*7249d1a6SKrzysztof Kosiński def testSimple(self): 1617*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1618*7249d1a6SKrzysztof Kosiński foo = '1' # Aligned at first list value 1619*7249d1a6SKrzysztof Kosiński 1620*7249d1a6SKrzysztof Kosiński foo = '2__<15>' # Aligned at second list value 1621*7249d1a6SKrzysztof Kosiński 1622*7249d1a6SKrzysztof Kosiński foo = '3____________<25>' # Aligned at third list value 1623*7249d1a6SKrzysztof Kosiński 1624*7249d1a6SKrzysztof Kosiński foo = '4______________________<35>' # Aligned beyond list values 1625*7249d1a6SKrzysztof Kosiński """) 1626*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1627*7249d1a6SKrzysztof Kosiński foo = '1' # Aligned at first list value 1628*7249d1a6SKrzysztof Kosiński 1629*7249d1a6SKrzysztof Kosiński foo = '2__<15>' # Aligned at second list value 1630*7249d1a6SKrzysztof Kosiński 1631*7249d1a6SKrzysztof Kosiński foo = '3____________<25>' # Aligned at third list value 1632*7249d1a6SKrzysztof Kosiński 1633*7249d1a6SKrzysztof Kosiński foo = '4______________________<35>' # Aligned beyond list values 1634*7249d1a6SKrzysztof Kosiński """) 1635*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1636*7249d1a6SKrzysztof Kosiński 1637*7249d1a6SKrzysztof Kosiński def testBlock(self): 1638*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1639*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1640*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1641*7249d1a6SKrzysztof Kosiński # Line 3 1642*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1643*7249d1a6SKrzysztof Kosiński # Line 5 1644*7249d1a6SKrzysztof Kosiński # Line 6 1645*7249d1a6SKrzysztof Kosiński """) 1646*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1647*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1648*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1649*7249d1a6SKrzysztof Kosiński # Line 3 1650*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1651*7249d1a6SKrzysztof Kosiński # Line 5 1652*7249d1a6SKrzysztof Kosiński # Line 6 1653*7249d1a6SKrzysztof Kosiński """) 1654*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1655*7249d1a6SKrzysztof Kosiński 1656*7249d1a6SKrzysztof Kosiński def testBlockWithLongLine(self): 1657*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1658*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1659*7249d1a6SKrzysztof Kosiński func___________________(2) # Line 2 1660*7249d1a6SKrzysztof Kosiński # Line 3 1661*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1662*7249d1a6SKrzysztof Kosiński # Line 5 1663*7249d1a6SKrzysztof Kosiński # Line 6 1664*7249d1a6SKrzysztof Kosiński """) 1665*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1666*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1667*7249d1a6SKrzysztof Kosiński func___________________(2) # Line 2 1668*7249d1a6SKrzysztof Kosiński # Line 3 1669*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1670*7249d1a6SKrzysztof Kosiński # Line 5 1671*7249d1a6SKrzysztof Kosiński # Line 6 1672*7249d1a6SKrzysztof Kosiński """) 1673*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1674*7249d1a6SKrzysztof Kosiński 1675*7249d1a6SKrzysztof Kosiński def testBlockFuncSuffix(self): 1676*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1677*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1678*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1679*7249d1a6SKrzysztof Kosiński # Line 3 1680*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1681*7249d1a6SKrzysztof Kosiński # Line 5 1682*7249d1a6SKrzysztof Kosiński # Line 6 1683*7249d1a6SKrzysztof Kosiński 1684*7249d1a6SKrzysztof Kosiński def Func(): 1685*7249d1a6SKrzysztof Kosiński pass 1686*7249d1a6SKrzysztof Kosiński """) 1687*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1688*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1689*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1690*7249d1a6SKrzysztof Kosiński # Line 3 1691*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1692*7249d1a6SKrzysztof Kosiński # Line 5 1693*7249d1a6SKrzysztof Kosiński # Line 6 1694*7249d1a6SKrzysztof Kosiński 1695*7249d1a6SKrzysztof Kosiński 1696*7249d1a6SKrzysztof Kosiński def Func(): 1697*7249d1a6SKrzysztof Kosiński pass 1698*7249d1a6SKrzysztof Kosiński """) 1699*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1700*7249d1a6SKrzysztof Kosiński 1701*7249d1a6SKrzysztof Kosiński def testBlockCommentSuffix(self): 1702*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1703*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1704*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1705*7249d1a6SKrzysztof Kosiński # Line 3 1706*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1707*7249d1a6SKrzysztof Kosiński # Line 5 - SpliceComments makes this part of the previous block 1708*7249d1a6SKrzysztof Kosiński # Line 6 1709*7249d1a6SKrzysztof Kosiński 1710*7249d1a6SKrzysztof Kosiński # Aligned with prev comment block 1711*7249d1a6SKrzysztof Kosiński """) # noqa 1712*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1713*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1714*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1715*7249d1a6SKrzysztof Kosiński # Line 3 1716*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1717*7249d1a6SKrzysztof Kosiński # Line 5 - SpliceComments makes this part of the previous block 1718*7249d1a6SKrzysztof Kosiński # Line 6 1719*7249d1a6SKrzysztof Kosiński 1720*7249d1a6SKrzysztof Kosiński # Aligned with prev comment block 1721*7249d1a6SKrzysztof Kosiński """) # noqa 1722*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1723*7249d1a6SKrzysztof Kosiński 1724*7249d1a6SKrzysztof Kosiński def testBlockIndentedFuncSuffix(self): 1725*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1726*7249d1a6SKrzysztof Kosiński if True: 1727*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1728*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1729*7249d1a6SKrzysztof Kosiński # Line 3 1730*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1731*7249d1a6SKrzysztof Kosiński # Line 5 - SpliceComments makes this a new block 1732*7249d1a6SKrzysztof Kosiński # Line 6 1733*7249d1a6SKrzysztof Kosiński 1734*7249d1a6SKrzysztof Kosiński # Aligned with Func 1735*7249d1a6SKrzysztof Kosiński 1736*7249d1a6SKrzysztof Kosiński def Func(): 1737*7249d1a6SKrzysztof Kosiński pass 1738*7249d1a6SKrzysztof Kosiński """) # noqa 1739*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1740*7249d1a6SKrzysztof Kosiński if True: 1741*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1742*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1743*7249d1a6SKrzysztof Kosiński # Line 3 1744*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1745*7249d1a6SKrzysztof Kosiński 1746*7249d1a6SKrzysztof Kosiński # Line 5 - SpliceComments makes this a new block 1747*7249d1a6SKrzysztof Kosiński # Line 6 1748*7249d1a6SKrzysztof Kosiński 1749*7249d1a6SKrzysztof Kosiński # Aligned with Func 1750*7249d1a6SKrzysztof Kosiński 1751*7249d1a6SKrzysztof Kosiński 1752*7249d1a6SKrzysztof Kosiński def Func(): 1753*7249d1a6SKrzysztof Kosiński pass 1754*7249d1a6SKrzysztof Kosiński """) 1755*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1756*7249d1a6SKrzysztof Kosiński 1757*7249d1a6SKrzysztof Kosiński def testBlockIndentedCommentSuffix(self): 1758*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1759*7249d1a6SKrzysztof Kosiński if True: 1760*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1761*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1762*7249d1a6SKrzysztof Kosiński # Line 3 1763*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1764*7249d1a6SKrzysztof Kosiński # Line 5 1765*7249d1a6SKrzysztof Kosiński # Line 6 1766*7249d1a6SKrzysztof Kosiński 1767*7249d1a6SKrzysztof Kosiński # Not aligned 1768*7249d1a6SKrzysztof Kosiński """) 1769*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1770*7249d1a6SKrzysztof Kosiński if True: 1771*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1772*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1773*7249d1a6SKrzysztof Kosiński # Line 3 1774*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1775*7249d1a6SKrzysztof Kosiński # Line 5 1776*7249d1a6SKrzysztof Kosiński # Line 6 1777*7249d1a6SKrzysztof Kosiński 1778*7249d1a6SKrzysztof Kosiński # Not aligned 1779*7249d1a6SKrzysztof Kosiński """) 1780*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1781*7249d1a6SKrzysztof Kosiński 1782*7249d1a6SKrzysztof Kosiński def testBlockMultiIndented(self): 1783*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1784*7249d1a6SKrzysztof Kosiński if True: 1785*7249d1a6SKrzysztof Kosiński if True: 1786*7249d1a6SKrzysztof Kosiński if True: 1787*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1788*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1789*7249d1a6SKrzysztof Kosiński # Line 3 1790*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1791*7249d1a6SKrzysztof Kosiński # Line 5 1792*7249d1a6SKrzysztof Kosiński # Line 6 1793*7249d1a6SKrzysztof Kosiński 1794*7249d1a6SKrzysztof Kosiński # Not aligned 1795*7249d1a6SKrzysztof Kosiński """) # noqa 1796*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1797*7249d1a6SKrzysztof Kosiński if True: 1798*7249d1a6SKrzysztof Kosiński if True: 1799*7249d1a6SKrzysztof Kosiński if True: 1800*7249d1a6SKrzysztof Kosiński func(1) # Line 1 1801*7249d1a6SKrzysztof Kosiński func(2) # Line 2 1802*7249d1a6SKrzysztof Kosiński # Line 3 1803*7249d1a6SKrzysztof Kosiński func(3) # Line 4 1804*7249d1a6SKrzysztof Kosiński # Line 5 1805*7249d1a6SKrzysztof Kosiński # Line 6 1806*7249d1a6SKrzysztof Kosiński 1807*7249d1a6SKrzysztof Kosiński # Not aligned 1808*7249d1a6SKrzysztof Kosiński """) 1809*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1810*7249d1a6SKrzysztof Kosiński 1811*7249d1a6SKrzysztof Kosiński def testArgs(self): 1812*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1813*7249d1a6SKrzysztof Kosiński def MyFunc( 1814*7249d1a6SKrzysztof Kosiński arg1, # Desc 1 1815*7249d1a6SKrzysztof Kosiński arg2, # Desc 2 1816*7249d1a6SKrzysztof Kosiński a_longer_var_name, # Desc 3 1817*7249d1a6SKrzysztof Kosiński arg4, 1818*7249d1a6SKrzysztof Kosiński arg5, # Desc 5 1819*7249d1a6SKrzysztof Kosiński arg6, 1820*7249d1a6SKrzysztof Kosiński ): 1821*7249d1a6SKrzysztof Kosiński pass 1822*7249d1a6SKrzysztof Kosiński """) 1823*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1824*7249d1a6SKrzysztof Kosiński def MyFunc( 1825*7249d1a6SKrzysztof Kosiński arg1, # Desc 1 1826*7249d1a6SKrzysztof Kosiński arg2, # Desc 2 1827*7249d1a6SKrzysztof Kosiński a_longer_var_name, # Desc 3 1828*7249d1a6SKrzysztof Kosiński arg4, 1829*7249d1a6SKrzysztof Kosiński arg5, # Desc 5 1830*7249d1a6SKrzysztof Kosiński arg6, 1831*7249d1a6SKrzysztof Kosiński ): 1832*7249d1a6SKrzysztof Kosiński pass 1833*7249d1a6SKrzysztof Kosiński """) 1834*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1835*7249d1a6SKrzysztof Kosiński 1836*7249d1a6SKrzysztof Kosiński def testDisableBlock(self): 1837*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1838*7249d1a6SKrzysztof Kosiński a() # comment 1 1839*7249d1a6SKrzysztof Kosiński b() # comment 2 1840*7249d1a6SKrzysztof Kosiński 1841*7249d1a6SKrzysztof Kosiński # yapf: disable 1842*7249d1a6SKrzysztof Kosiński c() # comment 3 1843*7249d1a6SKrzysztof Kosiński d() # comment 4 1844*7249d1a6SKrzysztof Kosiński # yapf: enable 1845*7249d1a6SKrzysztof Kosiński 1846*7249d1a6SKrzysztof Kosiński e() # comment 5 1847*7249d1a6SKrzysztof Kosiński f() # comment 6 1848*7249d1a6SKrzysztof Kosiński """) 1849*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1850*7249d1a6SKrzysztof Kosiński a() # comment 1 1851*7249d1a6SKrzysztof Kosiński b() # comment 2 1852*7249d1a6SKrzysztof Kosiński 1853*7249d1a6SKrzysztof Kosiński # yapf: disable 1854*7249d1a6SKrzysztof Kosiński c() # comment 3 1855*7249d1a6SKrzysztof Kosiński d() # comment 4 1856*7249d1a6SKrzysztof Kosiński # yapf: enable 1857*7249d1a6SKrzysztof Kosiński 1858*7249d1a6SKrzysztof Kosiński e() # comment 5 1859*7249d1a6SKrzysztof Kosiński f() # comment 6 1860*7249d1a6SKrzysztof Kosiński """) 1861*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1862*7249d1a6SKrzysztof Kosiński 1863*7249d1a6SKrzysztof Kosiński def testDisabledLine(self): 1864*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1865*7249d1a6SKrzysztof Kosiński short # comment 1 1866*7249d1a6SKrzysztof Kosiński do_not_touch1 # yapf: disable 1867*7249d1a6SKrzysztof Kosiński do_not_touch2 # yapf: disable 1868*7249d1a6SKrzysztof Kosiński a_longer_statement # comment 2 1869*7249d1a6SKrzysztof Kosiński """) 1870*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1871*7249d1a6SKrzysztof Kosiński short # comment 1 1872*7249d1a6SKrzysztof Kosiński do_not_touch1 # yapf: disable 1873*7249d1a6SKrzysztof Kosiński do_not_touch2 # yapf: disable 1874*7249d1a6SKrzysztof Kosiński a_longer_statement # comment 2 1875*7249d1a6SKrzysztof Kosiński """) 1876*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1877*7249d1a6SKrzysztof Kosiński 1878*7249d1a6SKrzysztof Kosiński 1879*7249d1a6SKrzysztof Kosińskiclass _SpacesAroundDictListTupleTestImpl(unittest.TestCase): 1880*7249d1a6SKrzysztof Kosiński 1881*7249d1a6SKrzysztof Kosiński @staticmethod 1882*7249d1a6SKrzysztof Kosiński def _OwnStyle(): 1883*7249d1a6SKrzysztof Kosiński my_style = style.CreatePEP8Style() 1884*7249d1a6SKrzysztof Kosiński my_style['DISABLE_ENDING_COMMA_HEURISTIC'] = True 1885*7249d1a6SKrzysztof Kosiński my_style['SPLIT_ALL_COMMA_SEPARATED_VALUES'] = False 1886*7249d1a6SKrzysztof Kosiński my_style['SPLIT_ARGUMENTS_WHEN_COMMA_TERMINATED'] = False 1887*7249d1a6SKrzysztof Kosiński return my_style 1888*7249d1a6SKrzysztof Kosiński 1889*7249d1a6SKrzysztof Kosiński def _Check(self, unformatted_code, expected_formatted_code): 1890*7249d1a6SKrzysztof Kosiński formatted_code, _ = yapf_api.FormatCode( 1891*7249d1a6SKrzysztof Kosiński unformatted_code, style_config=style.SetGlobalStyle(self._OwnStyle())) 1892*7249d1a6SKrzysztof Kosiński self.assertEqual(expected_formatted_code, formatted_code) 1893*7249d1a6SKrzysztof Kosiński 1894*7249d1a6SKrzysztof Kosiński def setUp(self): 1895*7249d1a6SKrzysztof Kosiński self.maxDiff = None 1896*7249d1a6SKrzysztof Kosiński 1897*7249d1a6SKrzysztof Kosiński 1898*7249d1a6SKrzysztof Kosińskiclass SpacesAroundDictTest(_SpacesAroundDictListTupleTestImpl): 1899*7249d1a6SKrzysztof Kosiński 1900*7249d1a6SKrzysztof Kosiński @classmethod 1901*7249d1a6SKrzysztof Kosiński def _OwnStyle(cls): 1902*7249d1a6SKrzysztof Kosiński style = super(SpacesAroundDictTest, cls)._OwnStyle() 1903*7249d1a6SKrzysztof Kosiński style['SPACES_AROUND_DICT_DELIMITERS'] = True 1904*7249d1a6SKrzysztof Kosiński 1905*7249d1a6SKrzysztof Kosiński return style 1906*7249d1a6SKrzysztof Kosiński 1907*7249d1a6SKrzysztof Kosiński def testStandard(self): 1908*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1909*7249d1a6SKrzysztof Kosiński {1 : 2} 1910*7249d1a6SKrzysztof Kosiński {k:v for k, v in other.items()} 1911*7249d1a6SKrzysztof Kosiński {k for k in [1, 2, 3]} 1912*7249d1a6SKrzysztof Kosiński 1913*7249d1a6SKrzysztof Kosiński # The following statements should not change 1914*7249d1a6SKrzysztof Kosiński {} 1915*7249d1a6SKrzysztof Kosiński {1 : 2} # yapf: disable 1916*7249d1a6SKrzysztof Kosiński 1917*7249d1a6SKrzysztof Kosiński # yapf: disable 1918*7249d1a6SKrzysztof Kosiński {1 : 2} 1919*7249d1a6SKrzysztof Kosiński # yapf: enable 1920*7249d1a6SKrzysztof Kosiński 1921*7249d1a6SKrzysztof Kosiński # Dict settings should not impact lists or tuples 1922*7249d1a6SKrzysztof Kosiński [1, 2] 1923*7249d1a6SKrzysztof Kosiński (3, 4) 1924*7249d1a6SKrzysztof Kosiński """) 1925*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1926*7249d1a6SKrzysztof Kosiński { 1: 2 } 1927*7249d1a6SKrzysztof Kosiński { k: v for k, v in other.items() } 1928*7249d1a6SKrzysztof Kosiński { k for k in [1, 2, 3] } 1929*7249d1a6SKrzysztof Kosiński 1930*7249d1a6SKrzysztof Kosiński # The following statements should not change 1931*7249d1a6SKrzysztof Kosiński {} 1932*7249d1a6SKrzysztof Kosiński {1 : 2} # yapf: disable 1933*7249d1a6SKrzysztof Kosiński 1934*7249d1a6SKrzysztof Kosiński # yapf: disable 1935*7249d1a6SKrzysztof Kosiński {1 : 2} 1936*7249d1a6SKrzysztof Kosiński # yapf: enable 1937*7249d1a6SKrzysztof Kosiński 1938*7249d1a6SKrzysztof Kosiński # Dict settings should not impact lists or tuples 1939*7249d1a6SKrzysztof Kosiński [1, 2] 1940*7249d1a6SKrzysztof Kosiński (3, 4) 1941*7249d1a6SKrzysztof Kosiński """) 1942*7249d1a6SKrzysztof Kosiński 1943*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 1944*7249d1a6SKrzysztof Kosiński 1945*7249d1a6SKrzysztof Kosiński 1946*7249d1a6SKrzysztof Kosińskiclass SpacesAroundListTest(_SpacesAroundDictListTupleTestImpl): 1947*7249d1a6SKrzysztof Kosiński 1948*7249d1a6SKrzysztof Kosiński @classmethod 1949*7249d1a6SKrzysztof Kosiński def _OwnStyle(cls): 1950*7249d1a6SKrzysztof Kosiński style = super(SpacesAroundListTest, cls)._OwnStyle() 1951*7249d1a6SKrzysztof Kosiński style['SPACES_AROUND_LIST_DELIMITERS'] = True 1952*7249d1a6SKrzysztof Kosiński 1953*7249d1a6SKrzysztof Kosiński return style 1954*7249d1a6SKrzysztof Kosiński 1955*7249d1a6SKrzysztof Kosiński def testStandard(self): 1956*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 1957*7249d1a6SKrzysztof Kosiński [a,b,c] 1958*7249d1a6SKrzysztof Kosiński [4,5,] 1959*7249d1a6SKrzysztof Kosiński [6, [7, 8], 9] 1960*7249d1a6SKrzysztof Kosiński [v for v in [1,2,3] if v & 1] 1961*7249d1a6SKrzysztof Kosiński 1962*7249d1a6SKrzysztof Kosiński # The following statements should not change 1963*7249d1a6SKrzysztof Kosiński index[0] 1964*7249d1a6SKrzysztof Kosiński index[a, b] 1965*7249d1a6SKrzysztof Kosiński [] 1966*7249d1a6SKrzysztof Kosiński [v for v in [1,2,3] if v & 1] # yapf: disable 1967*7249d1a6SKrzysztof Kosiński 1968*7249d1a6SKrzysztof Kosiński # yapf: disable 1969*7249d1a6SKrzysztof Kosiński [a,b,c] 1970*7249d1a6SKrzysztof Kosiński [4,5,] 1971*7249d1a6SKrzysztof Kosiński # yapf: enable 1972*7249d1a6SKrzysztof Kosiński 1973*7249d1a6SKrzysztof Kosiński # List settings should not impact dicts or tuples 1974*7249d1a6SKrzysztof Kosiński {a: b} 1975*7249d1a6SKrzysztof Kosiński (1, 2) 1976*7249d1a6SKrzysztof Kosiński """) 1977*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 1978*7249d1a6SKrzysztof Kosiński [ a, b, c ] 1979*7249d1a6SKrzysztof Kosiński [ 4, 5, ] 1980*7249d1a6SKrzysztof Kosiński [ 6, [ 7, 8 ], 9 ] 1981*7249d1a6SKrzysztof Kosiński [ v for v in [ 1, 2, 3 ] if v & 1 ] 1982*7249d1a6SKrzysztof Kosiński 1983*7249d1a6SKrzysztof Kosiński # The following statements should not change 1984*7249d1a6SKrzysztof Kosiński index[0] 1985*7249d1a6SKrzysztof Kosiński index[a, b] 1986*7249d1a6SKrzysztof Kosiński [] 1987*7249d1a6SKrzysztof Kosiński [v for v in [1,2,3] if v & 1] # yapf: disable 1988*7249d1a6SKrzysztof Kosiński 1989*7249d1a6SKrzysztof Kosiński # yapf: disable 1990*7249d1a6SKrzysztof Kosiński [a,b,c] 1991*7249d1a6SKrzysztof Kosiński [4,5,] 1992*7249d1a6SKrzysztof Kosiński # yapf: enable 1993*7249d1a6SKrzysztof Kosiński 1994*7249d1a6SKrzysztof Kosiński # List settings should not impact dicts or tuples 1995*7249d1a6SKrzysztof Kosiński {a: b} 1996*7249d1a6SKrzysztof Kosiński (1, 2) 1997*7249d1a6SKrzysztof Kosiński """) 1998*7249d1a6SKrzysztof Kosiński 1999*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 2000*7249d1a6SKrzysztof Kosiński 2001*7249d1a6SKrzysztof Kosiński 2002*7249d1a6SKrzysztof Kosińskiclass SpacesAroundTupleTest(_SpacesAroundDictListTupleTestImpl): 2003*7249d1a6SKrzysztof Kosiński 2004*7249d1a6SKrzysztof Kosiński @classmethod 2005*7249d1a6SKrzysztof Kosiński def _OwnStyle(cls): 2006*7249d1a6SKrzysztof Kosiński style = super(SpacesAroundTupleTest, cls)._OwnStyle() 2007*7249d1a6SKrzysztof Kosiński style['SPACES_AROUND_TUPLE_DELIMITERS'] = True 2008*7249d1a6SKrzysztof Kosiński 2009*7249d1a6SKrzysztof Kosiński return style 2010*7249d1a6SKrzysztof Kosiński 2011*7249d1a6SKrzysztof Kosiński def testStandard(self): 2012*7249d1a6SKrzysztof Kosiński unformatted_code = textwrap.dedent("""\ 2013*7249d1a6SKrzysztof Kosiński (0, 1) 2014*7249d1a6SKrzysztof Kosiński (2, 3) 2015*7249d1a6SKrzysztof Kosiński (4, 5, 6,) 2016*7249d1a6SKrzysztof Kosiński func((7, 8), 9) 2017*7249d1a6SKrzysztof Kosiński 2018*7249d1a6SKrzysztof Kosiński # The following statements should not change 2019*7249d1a6SKrzysztof Kosiński func(1, 2) 2020*7249d1a6SKrzysztof Kosiński (this_func or that_func)(3, 4) 2021*7249d1a6SKrzysztof Kosiński if (True and False): pass 2022*7249d1a6SKrzysztof Kosiński () 2023*7249d1a6SKrzysztof Kosiński 2024*7249d1a6SKrzysztof Kosiński (0, 1) # yapf: disable 2025*7249d1a6SKrzysztof Kosiński 2026*7249d1a6SKrzysztof Kosiński # yapf: disable 2027*7249d1a6SKrzysztof Kosiński (0, 1) 2028*7249d1a6SKrzysztof Kosiński (2, 3) 2029*7249d1a6SKrzysztof Kosiński # yapf: enable 2030*7249d1a6SKrzysztof Kosiński 2031*7249d1a6SKrzysztof Kosiński # Tuple settings should not impact dicts or lists 2032*7249d1a6SKrzysztof Kosiński {a: b} 2033*7249d1a6SKrzysztof Kosiński [3, 4] 2034*7249d1a6SKrzysztof Kosiński """) 2035*7249d1a6SKrzysztof Kosiński expected_formatted_code = textwrap.dedent("""\ 2036*7249d1a6SKrzysztof Kosiński ( 0, 1 ) 2037*7249d1a6SKrzysztof Kosiński ( 2, 3 ) 2038*7249d1a6SKrzysztof Kosiński ( 4, 5, 6, ) 2039*7249d1a6SKrzysztof Kosiński func(( 7, 8 ), 9) 2040*7249d1a6SKrzysztof Kosiński 2041*7249d1a6SKrzysztof Kosiński # The following statements should not change 2042*7249d1a6SKrzysztof Kosiński func(1, 2) 2043*7249d1a6SKrzysztof Kosiński (this_func or that_func)(3, 4) 2044*7249d1a6SKrzysztof Kosiński if (True and False): pass 2045*7249d1a6SKrzysztof Kosiński () 2046*7249d1a6SKrzysztof Kosiński 2047*7249d1a6SKrzysztof Kosiński (0, 1) # yapf: disable 2048*7249d1a6SKrzysztof Kosiński 2049*7249d1a6SKrzysztof Kosiński # yapf: disable 2050*7249d1a6SKrzysztof Kosiński (0, 1) 2051*7249d1a6SKrzysztof Kosiński (2, 3) 2052*7249d1a6SKrzysztof Kosiński # yapf: enable 2053*7249d1a6SKrzysztof Kosiński 2054*7249d1a6SKrzysztof Kosiński # Tuple settings should not impact dicts or lists 2055*7249d1a6SKrzysztof Kosiński {a: b} 2056*7249d1a6SKrzysztof Kosiński [3, 4] 2057*7249d1a6SKrzysztof Kosiński """) 2058*7249d1a6SKrzysztof Kosiński 2059*7249d1a6SKrzysztof Kosiński self._Check(unformatted_code, expected_formatted_code) 2060*7249d1a6SKrzysztof Kosiński 2061*7249d1a6SKrzysztof Kosiński 2062*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__': 2063*7249d1a6SKrzysztof Kosiński unittest.main() 2064