move sections
[python/dscho.git] / Lib / test / test_pdb.py
blobce64d171a45818a8b4ec2e2bdc8877830d7d035f
1 # A test suite for pdb; at the moment, this only validates skipping of
2 # specified test modules (RFE #5142).
4 import imp
5 import sys
7 from test import test_support
8 # This little helper class is essential for testing pdb under doctest.
9 from test_doctest import _FakeInput
12 class PdbTestInput(object):
13 """Context manager that makes testing Pdb in doctests easier."""
15 def __init__(self, input):
16 self.input = input
18 def __enter__(self):
19 self.real_stdin = sys.stdin
20 sys.stdin = _FakeInput(self.input)
22 def __exit__(self, *exc):
23 sys.stdin = self.real_stdin
26 def write(x):
27 print x
29 def test_pdb_displayhook():
30 """This tests the custom displayhook for pdb.
32 >>> def test_function(foo, bar):
33 ... import pdb; pdb.Pdb().set_trace()
34 ... pass
36 >>> with PdbTestInput([
37 ... 'foo',
38 ... 'bar',
39 ... 'for i in range(5): write(i)',
40 ... 'continue',
41 ... ]):
42 ... test_function(1, None)
43 > <doctest test.test_pdb.test_pdb_displayhook[0]>(3)test_function()
44 -> pass
45 (Pdb) foo
47 (Pdb) bar
48 (Pdb) for i in range(5): write(i)
54 (Pdb) continue
55 """
58 def test_pdb_skip_modules():
59 """This illustrates the simple case of module skipping.
61 >>> def skip_module():
62 ... import string
63 ... import pdb; pdb.Pdb(skip=['string*']).set_trace()
64 ... string.lower('FOO')
66 >>> with PdbTestInput([
67 ... 'step',
68 ... 'continue',
69 ... ]):
70 ... skip_module()
71 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()
72 -> string.lower('FOO')
73 (Pdb) step
74 --Return--
75 > <doctest test.test_pdb.test_pdb_skip_modules[0]>(4)skip_module()->None
76 -> string.lower('FOO')
77 (Pdb) continue
78 """
81 # Module for testing skipping of module that makes a callback
82 mod = imp.new_module('module_to_skip')
83 exec 'def foo_pony(callback): x = 1; callback(); return None' in mod.__dict__
86 def test_pdb_skip_modules_with_callback():
87 """This illustrates skipping of modules that call into other code.
89 >>> def skip_module():
90 ... def callback():
91 ... return None
92 ... import pdb; pdb.Pdb(skip=['module_to_skip*']).set_trace()
93 ... mod.foo_pony(callback)
95 >>> with PdbTestInput([
96 ... 'step',
97 ... 'step',
98 ... 'step',
99 ... 'step',
100 ... 'step',
101 ... 'continue',
102 ... ]):
103 ... skip_module()
104 ... pass # provides something to "step" to
105 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()
106 -> mod.foo_pony(callback)
107 (Pdb) step
108 --Call--
109 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(2)callback()
110 -> def callback():
111 (Pdb) step
112 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()
113 -> return None
114 (Pdb) step
115 --Return--
116 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(3)callback()->None
117 -> return None
118 (Pdb) step
119 --Return--
120 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[0]>(5)skip_module()->None
121 -> mod.foo_pony(callback)
122 (Pdb) step
123 > <doctest test.test_pdb.test_pdb_skip_modules_with_callback[1]>(10)<module>()
124 -> pass # provides something to "step" to
125 (Pdb) continue
129 def test_main():
130 from test import test_pdb
131 test_support.run_doctest(test_pdb, verbosity=True)
134 if __name__ == '__main__':
135 test_main()