示例#1
0
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']
示例#2
0
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
示例#3
0
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
示例#4
0
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'}
示例#5
0
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(')
示例#6
0
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
示例#7
0
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
示例#8
0
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)]
示例#9
0
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/')