##// END OF EJS Templates
Merge pull request #13239 from Kojoley/pytest-ipdoctest-plugin...
Merge pull request #13239 from Kojoley/pytest-ipdoctest-plugin Pytest ipdoctest plugin

File last commit:

r26750:7b2546d2
r27000:f9db68b1 merge
Show More
test_iplib.py
241 lines | 6.1 KiB | text/x-python | PythonLexer
"""Tests for the key interactiveshell module, where the main ipython class is defined.
"""
#-----------------------------------------------------------------------------
# Module imports
#-----------------------------------------------------------------------------
# third party
import pytest
# our own packages
#-----------------------------------------------------------------------------
# Test functions
#-----------------------------------------------------------------------------
def test_reset():
"""reset must clear most namespaces."""
# 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)
nvars_hidden = len(ip.user_ns_hidden)
# 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:
assert len(ip.user_ns) == nvars_user_ns
assert len(ip.user_ns_hidden) == nvars_hidden
# Tests for reporting of exceptions in various modes, handling of SystemExit,
# and %tb functionality. This is really a mix of testing ultraTB and interactiveshell.
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
ZeroDivisionError: ...
"""
def doctest_tb_context():
"""
In [3]: xmode context
Exception reporting mode: Context
In [4]: run simpleerr.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<BLANKLINE>
... in <module>
29 except IndexError:
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>
ZeroDivisionError: ...
"""
def doctest_tb_verbose():
"""
In [5]: xmode verbose
Exception reporting mode: Verbose
In [6]: run simpleerr.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<BLANKLINE>
... in <module>
29 except IndexError:
30 mode = 'div'
---> 32 bar(mode)
mode = 'div'
<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>
ZeroDivisionError: ...
"""
# 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')
# """
def test_run_cell():
import textwrap
ip.run_cell("a = 10\na+=1")
ip.run_cell("assert a == 11\nassert 1")
assert ip.user_ns["a"] == 11
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
ip.run_cell(complex)
def test_db():
"""Test the internal database used for variable persistence."""
ip.db["__unittest_"] = 12
assert ip.db["__unittest_"] == 12
del ip.db["__unittest_"]
assert "__unittest_" not in ip.db