##// END OF EJS Templates
Start adding code for checking when input is complete
Start adding code for checking when input is complete

File last commit:

r24165:6f00ca81
r24165:6f00ca81
Show More
test_inputtransformer2.py
188 lines | 5.4 KiB | text/x-python | PythonLexer
/ IPython / core / tests / test_inputtransformer2.py
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 import nose.tools as nt
Thomas Kluyver
Add transformation for system assignments
r24156 from IPython.core import inputtransformer2 as ipt2
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 from IPython.core.inputtransformer2 import make_tokens_by_line
Thomas Kluyver
Escaped commands
r24159 MULTILINE_MAGIC = ("""\
a = f()
%foo \\
bar
g()
Thomas Kluyver
Transformations for 'help?' syntax
r24161 """.splitlines(keepends=True), (2, 0), """\
Thomas Kluyver
Escaped commands
r24159 a = f()
get_ipython().run_line_magic('foo', ' bar')
g()
""".splitlines(keepends=True))
Thomas Kluyver
Some more tests for escaped commands
r24160 INDENTED_MAGIC = ("""\
for a in range(5):
%ls
Thomas Kluyver
Transformations for 'help?' syntax
r24161 """.splitlines(keepends=True), (2, 4), """\
Thomas Kluyver
Some more tests for escaped commands
r24160 for a in range(5):
get_ipython().run_line_magic('ls', '')
""".splitlines(keepends=True))
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 MULTILINE_MAGIC_ASSIGN = ("""\
a = f()
b = %foo \\
bar
g()
Thomas Kluyver
Transformations for 'help?' syntax
r24161 """.splitlines(keepends=True), (2, 4), """\
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 a = f()
b = get_ipython().run_line_magic('foo', ' bar')
g()
""".splitlines(keepends=True))
MULTILINE_SYSTEM_ASSIGN = ("""\
a = f()
b = !foo \\
bar
g()
Thomas Kluyver
Transformations for 'help?' syntax
r24161 """.splitlines(keepends=True), (2, 4), """\
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 a = f()
Thomas Kluyver
Add transformation for system assignments
r24156 b = get_ipython().getoutput('foo bar')
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 g()
""".splitlines(keepends=True))
Thomas Kluyver
Some more tests for escaped commands
r24160 AUTOCALL_QUOTE = (
Thomas Kluyver
Transformations for 'help?' syntax
r24161 [",f 1 2 3\n"], (1, 0),
Thomas Kluyver
Some more tests for escaped commands
r24160 ['f("1", "2", "3")\n']
)
AUTOCALL_QUOTE2 = (
Thomas Kluyver
Transformations for 'help?' syntax
r24161 [";f 1 2 3\n"], (1, 0),
Thomas Kluyver
Some more tests for escaped commands
r24160 ['f("1 2 3")\n']
)
AUTOCALL_PAREN = (
Thomas Kluyver
Transformations for 'help?' syntax
r24161 ["/f 1 2 3\n"], (1, 0),
Thomas Kluyver
Some more tests for escaped commands
r24160 ['f(1, 2, 3)\n']
)
Thomas Kluyver
Transformations for 'help?' syntax
r24161 SIMPLE_HELP = (
["foo?\n"], (1, 0),
["get_ipython().run_line_magic('pinfo', 'foo')\n"]
)
DETAILED_HELP = (
["foo??\n"], (1, 0),
["get_ipython().run_line_magic('pinfo2', 'foo')\n"]
)
MAGIC_HELP = (
["%foo?\n"], (1, 0),
["get_ipython().run_line_magic('pinfo', '%foo')\n"]
)
HELP_IN_EXPR = (
["a = b + c?\n"], (1, 0),
["get_ipython().set_next_input('a = b + c');"
"get_ipython().run_line_magic('pinfo', 'c')\n"]
)
HELP_CONTINUED_LINE = ("""\
a = \\
zip?
""".splitlines(keepends=True), (1, 0),
[r"get_ipython().set_next_input('a = \\\nzip');get_ipython().run_line_magic('pinfo', 'zip')" + "\n"]
)
HELP_MULTILINE = ("""\
(a,
b) = zip?
""".splitlines(keepends=True), (1, 0),
[r"get_ipython().set_next_input('(a,\nb) = zip');get_ipython().run_line_magic('pinfo', 'zip')" + "\n"]
)
def check_find(transformer, case, match=True):
sample, expected_start, _ = case
tbl = make_tokens_by_line(sample)
res = transformer.find(tbl)
if match:
# start_line is stored 0-indexed, expected values are 1-indexed
nt.assert_equal((res.start_line+1, res.start_col), expected_start)
return res
else:
nt.assert_is(res, None)
def check_transform(transformer_cls, case):
lines, start, expected = case
transformer = transformer_cls(start)
nt.assert_equal(transformer.transform(lines), expected)
Thomas Kluyver
Factor out handling of line continuations
r24157 def test_continued_line():
lines = MULTILINE_MAGIC_ASSIGN[0]
nt.assert_equal(ipt2.find_end_of_continued_line(lines, 1), 2)
nt.assert_equal(ipt2.assemble_continued_line(lines, (1, 5), 2), "foo bar")
Thomas Kluyver
Start adding tests for inputtransformer2
r24155 def test_find_assign_magic():
Thomas Kluyver
Transformations for 'help?' syntax
r24161 check_find(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN)
check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN, match=False)
Thomas Kluyver
Start adding tests for inputtransformer2
r24155
def test_transform_assign_magic():
Thomas Kluyver
Transformations for 'help?' syntax
r24161 check_transform(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN)
Thomas Kluyver
Add transformation for system assignments
r24156
def test_find_assign_system():
Thomas Kluyver
Transformations for 'help?' syntax
r24161 check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN)
check_find(ipt2.SystemAssign, (["a = !ls\n"], (1, 5), None))
check_find(ipt2.SystemAssign, (["a=!ls\n"], (1, 2), None))
check_find(ipt2.SystemAssign, MULTILINE_MAGIC_ASSIGN, match=False)
Thomas Kluyver
Add transformation for system assignments
r24156
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_transform_assign_system():
check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN)
Thomas Kluyver
Add transformation for system assignments
r24156
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_find_magic_escape():
check_find(ipt2.EscapedCommand, MULTILINE_MAGIC)
check_find(ipt2.EscapedCommand, INDENTED_MAGIC)
check_find(ipt2.EscapedCommand, MULTILINE_MAGIC_ASSIGN, match=False)
Thomas Kluyver
Add transformation for system assignments
r24156
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_transform_magic_escape():
check_transform(ipt2.EscapedCommand, MULTILINE_MAGIC)
check_transform(ipt2.EscapedCommand, INDENTED_MAGIC)
Thomas Kluyver
Add transformation for system assignments
r24156
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_find_autocalls():
for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]:
print("Testing %r" % case[0])
check_find(ipt2.EscapedCommand, case)
Thomas Kluyver
Escaped commands
r24159
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_transform_autocall():
for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]:
print("Testing %r" % case[0])
check_transform(ipt2.EscapedCommand, case)
Thomas Kluyver
Escaped commands
r24159
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_find_help():
for case in [SIMPLE_HELP, DETAILED_HELP, MAGIC_HELP, HELP_IN_EXPR]:
check_find(ipt2.HelpEnd, case)
Thomas Kluyver
Some more tests for escaped commands
r24160
Thomas Kluyver
Transformations for 'help?' syntax
r24161 tf = check_find(ipt2.HelpEnd, HELP_CONTINUED_LINE)
nt.assert_equal(tf.q_line, 1)
nt.assert_equal(tf.q_col, 3)
Thomas Kluyver
Escaped commands
r24159
Thomas Kluyver
Transformations for 'help?' syntax
r24161 tf = check_find(ipt2.HelpEnd, HELP_MULTILINE)
nt.assert_equal(tf.q_line, 1)
nt.assert_equal(tf.q_col, 8)
Thomas Kluyver
Some more tests for escaped commands
r24160
Thomas Kluyver
Transformations for 'help?' syntax
r24161 # ? in a comment does not trigger help
check_find(ipt2.HelpEnd, (["foo # bar?\n"], None, None), match=False)
# Nor in a string
check_find(ipt2.HelpEnd, (["foo = '''bar?\n"], None, None), match=False)
Thomas Kluyver
Some more tests for escaped commands
r24160
Thomas Kluyver
Transformations for 'help?' syntax
r24161 def test_transform_help():
tf = ipt2.HelpEnd((1, 0), (1, 9))
nt.assert_equal(tf.transform(HELP_IN_EXPR[0]), HELP_IN_EXPR[2])
Thomas Kluyver
Some more tests for escaped commands
r24160
Thomas Kluyver
Transformations for 'help?' syntax
r24161 tf = ipt2.HelpEnd((1, 0), (2, 3))
nt.assert_equal(tf.transform(HELP_CONTINUED_LINE[0]), HELP_CONTINUED_LINE[2])
tf = ipt2.HelpEnd((1, 0), (2, 8))
nt.assert_equal(tf.transform(HELP_MULTILINE[0]), HELP_MULTILINE[2])
Thomas Kluyver
Start adding code for checking when input is complete
r24165
def test_check_complete():
tm = ipt2.TransformerManager()
nt.assert_equal(tm.check_complete("a = 1"), ('complete', None))
nt.assert_equal(tm.check_complete("for a in range(5):"), ('incomplete', 4))
nt.assert_equal(tm.check_complete("raise = 2"), ('invalid', None))
nt.assert_equal(tm.check_complete("a = [1,\n2,"), ('incomplete', 0))
nt.assert_equal(tm.check_complete("a = '''\n hi"), ('incomplete', 3))
nt.assert_equal(tm.check_complete("def a():\n x=1\n global x"), ('invalid', None))