test_iplib.py
238 lines
| 6.1 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 | ||
Fernando Perez
|
r1859 | import nose.tools as nt | ||
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: | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(len(ip.user_ns), nvars_user_ns) | ||
nt.assert_equal(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(): | ||||
""" | ||||
In [18]: xmode plain | ||||
Exception reporting mode: Plain | ||||
In [19]: run simpleerr.py | ||||
Traceback (most recent call last): | ||||
...line 32, in <module> | ||||
bar(mode) | ||||
...line 16, in bar | ||||
div0() | ||||
...line 8, in div0 | ||||
x/y | ||||
Thomas Kluyver
|
r4731 | ZeroDivisionError: ... | ||
Fernando Perez
|
r2440 | """ | ||
def doctest_tb_context(): | ||||
""" | ||||
In [3]: xmode context | ||||
Exception reporting mode: Context | ||||
In [4]: run simpleerr.py | ||||
--------------------------------------------------------------------------- | ||||
ZeroDivisionError Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
Matthias Bussonnier
|
r24340 | ... in <module> | ||
Alex Hall
|
r25471 | 29 except IndexError: | ||
Fernando Perez
|
r2440 | 30 mode = 'div' | ||
---> 32 bar(mode) | ||||
<BLANKLINE> | ||||
... in bar(mode) | ||||
14 "bar" | ||||
15 if mode=='div': | ||||
---> 16 div0() | ||||
17 elif mode=='exit': | ||||
18 try: | ||||
<BLANKLINE> | ||||
... in div0() | ||||
6 x = 1 | ||||
7 y = 0 | ||||
----> 8 x/y | ||||
<BLANKLINE> | ||||
Thomas Kluyver
|
r4731 | ZeroDivisionError: ... | ||
Fernando Perez
|
r2440 | """ | ||
def doctest_tb_verbose(): | ||||
""" | ||||
In [5]: xmode verbose | ||||
Exception reporting mode: Verbose | ||||
In [6]: run simpleerr.py | ||||
--------------------------------------------------------------------------- | ||||
ZeroDivisionError Traceback (most recent call last) | ||||
<BLANKLINE> | ||||
Matthias Bussonnier
|
r24340 | ... in <module> | ||
Alex Hall
|
r25471 | 29 except IndexError: | ||
Fernando Perez
|
r2440 | 30 mode = 'div' | ||
---> 32 bar(mode) | ||||
Alex Hall
|
r25471 | mode = 'div' | ||
Fernando Perez
|
r2440 | <BLANKLINE> | ||
... in bar(mode='div') | ||||
14 "bar" | ||||
15 if mode=='div': | ||||
---> 16 div0() | ||||
17 elif mode=='exit': | ||||
18 try: | ||||
<BLANKLINE> | ||||
... in div0() | ||||
6 x = 1 | ||||
7 y = 0 | ||||
----> 8 x/y | ||||
x = 1 | ||||
y = 0 | ||||
<BLANKLINE> | ||||
Thomas Kluyver
|
r4731 | ZeroDivisionError: ... | ||
Fernando Perez
|
r2440 | """ | ||
Matthias Bussonnier
|
r26404 | # TODO : Marc 2021 – this seem to fail due | ||
# to upstream changes in CI for whatever reason. | ||||
# Commenting for now, to revive someday (maybe?) | ||||
# nose won't work in 3.10 anyway and we'll have to disable iptest. | ||||
# thus this likely need to bemigrated to pytest. | ||||
# 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): | ||||
# File ... in <module> | ||||
# bar(mode) | ||||
# File ... line 22, in bar | ||||
# sysexit(stat, mode) | ||||
# File ... line 11, in sysexit | ||||
# raise SystemExit(stat, 'Mode = %s' % mode) | ||||
# SystemExit: (2, 'Mode = exit') | ||||
# | ||||
# In [21]: %xmode context | ||||
# Exception reporting mode: Context | ||||
# | ||||
# In [22]: %tb | ||||
# --------------------------------------------------------------------------- | ||||
# SystemExit Traceback (most recent call last) | ||||
# <BLANKLINE> | ||||
# ...<module> | ||||
# 29 except IndexError: | ||||
# 30 mode = 'div' | ||||
# ---> 32 bar(mode) | ||||
# <BLANKLINE> | ||||
# ...bar(mode) | ||||
# 20 except: | ||||
# 21 stat = 1 | ||||
# ---> 22 sysexit(stat, mode) | ||||
# 23 else: | ||||
# 24 raise ValueError('Unknown mode') | ||||
# <BLANKLINE> | ||||
# ...sysexit(stat, mode) | ||||
# 10 def sysexit(stat, mode): | ||||
# ---> 11 raise SystemExit(stat, 'Mode = %s' % mode) | ||||
# <BLANKLINE> | ||||
# SystemExit: (2, 'Mode = exit') | ||||
# | ||||
# In [23]: %xmode verbose | ||||
# Exception reporting mode: Verbose | ||||
# | ||||
# In [24]: %tb | ||||
# --------------------------------------------------------------------------- | ||||
# SystemExit Traceback (most recent call last) | ||||
# <BLANKLINE> | ||||
# ... in <module> | ||||
# 29 except IndexError: | ||||
# 30 mode = 'div' | ||||
# ---> 32 bar(mode) | ||||
# mode = 'exit' | ||||
# <BLANKLINE> | ||||
# ... in bar(mode='exit') | ||||
# 20 except: | ||||
# 21 stat = 1 | ||||
# ---> 22 sysexit(stat, mode) | ||||
# mode = 'exit' | ||||
# stat = 2 | ||||
# 23 else: | ||||
# 24 raise ValueError('Unknown mode') | ||||
# <BLANKLINE> | ||||
# ... in sysexit(stat=2, mode='exit') | ||||
# 10 def sysexit(stat, mode): | ||||
# ---> 11 raise SystemExit(stat, 'Mode = %s' % mode) | ||||
# stat = 2 | ||||
# mode = 'exit' | ||||
# <BLANKLINE> | ||||
# SystemExit: (2, 'Mode = exit') | ||||
# """ | ||||
Fernando Perez
|
r2656 | |||
Thomas Kluyver
|
r3752 | def test_run_cell(): | ||
Fernando Perez
|
r2656 | import textwrap | ||
Thomas Kluyver
|
r3752 | ip.run_cell('a = 10\na+=1') | ||
ip.run_cell('assert a == 11\nassert 1') | ||||
Fernando Perez
|
r2656 | |||
Bradley M. Froehle
|
r7875 | nt.assert_equal(ip.user_ns['a'], 11) | ||
Fernando Perez
|
r2656 | complex = textwrap.dedent(""" | ||
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.""" | ||||
ip.db['__unittest_'] = 12 | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(ip.db['__unittest_'], 12) | ||
Fernando Perez
|
r2656 | del ip.db['__unittest_'] | ||
assert '__unittest_' not in ip.db | ||||