def test_exclude_types(): parser = Parser(exclude=[LOCAL]) add, clear = parser.parse(dedent(''' a = 1 def f(): b, c = 1 a + b ''')) assert [n.name for n in add] == ['a'] assert clear == [] add, clear = parser.parse(dedent(''' a = 1 def f(): b, c = 1 a + c ''')) assert add == [] assert clear == [] add, clear = parser.parse(dedent(''' a = 1 def f(): b, c = 1 g + c ''')) assert [n.name for n in add] == ['g'] assert [n.name for n in clear] == ['a'] add, clear = parser.parse(dedent(''' a = 1 def f(): b, c = 1 0 + c ''')) assert add == [] assert [n.name for n in clear] == ['g']
def test_diff(): """The id of a saved name should remain the same so that we can remove it later by ID.""" parser = Parser() add0, rem = parser.parse('foo') add, rem = parser.parse('foo ') add, rem = parser.parse('foo = 1') assert add0[0].id == rem[0].id
def test_detect_symtable_syntax_error(): """Some syntax errors (such as duplicate parameter names) aren't directly raised when compile() is called on the code, but cause problems later. """ parser = Parser() with pytest.raises(UnparsableError): parser.parse('def foo(x, x): pass') assert parser.syntax_errors[-1].lineno == 1
def test_fixable_syntax_errors2(): """Test syntax errors where we can tokenize the last modified line.""" parser = make_parser(''' a b ''') parser.parse(dedent(''' c( b ''')) assert {n.name for n in parser._nodes} == {'c', 'b'}
def test_syntax_error_fail(): """Syntax errors which can't be fixed with a single change.""" parser = Parser() with pytest.raises(UnparsableError): parser.parse('(\n(') with pytest.raises(UnparsableError): parser.parse(')\n(') # Intentionally no difference to previous one with pytest.raises(UnparsableError): parser.parse(')\n(')
def test_syntax_error_cycle(): parser = make_parser('') assert parser.syntax_errors[-2] is None assert parser.syntax_errors[-1] is None parser.parse('1+') assert parser.syntax_errors[-2] is None assert parser.syntax_errors[-1].lineno == 1 parser.parse('1+1') assert parser.syntax_errors[-2].lineno == 1 assert parser.syntax_errors[-1] is None with pytest.raises(UnparsableError): parser.parse('\n+\n+') assert parser.syntax_errors[-2] is None assert parser.syntax_errors[-1].lineno == 2
def test_refresh_names(): """Clear everything if more than one line changes.""" parser = Parser() add, clear = parser.parse(dedent(''' def foo(): x = y ''')) assert len(add) == 3 assert len(clear) == 0 add, clear = parser.parse(dedent(''' def foo(): x = y ''')) assert len(add) == 0 assert len(clear) == 0 add, clear = parser.parse(dedent(''' def foo(): z = y ''')) assert len(add) == 1 assert len(clear) == 1 add, clear = parser.parse( dedent(''' def foo(): z = y a, b ''')) assert len(add) == 5 assert len(clear) == 3 add, clear = parser.parse( dedent(''' def foo(): z = y c, d ''')) assert len(add) == 2 assert len(clear) == 2 add, clear = parser.parse( dedent(''' def foo(): z = y, k 1, 1 ''')) assert len(add) == 4 assert len(clear) == 5
def test_exclude_types_same_nodes(): parser = Parser(exclude=[UNRESOLVED]) add, clear = parser.parse('a, a') assert len(add) == 0 assert [n.pos for n in parser.same_nodes((1, 0))] == [(1, 0), (1, 3)]
def test_syntax_error_fail2(): """Syntax errors which can't be fixed with a single change.""" parser = make_parser('a\nb/') with pytest.raises(UnparsableError): parser.parse('a(\nb/')