test_iplib.py
246 lines
| 6.5 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2760 | """Tests for the key interactiveshell module, where the main ipython class is defined. | ||
Fernando Perez
|
r1859 | """ | ||
Matthias Bussonnier
|
r27862 | import stack_data | ||
Matthias Bussonnier
|
r27864 | import sys | ||
Fernando Perez
|
r1859 | |||
Matthias Bussonnier
|
r27862 | SV_VERSION = tuple([int(x) for x in stack_data.__version__.split(".")[0:2]]) | ||
Fernando Perez
|
r1908 | |||
Fernando Perez
|
r1868 | |||
Fernando Perez
|
r1859 | def test_reset(): | ||
"""reset must clear most namespaces.""" | ||||
Fernando Perez
|
r2398 | |||
# Check that reset runs without error | ||||
ip.reset() | ||||
# Once we've reset it (to clear of any junk that might have been there from | ||||
# other tests, we can count how many variables are in the user's namespace | ||||
nvars_user_ns = len(ip.user_ns) | ||||
Thomas Kluyver
|
r5458 | nvars_hidden = len(ip.user_ns_hidden) | ||
Fernando Perez
|
r2398 | |||
# Now add a few variables to user_ns, and check that reset clears them | ||||
ip.user_ns['x'] = 1 | ||||
ip.user_ns['y'] = 1 | ||||
ip.reset() | ||||
# Finally, check that all namespaces have only as many variables as we | ||||
# expect to find in them: | ||||
Tomasz KÅ‚oczko
|
r26749 | assert len(ip.user_ns) == nvars_user_ns | ||
assert len(ip.user_ns_hidden) == nvars_hidden | ||||
Fernando Perez
|
r2440 | |||
# Tests for reporting of exceptions in various modes, handling of SystemExit, | ||||
Brian Granger
|
r2760 | # and %tb functionality. This is really a mix of testing ultraTB and interactiveshell. | ||
Fernando Perez
|
r2440 | |||
def doctest_tb_plain(): | ||||
""" | ||||
Matthias Bussonnier
|
r27052 | In [18]: xmode plain | ||
Exception reporting mode: Plain | ||||
In [19]: run simpleerr.py | ||||
Traceback (most recent call last): | ||||
JD Smith
|
r27686 | File ...:... | ||
Matthias Bussonnier
|
r27052 | bar(mode) | ||
Matthias Bussonnier
|
r27356 | File ...:... in bar | ||
Matthias Bussonnier
|
r27052 | div0() | ||
Matthias Bussonnier
|
r27356 | File ...:... in div0 | ||
Matthias Bussonnier
|
r27052 | x/y | ||
ZeroDivisionError: ... | ||||
Fernando Perez
|
r2440 | """ | ||
def doctest_tb_context(): | ||||
""" | ||||
Matthias Bussonnier
|
r27052 | In [3]: xmode context | ||
Exception reporting mode: Context | ||||
In [4]: run simpleerr.py | ||||
--------------------------------------------------------------------------- | ||||
ZeroDivisionError Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
JD Smith
|
r27686 | ... | ||
Matthias Bussonnier
|
r27052 | 30 except IndexError: | ||
31 mode = 'div' | ||||
---> 33 bar(mode) | ||||
<BLANKLINE> | ||||
... in bar(mode) | ||||
15 "bar" | ||||
16 if mode=='div': | ||||
---> 17 div0() | ||||
18 elif mode=='exit': | ||||
19 try: | ||||
<BLANKLINE> | ||||
... in div0() | ||||
6 x = 1 | ||||
7 y = 0 | ||||
----> 8 x/y | ||||
<BLANKLINE> | ||||
ZeroDivisionError: ...""" | ||||
Fernando Perez
|
r2440 | |||
def doctest_tb_verbose(): | ||||
""" | ||||
Blazej Michalik
|
r26750 | In [5]: xmode verbose | ||
Exception reporting mode: Verbose | ||||
In [6]: run simpleerr.py | ||||
--------------------------------------------------------------------------- | ||||
ZeroDivisionError Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
JD Smith
|
r27686 | ... | ||
Matthias Bussonnier
|
r27005 | 30 except IndexError: | ||
31 mode = 'div' | ||||
---> 33 bar(mode) | ||||
Blazej Michalik
|
r26750 | mode = 'div' | ||
<BLANKLINE> | ||||
... in bar(mode='div') | ||||
Matthias Bussonnier
|
r27005 | 15 "bar" | ||
16 if mode=='div': | ||||
---> 17 div0() | ||||
18 elif mode=='exit': | ||||
19 try: | ||||
Blazej Michalik
|
r26750 | <BLANKLINE> | ||
... in div0() | ||||
6 x = 1 | ||||
7 y = 0 | ||||
----> 8 x/y | ||||
x = 1 | ||||
y = 0 | ||||
<BLANKLINE> | ||||
ZeroDivisionError: ... | ||||
""" | ||||
Fernando Perez
|
r2440 | |||
Nikita Kniazev
|
r27003 | def doctest_tb_sysexit(): | ||
""" | ||||
In [17]: %xmode plain | ||||
Exception reporting mode: Plain | ||||
In [18]: %run simpleerr.py exit | ||||
An exception has occurred, use %tb to see the full traceback. | ||||
SystemExit: (1, 'Mode = exit') | ||||
In [19]: %run simpleerr.py exit 2 | ||||
An exception has occurred, use %tb to see the full traceback. | ||||
SystemExit: (2, 'Mode = exit') | ||||
In [20]: %tb | ||||
Traceback (most recent call last): | ||||
Matthias Bussonnier
|
r27356 | File ...:... in execfile | ||
Matthias Bussonnier
|
r27224 | exec(compiler(f.read(), fname, "exec"), glob, loc) | ||
JD Smith
|
r27686 | File ...:... | ||
Nikita Kniazev
|
r27003 | bar(mode) | ||
Matthias Bussonnier
|
r27356 | File ...:... in bar | ||
Nikita Kniazev
|
r27003 | sysexit(stat, mode) | ||
Matthias Bussonnier
|
r27356 | File ...:... in sysexit | ||
Matthias Bussonnier
|
r27005 | raise SystemExit(stat, f"Mode = {mode}") | ||
Nikita Kniazev
|
r27003 | SystemExit: (2, 'Mode = exit') | ||
In [21]: %xmode context | ||||
Exception reporting mode: Context | ||||
In [22]: %tb | ||||
--------------------------------------------------------------------------- | ||||
SystemExit Traceback (most recent call last) | ||||
Matthias Bussonnier
|
r27005 | File ..., in execfile(fname, glob, loc, compiler) | ||
Matthias Bussonnier
|
r27224 | ... with open(fname, "rb") as f: | ||
... compiler = compiler or compile | ||||
---> ... exec(compiler(f.read(), fname, "exec"), glob, loc) | ||||
JD Smith
|
r27686 | ... | ||
Matthias Bussonnier
|
r27005 | 30 except IndexError: | ||
31 mode = 'div' | ||||
---> 33 bar(mode) | ||||
Nikita Kniazev
|
r27003 | <BLANKLINE> | ||
...bar(mode) | ||||
Matthias Bussonnier
|
r27005 | 21 except: | ||
22 stat = 1 | ||||
---> 23 sysexit(stat, mode) | ||||
24 else: | ||||
25 raise ValueError('Unknown mode') | ||||
Nikita Kniazev
|
r27003 | <BLANKLINE> | ||
...sysexit(stat, mode) | ||||
10 def sysexit(stat, mode): | ||||
Matthias Bussonnier
|
r27005 | ---> 11 raise SystemExit(stat, f"Mode = {mode}") | ||
Nikita Kniazev
|
r27003 | <BLANKLINE> | ||
SystemExit: (2, 'Mode = exit') | ||||
Matthias Bussonnier
|
r27005 | """ | ||
Matthias Bussonnier
|
r28219 | if SV_VERSION < (0, 6): | ||
def doctest_tb_sysexit_verbose_stack_data_05(): | ||||
""" | ||||
In [18]: %run simpleerr.py exit | ||||
An exception has occurred, use %tb to see the full traceback. | ||||
SystemExit: (1, 'Mode = exit') | ||||
In [19]: %run simpleerr.py exit 2 | ||||
An exception has occurred, use %tb to see the full traceback. | ||||
SystemExit: (2, 'Mode = exit') | ||||
In [23]: %xmode verbose | ||||
Exception reporting mode: Verbose | ||||
In [24]: %tb | ||||
--------------------------------------------------------------------------- | ||||
SystemExit Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
... | ||||
30 except IndexError: | ||||
31 mode = 'div' | ||||
---> 33 bar(mode) | ||||
mode = 'exit' | ||||
<BLANKLINE> | ||||
... in bar(mode='exit') | ||||
... except: | ||||
... stat = 1 | ||||
---> ... sysexit(stat, mode) | ||||
mode = 'exit' | ||||
stat = 2 | ||||
... else: | ||||
... raise ValueError('Unknown mode') | ||||
<BLANKLINE> | ||||
... in sysexit(stat=2, mode='exit') | ||||
10 def sysexit(stat, mode): | ||||
---> 11 raise SystemExit(stat, f"Mode = {mode}") | ||||
stat = 2 | ||||
<BLANKLINE> | ||||
SystemExit: (2, 'Mode = exit') | ||||
""" | ||||
Fernando Perez
|
r2656 | |||
Thomas Kluyver
|
r3752 | def test_run_cell(): | ||
Fernando Perez
|
r2656 | import textwrap | ||
Blazej Michalik
|
r26750 | ip.run_cell("a = 10\na+=1") | ||
ip.run_cell("assert a == 11\nassert 1") | ||||
assert ip.user_ns["a"] == 11 | ||||
complex = textwrap.dedent( | ||||
""" | ||||
Fernando Perez
|
r2656 | if 1: | ||
print "hello" | ||||
if 1: | ||||
print "world" | ||||
if 2: | ||||
print "foo" | ||||
if 3: | ||||
print "bar" | ||||
if 4: | ||||
print "bar" | ||||
Matthias Bussonnier
|
r27639 | """ | ||
) | ||||
Fernando Perez
|
r2656 | # Simply verifies that this kind of input is run | ||
Thomas Kluyver
|
r3752 | ip.run_cell(complex) | ||
Fernando Perez
|
r2656 | |||
def test_db(): | ||||
"""Test the internal database used for variable persistence.""" | ||||
Blazej Michalik
|
r26750 | ip.db["__unittest_"] = 12 | ||
assert ip.db["__unittest_"] == 12 | ||||
del ip.db["__unittest_"] | ||||
assert "__unittest_" not in ip.db | ||||