test_debugger.py
157 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
Fernando Perez
|
r7087 | """Tests for debugging machinery. | ||
""" | ||||
Thomas Kluyver
|
r13348 | from __future__ import print_function | ||
Fernando Perez
|
r7087 | #----------------------------------------------------------------------------- | ||
# Copyright (c) 2012, The IPython Development Team. | ||||
# | ||||
# Distributed under the terms of the Modified BSD License. | ||||
# | ||||
# The full license is in the file COPYING.txt, distributed with this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
Bradley M. Froehle
|
r7929 | import sys | ||
Fernando Perez
|
r7087 | # third-party | ||
import nose.tools as nt | ||||
# Our own | ||||
from IPython.core import debugger | ||||
#----------------------------------------------------------------------------- | ||||
Bradley M. Froehle
|
r7929 | # Helper classes, from CPython's Pdb test suite | ||
#----------------------------------------------------------------------------- | ||||
class _FakeInput(object): | ||||
""" | ||||
A fake input stream for pdb's interactive debugger. Whenever a | ||||
line is read, print it (to simulate the user typing it), and then | ||||
return it. The set of lines to return is specified in the | ||||
constructor; they should not have trailing newlines. | ||||
""" | ||||
def __init__(self, lines): | ||||
self.lines = iter(lines) | ||||
def readline(self): | ||||
line = next(self.lines) | ||||
Thomas Kluyver
|
r13348 | print(line) | ||
Bradley M. Froehle
|
r7929 | return line+'\n' | ||
class PdbTestInput(object): | ||||
"""Context manager that makes testing Pdb in doctests easier.""" | ||||
def __init__(self, input): | ||||
self.input = input | ||||
def __enter__(self): | ||||
self.real_stdin = sys.stdin | ||||
sys.stdin = _FakeInput(self.input) | ||||
def __exit__(self, *exc): | ||||
sys.stdin = self.real_stdin | ||||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r7087 | # Tests | ||
#----------------------------------------------------------------------------- | ||||
def test_longer_repr(): | ||||
Thomas Kluyver
|
r13375 | try: | ||
from reprlib import repr as trepr # Py 3 | ||||
except ImportError: | ||||
from repr import repr as trepr # Py 2 | ||||
Fernando Perez
|
r7087 | |||
a = '1234567890'* 7 | ||||
ar = "'1234567890123456789012345678901234567890123456789012345678901234567890'" | ||||
a_trunc = "'123456789012...8901234567890'" | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(trepr(a), a_trunc) | ||
Fernando Perez
|
r7087 | # The creation of our tracer modifies the repr module's repr function | ||
# in-place, since that global is used directly by the stdlib's pdb module. | ||||
t = debugger.Tracer() | ||||
Bradley M. Froehle
|
r7875 | nt.assert_equal(trepr(a), ar) | ||
Bradley M. Froehle
|
r7929 | |||
def test_ipdb_magics(): | ||||
'''Test calling some IPython magics from ipdb. | ||||
First, set up some test functions and classes which we can inspect. | ||||
>>> class ExampleClass(object): | ||||
... """Docstring for ExampleClass.""" | ||||
... def __init__(self): | ||||
... """Docstring for ExampleClass.__init__""" | ||||
... pass | ||||
... def __str__(self): | ||||
... return "ExampleClass()" | ||||
>>> def example_function(x, y, z="hello"): | ||||
... """Docstring for example_function.""" | ||||
... pass | ||||
Thomas Kluyver
|
r12286 | >>> old_trace = sys.gettrace() | ||
Bradley M. Froehle
|
r7929 | Create a function which triggers ipdb. | ||
>>> def trigger_ipdb(): | ||||
... a = ExampleClass() | ||||
... debugger.Pdb().set_trace() | ||||
>>> with PdbTestInput([ | ||||
... 'pdef example_function', | ||||
... 'pdoc ExampleClass', | ||||
... 'pinfo a', | ||||
... 'continue', | ||||
... ]): | ||||
... trigger_ipdb() | ||||
--Return-- | ||||
None | ||||
> <doctest ...>(3)trigger_ipdb() | ||||
1 def trigger_ipdb(): | ||||
2 a = ExampleClass() | ||||
----> 3 debugger.Pdb().set_trace() | ||||
<BLANKLINE> | ||||
ipdb> pdef example_function | ||||
example_function(x, y, z='hello') | ||||
ipdb> pdoc ExampleClass | ||||
MinRK
|
r15712 | Class docstring: | ||
Bradley M. Froehle
|
r7929 | Docstring for ExampleClass. | ||
MinRK
|
r15712 | Init docstring: | ||
Bradley M. Froehle
|
r7929 | Docstring for ExampleClass.__init__ | ||
ipdb> pinfo a | ||||
MinRK
|
r15711 | Type: ExampleClass | ||
MinRK
|
r15712 | String form: ExampleClass() | ||
MinRK
|
r15711 | Namespace: Local... | ||
Docstring: Docstring for ExampleClass. | ||||
MinRK
|
r15712 | Init docstring: Docstring for ExampleClass.__init__ | ||
Bradley M. Froehle
|
r7929 | ipdb> continue | ||
Thomas Kluyver
|
r12286 | |||
Restore previous trace function, e.g. for coverage.py | ||||
>>> sys.settrace(old_trace) | ||||
Bradley M. Froehle
|
r7929 | ''' | ||
Bradley M. Froehle
|
r8929 | |||
Thomas Kluyver
|
r11124 | def test_ipdb_magics2(): | ||
Bradley M. Froehle
|
r8929 | '''Test ipdb with a very short function. | ||
Thomas Kluyver
|
r12286 | |||
>>> old_trace = sys.gettrace() | ||||
Bradley M. Froehle
|
r8929 | |||
>>> def bar(): | ||||
... pass | ||||
Run ipdb. | ||||
>>> with PdbTestInput([ | ||||
... 'continue', | ||||
... ]): | ||||
... debugger.Pdb().runcall(bar) | ||||
> <doctest ...>(2)bar() | ||||
1 def bar(): | ||||
----> 2 pass | ||||
<BLANKLINE> | ||||
ipdb> continue | ||||
Thomas Kluyver
|
r12286 | |||
Restore previous trace function, e.g. for coverage.py | ||||
>>> sys.settrace(old_trace) | ||||
Bradley M. Froehle
|
r8929 | ''' | ||