blob: d06e40623c9bfebe7b2bb696991735cc3b8a4237 [file] [log] [blame]
# Copyright 2016 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Python 3 tests for yapf.reformatter."""
import sys
import textwrap
import unittest
from yapf.yapflib import py3compat
from yapf.yapflib import reformatter
from yapf.yapflib import style
from yapftests import yapf_test_helper
@unittest.skipUnless(py3compat.PY3, 'Requires Python 3')
class TestsForPython3Code(yapf_test_helper.YAPFTest):
"""Test a few constructs that are new Python 3 syntax."""
@classmethod
def setUpClass(cls): # pylint: disable=g-missing-super-call
style.SetGlobalStyle(style.CreatePEP8Style())
def testTypedNames(self):
unformatted_code = textwrap.dedent("""\
def x(aaaaaaaaaaaaaaa:int,bbbbbbbbbbbbbbbb:str,ccccccccccccccc:dict,eeeeeeeeeeeeee:set={1, 2, 3})->bool:
pass
""")
expected_formatted_code = textwrap.dedent("""\
def x(aaaaaaaaaaaaaaa: int,
bbbbbbbbbbbbbbbb: str,
ccccccccccccccc: dict,
eeeeeeeeeeeeee: set = {1, 2, 3}) -> bool:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testTypedNameWithLongNamedArg(self):
unformatted_code = textwrap.dedent("""\
def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters()) -> ReturnType:
pass
""")
expected_formatted_code = textwrap.dedent("""\
def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters()
) -> ReturnType:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testKeywordOnlyArgSpecifier(self):
unformatted_code = textwrap.dedent("""\
def foo(a, *, kw):
return a+kw
""")
expected_formatted_code = textwrap.dedent("""\
def foo(a, *, kw):
return a + kw
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
@unittest.skipUnless(py3compat.PY36, 'Requires Python 3.6')
def testPEP448ParameterExpansion(self):
unformatted_code = textwrap.dedent("""\
{ ** x }
{ **{} }
{ **{ **x }, **x }
{'a': 1, **kw , 'b':3, **kw2 }
""")
expected_formatted_code = textwrap.dedent("""\
{**x}
{**{}}
{**{**x}, **x}
{'a': 1, **kw, 'b': 3, **kw2}
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testAnnotations(self):
unformatted_code = textwrap.dedent("""\
def foo(a: list, b: "bar") -> dict:
return a+b
""")
expected_formatted_code = textwrap.dedent("""\
def foo(a: list, b: "bar") -> dict:
return a + b
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testExecAsNonKeyword(self):
unformatted_code = 'methods.exec( sys.modules[name])\n'
expected_formatted_code = 'methods.exec(sys.modules[name])\n'
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testAsyncFunctions(self):
if sys.version_info[1] < 5:
return
code = textwrap.dedent("""\
import asyncio
import time
@print_args
async def slow_operation():
await asyncio.sleep(1)
# print("Slow operation {} complete".format(n))
async def main():
start = time.time()
if (await get_html()):
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines, verify=False))
def testNoSpacesAroundPowerOperator(self):
unformatted_code = textwrap.dedent("""\
a**b
""")
expected_formatted_code = textwrap.dedent("""\
a ** b
""")
try:
style.SetGlobalStyle(
style.CreateStyleFromConfig(
'{based_on_style: pep8, SPACES_AROUND_POWER_OPERATOR: True}'))
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(uwlines))
finally:
style.SetGlobalStyle(style.CreatePEP8Style())
def testSpacesAroundDefaultOrNamedAssign(self):
unformatted_code = textwrap.dedent("""\
f(a=5)
""")
expected_formatted_code = textwrap.dedent("""\
f(a = 5)
""")
try:
style.SetGlobalStyle(
style.CreateStyleFromConfig(
'{based_on_style: pep8, '
'SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN: True}'))
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(uwlines))
finally:
style.SetGlobalStyle(style.CreatePEP8Style())
def testTypeHint(self):
unformatted_code = textwrap.dedent("""\
def foo(x: int=42):
pass
def foo2(x: 'int' =42):
pass
""")
expected_formatted_code = textwrap.dedent("""\
def foo(x: int = 42):
pass
def foo2(x: 'int' = 42):
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testMatrixMultiplication(self):
unformatted_code = textwrap.dedent("""\
a=b@c
""")
expected_formatted_code = textwrap.dedent("""\
a = b @ c
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testNoneKeyword(self):
code = """\
None.__ne__()
"""
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testAsyncWithPrecedingComment(self):
if sys.version_info[1] < 5:
return
unformatted_code = textwrap.dedent("""\
import asyncio
# Comment
async def bar():
pass
async def foo():
pass
""")
expected_formatted_code = textwrap.dedent("""\
import asyncio
# Comment
async def bar():
pass
async def foo():
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testAsyncFunctionsNested(self):
if sys.version_info[1] < 5:
return
code = textwrap.dedent("""\
async def outer():
async def inner():
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testKeepTypesIntact(self):
if sys.version_info[1] < 5:
return
unformatted_code = textwrap.dedent("""\
def _ReduceAbstractContainers(
self, *args: Optional[automation_converter.PyiCollectionAbc]) -> List[
automation_converter.PyiCollectionAbc]:
pass
""")
expected_formatted_code = textwrap.dedent("""\
def _ReduceAbstractContainers(
self, *args: Optional[automation_converter.PyiCollectionAbc]
) -> List[automation_converter.PyiCollectionAbc]:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testContinuationIndentWithAsync(self):
if sys.version_info[1] < 5:
return
unformatted_code = textwrap.dedent("""\
async def start_websocket():
async with session.ws_connect(
r"ws://a_really_long_long_long_long_long_long_url") as ws:
pass
""")
expected_formatted_code = textwrap.dedent("""\
async def start_websocket():
async with session.ws_connect(
r"ws://a_really_long_long_long_long_long_long_url") as ws:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testSplittingArguments(self):
if sys.version_info[1] < 5:
return
unformatted_code = """\
async def open_file(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
pass
async def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None):
pass
def open_file(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):
pass
def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None):
pass
"""
expected_formatted_code = """\
async def open_file(
file,
mode='r',
buffering=-1,
encoding=None,
errors=None,
newline=None,
closefd=True,
opener=None
):
pass
async def run_sync_in_worker_thread(
sync_fn, *args, cancellable=False, limiter=None
):
pass
def open_file(
file,
mode='r',
buffering=-1,
encoding=None,
errors=None,
newline=None,
closefd=True,
opener=None
):
pass
def run_sync_in_worker_thread(sync_fn, *args, cancellable=False, limiter=None):
pass
"""
try:
style.SetGlobalStyle(
style.CreateStyleFromConfig(
'{based_on_style: pep8, '
'dedent_closing_brackets: true, '
'coalesce_brackets: false, '
'space_between_ending_comma_and_closing_bracket: false, '
'split_arguments_when_comma_terminated: true, '
'split_before_first_argument: true}'))
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(uwlines))
finally:
style.SetGlobalStyle(style.CreatePEP8Style())
def testDictUnpacking(self):
if sys.version_info[1] < 5:
return
unformatted_code = """\
class Foo:
def foo(self):
foofoofoofoofoofoofoofoo('foofoofoofoofoo', {
'foo': 'foo',
**foofoofoo
})
"""
expected_formatted_code = """\
class Foo:
def foo(self):
foofoofoofoofoofoofoofoo('foofoofoofoofoo', {
'foo': 'foo',
**foofoofoo
})
"""
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
def testMultilineFormatString(self):
if sys.version_info[1] < 6:
return
code = """\
# yapf: disable
(f'''
''')
# yapf: enable
"""
# https://github.com/google/yapf/issues/513
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testEllipses(self):
if sys.version_info[1] < 6:
return
code = """\
def dirichlet(x12345678901234567890123456789012345678901234567890=...) -> None:
return
"""
# https://github.com/google/yapf/issues/533
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testFunctionTypedReturnNextLine(self):
code = """\
def _GenerateStatsEntries(
process_id: Text,
timestamp: Optional[ffffffff.FFFFFFFFFFF] = None
) -> Sequence[ssssssssssss.SSSSSSSSSSSSSSS]:
pass
"""
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testFunctionTypedReturnSameLine(self):
code = """\
def rrrrrrrrrrrrrrrrrrrrrr(
ccccccccccccccccccccccc: Tuple[Text, Text]) -> List[Tuple[Text, Text]]:
pass
"""
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testAsyncForElseNotIndentedInsideBody(self):
if sys.version_info[1] < 5:
return
code = textwrap.dedent("""\
async def fn():
async for message in websocket:
for i in range(10):
pass
else:
pass
else:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testForElseInAsyncNotMixedWithAsyncFor(self):
if sys.version_info[1] < 5:
return
code = textwrap.dedent("""\
async def fn():
for i in range(10):
pass
else:
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(uwlines))
def testParameterListIndentationConflicts(self):
unformatted_code = textwrap.dedent("""\
def raw_message( # pylint: disable=too-many-arguments
self, text, user_id=1000, chat_type='private', forward_date=None, forward_from=None):
pass
""")
expected_formatted_code = textwrap.dedent("""\
def raw_message( # pylint: disable=too-many-arguments
self,
text,
user_id=1000,
chat_type='private',
forward_date=None,
forward_from=None):
pass
""")
uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(uwlines))
if __name__ == '__main__':
unittest.main()