test_iplib.py
249 lines
| 6.7 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2760 | """Tests for the key interactiveshell module, where the main ipython class is defined. | ||
Fernando Perez
|
r1859 | """ | ||
Fernando Perez
|
r1908 | #----------------------------------------------------------------------------- | ||
# Module imports | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r1859 | |||
Fernando Perez
|
r1908 | # third party | ||
Tomasz Kłoczko
|
r26749 | import pytest | ||
Fernando Perez
|
r1859 | |||
Fernando Perez
|
r1908 | # our own packages | ||
#----------------------------------------------------------------------------- | ||||
# Test functions | ||||
#----------------------------------------------------------------------------- | ||||
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): | ||||
...line ..., in <module> | ||||
bar(mode) | ||||
...line ..., in bar | ||||
div0() | ||||
...line ..., in div0 | ||||
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> | ||||
... in <module> | ||||
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> | ||||
... in <module> | ||||
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
|
r27005 | File ..., in execfile | ||
exec(compiler(f.read(), fname, 'exec'), glob, loc) | ||||
File ..., in <module> | ||||
Nikita Kniazev
|
r27003 | bar(mode) | ||
Matthias Bussonnier
|
r27005 | File ..., in bar | ||
Nikita Kniazev
|
r27003 | sysexit(stat, mode) | ||
Matthias Bussonnier
|
r27005 | File ..., in sysexit | ||
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) | ||
70 with open(fname, 'rb') as f: | ||||
71 compiler = compiler or compile | ||||
---> 72 exec(compiler(f.read(), fname, 'exec'), glob, loc) | ||||
Nikita Kniazev
|
r27003 | ...<module> | ||
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 | """ | ||
def doctest_tb_sysexit_verbose(): | ||||
""" | ||||
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') | ||||
Nikita Kniazev
|
r27003 | |||
In [23]: %xmode verbose | ||||
Exception reporting mode: Verbose | ||||
In [24]: %tb | ||||
--------------------------------------------------------------------------- | ||||
SystemExit Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
... in <module> | ||||
Matthias Bussonnier
|
r27005 | 30 except IndexError: | ||
31 mode = 'div' | ||||
---> 33 bar(mode) | ||||
Nikita Kniazev
|
r27003 | mode = 'exit' | ||
<BLANKLINE> | ||||
... in bar(mode='exit') | ||||
Matthias Bussonnier
|
r27005 | ... except: | ||
... stat = 1 | ||||
---> ... sysexit(stat, mode) | ||||
Nikita Kniazev
|
r27003 | mode = 'exit' | ||
stat = 2 | ||||
Matthias Bussonnier
|
r27005 | ... else: | ||
... raise ValueError('Unknown mode') | ||||
Nikita Kniazev
|
r27003 | <BLANKLINE> | ||
... in sysexit(stat=2, mode='exit') | ||||
10 def sysexit(stat, mode): | ||||
Matthias Bussonnier
|
r27005 | ---> 11 raise SystemExit(stat, f"Mode = {mode}") | ||
Nikita Kniazev
|
r27003 | 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" | ||||
""") | ||||
# 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 | ||||