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.style.""" 16*7249d1a6SKrzysztof Kosiński 17*7249d1a6SKrzysztof Kosińskiimport os 18*7249d1a6SKrzysztof Kosińskiimport shutil 19*7249d1a6SKrzysztof Kosińskiimport tempfile 20*7249d1a6SKrzysztof Kosińskiimport textwrap 21*7249d1a6SKrzysztof Kosińskiimport unittest 22*7249d1a6SKrzysztof Kosiński 23*7249d1a6SKrzysztof Kosińskifrom yapf.yapflib import style 24*7249d1a6SKrzysztof Kosiński 25*7249d1a6SKrzysztof Kosińskifrom yapftests import utils 26*7249d1a6SKrzysztof Kosińskifrom yapftests import yapf_test_helper 27*7249d1a6SKrzysztof Kosiński 28*7249d1a6SKrzysztof Kosiński 29*7249d1a6SKrzysztof Kosińskiclass UtilsTest(yapf_test_helper.YAPFTest): 30*7249d1a6SKrzysztof Kosiński 31*7249d1a6SKrzysztof Kosiński def testContinuationAlignStyleStringConverter(self): 32*7249d1a6SKrzysztof Kosiński for cont_align_space in ('', 'space', '"space"', '\'space\''): 33*7249d1a6SKrzysztof Kosiński self.assertEqual( 34*7249d1a6SKrzysztof Kosiński style._ContinuationAlignStyleStringConverter(cont_align_space), 35*7249d1a6SKrzysztof Kosiński 'SPACE') 36*7249d1a6SKrzysztof Kosiński for cont_align_fixed in ('fixed', '"fixed"', '\'fixed\''): 37*7249d1a6SKrzysztof Kosiński self.assertEqual( 38*7249d1a6SKrzysztof Kosiński style._ContinuationAlignStyleStringConverter(cont_align_fixed), 39*7249d1a6SKrzysztof Kosiński 'FIXED') 40*7249d1a6SKrzysztof Kosiński for cont_align_valignright in ( 41*7249d1a6SKrzysztof Kosiński 'valign-right', 42*7249d1a6SKrzysztof Kosiński '"valign-right"', 43*7249d1a6SKrzysztof Kosiński '\'valign-right\'', 44*7249d1a6SKrzysztof Kosiński 'valign_right', 45*7249d1a6SKrzysztof Kosiński '"valign_right"', 46*7249d1a6SKrzysztof Kosiński '\'valign_right\'', 47*7249d1a6SKrzysztof Kosiński ): 48*7249d1a6SKrzysztof Kosiński self.assertEqual( 49*7249d1a6SKrzysztof Kosiński style._ContinuationAlignStyleStringConverter(cont_align_valignright), 50*7249d1a6SKrzysztof Kosiński 'VALIGN-RIGHT') 51*7249d1a6SKrzysztof Kosiński with self.assertRaises(ValueError) as ctx: 52*7249d1a6SKrzysztof Kosiński style._ContinuationAlignStyleStringConverter('blahblah') 53*7249d1a6SKrzysztof Kosiński self.assertIn("unknown continuation align style: 'blahblah'", 54*7249d1a6SKrzysztof Kosiński str(ctx.exception)) 55*7249d1a6SKrzysztof Kosiński 56*7249d1a6SKrzysztof Kosiński def testStringListConverter(self): 57*7249d1a6SKrzysztof Kosiński self.assertEqual(style._StringListConverter('foo, bar'), ['foo', 'bar']) 58*7249d1a6SKrzysztof Kosiński self.assertEqual(style._StringListConverter('foo,bar'), ['foo', 'bar']) 59*7249d1a6SKrzysztof Kosiński self.assertEqual(style._StringListConverter(' foo'), ['foo']) 60*7249d1a6SKrzysztof Kosiński self.assertEqual( 61*7249d1a6SKrzysztof Kosiński style._StringListConverter('joe ,foo, bar'), ['joe', 'foo', 'bar']) 62*7249d1a6SKrzysztof Kosiński 63*7249d1a6SKrzysztof Kosiński def testBoolConverter(self): 64*7249d1a6SKrzysztof Kosiński self.assertEqual(style._BoolConverter('true'), True) 65*7249d1a6SKrzysztof Kosiński self.assertEqual(style._BoolConverter('1'), True) 66*7249d1a6SKrzysztof Kosiński self.assertEqual(style._BoolConverter('false'), False) 67*7249d1a6SKrzysztof Kosiński self.assertEqual(style._BoolConverter('0'), False) 68*7249d1a6SKrzysztof Kosiński 69*7249d1a6SKrzysztof Kosiński def testIntListConverter(self): 70*7249d1a6SKrzysztof Kosiński self.assertEqual(style._IntListConverter('1, 2, 3'), [1, 2, 3]) 71*7249d1a6SKrzysztof Kosiński self.assertEqual(style._IntListConverter('[ 1, 2, 3 ]'), [1, 2, 3]) 72*7249d1a6SKrzysztof Kosiński self.assertEqual(style._IntListConverter('[ 1, 2, 3, ]'), [1, 2, 3]) 73*7249d1a6SKrzysztof Kosiński 74*7249d1a6SKrzysztof Kosiński def testIntOrIntListConverter(self): 75*7249d1a6SKrzysztof Kosiński self.assertEqual(style._IntOrIntListConverter('10'), 10) 76*7249d1a6SKrzysztof Kosiński self.assertEqual(style._IntOrIntListConverter('1, 2, 3'), [1, 2, 3]) 77*7249d1a6SKrzysztof Kosiński 78*7249d1a6SKrzysztof Kosiński 79*7249d1a6SKrzysztof Kosińskidef _LooksLikeGoogleStyle(cfg): 80*7249d1a6SKrzysztof Kosiński return cfg['COLUMN_LIMIT'] == 80 and cfg['SPLIT_COMPLEX_COMPREHENSION'] 81*7249d1a6SKrzysztof Kosiński 82*7249d1a6SKrzysztof Kosiński 83*7249d1a6SKrzysztof Kosińskidef _LooksLikePEP8Style(cfg): 84*7249d1a6SKrzysztof Kosiński return cfg['COLUMN_LIMIT'] == 79 85*7249d1a6SKrzysztof Kosiński 86*7249d1a6SKrzysztof Kosiński 87*7249d1a6SKrzysztof Kosińskidef _LooksLikeFacebookStyle(cfg): 88*7249d1a6SKrzysztof Kosiński return cfg['DEDENT_CLOSING_BRACKETS'] 89*7249d1a6SKrzysztof Kosiński 90*7249d1a6SKrzysztof Kosiński 91*7249d1a6SKrzysztof Kosińskidef _LooksLikeYapfStyle(cfg): 92*7249d1a6SKrzysztof Kosiński return cfg['SPLIT_BEFORE_DOT'] 93*7249d1a6SKrzysztof Kosiński 94*7249d1a6SKrzysztof Kosiński 95*7249d1a6SKrzysztof Kosińskiclass PredefinedStylesByNameTest(yapf_test_helper.YAPFTest): 96*7249d1a6SKrzysztof Kosiński 97*7249d1a6SKrzysztof Kosiński @classmethod 98*7249d1a6SKrzysztof Kosiński def setUpClass(cls): # pylint: disable=g-missing-super-call 99*7249d1a6SKrzysztof Kosiński style.SetGlobalStyle(style.CreatePEP8Style()) 100*7249d1a6SKrzysztof Kosiński 101*7249d1a6SKrzysztof Kosiński def testDefault(self): 102*7249d1a6SKrzysztof Kosiński # default is PEP8 103*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(None) 104*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 105*7249d1a6SKrzysztof Kosiński 106*7249d1a6SKrzysztof Kosiński def testPEP8ByName(self): 107*7249d1a6SKrzysztof Kosiński for pep8_name in ('PEP8', 'pep8', 'Pep8'): 108*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(pep8_name) 109*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 110*7249d1a6SKrzysztof Kosiński 111*7249d1a6SKrzysztof Kosiński def testGoogleByName(self): 112*7249d1a6SKrzysztof Kosiński for google_name in ('google', 'Google', 'GOOGLE'): 113*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(google_name) 114*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikeGoogleStyle(cfg)) 115*7249d1a6SKrzysztof Kosiński 116*7249d1a6SKrzysztof Kosiński def testYapfByName(self): 117*7249d1a6SKrzysztof Kosiński for yapf_name in ('yapf', 'YAPF'): 118*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(yapf_name) 119*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikeYapfStyle(cfg)) 120*7249d1a6SKrzysztof Kosiński 121*7249d1a6SKrzysztof Kosiński def testFacebookByName(self): 122*7249d1a6SKrzysztof Kosiński for fb_name in ('facebook', 'FACEBOOK', 'Facebook'): 123*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(fb_name) 124*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikeFacebookStyle(cfg)) 125*7249d1a6SKrzysztof Kosiński 126*7249d1a6SKrzysztof Kosiński 127*7249d1a6SKrzysztof Kosińskiclass StyleFromFileTest(yapf_test_helper.YAPFTest): 128*7249d1a6SKrzysztof Kosiński 129*7249d1a6SKrzysztof Kosiński @classmethod 130*7249d1a6SKrzysztof Kosiński def setUpClass(cls): # pylint: disable=g-missing-super-call 131*7249d1a6SKrzysztof Kosiński cls.test_tmpdir = tempfile.mkdtemp() 132*7249d1a6SKrzysztof Kosiński style.SetGlobalStyle(style.CreatePEP8Style()) 133*7249d1a6SKrzysztof Kosiński 134*7249d1a6SKrzysztof Kosiński @classmethod 135*7249d1a6SKrzysztof Kosiński def tearDownClass(cls): # pylint: disable=g-missing-super-call 136*7249d1a6SKrzysztof Kosiński shutil.rmtree(cls.test_tmpdir) 137*7249d1a6SKrzysztof Kosiński 138*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyle(self): 139*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 140*7249d1a6SKrzysztof Kosiński [style] 141*7249d1a6SKrzysztof Kosiński continuation_indent_width = 20 142*7249d1a6SKrzysztof Kosiński ''') 143*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 144*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 145*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 146*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) 147*7249d1a6SKrzysztof Kosiński 148*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnPEP8Style(self): 149*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 150*7249d1a6SKrzysztof Kosiński [style] 151*7249d1a6SKrzysztof Kosiński based_on_style = pep8 152*7249d1a6SKrzysztof Kosiński continuation_indent_width = 40 153*7249d1a6SKrzysztof Kosiński ''') 154*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 155*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 156*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 157*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 40) 158*7249d1a6SKrzysztof Kosiński 159*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnGoogleStyle(self): 160*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 161*7249d1a6SKrzysztof Kosiński [style] 162*7249d1a6SKrzysztof Kosiński based_on_style = google 163*7249d1a6SKrzysztof Kosiński continuation_indent_width = 20 164*7249d1a6SKrzysztof Kosiński ''') 165*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 166*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 167*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikeGoogleStyle(cfg)) 168*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) 169*7249d1a6SKrzysztof Kosiński 170*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnFacebookStyle(self): 171*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 172*7249d1a6SKrzysztof Kosiński [style] 173*7249d1a6SKrzysztof Kosiński based_on_style = facebook 174*7249d1a6SKrzysztof Kosiński continuation_indent_width = 20 175*7249d1a6SKrzysztof Kosiński ''') 176*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 177*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 178*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikeFacebookStyle(cfg)) 179*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 20) 180*7249d1a6SKrzysztof Kosiński 181*7249d1a6SKrzysztof Kosiński def testBoolOptionValue(self): 182*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 183*7249d1a6SKrzysztof Kosiński [style] 184*7249d1a6SKrzysztof Kosiński based_on_style = pep8 185*7249d1a6SKrzysztof Kosiński SPLIT_BEFORE_NAMED_ASSIGNS=False 186*7249d1a6SKrzysztof Kosiński split_before_logical_operator = true 187*7249d1a6SKrzysztof Kosiński ''') 188*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 189*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 190*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 191*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['SPLIT_BEFORE_NAMED_ASSIGNS'], False) 192*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['SPLIT_BEFORE_LOGICAL_OPERATOR'], True) 193*7249d1a6SKrzysztof Kosiński 194*7249d1a6SKrzysztof Kosiński def testStringListOptionValue(self): 195*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 196*7249d1a6SKrzysztof Kosiński [style] 197*7249d1a6SKrzysztof Kosiński based_on_style = pep8 198*7249d1a6SKrzysztof Kosiński I18N_FUNCTION_CALL = N_, V_, T_ 199*7249d1a6SKrzysztof Kosiński ''') 200*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 201*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 202*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 203*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['I18N_FUNCTION_CALL'], ['N_', 'V_', 'T_']) 204*7249d1a6SKrzysztof Kosiński 205*7249d1a6SKrzysztof Kosiński def testErrorNoStyleFile(self): 206*7249d1a6SKrzysztof Kosiński with self.assertRaisesRegex(style.StyleConfigError, 207*7249d1a6SKrzysztof Kosiński 'is not a valid style or file path'): 208*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig('/8822/xyznosuchfile') 209*7249d1a6SKrzysztof Kosiński 210*7249d1a6SKrzysztof Kosiński def testErrorNoStyleSection(self): 211*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 212*7249d1a6SKrzysztof Kosiński [s] 213*7249d1a6SKrzysztof Kosiński indent_width=2 214*7249d1a6SKrzysztof Kosiński ''') 215*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 216*7249d1a6SKrzysztof Kosiński with self.assertRaisesRegex(style.StyleConfigError, 217*7249d1a6SKrzysztof Kosiński 'Unable to find section'): 218*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig(filepath) 219*7249d1a6SKrzysztof Kosiński 220*7249d1a6SKrzysztof Kosiński def testErrorUnknownStyleOption(self): 221*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 222*7249d1a6SKrzysztof Kosiński [style] 223*7249d1a6SKrzysztof Kosiński indent_width=2 224*7249d1a6SKrzysztof Kosiński hummus=2 225*7249d1a6SKrzysztof Kosiński ''') 226*7249d1a6SKrzysztof Kosiński with utils.TempFileContents(self.test_tmpdir, cfg) as filepath: 227*7249d1a6SKrzysztof Kosiński with self.assertRaisesRegex(style.StyleConfigError, 228*7249d1a6SKrzysztof Kosiński 'Unknown style option'): 229*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig(filepath) 230*7249d1a6SKrzysztof Kosiński 231*7249d1a6SKrzysztof Kosiński def testPyprojectTomlNoYapfSection(self): 232*7249d1a6SKrzysztof Kosiński try: 233*7249d1a6SKrzysztof Kosiński import toml 234*7249d1a6SKrzysztof Kosiński except ImportError: 235*7249d1a6SKrzysztof Kosiński return 236*7249d1a6SKrzysztof Kosiński 237*7249d1a6SKrzysztof Kosiński filepath = os.path.join(self.test_tmpdir, 'pyproject.toml') 238*7249d1a6SKrzysztof Kosiński _ = open(filepath, 'w') 239*7249d1a6SKrzysztof Kosiński with self.assertRaisesRegex(style.StyleConfigError, 240*7249d1a6SKrzysztof Kosiński 'Unable to find section'): 241*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig(filepath) 242*7249d1a6SKrzysztof Kosiński 243*7249d1a6SKrzysztof Kosiński def testPyprojectTomlParseYapfSection(self): 244*7249d1a6SKrzysztof Kosiński try: 245*7249d1a6SKrzysztof Kosiński import toml 246*7249d1a6SKrzysztof Kosiński except ImportError: 247*7249d1a6SKrzysztof Kosiński return 248*7249d1a6SKrzysztof Kosiński 249*7249d1a6SKrzysztof Kosiński cfg = textwrap.dedent(u'''\ 250*7249d1a6SKrzysztof Kosiński [tool.yapf] 251*7249d1a6SKrzysztof Kosiński based_on_style = "pep8" 252*7249d1a6SKrzysztof Kosiński continuation_indent_width = 40 253*7249d1a6SKrzysztof Kosiński ''') 254*7249d1a6SKrzysztof Kosiński filepath = os.path.join(self.test_tmpdir, 'pyproject.toml') 255*7249d1a6SKrzysztof Kosiński with open(filepath, 'w') as f: 256*7249d1a6SKrzysztof Kosiński f.write(cfg) 257*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(filepath) 258*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 259*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['CONTINUATION_INDENT_WIDTH'], 40) 260*7249d1a6SKrzysztof Kosiński 261*7249d1a6SKrzysztof Kosiński 262*7249d1a6SKrzysztof Kosińskiclass StyleFromDict(yapf_test_helper.YAPFTest): 263*7249d1a6SKrzysztof Kosiński 264*7249d1a6SKrzysztof Kosiński @classmethod 265*7249d1a6SKrzysztof Kosiński def setUpClass(cls): # pylint: disable=g-missing-super-call 266*7249d1a6SKrzysztof Kosiński style.SetGlobalStyle(style.CreatePEP8Style()) 267*7249d1a6SKrzysztof Kosiński 268*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyle(self): 269*7249d1a6SKrzysztof Kosiński config_dict = { 270*7249d1a6SKrzysztof Kosiński 'based_on_style': 'pep8', 271*7249d1a6SKrzysztof Kosiński 'indent_width': 2, 272*7249d1a6SKrzysztof Kosiński 'blank_line_before_nested_class_or_def': True 273*7249d1a6SKrzysztof Kosiński } 274*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(config_dict) 275*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 276*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['INDENT_WIDTH'], 2) 277*7249d1a6SKrzysztof Kosiński 278*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyleBadDict(self): 279*7249d1a6SKrzysztof Kosiński self.assertRaisesRegex(style.StyleConfigError, 'Unknown style option', 280*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig, 281*7249d1a6SKrzysztof Kosiński {'based_on_styl': 'pep8'}) 282*7249d1a6SKrzysztof Kosiński self.assertRaisesRegex(style.StyleConfigError, 'not a valid', 283*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig, 284*7249d1a6SKrzysztof Kosiński {'INDENT_WIDTH': 'FOUR'}) 285*7249d1a6SKrzysztof Kosiński 286*7249d1a6SKrzysztof Kosiński 287*7249d1a6SKrzysztof Kosińskiclass StyleFromCommandLine(yapf_test_helper.YAPFTest): 288*7249d1a6SKrzysztof Kosiński 289*7249d1a6SKrzysztof Kosiński @classmethod 290*7249d1a6SKrzysztof Kosiński def setUpClass(cls): # pylint: disable=g-missing-super-call 291*7249d1a6SKrzysztof Kosiński style.SetGlobalStyle(style.CreatePEP8Style()) 292*7249d1a6SKrzysztof Kosiński 293*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyle(self): 294*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig( 295*7249d1a6SKrzysztof Kosiński '{based_on_style: pep8,' 296*7249d1a6SKrzysztof Kosiński ' indent_width: 2,' 297*7249d1a6SKrzysztof Kosiński ' blank_line_before_nested_class_or_def: True}') 298*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 299*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['INDENT_WIDTH'], 2) 300*7249d1a6SKrzysztof Kosiński 301*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyleNotStrict(self): 302*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig( 303*7249d1a6SKrzysztof Kosiński '{based_on_style : pep8' 304*7249d1a6SKrzysztof Kosiński ' ,indent_width=2' 305*7249d1a6SKrzysztof Kosiński ' blank_line_before_nested_class_or_def:True}') 306*7249d1a6SKrzysztof Kosiński self.assertTrue(_LooksLikePEP8Style(cfg)) 307*7249d1a6SKrzysztof Kosiński self.assertEqual(cfg['INDENT_WIDTH'], 2) 308*7249d1a6SKrzysztof Kosiński 309*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnExplicitlyUnicodeTypeString(self): 310*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig(u'{}') 311*7249d1a6SKrzysztof Kosiński self.assertIsInstance(cfg, dict) 312*7249d1a6SKrzysztof Kosiński 313*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnDetaultTypeString(self): 314*7249d1a6SKrzysztof Kosiński cfg = style.CreateStyleFromConfig('{}') 315*7249d1a6SKrzysztof Kosiński self.assertIsInstance(cfg, dict) 316*7249d1a6SKrzysztof Kosiński 317*7249d1a6SKrzysztof Kosiński def testDefaultBasedOnStyleBadString(self): 318*7249d1a6SKrzysztof Kosiński self.assertRaisesRegex(style.StyleConfigError, 'Unknown style option', 319*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig, '{based_on_styl: pep8}') 320*7249d1a6SKrzysztof Kosiński self.assertRaisesRegex(style.StyleConfigError, 'not a valid', 321*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig, '{INDENT_WIDTH: FOUR}') 322*7249d1a6SKrzysztof Kosiński self.assertRaisesRegex(style.StyleConfigError, 'Invalid style dict', 323*7249d1a6SKrzysztof Kosiński style.CreateStyleFromConfig, '{based_on_style: pep8') 324*7249d1a6SKrzysztof Kosiński 325*7249d1a6SKrzysztof Kosiński 326*7249d1a6SKrzysztof Kosińskiclass StyleHelp(yapf_test_helper.YAPFTest): 327*7249d1a6SKrzysztof Kosiński 328*7249d1a6SKrzysztof Kosiński def testHelpKeys(self): 329*7249d1a6SKrzysztof Kosiński settings = sorted(style.Help()) 330*7249d1a6SKrzysztof Kosiński expected = sorted(style._style) 331*7249d1a6SKrzysztof Kosiński self.assertListEqual(settings, expected) 332*7249d1a6SKrzysztof Kosiński 333*7249d1a6SKrzysztof Kosiński 334*7249d1a6SKrzysztof Kosińskiif __name__ == '__main__': 335*7249d1a6SKrzysztof Kosiński unittest.main() 336