xref: /aosp_15_r20/external/yapf/yapftests/style_test.py (revision 7249d1a64f4850ccf838e62a46276f891f72998e)
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