| # Copyright 2016-2017 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): |
| 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 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 testNoSpacesAroundPowerOparator(self): |
| try: |
| style.SetGlobalStyle( |
| style.CreateStyleFromConfig( |
| '{based_on_style: pep8, SPACES_AROUND_POWER_OPERATOR: True}')) |
| unformatted_code = textwrap.dedent("""\ |
| a**b |
| """) |
| expected_formatted_code = textwrap.dedent("""\ |
| a ** b |
| """) |
| uwlines = yapf_test_helper.ParseAndUnwrap(unformatted_code) |
| self.assertCodeEqual(expected_formatted_code, |
| reformatter.Reformat(uwlines)) |
| finally: |
| style.SetGlobalStyle(style.CreatePEP8Style()) |
| |
| def testSpacesAroundDefaultOrNamedAssign(self): |
| try: |
| style.SetGlobalStyle( |
| style.CreateStyleFromConfig( |
| '{based_on_style: pep8, ' |
| 'SPACES_AROUND_DEFAULT_OR_NAMED_ASSIGN: True}')) |
| unformatted_code = textwrap.dedent("""\ |
| f(a=5) |
| """) |
| expected_formatted_code = textwrap.dedent("""\ |
| f(a = 5) |
| """) |
| 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 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 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)) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |