Refactor some tests to make sure cross parsing versions works.

This commit is contained in:
Dave Halter
2017-07-12 21:32:16 +02:00
parent abc4852bd4
commit d7d1d67828

View File

@@ -13,6 +13,7 @@ import pytest
from parso._compatibility import py_version from parso._compatibility import py_version
from parso import load_grammar from parso import load_grammar
from parso import ParserSyntaxError from parso import ParserSyntaxError
from parso.utils import version_string_to_int
class Checker(): class Checker():
@@ -30,15 +31,19 @@ def works_in_py2(each_version):
@pytest.fixture @pytest.fixture
def works_in_py3(each_version): def works_ge_py3(each_version):
return Checker(each_version, each_version.startswith('3')) version_int = version_string_to_int(each_version)
return Checker(each_version, version_int >= 30)
@pytest.fixture @pytest.fixture
def works_ge_py33(each_version): def works_ge_py35(each_version):
""" """
Works only greater equal Python 3.3. Works only greater equal Python 3.3.
""" """
return Checker(each_version, each_version.startswith('3')) version_int = version_string_to_int(each_version)
return Checker(each_version, version_int >= 35)
def _parse(code, version=None): def _parse(code, version=None):
code = dedent(code) + "\n\n" code = dedent(code) + "\n\n"
@@ -62,39 +67,37 @@ def test_formfeed(each_py2_version):
t = _parse(s, each_py2_version) t = _parse(s, each_py2_version)
def test_matrix_multiplication_operator(): def test_matrix_multiplication_operator(works_ge_py35):
# Introduced in 3.5 works_ge_py35.parse("a @ b")
_parse("a @ b", "3.5") works_ge_py35.parse("a @= b")
_parse("a @= b", "3.5")
def test_yield_from(works_ge_py33, each_version): def test_yield_from(works_ge_py3, each_version):
works_ge_py33.parse("yield from x") works_ge_py3.parse("yield from x")
works_ge_py33.parse("(yield from x) + y") works_ge_py3.parse("(yield from x) + y")
_invalid_syntax("yield from", each_version) _invalid_syntax("yield from", each_version)
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') def test_await_expr(works_ge_py35):
def test_await_expr(): works_ge_py35.parse("""async def foo():
_parse("""async def foo():
await x await x
""", "3.5") """)
_parse("""async def foo(): works_ge_py35.parse("""async def foo():
def foo(): pass def foo(): pass
def foo(): pass def foo(): pass
await x await x
""", "3.5") """)
_parse("""async def foo(): return await a""", "3.5") works_ge_py35.parse("""async def foo(): return await a""")
_parse("""def foo(): works_ge_py35.parse("""def foo():
def foo(): pass def foo(): pass
async def foo(): await x async def foo(): await x
""", "3.5") """)
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@@ -119,10 +122,8 @@ def test_async_var():
_parse("""def async(): pass""", "3.5") _parse("""def async(): pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') def test_async_for(works_ge_py35):
def test_async_for(): works_ge_py35.parse("async def foo():\n async for a in b: pass")
_parse("""async def foo():
async for a in b: pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@@ -132,10 +133,8 @@ def test_async_for_invalid():
async for a in b: pass""", version="3.5") async for a in b: pass""", version="3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') def test_async_with(works_ge_py35):
def test_async_with(): works_ge_py35.parse("async def foo():\n async with a: pass")
_parse("""async def foo():
async with a: pass""", "3.5")
@pytest.mark.skipif('sys.version_info[:2] < (3, 5)') @pytest.mark.skipif('sys.version_info[:2] < (3, 5)')
@pytest.mark.xfail(reason="acting like python 3.7") @pytest.mark.xfail(reason="acting like python 3.7")
@@ -148,17 +147,17 @@ def test_raise_3x_style_1(each_version):
_parse("raise", each_version) _parse("raise", each_version)
def test_raise_2x_style_2(each_py2_version): def test_raise_2x_style_2(works_in_py2):
_parse("raise E, V", version=each_py2_version) works_in_py2.parse("raise E, V")
def test_raise_2x_style_3(each_py2_version): def test_raise_2x_style_3(works_in_py2):
_parse("raise E, V, T", version=each_py2_version) works_in_py2.parse("raise E, V, T")
def test_raise_2x_style_invalid_1(each_py2_version): def test_raise_2x_style_invalid_1(each_version):
_invalid_syntax("raise E, V, T, Z", version=each_py2_version) _invalid_syntax("raise E, V, T, Z", version=each_version)
def test_raise_3x_style(): def test_raise_3x_style(works_ge_py3):
_parse("raise E1 from E2", '3.3') works_ge_py3.parse("raise E1 from E2")
def test_raise_3x_style_invalid_1(): def test_raise_3x_style_invalid_1():
_invalid_syntax("raise E, V from E1", '3.3') _invalid_syntax("raise E, V from E1", '3.3')