| | """Tests for tokenutil""" |
| | |
| | |
| |
|
| | import pytest |
| |
|
| | from IPython.utils.tokenutil import token_at_cursor, line_at_cursor |
| |
|
| | def expect_token(expected, cell, cursor_pos): |
| | token = token_at_cursor(cell, cursor_pos) |
| | offset = 0 |
| | for line in cell.splitlines(): |
| | if offset + len(line) >= cursor_pos: |
| | break |
| | else: |
| | offset += len(line)+1 |
| | column = cursor_pos - offset |
| | line_with_cursor = "%s|%s" % (line[:column], line[column:]) |
| | assert token == expected, "Expected %r, got %r in: %r (pos %i)" % ( |
| | expected, |
| | token, |
| | line_with_cursor, |
| | cursor_pos, |
| | ) |
| |
|
| |
|
| | def test_simple(): |
| | cell = "foo" |
| | for i in range(len(cell)): |
| | expect_token("foo", cell, i) |
| |
|
| | def test_function(): |
| | cell = "foo(a=5, b='10')" |
| | expected = 'foo' |
| | |
| | for i in range(cell.find('a=') + 1): |
| | expect_token("foo", cell, i) |
| | |
| | for i in [cell.find('=') + 1, cell.rfind('=') + 1]: |
| | expect_token("foo", cell, i) |
| | |
| | for i in range(cell.find(','), cell.find('b=')): |
| | expect_token("foo", cell, i) |
| |
|
| | def test_multiline(): |
| | cell = '\n'.join([ |
| | 'a = 5', |
| | 'b = hello("string", there)' |
| | ]) |
| | expected = 'hello' |
| | start = cell.index(expected) + 1 |
| | for i in range(start, start + len(expected)): |
| | expect_token(expected, cell, i) |
| | expected = 'hello' |
| | start = cell.index(expected) + 1 |
| | for i in range(start, start + len(expected)): |
| | expect_token(expected, cell, i) |
| |
|
| | def test_multiline_token(): |
| | cell = '\n'.join([ |
| | '"""\n\nxxxxxxxxxx\n\n"""', |
| | '5, """', |
| | 'docstring', |
| | 'multiline token', |
| | '""", [', |
| | '2, 3, "complicated"]', |
| | 'b = hello("string", there)' |
| | ]) |
| | expected = 'hello' |
| | start = cell.index(expected) + 1 |
| | for i in range(start, start + len(expected)): |
| | expect_token(expected, cell, i) |
| | expected = 'hello' |
| | start = cell.index(expected) + 1 |
| | for i in range(start, start + len(expected)): |
| | expect_token(expected, cell, i) |
| |
|
| | def test_nested_call(): |
| | cell = "foo(bar(a=5), b=10)" |
| | expected = 'foo' |
| | start = cell.index('bar') + 1 |
| | for i in range(start, start + 3): |
| | expect_token(expected, cell, i) |
| | expected = 'bar' |
| | start = cell.index('a=') |
| | for i in range(start, start + 3): |
| | expect_token(expected, cell, i) |
| | expected = 'foo' |
| | start = cell.index(')') + 1 |
| | for i in range(start, len(cell)-1): |
| | expect_token(expected, cell, i) |
| |
|
| | def test_attrs(): |
| | cell = "a = obj.attr.subattr" |
| | expected = 'obj' |
| | idx = cell.find('obj') + 1 |
| | for i in range(idx, idx + 3): |
| | expect_token(expected, cell, i) |
| | idx = cell.find('.attr') + 2 |
| | expected = 'obj.attr' |
| | for i in range(idx, idx + 4): |
| | expect_token(expected, cell, i) |
| | idx = cell.find('.subattr') + 2 |
| | expected = 'obj.attr.subattr' |
| | for i in range(idx, len(cell)): |
| | expect_token(expected, cell, i) |
| |
|
| | def test_line_at_cursor(): |
| | cell = "" |
| | (line, offset) = line_at_cursor(cell, cursor_pos=11) |
| | assert line == "" |
| | assert offset == 0 |
| |
|
| | |
| | cell = "One\nTwo\n" |
| | (line, offset) = line_at_cursor(cell, cursor_pos=4) |
| | assert line == "Two\n" |
| | assert offset == 4 |
| |
|
| | |
| | cell = "pri\npri" |
| | (line, offset) = line_at_cursor(cell, cursor_pos=7) |
| | assert line == "pri" |
| | assert offset == 4 |
| |
|
| |
|
| | @pytest.mark.parametrize( |
| | "c, token", |
| | zip( |
| | list(range(16, 22)) + list(range(22, 28)), |
| | ["int"] * (22 - 16) + ["map"] * (28 - 22), |
| | ), |
| | ) |
| | def test_multiline_statement(c, token): |
| | cell = """a = (1, |
| | 3) |
| | |
| | int() |
| | map() |
| | """ |
| | expect_token(token, cell, c) |
| |
|