blob: f5741b31346194d9510e15d4bf7d53c4e1164d5e [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 reformatter
from yapf.yapflib import style
from yapftests import yapf_test_helper
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
""") # noqa
expected_formatted_code = textwrap.dedent("""\
def x(aaaaaaaaaaaaaaa: int,
bbbbbbbbbbbbbbbb: str,
ccccccccccccccc: dict,
eeeeeeeeeeeeee: set = {1, 2, 3}) -> bool:
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testTypedNameWithLongNamedArg(self):
unformatted_code = textwrap.dedent("""\
def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters()) -> ReturnType:
pass
""") # noqa
expected_formatted_code = textwrap.dedent("""\
def func(arg=long_function_call_that_pushes_the_line_over_eighty_characters()
) -> ReturnType:
pass
""") # noqa
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testExecAsNonKeyword(self):
unformatted_code = 'methods.exec( sys.modules[name])\n'
expected_formatted_code = 'methods.exec(sys.modules[name])\n'
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testAsyncFunctions(self):
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
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
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}'))
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(llines))
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}'))
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(llines))
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testMatrixMultiplication(self):
unformatted_code = textwrap.dedent("""\
a=b@c
""")
expected_formatted_code = textwrap.dedent("""\
a = b @ c
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testNoneKeyword(self):
code = textwrap.dedent("""\
None.__ne__()
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testAsyncWithPrecedingComment(self):
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testAsyncFunctionsNested(self):
code = textwrap.dedent("""\
async def outer():
async def inner():
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testKeepTypesIntact(self):
unformatted_code = textwrap.dedent("""\
def _ReduceAbstractContainers(
self, *args: Optional[automation_converter.PyiCollectionAbc]) -> List[
automation_converter.PyiCollectionAbc]:
pass
""") # noqa
expected_formatted_code = textwrap.dedent("""\
def _ReduceAbstractContainers(
self, *args: Optional[automation_converter.PyiCollectionAbc]
) -> List[automation_converter.PyiCollectionAbc]:
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testContinuationIndentWithAsync(self):
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testSplittingArguments(self):
unformatted_code = textwrap.dedent("""\
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
""") # noqa
expected_formatted_code = textwrap.dedent("""\
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
""") # noqa
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}'))
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code,
reformatter.Reformat(llines))
finally:
style.SetGlobalStyle(style.CreatePEP8Style())
def testDictUnpacking(self):
unformatted_code = textwrap.dedent("""\
class Foo:
def foo(self):
foofoofoofoofoofoofoofoo('foofoofoofoofoo', {
'foo': 'foo',
**foofoofoo
})
""")
expected_formatted_code = textwrap.dedent("""\
class Foo:
def foo(self):
foofoofoofoofoofoofoofoo('foofoofoofoofoo', {
'foo': 'foo',
**foofoofoo
})
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testMultilineFormatString(self):
# https://github.com/google/yapf/issues/513
code = textwrap.dedent("""\
# yapf: disable
(f'''
''')
# yapf: enable
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testEllipses(self):
# https://github.com/google/yapf/issues/533
code = textwrap.dedent("""\
def dirichlet(x12345678901234567890123456789012345678901234567890=...) -> None:
return
""") # noqa
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testFunctionTypedReturnNextLine(self):
code = textwrap.dedent("""\
def _GenerateStatsEntries(
process_id: Text,
timestamp: Optional[ffffffff.FFFFFFFFFFF] = None
) -> Sequence[ssssssssssss.SSSSSSSSSSSSSSS]:
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testFunctionTypedReturnSameLine(self):
code = textwrap.dedent("""\
def rrrrrrrrrrrrrrrrrrrrrr(
ccccccccccccccccccccccc: Tuple[Text, Text]) -> List[Tuple[Text, Text]]:
pass
""") # noqa
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testAsyncForElseNotIndentedInsideBody(self):
code = textwrap.dedent("""\
async def fn():
async for message in websocket:
for i in range(10):
pass
else:
pass
else:
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testForElseInAsyncNotMixedWithAsyncFor(self):
code = textwrap.dedent("""\
async def fn():
for i in range(10):
pass
else:
pass
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
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
""") # noqa
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
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testTypeHintedYieldExpression(self):
# https://github.com/google/yapf/issues/1092
code = textwrap.dedent("""\
def my_coroutine():
x: int = yield
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testSyntaxMatch(self):
# https://github.com/google/yapf/issues/1045
# https://github.com/google/yapf/issues/1085
unformatted_code = textwrap.dedent("""\
a=3
b=0
match a :
case 0 :
b=1
case _ :
b=2
""")
expected_formatted_code = textwrap.dedent("""\
a = 3
b = 0
match a:
case 0:
b = 1
case _:
b = 2
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testParenthsizedContextManager(self):
# https://github.com/google/yapf/issues/1064
unformatted_code = textwrap.dedent("""\
def test_copy_dimension(self):
with (Dataset() as target_ds,
Dataset() as source_ds):
do_something
""")
expected_formatted_code = textwrap.dedent("""\
def test_copy_dimension(self):
with (Dataset() as target_ds, Dataset() as source_ds):
do_something
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testUnpackedTuple(self):
# https://github.com/google/yapf/issues/830
# https://github.com/google/yapf/issues/1060
unformatted_code = textwrap.dedent("""\
def a():
t = (2,3)
for i in range(5):
yield i,*t
""")
expected_formatted_code = textwrap.dedent("""\
def a():
t = (2, 3)
for i in range(5):
yield i, *t
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testTypedTuple(self):
# https://github.com/google/yapf/issues/412
# https://github.com/google/yapf/issues/1058
code = textwrap.dedent("""\
t: tuple = 1, 2
args = tuple(x for x in [2], )
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
def testWalrusOperator(self):
# https://github.com/google/yapf/issues/894
unformatted_code = textwrap.dedent("""\
import os
a=[1,2,3,4]
if (n:=len(a))>2:
print()
""")
expected_formatted_code = textwrap.dedent("""\
import os
a = [1, 2, 3, 4]
if (n := len(a)) > 2:
print()
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testCondAssign(self):
# https://github.com/google/yapf/issues/856
unformatted_code = textwrap.dedent("""\
def json(self) -> JSONTask:
result: JSONTask = {
"id": self.id,
"text": self.text,
"status": self.status,
"last_mod": self.last_mod_time
}
for i in "parent_id", "deadline", "reminder":
if x := getattr(self , i):
result[i] = x # type: ignore
return result
""")
expected_formatted_code = textwrap.dedent("""\
def json(self) -> JSONTask:
result: JSONTask = {
"id": self.id,
"text": self.text,
"status": self.status,
"last_mod": self.last_mod_time
}
for i in "parent_id", "deadline", "reminder":
if x := getattr(self, i):
result[i] = x # type: ignore
return result
""")
llines = yapf_test_helper.ParseAndUnwrap(unformatted_code)
self.assertCodeEqual(expected_formatted_code, reformatter.Reformat(llines))
def testCopyDictionary(self):
# https://github.com/google/yapf/issues/233
# https://github.com/google/yapf/issues/402
code = textwrap.dedent("""\
a_dict = {'key': 'value'}
a_dict_copy = {**a_dict}
print('a_dict:', a_dict)
print('a_dict_copy:', a_dict_copy)
""")
llines = yapf_test_helper.ParseAndUnwrap(code)
self.assertCodeEqual(code, reformatter.Reformat(llines))
if __name__ == '__main__':
unittest.main()