summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2004-11-08 22:07:37 (GMT)
committerTim Peters <tim.peters@gmail.com>2004-11-08 22:07:37 (GMT)
commit50c6bdb1d6f5344fcaa772c6a1a37c09bbe55bf6 (patch)
treed13b58927b5b67465558756843e551830728beba /Lib
parente0b855fac96e858934e9792c6d04bfb2f35b3b9d (diff)
downloadcpython-50c6bdb1d6f5344fcaa772c6a1a37c09bbe55bf6.zip
cpython-50c6bdb1d6f5344fcaa772c6a1a37c09bbe55bf6.tar.gz
cpython-50c6bdb1d6f5344fcaa772c6a1a37c09bbe55bf6.tar.bz2
test_doctest.py test_pdb_set_trace_nested(): A new test from Jim Fulton
showing that doctest's pdb.set_trace() support was dramatically broken. doctest.py _OutputRedirectingPdb.trace_dispatch(): Return a local trace function instead of (implicitly) None. Else interaction with pdb was bizarre, noticing only 'call' events. Amazingly, the existing set_trace() tests didn't care.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/doctest.py5
-rw-r--r--Lib/test/test_doctest.py93
2 files changed, 92 insertions, 6 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index a8162f3..fb4f01b 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -105,8 +105,6 @@ from StringIO import StringIO
warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
__name__, 0)
-real_pdb_set_trace = pdb.set_trace
-
# There are 4 basic classes:
# - Example: a <source, want> pair, plus an intra-docstring line number.
# - DocTest: a collection of examples, parsed from a docstring, plus
@@ -350,9 +348,10 @@ class _OutputRedirectingPdb(pdb.Pdb):
save_stdout = sys.stdout
sys.stdout = self.__out
# Call Pdb's trace dispatch method.
- pdb.Pdb.trace_dispatch(self, *args)
+ result = pdb.Pdb.trace_dispatch(self, *args)
# Restore stdout.
sys.stdout = save_stdout
+ return result
# [XX] Normalize with respect to os.path.pardir?
def _module_relative_path(module, path):
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index d17ca1a..0ae6b8d 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -1568,7 +1568,7 @@ Run the debugger on the docstring, and then restore sys.stdin.
"""
def test_pdb_set_trace():
- """Using pdb.set_trace from a doctest
+ """Using pdb.set_trace from a doctest.
You can use pdb.set_trace from a doctest. To do so, you must
retrieve the set_trace function from the pdb module at the time
@@ -1624,8 +1624,10 @@ def test_pdb_set_trace():
... 'continue', # stop debugging
... ''])
- >>> try: runner.run(test)
- ... finally: sys.stdin = real_stdin
+ >>> try:
+ ... runner.run(test)
+ ... finally:
+ ... sys.stdin = real_stdin
--Return--
> <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None
-> import pdb; pdb.set_trace()
@@ -1697,6 +1699,91 @@ def test_pdb_set_trace():
(1, 3)
"""
+def test_pdb_set_trace_nested():
+ """This illustrates more-demanding use of set_trace with nested functions.
+
+ >>> class C(object):
+ ... def calls_set_trace(self):
+ ... y = 1
+ ... import pdb; pdb.set_trace()
+ ... self.f1()
+ ... y = 2
+ ... def f1(self):
+ ... x = 1
+ ... self.f2()
+ ... x = 2
+ ... def f2(self):
+ ... z = 1
+ ... z = 2
+
+ >>> calls_set_trace = C().calls_set_trace
+
+ >>> doc = '''
+ ... >>> a = 1
+ ... >>> calls_set_trace()
+ ... '''
+ >>> parser = doctest.DocTestParser()
+ >>> runner = doctest.DocTestRunner(verbose=False)
+ >>> test = parser.get_doctest(doc, globals(), "foo", "foo.py", 0)
+ >>> real_stdin = sys.stdin
+ >>> sys.stdin = _FakeInput([
+ ... 'print y', # print data defined in the function
+ ... 'step', 'step', 'step', 'step', 'step', 'step', 'print z',
+ ... 'up', 'print x',
+ ... 'up', 'print y',
+ ... 'up', 'print foo',
+ ... 'continue', # stop debugging
+ ... ''])
+
+ >>> try:
+ ... runner.run(test)
+ ... finally:
+ ... sys.stdin = real_stdin
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
+ -> self.f1()
+ (Pdb) print y
+ 1
+ (Pdb) step
+ --Call--
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1()
+ -> def f1(self):
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1()
+ -> x = 1
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
+ -> self.f2()
+ (Pdb) step
+ --Call--
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2()
+ -> def f2(self):
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2()
+ -> z = 1
+ (Pdb) step
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2()
+ -> z = 2
+ (Pdb) print z
+ 1
+ (Pdb) up
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
+ -> self.f2()
+ (Pdb) print x
+ 1
+ (Pdb) up
+ > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
+ -> self.f1()
+ (Pdb) print y
+ 1
+ (Pdb) up
+ > <doctest foo[1]>(1)?()
+ -> calls_set_trace()
+ (Pdb) print foo
+ *** NameError: name 'foo' is not defined
+ (Pdb) continue
+ (0, 2)
+"""
+
def test_DocTestSuite():
"""DocTestSuite creates a unittest test suite from a doctest.