blob: 426b33fbcfb1296a051e364fab8451b3ab1f3382 [file] [log] [blame]
Florent Xicluna2a903b22010-02-27 13:31:23 +00001# -*- coding: utf-8 -*-
Tim Peters8485b562004-08-04 18:46:34 +00002"""
3Test script for doctest.
4"""
5
Barry Warsaw04f357c2002-07-23 19:04:11 +00006from test import test_support
Tim Peters8485b562004-08-04 18:46:34 +00007import doctest
Tim Petersa7def722004-08-23 22:13:22 +00008import warnings
Tim Peters8485b562004-08-04 18:46:34 +00009
Nick Coghlana2053472008-12-14 10:54:50 +000010# NOTE: There are some additional tests relating to interaction with
11# zipimport in the test_zipimport_support test module.
12
Tim Peters8485b562004-08-04 18:46:34 +000013######################################################################
14## Sample Objects (used by test cases)
15######################################################################
16
17def sample_func(v):
18 """
Tim Peters19397e52004-08-06 22:02:59 +000019 Blah blah
20
Tim Peters8485b562004-08-04 18:46:34 +000021 >>> print sample_func(22)
22 44
Tim Peters19397e52004-08-06 22:02:59 +000023
24 Yee ha!
Tim Peters8485b562004-08-04 18:46:34 +000025 """
26 return v+v
27
28class SampleClass:
29 """
30 >>> print 1
31 1
Edward Loper4ae900f2004-09-21 03:20:34 +000032
33 >>> # comments get ignored. so are empty PS1 and PS2 prompts:
34 >>>
35 ...
36
37 Multiline example:
38 >>> sc = SampleClass(3)
39 >>> for i in range(10):
40 ... sc = sc.double()
41 ... print sc.get(),
42 6 12 24 48 96 192 384 768 1536 3072
Tim Peters8485b562004-08-04 18:46:34 +000043 """
44 def __init__(self, val):
45 """
46 >>> print SampleClass(12).get()
47 12
48 """
49 self.val = val
50
51 def double(self):
52 """
53 >>> print SampleClass(12).double().get()
54 24
55 """
56 return SampleClass(self.val + self.val)
57
58 def get(self):
59 """
60 >>> print SampleClass(-5).get()
61 -5
62 """
63 return self.val
64
65 def a_staticmethod(v):
66 """
67 >>> print SampleClass.a_staticmethod(10)
68 11
69 """
70 return v+1
71 a_staticmethod = staticmethod(a_staticmethod)
72
73 def a_classmethod(cls, v):
74 """
75 >>> print SampleClass.a_classmethod(10)
76 12
77 >>> print SampleClass(0).a_classmethod(10)
78 12
79 """
80 return v+2
81 a_classmethod = classmethod(a_classmethod)
82
83 a_property = property(get, doc="""
84 >>> print SampleClass(22).a_property
85 22
86 """)
87
88 class NestedClass:
89 """
90 >>> x = SampleClass.NestedClass(5)
91 >>> y = x.square()
92 >>> print y.get()
93 25
94 """
95 def __init__(self, val=0):
96 """
97 >>> print SampleClass.NestedClass().get()
98 0
99 """
100 self.val = val
101 def square(self):
102 return SampleClass.NestedClass(self.val*self.val)
103 def get(self):
104 return self.val
105
106class SampleNewStyleClass(object):
107 r"""
108 >>> print '1\n2\n3'
109 1
110 2
111 3
112 """
113 def __init__(self, val):
114 """
115 >>> print SampleNewStyleClass(12).get()
116 12
117 """
118 self.val = val
119
120 def double(self):
121 """
122 >>> print SampleNewStyleClass(12).double().get()
123 24
124 """
125 return SampleNewStyleClass(self.val + self.val)
126
127 def get(self):
128 """
129 >>> print SampleNewStyleClass(-5).get()
130 -5
131 """
132 return self.val
133
134######################################################################
Edward Loper2de91ba2004-08-27 02:07:46 +0000135## Fake stdin (for testing interactive debugging)
136######################################################################
137
138class _FakeInput:
139 """
140 A fake input stream for pdb's interactive debugger. Whenever a
141 line is read, print it (to simulate the user typing it), and then
142 return it. The set of lines to return is specified in the
143 constructor; they should not have trailing newlines.
144 """
145 def __init__(self, lines):
146 self.lines = lines
147
148 def readline(self):
149 line = self.lines.pop(0)
150 print line
151 return line+'\n'
152
153######################################################################
Tim Peters8485b562004-08-04 18:46:34 +0000154## Test Cases
155######################################################################
156
157def test_Example(): r"""
158Unit tests for the `Example` class.
159
Edward Lopera6b68322004-08-26 00:05:43 +0000160Example is a simple container class that holds:
161 - `source`: A source string.
162 - `want`: An expected output string.
163 - `exc_msg`: An expected exception message string (or None if no
164 exception is expected).
165 - `lineno`: A line number (within the docstring).
166 - `indent`: The example's indentation in the input string.
167 - `options`: An option dictionary, mapping option flags to True or
168 False.
Tim Peters8485b562004-08-04 18:46:34 +0000169
Edward Lopera6b68322004-08-26 00:05:43 +0000170These attributes are set by the constructor. `source` and `want` are
171required; the other attributes all have default values:
Tim Peters8485b562004-08-04 18:46:34 +0000172
Edward Lopera6b68322004-08-26 00:05:43 +0000173 >>> example = doctest.Example('print 1', '1\n')
174 >>> (example.source, example.want, example.exc_msg,
175 ... example.lineno, example.indent, example.options)
176 ('print 1\n', '1\n', None, 0, 0, {})
177
178The first three attributes (`source`, `want`, and `exc_msg`) may be
179specified positionally; the remaining arguments should be specified as
180keyword arguments:
181
182 >>> exc_msg = 'IndexError: pop from an empty list'
183 >>> example = doctest.Example('[].pop()', '', exc_msg,
184 ... lineno=5, indent=4,
185 ... options={doctest.ELLIPSIS: True})
186 >>> (example.source, example.want, example.exc_msg,
187 ... example.lineno, example.indent, example.options)
188 ('[].pop()\n', '', 'IndexError: pop from an empty list\n', 5, 4, {8: True})
189
190The constructor normalizes the `source` string to end in a newline:
Tim Peters8485b562004-08-04 18:46:34 +0000191
Tim Petersbb431472004-08-09 03:51:46 +0000192 Source spans a single line: no terminating newline.
Edward Lopera6b68322004-08-26 00:05:43 +0000193 >>> e = doctest.Example('print 1', '1\n')
Tim Petersbb431472004-08-09 03:51:46 +0000194 >>> e.source, e.want
195 ('print 1\n', '1\n')
196
Edward Lopera6b68322004-08-26 00:05:43 +0000197 >>> e = doctest.Example('print 1\n', '1\n')
Tim Petersbb431472004-08-09 03:51:46 +0000198 >>> e.source, e.want
199 ('print 1\n', '1\n')
Tim Peters8485b562004-08-04 18:46:34 +0000200
Tim Petersbb431472004-08-09 03:51:46 +0000201 Source spans multiple lines: require terminating newline.
Edward Lopera6b68322004-08-26 00:05:43 +0000202 >>> e = doctest.Example('print 1;\nprint 2\n', '1\n2\n')
Tim Petersbb431472004-08-09 03:51:46 +0000203 >>> e.source, e.want
204 ('print 1;\nprint 2\n', '1\n2\n')
Tim Peters8485b562004-08-04 18:46:34 +0000205
Edward Lopera6b68322004-08-26 00:05:43 +0000206 >>> e = doctest.Example('print 1;\nprint 2', '1\n2\n')
Tim Petersbb431472004-08-09 03:51:46 +0000207 >>> e.source, e.want
208 ('print 1;\nprint 2\n', '1\n2\n')
209
Edward Lopera6b68322004-08-26 00:05:43 +0000210 Empty source string (which should never appear in real examples)
211 >>> e = doctest.Example('', '')
212 >>> e.source, e.want
213 ('\n', '')
Tim Peters8485b562004-08-04 18:46:34 +0000214
Edward Lopera6b68322004-08-26 00:05:43 +0000215The constructor normalizes the `want` string to end in a newline,
216unless it's the empty string:
217
218 >>> e = doctest.Example('print 1', '1\n')
Tim Petersbb431472004-08-09 03:51:46 +0000219 >>> e.source, e.want
220 ('print 1\n', '1\n')
221
Edward Lopera6b68322004-08-26 00:05:43 +0000222 >>> e = doctest.Example('print 1', '1')
Tim Petersbb431472004-08-09 03:51:46 +0000223 >>> e.source, e.want
224 ('print 1\n', '1\n')
225
Edward Lopera6b68322004-08-26 00:05:43 +0000226 >>> e = doctest.Example('print', '')
Tim Petersbb431472004-08-09 03:51:46 +0000227 >>> e.source, e.want
228 ('print\n', '')
Edward Lopera6b68322004-08-26 00:05:43 +0000229
230The constructor normalizes the `exc_msg` string to end in a newline,
231unless it's `None`:
232
233 Message spans one line
234 >>> exc_msg = 'IndexError: pop from an empty list'
235 >>> e = doctest.Example('[].pop()', '', exc_msg)
236 >>> e.exc_msg
237 'IndexError: pop from an empty list\n'
238
239 >>> exc_msg = 'IndexError: pop from an empty list\n'
240 >>> e = doctest.Example('[].pop()', '', exc_msg)
241 >>> e.exc_msg
242 'IndexError: pop from an empty list\n'
243
244 Message spans multiple lines
245 >>> exc_msg = 'ValueError: 1\n 2'
246 >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg)
247 >>> e.exc_msg
248 'ValueError: 1\n 2\n'
249
250 >>> exc_msg = 'ValueError: 1\n 2\n'
251 >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg)
252 >>> e.exc_msg
253 'ValueError: 1\n 2\n'
254
255 Empty (but non-None) exception message (which should never appear
256 in real examples)
257 >>> exc_msg = ''
258 >>> e = doctest.Example('raise X()', '', exc_msg)
259 >>> e.exc_msg
260 '\n'
Tim Peters8485b562004-08-04 18:46:34 +0000261"""
262
263def test_DocTest(): r"""
264Unit tests for the `DocTest` class.
265
266DocTest is a collection of examples, extracted from a docstring, along
267with information about where the docstring comes from (a name,
268filename, and line number). The docstring is parsed by the `DocTest`
269constructor:
270
271 >>> docstring = '''
272 ... >>> print 12
273 ... 12
274 ...
275 ... Non-example text.
276 ...
277 ... >>> print 'another\example'
278 ... another
279 ... example
280 ... '''
281 >>> globs = {} # globals to run the test in.
Edward Lopera1ef6112004-08-09 16:14:41 +0000282 >>> parser = doctest.DocTestParser()
283 >>> test = parser.get_doctest(docstring, globs, 'some_test',
284 ... 'some_file', 20)
Tim Peters8485b562004-08-04 18:46:34 +0000285 >>> print test
286 <DocTest some_test from some_file:20 (2 examples)>
287 >>> len(test.examples)
288 2
289 >>> e1, e2 = test.examples
290 >>> (e1.source, e1.want, e1.lineno)
Tim Petersbb431472004-08-09 03:51:46 +0000291 ('print 12\n', '12\n', 1)
Tim Peters8485b562004-08-04 18:46:34 +0000292 >>> (e2.source, e2.want, e2.lineno)
Tim Petersbb431472004-08-09 03:51:46 +0000293 ("print 'another\\example'\n", 'another\nexample\n', 6)
Tim Peters8485b562004-08-04 18:46:34 +0000294
295Source information (name, filename, and line number) is available as
296attributes on the doctest object:
297
298 >>> (test.name, test.filename, test.lineno)
299 ('some_test', 'some_file', 20)
300
301The line number of an example within its containing file is found by
302adding the line number of the example and the line number of its
303containing test:
304
305 >>> test.lineno + e1.lineno
306 21
307 >>> test.lineno + e2.lineno
308 26
309
310If the docstring contains inconsistant leading whitespace in the
311expected output of an example, then `DocTest` will raise a ValueError:
312
313 >>> docstring = r'''
314 ... >>> print 'bad\nindentation'
315 ... bad
316 ... indentation
317 ... '''
Edward Lopera1ef6112004-08-09 16:14:41 +0000318 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
Tim Peters8485b562004-08-04 18:46:34 +0000319 Traceback (most recent call last):
Edward Loper00f8da72004-08-26 18:05:07 +0000320 ValueError: line 4 of the docstring for some_test has inconsistent leading whitespace: 'indentation'
Tim Peters8485b562004-08-04 18:46:34 +0000321
322If the docstring contains inconsistent leading whitespace on
323continuation lines, then `DocTest` will raise a ValueError:
324
325 >>> docstring = r'''
326 ... >>> print ('bad indentation',
327 ... ... 2)
328 ... ('bad', 'indentation')
329 ... '''
Edward Lopera1ef6112004-08-09 16:14:41 +0000330 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
Tim Peters8485b562004-08-04 18:46:34 +0000331 Traceback (most recent call last):
Edward Loper00f8da72004-08-26 18:05:07 +0000332 ValueError: line 2 of the docstring for some_test has inconsistent leading whitespace: '... 2)'
Tim Peters8485b562004-08-04 18:46:34 +0000333
334If there's no blank space after a PS1 prompt ('>>>'), then `DocTest`
335will raise a ValueError:
336
337 >>> docstring = '>>>print 1\n1'
Edward Lopera1ef6112004-08-09 16:14:41 +0000338 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
Tim Peters8485b562004-08-04 18:46:34 +0000339 Traceback (most recent call last):
Edward Loper7c748462004-08-09 02:06:06 +0000340 ValueError: line 1 of the docstring for some_test lacks blank after >>>: '>>>print 1'
341
342If there's no blank space after a PS2 prompt ('...'), then `DocTest`
343will raise a ValueError:
344
345 >>> docstring = '>>> if 1:\n...print 1\n1'
Edward Lopera1ef6112004-08-09 16:14:41 +0000346 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
Edward Loper7c748462004-08-09 02:06:06 +0000347 Traceback (most recent call last):
348 ValueError: line 2 of the docstring for some_test lacks blank after ...: '...print 1'
349
Tim Peters8485b562004-08-04 18:46:34 +0000350"""
351
Tim Peters8485b562004-08-04 18:46:34 +0000352def test_DocTestFinder(): r"""
353Unit tests for the `DocTestFinder` class.
354
355DocTestFinder is used to extract DocTests from an object's docstring
356and the docstrings of its contained objects. It can be used with
357modules, functions, classes, methods, staticmethods, classmethods, and
358properties.
359
360Finding Tests in Functions
361~~~~~~~~~~~~~~~~~~~~~~~~~~
362For a function whose docstring contains examples, DocTestFinder.find()
363will return a single test (for that function's docstring):
364
Tim Peters8485b562004-08-04 18:46:34 +0000365 >>> finder = doctest.DocTestFinder()
Jim Fulton07a349c2004-08-22 14:10:00 +0000366
367We'll simulate a __file__ attr that ends in pyc:
368
369 >>> import test.test_doctest
370 >>> old = test.test_doctest.__file__
371 >>> test.test_doctest.__file__ = 'test_doctest.pyc'
372
Tim Peters8485b562004-08-04 18:46:34 +0000373 >>> tests = finder.find(sample_func)
Edward Loper8e4a34b2004-08-12 02:34:27 +0000374
Edward Loper74bca7a2004-08-12 02:27:44 +0000375 >>> print tests # doctest: +ELLIPSIS
Florent Xicluna2a903b22010-02-27 13:31:23 +0000376 [<DocTest sample_func from ...:17 (1 example)>]
Edward Loper8e4a34b2004-08-12 02:34:27 +0000377
Tim Peters4de7c5c2004-08-23 22:38:05 +0000378The exact name depends on how test_doctest was invoked, so allow for
379leading path components.
380
381 >>> tests[0].filename # doctest: +ELLIPSIS
382 '...test_doctest.py'
Jim Fulton07a349c2004-08-22 14:10:00 +0000383
384 >>> test.test_doctest.__file__ = old
Tim Petersc6cbab02004-08-22 19:43:28 +0000385
Jim Fulton07a349c2004-08-22 14:10:00 +0000386
Tim Peters8485b562004-08-04 18:46:34 +0000387 >>> e = tests[0].examples[0]
Tim Petersbb431472004-08-09 03:51:46 +0000388 >>> (e.source, e.want, e.lineno)
389 ('print sample_func(22)\n', '44\n', 3)
Tim Peters8485b562004-08-04 18:46:34 +0000390
Edward Loper32ddbf72004-09-13 05:47:24 +0000391By default, tests are created for objects with no docstring:
Tim Peters8485b562004-08-04 18:46:34 +0000392
393 >>> def no_docstring(v):
394 ... pass
Tim Peters958cc892004-09-13 14:53:28 +0000395 >>> finder.find(no_docstring)
396 []
Edward Loper32ddbf72004-09-13 05:47:24 +0000397
398However, the optional argument `exclude_empty` to the DocTestFinder
399constructor can be used to exclude tests for objects with empty
400docstrings:
401
402 >>> def no_docstring(v):
403 ... pass
404 >>> excl_empty_finder = doctest.DocTestFinder(exclude_empty=True)
405 >>> excl_empty_finder.find(no_docstring)
Tim Peters8485b562004-08-04 18:46:34 +0000406 []
407
408If the function has a docstring with no examples, then a test with no
409examples is returned. (This lets `DocTestRunner` collect statistics
410about which functions have no tests -- but is that useful? And should
411an empty test also be created when there's no docstring?)
412
413 >>> def no_examples(v):
414 ... ''' no doctest examples '''
Tim Peters17b56372004-09-11 17:33:27 +0000415 >>> finder.find(no_examples) # doctest: +ELLIPSIS
416 [<DocTest no_examples from ...:1 (no examples)>]
Tim Peters8485b562004-08-04 18:46:34 +0000417
418Finding Tests in Classes
419~~~~~~~~~~~~~~~~~~~~~~~~
420For a class, DocTestFinder will create a test for the class's
421docstring, and will recursively explore its contents, including
422methods, classmethods, staticmethods, properties, and nested classes.
423
424 >>> finder = doctest.DocTestFinder()
425 >>> tests = finder.find(SampleClass)
Tim Peters8485b562004-08-04 18:46:34 +0000426 >>> for t in tests:
427 ... print '%2s %s' % (len(t.examples), t.name)
Edward Loper4ae900f2004-09-21 03:20:34 +0000428 3 SampleClass
Tim Peters8485b562004-08-04 18:46:34 +0000429 3 SampleClass.NestedClass
430 1 SampleClass.NestedClass.__init__
431 1 SampleClass.__init__
432 2 SampleClass.a_classmethod
433 1 SampleClass.a_property
434 1 SampleClass.a_staticmethod
435 1 SampleClass.double
436 1 SampleClass.get
437
438New-style classes are also supported:
439
440 >>> tests = finder.find(SampleNewStyleClass)
Tim Peters8485b562004-08-04 18:46:34 +0000441 >>> for t in tests:
442 ... print '%2s %s' % (len(t.examples), t.name)
443 1 SampleNewStyleClass
444 1 SampleNewStyleClass.__init__
445 1 SampleNewStyleClass.double
446 1 SampleNewStyleClass.get
447
448Finding Tests in Modules
449~~~~~~~~~~~~~~~~~~~~~~~~
450For a module, DocTestFinder will create a test for the class's
451docstring, and will recursively explore its contents, including
452functions, classes, and the `__test__` dictionary, if it exists:
453
454 >>> # A module
Christian Heimesc756d002007-11-27 21:34:01 +0000455 >>> import types
456 >>> m = types.ModuleType('some_module')
Tim Peters8485b562004-08-04 18:46:34 +0000457 >>> def triple(val):
458 ... '''
Edward Loper4ae900f2004-09-21 03:20:34 +0000459 ... >>> print triple(11)
Tim Peters8485b562004-08-04 18:46:34 +0000460 ... 33
461 ... '''
462 ... return val*3
463 >>> m.__dict__.update({
464 ... 'sample_func': sample_func,
465 ... 'SampleClass': SampleClass,
466 ... '__doc__': '''
467 ... Module docstring.
468 ... >>> print 'module'
469 ... module
470 ... ''',
471 ... '__test__': {
472 ... 'd': '>>> print 6\n6\n>>> print 7\n7\n',
473 ... 'c': triple}})
474
475 >>> finder = doctest.DocTestFinder()
476 >>> # Use module=test.test_doctest, to prevent doctest from
477 >>> # ignoring the objects since they weren't defined in m.
478 >>> import test.test_doctest
479 >>> tests = finder.find(m, module=test.test_doctest)
Tim Peters8485b562004-08-04 18:46:34 +0000480 >>> for t in tests:
481 ... print '%2s %s' % (len(t.examples), t.name)
482 1 some_module
Edward Loper4ae900f2004-09-21 03:20:34 +0000483 3 some_module.SampleClass
Tim Peters8485b562004-08-04 18:46:34 +0000484 3 some_module.SampleClass.NestedClass
485 1 some_module.SampleClass.NestedClass.__init__
486 1 some_module.SampleClass.__init__
487 2 some_module.SampleClass.a_classmethod
488 1 some_module.SampleClass.a_property
489 1 some_module.SampleClass.a_staticmethod
490 1 some_module.SampleClass.double
491 1 some_module.SampleClass.get
Tim Petersc5684782004-09-13 01:07:12 +0000492 1 some_module.__test__.c
493 2 some_module.__test__.d
Tim Peters8485b562004-08-04 18:46:34 +0000494 1 some_module.sample_func
495
496Duplicate Removal
497~~~~~~~~~~~~~~~~~
498If a single object is listed twice (under different names), then tests
499will only be generated for it once:
500
Tim Petersf3f57472004-08-08 06:11:48 +0000501 >>> from test import doctest_aliases
Amaury Forgeot d'Arcf81ff982009-06-14 21:20:40 +0000502 >>> assert doctest_aliases.TwoNames.f
503 >>> assert doctest_aliases.TwoNames.g
Edward Loper32ddbf72004-09-13 05:47:24 +0000504 >>> tests = excl_empty_finder.find(doctest_aliases)
Tim Peters8485b562004-08-04 18:46:34 +0000505 >>> print len(tests)
506 2
507 >>> print tests[0].name
Tim Petersf3f57472004-08-08 06:11:48 +0000508 test.doctest_aliases.TwoNames
509
510 TwoNames.f and TwoNames.g are bound to the same object.
511 We can't guess which will be found in doctest's traversal of
512 TwoNames.__dict__ first, so we have to allow for either.
513
514 >>> tests[1].name.split('.')[-1] in ['f', 'g']
Tim Peters8485b562004-08-04 18:46:34 +0000515 True
516
Tim Petersbf0400a2006-06-05 01:43:03 +0000517Empty Tests
518~~~~~~~~~~~
519By default, an object with no doctests doesn't create any tests:
Tim Peters8485b562004-08-04 18:46:34 +0000520
Tim Petersbf0400a2006-06-05 01:43:03 +0000521 >>> tests = doctest.DocTestFinder().find(SampleClass)
Tim Peters8485b562004-08-04 18:46:34 +0000522 >>> for t in tests:
523 ... print '%2s %s' % (len(t.examples), t.name)
Edward Loper4ae900f2004-09-21 03:20:34 +0000524 3 SampleClass
Tim Peters8485b562004-08-04 18:46:34 +0000525 3 SampleClass.NestedClass
526 1 SampleClass.NestedClass.__init__
Tim Peters958cc892004-09-13 14:53:28 +0000527 1 SampleClass.__init__
Tim Petersbf0400a2006-06-05 01:43:03 +0000528 2 SampleClass.a_classmethod
529 1 SampleClass.a_property
530 1 SampleClass.a_staticmethod
Tim Peters958cc892004-09-13 14:53:28 +0000531 1 SampleClass.double
532 1 SampleClass.get
533
534By default, that excluded objects with no doctests. exclude_empty=False
535tells it to include (empty) tests for objects with no doctests. This feature
536is really to support backward compatibility in what doctest.master.summarize()
537displays.
538
Tim Petersbf0400a2006-06-05 01:43:03 +0000539 >>> tests = doctest.DocTestFinder(exclude_empty=False).find(SampleClass)
Tim Peters958cc892004-09-13 14:53:28 +0000540 >>> for t in tests:
541 ... print '%2s %s' % (len(t.examples), t.name)
Edward Loper4ae900f2004-09-21 03:20:34 +0000542 3 SampleClass
Tim Peters958cc892004-09-13 14:53:28 +0000543 3 SampleClass.NestedClass
544 1 SampleClass.NestedClass.__init__
Edward Loper32ddbf72004-09-13 05:47:24 +0000545 0 SampleClass.NestedClass.get
546 0 SampleClass.NestedClass.square
Tim Peters8485b562004-08-04 18:46:34 +0000547 1 SampleClass.__init__
Tim Peters8485b562004-08-04 18:46:34 +0000548 2 SampleClass.a_classmethod
549 1 SampleClass.a_property
550 1 SampleClass.a_staticmethod
551 1 SampleClass.double
552 1 SampleClass.get
553
Tim Peters8485b562004-08-04 18:46:34 +0000554Turning off Recursion
555~~~~~~~~~~~~~~~~~~~~~
556DocTestFinder can be told not to look for tests in contained objects
557using the `recurse` flag:
558
559 >>> tests = doctest.DocTestFinder(recurse=False).find(SampleClass)
Tim Peters8485b562004-08-04 18:46:34 +0000560 >>> for t in tests:
561 ... print '%2s %s' % (len(t.examples), t.name)
Edward Loper4ae900f2004-09-21 03:20:34 +0000562 3 SampleClass
Edward Loperb51b2342004-08-17 16:37:12 +0000563
564Line numbers
565~~~~~~~~~~~~
566DocTestFinder finds the line number of each example:
567
568 >>> def f(x):
569 ... '''
570 ... >>> x = 12
571 ...
572 ... some text
573 ...
574 ... >>> # examples are not created for comments & bare prompts.
575 ... >>>
576 ... ...
577 ...
578 ... >>> for x in range(10):
579 ... ... print x,
580 ... 0 1 2 3 4 5 6 7 8 9
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000581 ... >>> x//2
Edward Loperb51b2342004-08-17 16:37:12 +0000582 ... 6
583 ... '''
584 >>> test = doctest.DocTestFinder().find(f)[0]
585 >>> [e.lineno for e in test.examples]
586 [1, 9, 12]
Tim Peters8485b562004-08-04 18:46:34 +0000587"""
588
Edward Loper00f8da72004-08-26 18:05:07 +0000589def test_DocTestParser(): r"""
590Unit tests for the `DocTestParser` class.
591
592DocTestParser is used to parse docstrings containing doctest examples.
593
594The `parse` method divides a docstring into examples and intervening
595text:
596
597 >>> s = '''
598 ... >>> x, y = 2, 3 # no output expected
599 ... >>> if 1:
600 ... ... print x
601 ... ... print y
602 ... 2
603 ... 3
604 ...
605 ... Some text.
606 ... >>> x+y
607 ... 5
608 ... '''
609 >>> parser = doctest.DocTestParser()
610 >>> for piece in parser.parse(s):
611 ... if isinstance(piece, doctest.Example):
612 ... print 'Example:', (piece.source, piece.want, piece.lineno)
613 ... else:
614 ... print ' Text:', `piece`
615 Text: '\n'
616 Example: ('x, y = 2, 3 # no output expected\n', '', 1)
617 Text: ''
618 Example: ('if 1:\n print x\n print y\n', '2\n3\n', 2)
619 Text: '\nSome text.\n'
620 Example: ('x+y\n', '5\n', 9)
621 Text: ''
622
623The `get_examples` method returns just the examples:
624
625 >>> for piece in parser.get_examples(s):
626 ... print (piece.source, piece.want, piece.lineno)
627 ('x, y = 2, 3 # no output expected\n', '', 1)
628 ('if 1:\n print x\n print y\n', '2\n3\n', 2)
629 ('x+y\n', '5\n', 9)
630
631The `get_doctest` method creates a Test from the examples, along with the
632given arguments:
633
634 >>> test = parser.get_doctest(s, {}, 'name', 'filename', lineno=5)
635 >>> (test.name, test.filename, test.lineno)
636 ('name', 'filename', 5)
637 >>> for piece in test.examples:
638 ... print (piece.source, piece.want, piece.lineno)
639 ('x, y = 2, 3 # no output expected\n', '', 1)
640 ('if 1:\n print x\n print y\n', '2\n3\n', 2)
641 ('x+y\n', '5\n', 9)
642"""
643
Tim Peters8485b562004-08-04 18:46:34 +0000644class test_DocTestRunner:
645 def basics(): r"""
646Unit tests for the `DocTestRunner` class.
647
648DocTestRunner is used to run DocTest test cases, and to accumulate
649statistics. Here's a simple DocTest case we can use:
650
651 >>> def f(x):
652 ... '''
653 ... >>> x = 12
654 ... >>> print x
655 ... 12
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000656 ... >>> x//2
Tim Peters8485b562004-08-04 18:46:34 +0000657 ... 6
658 ... '''
659 >>> test = doctest.DocTestFinder().find(f)[0]
660
661The main DocTestRunner interface is the `run` method, which runs a
662given DocTest case in a given namespace (globs). It returns a tuple
663`(f,t)`, where `f` is the number of failed tests and `t` is the number
664of tried tests.
665
666 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000667 TestResults(failed=0, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +0000668
669If any example produces incorrect output, then the test runner reports
670the failure and proceeds to the next example:
671
672 >>> def f(x):
673 ... '''
674 ... >>> x = 12
675 ... >>> print x
676 ... 14
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000677 ... >>> x//2
Tim Peters8485b562004-08-04 18:46:34 +0000678 ... 6
679 ... '''
680 >>> test = doctest.DocTestFinder().find(f)[0]
681 >>> doctest.DocTestRunner(verbose=True).run(test)
Tim Peters17b56372004-09-11 17:33:27 +0000682 ... # doctest: +ELLIPSIS
Edward Loperaacf0832004-08-26 01:19:50 +0000683 Trying:
684 x = 12
685 Expecting nothing
Tim Peters8485b562004-08-04 18:46:34 +0000686 ok
Edward Loperaacf0832004-08-26 01:19:50 +0000687 Trying:
688 print x
689 Expecting:
690 14
Tim Peters8485b562004-08-04 18:46:34 +0000691 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000692 File ..., line 4, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000693 Failed example:
694 print x
695 Expected:
696 14
697 Got:
698 12
Edward Loperaacf0832004-08-26 01:19:50 +0000699 Trying:
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000700 x//2
Edward Loperaacf0832004-08-26 01:19:50 +0000701 Expecting:
702 6
Tim Peters8485b562004-08-04 18:46:34 +0000703 ok
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000704 TestResults(failed=1, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +0000705"""
706 def verbose_flag(): r"""
707The `verbose` flag makes the test runner generate more detailed
708output:
709
710 >>> def f(x):
711 ... '''
712 ... >>> x = 12
713 ... >>> print x
714 ... 12
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000715 ... >>> x//2
Tim Peters8485b562004-08-04 18:46:34 +0000716 ... 6
717 ... '''
718 >>> test = doctest.DocTestFinder().find(f)[0]
719
720 >>> doctest.DocTestRunner(verbose=True).run(test)
Edward Loperaacf0832004-08-26 01:19:50 +0000721 Trying:
722 x = 12
723 Expecting nothing
Tim Peters8485b562004-08-04 18:46:34 +0000724 ok
Edward Loperaacf0832004-08-26 01:19:50 +0000725 Trying:
726 print x
727 Expecting:
728 12
Tim Peters8485b562004-08-04 18:46:34 +0000729 ok
Edward Loperaacf0832004-08-26 01:19:50 +0000730 Trying:
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000731 x//2
Edward Loperaacf0832004-08-26 01:19:50 +0000732 Expecting:
733 6
Tim Peters8485b562004-08-04 18:46:34 +0000734 ok
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000735 TestResults(failed=0, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +0000736
737If the `verbose` flag is unspecified, then the output will be verbose
738iff `-v` appears in sys.argv:
739
740 >>> # Save the real sys.argv list.
741 >>> old_argv = sys.argv
742
743 >>> # If -v does not appear in sys.argv, then output isn't verbose.
744 >>> sys.argv = ['test']
745 >>> doctest.DocTestRunner().run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000746 TestResults(failed=0, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +0000747
748 >>> # If -v does appear in sys.argv, then output is verbose.
749 >>> sys.argv = ['test', '-v']
750 >>> doctest.DocTestRunner().run(test)
Edward Loperaacf0832004-08-26 01:19:50 +0000751 Trying:
752 x = 12
753 Expecting nothing
Tim Peters8485b562004-08-04 18:46:34 +0000754 ok
Edward Loperaacf0832004-08-26 01:19:50 +0000755 Trying:
756 print x
757 Expecting:
758 12
Tim Peters8485b562004-08-04 18:46:34 +0000759 ok
Edward Loperaacf0832004-08-26 01:19:50 +0000760 Trying:
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000761 x//2
Edward Loperaacf0832004-08-26 01:19:50 +0000762 Expecting:
763 6
Tim Peters8485b562004-08-04 18:46:34 +0000764 ok
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000765 TestResults(failed=0, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +0000766
767 >>> # Restore sys.argv
768 >>> sys.argv = old_argv
769
770In the remaining examples, the test runner's verbosity will be
771explicitly set, to ensure that the test behavior is consistent.
772 """
773 def exceptions(): r"""
774Tests of `DocTestRunner`'s exception handling.
775
776An expected exception is specified with a traceback message. The
777lines between the first line and the type/value may be omitted or
778replaced with any other string:
779
780 >>> def f(x):
781 ... '''
782 ... >>> x = 12
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000783 ... >>> print x//0
Tim Peters8485b562004-08-04 18:46:34 +0000784 ... Traceback (most recent call last):
785 ... ZeroDivisionError: integer division or modulo by zero
786 ... '''
787 >>> test = doctest.DocTestFinder().find(f)[0]
788 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000789 TestResults(failed=0, attempted=2)
Tim Peters8485b562004-08-04 18:46:34 +0000790
Edward Loper19b19582004-08-25 23:07:03 +0000791An example may not generate output before it raises an exception; if
792it does, then the traceback message will not be recognized as
793signaling an expected exception, so the example will be reported as an
794unexpected exception:
Tim Peters8485b562004-08-04 18:46:34 +0000795
796 >>> def f(x):
797 ... '''
798 ... >>> x = 12
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000799 ... >>> print 'pre-exception output', x//0
Tim Peters8485b562004-08-04 18:46:34 +0000800 ... pre-exception output
801 ... Traceback (most recent call last):
802 ... ZeroDivisionError: integer division or modulo by zero
803 ... '''
804 >>> test = doctest.DocTestFinder().find(f)[0]
805 >>> doctest.DocTestRunner(verbose=False).run(test)
Edward Loper19b19582004-08-25 23:07:03 +0000806 ... # doctest: +ELLIPSIS
807 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000808 File ..., line 4, in f
Edward Loper19b19582004-08-25 23:07:03 +0000809 Failed example:
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000810 print 'pre-exception output', x//0
Edward Loper19b19582004-08-25 23:07:03 +0000811 Exception raised:
812 ...
813 ZeroDivisionError: integer division or modulo by zero
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000814 TestResults(failed=1, attempted=2)
Tim Peters8485b562004-08-04 18:46:34 +0000815
816Exception messages may contain newlines:
817
818 >>> def f(x):
819 ... r'''
820 ... >>> raise ValueError, 'multi\nline\nmessage'
821 ... Traceback (most recent call last):
822 ... ValueError: multi
823 ... line
824 ... message
825 ... '''
826 >>> test = doctest.DocTestFinder().find(f)[0]
827 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000828 TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000829
830If an exception is expected, but an exception with the wrong type or
831message is raised, then it is reported as a failure:
832
833 >>> def f(x):
834 ... r'''
835 ... >>> raise ValueError, 'message'
836 ... Traceback (most recent call last):
837 ... ValueError: wrong message
838 ... '''
839 >>> test = doctest.DocTestFinder().find(f)[0]
840 >>> doctest.DocTestRunner(verbose=False).run(test)
Edward Loper8e4a34b2004-08-12 02:34:27 +0000841 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +0000842 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000843 File ..., line 3, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000844 Failed example:
845 raise ValueError, 'message'
Tim Peters8485b562004-08-04 18:46:34 +0000846 Expected:
847 Traceback (most recent call last):
848 ValueError: wrong message
849 Got:
850 Traceback (most recent call last):
Edward Loper8e4a34b2004-08-12 02:34:27 +0000851 ...
Tim Peters8485b562004-08-04 18:46:34 +0000852 ValueError: message
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000853 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000854
Tim Peters1fbf9c52004-09-04 17:21:02 +0000855However, IGNORE_EXCEPTION_DETAIL can be used to allow a mismatch in the
856detail:
857
858 >>> def f(x):
859 ... r'''
860 ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
861 ... Traceback (most recent call last):
862 ... ValueError: wrong message
863 ... '''
864 >>> test = doctest.DocTestFinder().find(f)[0]
865 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000866 TestResults(failed=0, attempted=1)
Tim Peters1fbf9c52004-09-04 17:21:02 +0000867
868But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type:
869
870 >>> def f(x):
871 ... r'''
872 ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
873 ... Traceback (most recent call last):
874 ... TypeError: wrong type
875 ... '''
876 >>> test = doctest.DocTestFinder().find(f)[0]
877 >>> doctest.DocTestRunner(verbose=False).run(test)
878 ... # doctest: +ELLIPSIS
879 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000880 File ..., line 3, in f
Tim Peters1fbf9c52004-09-04 17:21:02 +0000881 Failed example:
882 raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
883 Expected:
884 Traceback (most recent call last):
885 TypeError: wrong type
886 Got:
887 Traceback (most recent call last):
888 ...
889 ValueError: message
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000890 TestResults(failed=1, attempted=1)
Tim Peters1fbf9c52004-09-04 17:21:02 +0000891
Tim Peters8485b562004-08-04 18:46:34 +0000892If an exception is raised but not expected, then it is reported as an
893unexpected exception:
894
Tim Peters8485b562004-08-04 18:46:34 +0000895 >>> def f(x):
896 ... r'''
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000897 ... >>> 1//0
Tim Peters8485b562004-08-04 18:46:34 +0000898 ... 0
899 ... '''
900 >>> test = doctest.DocTestFinder().find(f)[0]
901 >>> doctest.DocTestRunner(verbose=False).run(test)
Edward Loper74bca7a2004-08-12 02:27:44 +0000902 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +0000903 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000904 File ..., line 3, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000905 Failed example:
Tim Peters1c5bc1c2006-03-28 07:28:40 +0000906 1//0
Tim Peters8485b562004-08-04 18:46:34 +0000907 Exception raised:
908 Traceback (most recent call last):
Jim Fulton07a349c2004-08-22 14:10:00 +0000909 ...
Tim Peters8485b562004-08-04 18:46:34 +0000910 ZeroDivisionError: integer division or modulo by zero
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000911 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000912"""
913 def optionflags(): r"""
914Tests of `DocTestRunner`'s option flag handling.
915
916Several option flags can be used to customize the behavior of the test
917runner. These are defined as module constants in doctest, and passed
Georg Brandlf725b952008-01-05 19:44:22 +0000918to the DocTestRunner constructor (multiple constants should be ORed
Tim Peters8485b562004-08-04 18:46:34 +0000919together).
920
921The DONT_ACCEPT_TRUE_FOR_1 flag disables matches between True/False
922and 1/0:
923
924 >>> def f(x):
925 ... '>>> True\n1\n'
926
927 >>> # Without the flag:
928 >>> test = doctest.DocTestFinder().find(f)[0]
929 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000930 TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000931
932 >>> # With the flag:
933 >>> test = doctest.DocTestFinder().find(f)[0]
934 >>> flags = doctest.DONT_ACCEPT_TRUE_FOR_1
935 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +0000936 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +0000937 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000938 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000939 Failed example:
940 True
941 Expected:
942 1
943 Got:
944 True
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000945 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000946
947The DONT_ACCEPT_BLANKLINE flag disables the match between blank lines
948and the '<BLANKLINE>' marker:
949
950 >>> def f(x):
951 ... '>>> print "a\\n\\nb"\na\n<BLANKLINE>\nb\n'
952
953 >>> # Without the flag:
954 >>> test = doctest.DocTestFinder().find(f)[0]
955 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000956 TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000957
958 >>> # With the flag:
959 >>> test = doctest.DocTestFinder().find(f)[0]
960 >>> flags = doctest.DONT_ACCEPT_BLANKLINE
961 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +0000962 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +0000963 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000964 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000965 Failed example:
966 print "a\n\nb"
Tim Peters8485b562004-08-04 18:46:34 +0000967 Expected:
968 a
969 <BLANKLINE>
970 b
971 Got:
972 a
973 <BLANKLINE>
974 b
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000975 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000976
977The NORMALIZE_WHITESPACE flag causes all sequences of whitespace to be
978treated as equal:
979
980 >>> def f(x):
981 ... '>>> print 1, 2, 3\n 1 2\n 3'
982
983 >>> # Without the flag:
984 >>> test = doctest.DocTestFinder().find(f)[0]
985 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +0000986 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +0000987 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +0000988 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +0000989 Failed example:
990 print 1, 2, 3
Tim Peters8485b562004-08-04 18:46:34 +0000991 Expected:
992 1 2
993 3
Jim Fulton07a349c2004-08-22 14:10:00 +0000994 Got:
995 1 2 3
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +0000996 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +0000997
998 >>> # With the flag:
999 >>> test = doctest.DocTestFinder().find(f)[0]
1000 >>> flags = doctest.NORMALIZE_WHITESPACE
1001 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001002 TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001003
Tim Peters026f8dc2004-08-19 16:38:58 +00001004 An example from the docs:
1005 >>> print range(20) #doctest: +NORMALIZE_WHITESPACE
1006 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1007 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
1008
Tim Peters8485b562004-08-04 18:46:34 +00001009The ELLIPSIS flag causes ellipsis marker ("...") in the expected
1010output to match any substring in the actual output:
1011
1012 >>> def f(x):
1013 ... '>>> print range(15)\n[0, 1, 2, ..., 14]\n'
1014
1015 >>> # Without the flag:
1016 >>> test = doctest.DocTestFinder().find(f)[0]
1017 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001018 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001019 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001020 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001021 Failed example:
1022 print range(15)
1023 Expected:
1024 [0, 1, 2, ..., 14]
1025 Got:
1026 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001027 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001028
1029 >>> # With the flag:
1030 >>> test = doctest.DocTestFinder().find(f)[0]
1031 >>> flags = doctest.ELLIPSIS
1032 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001033 TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001034
Tim Peterse594bee2004-08-22 01:47:51 +00001035 ... also matches nothing:
Tim Peters1cf3aa62004-08-19 06:49:33 +00001036
1037 >>> for i in range(100):
Tim Peterse594bee2004-08-22 01:47:51 +00001038 ... print i**2, #doctest: +ELLIPSIS
1039 0 1...4...9 16 ... 36 49 64 ... 9801
Tim Peters1cf3aa62004-08-19 06:49:33 +00001040
Tim Peters026f8dc2004-08-19 16:38:58 +00001041 ... can be surprising; e.g., this test passes:
Tim Peters26b3ebb2004-08-19 08:10:08 +00001042
1043 >>> for i in range(21): #doctest: +ELLIPSIS
Tim Peterse594bee2004-08-22 01:47:51 +00001044 ... print i,
1045 0 1 2 ...1...2...0
Tim Peters26b3ebb2004-08-19 08:10:08 +00001046
Tim Peters026f8dc2004-08-19 16:38:58 +00001047 Examples from the docs:
1048
1049 >>> print range(20) # doctest:+ELLIPSIS
1050 [0, 1, ..., 18, 19]
1051
1052 >>> print range(20) # doctest: +ELLIPSIS
1053 ... # doctest: +NORMALIZE_WHITESPACE
1054 [0, 1, ..., 18, 19]
1055
Tim Peters711bf302006-04-25 03:31:36 +00001056The SKIP flag causes an example to be skipped entirely. I.e., the
1057example is not run. It can be useful in contexts where doctest
1058examples serve as both documentation and test cases, and an example
1059should be included for documentation purposes, but should not be
1060checked (e.g., because its output is random, or depends on resources
1061which would be unavailable.) The SKIP flag can also be used for
1062'commenting out' broken examples.
1063
1064 >>> import unavailable_resource # doctest: +SKIP
1065 >>> unavailable_resource.do_something() # doctest: +SKIP
1066 >>> unavailable_resource.blow_up() # doctest: +SKIP
1067 Traceback (most recent call last):
1068 ...
1069 UncheckedBlowUpError: Nobody checks me.
1070
1071 >>> import random
1072 >>> print random.random() # doctest: +SKIP
1073 0.721216923889
1074
Edward Loper71f55af2004-08-26 01:41:51 +00001075The REPORT_UDIFF flag causes failures that involve multi-line expected
Tim Peters8485b562004-08-04 18:46:34 +00001076and actual outputs to be displayed using a unified diff:
1077
1078 >>> def f(x):
1079 ... r'''
1080 ... >>> print '\n'.join('abcdefg')
1081 ... a
1082 ... B
1083 ... c
1084 ... d
1085 ... f
1086 ... g
1087 ... h
1088 ... '''
1089
1090 >>> # Without the flag:
1091 >>> test = doctest.DocTestFinder().find(f)[0]
1092 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001093 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001094 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001095 File ..., line 3, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001096 Failed example:
1097 print '\n'.join('abcdefg')
Tim Peters8485b562004-08-04 18:46:34 +00001098 Expected:
1099 a
1100 B
1101 c
1102 d
1103 f
1104 g
1105 h
1106 Got:
1107 a
1108 b
1109 c
1110 d
1111 e
1112 f
1113 g
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001114 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001115
1116 >>> # With the flag:
1117 >>> test = doctest.DocTestFinder().find(f)[0]
Edward Loper71f55af2004-08-26 01:41:51 +00001118 >>> flags = doctest.REPORT_UDIFF
Tim Peters8485b562004-08-04 18:46:34 +00001119 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001120 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001121 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001122 File ..., line 3, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001123 Failed example:
1124 print '\n'.join('abcdefg')
Edward Loper56629292004-08-26 01:31:56 +00001125 Differences (unified diff with -expected +actual):
Tim Peterse7edcb82004-08-26 05:44:27 +00001126 @@ -1,7 +1,7 @@
Tim Peters8485b562004-08-04 18:46:34 +00001127 a
1128 -B
1129 +b
1130 c
1131 d
1132 +e
1133 f
1134 g
1135 -h
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001136 TestResults(failed=1, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001137
Edward Loper71f55af2004-08-26 01:41:51 +00001138The REPORT_CDIFF flag causes failures that involve multi-line expected
Tim Peters8485b562004-08-04 18:46:34 +00001139and actual outputs to be displayed using a context diff:
1140
Edward Loper71f55af2004-08-26 01:41:51 +00001141 >>> # Reuse f() from the REPORT_UDIFF example, above.
Tim Peters8485b562004-08-04 18:46:34 +00001142 >>> test = doctest.DocTestFinder().find(f)[0]
Edward Loper71f55af2004-08-26 01:41:51 +00001143 >>> flags = doctest.REPORT_CDIFF
Tim Peters8485b562004-08-04 18:46:34 +00001144 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001145 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001146 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001147 File ..., line 3, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001148 Failed example:
1149 print '\n'.join('abcdefg')
Edward Loper56629292004-08-26 01:31:56 +00001150 Differences (context diff with expected followed by actual):
Tim Peters8485b562004-08-04 18:46:34 +00001151 ***************
Tim Peterse7edcb82004-08-26 05:44:27 +00001152 *** 1,7 ****
Tim Peters8485b562004-08-04 18:46:34 +00001153 a
1154 ! B
1155 c
1156 d
1157 f
1158 g
1159 - h
Tim Peterse7edcb82004-08-26 05:44:27 +00001160 --- 1,7 ----
Tim Peters8485b562004-08-04 18:46:34 +00001161 a
1162 ! b
1163 c
1164 d
1165 + e
1166 f
1167 g
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001168 TestResults(failed=1, attempted=1)
Tim Petersc6cbab02004-08-22 19:43:28 +00001169
1170
Edward Loper71f55af2004-08-26 01:41:51 +00001171The REPORT_NDIFF flag causes failures to use the difflib.Differ algorithm
Tim Petersc6cbab02004-08-22 19:43:28 +00001172used by the popular ndiff.py utility. This does intraline difference
1173marking, as well as interline differences.
1174
1175 >>> def f(x):
1176 ... r'''
1177 ... >>> print "a b c d e f g h i j k l m"
1178 ... a b c d e f g h i j k 1 m
1179 ... '''
1180 >>> test = doctest.DocTestFinder().find(f)[0]
Edward Loper71f55af2004-08-26 01:41:51 +00001181 >>> flags = doctest.REPORT_NDIFF
Tim Petersc6cbab02004-08-22 19:43:28 +00001182 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001183 ... # doctest: +ELLIPSIS
Tim Petersc6cbab02004-08-22 19:43:28 +00001184 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001185 File ..., line 3, in f
Tim Petersc6cbab02004-08-22 19:43:28 +00001186 Failed example:
1187 print "a b c d e f g h i j k l m"
1188 Differences (ndiff with -expected +actual):
1189 - a b c d e f g h i j k 1 m
1190 ? ^
1191 + a b c d e f g h i j k l m
1192 ? + ++ ^
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001193 TestResults(failed=1, attempted=1)
Edward Lopera89f88d2004-08-26 02:45:51 +00001194
1195The REPORT_ONLY_FIRST_FAILURE supresses result output after the first
1196failing example:
1197
1198 >>> def f(x):
1199 ... r'''
1200 ... >>> print 1 # first success
1201 ... 1
1202 ... >>> print 2 # first failure
1203 ... 200
1204 ... >>> print 3 # second failure
1205 ... 300
1206 ... >>> print 4 # second success
1207 ... 4
1208 ... >>> print 5 # third failure
1209 ... 500
1210 ... '''
1211 >>> test = doctest.DocTestFinder().find(f)[0]
1212 >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE
1213 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001214 ... # doctest: +ELLIPSIS
Edward Lopera89f88d2004-08-26 02:45:51 +00001215 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001216 File ..., line 5, in f
Edward Lopera89f88d2004-08-26 02:45:51 +00001217 Failed example:
1218 print 2 # first failure
1219 Expected:
1220 200
1221 Got:
1222 2
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001223 TestResults(failed=3, attempted=5)
Edward Lopera89f88d2004-08-26 02:45:51 +00001224
1225However, output from `report_start` is not supressed:
1226
1227 >>> doctest.DocTestRunner(verbose=True, optionflags=flags).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001228 ... # doctest: +ELLIPSIS
Edward Lopera89f88d2004-08-26 02:45:51 +00001229 Trying:
1230 print 1 # first success
1231 Expecting:
1232 1
1233 ok
1234 Trying:
1235 print 2 # first failure
1236 Expecting:
1237 200
1238 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001239 File ..., line 5, in f
Edward Lopera89f88d2004-08-26 02:45:51 +00001240 Failed example:
1241 print 2 # first failure
1242 Expected:
1243 200
1244 Got:
1245 2
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001246 TestResults(failed=3, attempted=5)
Edward Lopera89f88d2004-08-26 02:45:51 +00001247
1248For the purposes of REPORT_ONLY_FIRST_FAILURE, unexpected exceptions
1249count as failures:
1250
1251 >>> def f(x):
1252 ... r'''
1253 ... >>> print 1 # first success
1254 ... 1
1255 ... >>> raise ValueError(2) # first failure
1256 ... 200
1257 ... >>> print 3 # second failure
1258 ... 300
1259 ... >>> print 4 # second success
1260 ... 4
1261 ... >>> print 5 # third failure
1262 ... 500
1263 ... '''
1264 >>> test = doctest.DocTestFinder().find(f)[0]
1265 >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE
1266 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1267 ... # doctest: +ELLIPSIS
1268 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001269 File ..., line 5, in f
Edward Lopera89f88d2004-08-26 02:45:51 +00001270 Failed example:
1271 raise ValueError(2) # first failure
1272 Exception raised:
1273 ...
1274 ValueError: 2
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001275 TestResults(failed=3, attempted=5)
Edward Lopera89f88d2004-08-26 02:45:51 +00001276
Tim Petersad2ef332006-05-10 02:43:01 +00001277New option flags can also be registered, via register_optionflag(). Here
1278we reach into doctest's internals a bit.
1279
1280 >>> unlikely = "UNLIKELY_OPTION_NAME"
1281 >>> unlikely in doctest.OPTIONFLAGS_BY_NAME
1282 False
1283 >>> new_flag_value = doctest.register_optionflag(unlikely)
1284 >>> unlikely in doctest.OPTIONFLAGS_BY_NAME
1285 True
1286
1287Before 2.4.4/2.5, registering a name more than once erroneously created
1288more than one flag value. Here we verify that's fixed:
1289
1290 >>> redundant_flag_value = doctest.register_optionflag(unlikely)
1291 >>> redundant_flag_value == new_flag_value
1292 True
1293
1294Clean up.
1295 >>> del doctest.OPTIONFLAGS_BY_NAME[unlikely]
1296
Tim Petersc6cbab02004-08-22 19:43:28 +00001297 """
1298
Tim Peters8485b562004-08-04 18:46:34 +00001299 def option_directives(): r"""
1300Tests of `DocTestRunner`'s option directive mechanism.
1301
Edward Loper74bca7a2004-08-12 02:27:44 +00001302Option directives can be used to turn option flags on or off for a
1303single example. To turn an option on for an example, follow that
1304example with a comment of the form ``# doctest: +OPTION``:
Tim Peters8485b562004-08-04 18:46:34 +00001305
1306 >>> def f(x): r'''
Edward Loper74bca7a2004-08-12 02:27:44 +00001307 ... >>> print range(10) # should fail: no ellipsis
1308 ... [0, 1, ..., 9]
1309 ...
1310 ... >>> print range(10) # doctest: +ELLIPSIS
1311 ... [0, 1, ..., 9]
1312 ... '''
1313 >>> test = doctest.DocTestFinder().find(f)[0]
1314 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001315 ... # doctest: +ELLIPSIS
Edward Loper74bca7a2004-08-12 02:27:44 +00001316 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001317 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001318 Failed example:
1319 print range(10) # should fail: no ellipsis
1320 Expected:
1321 [0, 1, ..., 9]
1322 Got:
1323 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001324 TestResults(failed=1, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001325
1326To turn an option off for an example, follow that example with a
1327comment of the form ``# doctest: -OPTION``:
1328
1329 >>> def f(x): r'''
1330 ... >>> print range(10)
1331 ... [0, 1, ..., 9]
1332 ...
1333 ... >>> # should fail: no ellipsis
1334 ... >>> print range(10) # doctest: -ELLIPSIS
1335 ... [0, 1, ..., 9]
1336 ... '''
1337 >>> test = doctest.DocTestFinder().find(f)[0]
1338 >>> doctest.DocTestRunner(verbose=False,
1339 ... optionflags=doctest.ELLIPSIS).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001340 ... # doctest: +ELLIPSIS
Edward Loper74bca7a2004-08-12 02:27:44 +00001341 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001342 File ..., line 6, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001343 Failed example:
1344 print range(10) # doctest: -ELLIPSIS
1345 Expected:
1346 [0, 1, ..., 9]
1347 Got:
1348 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001349 TestResults(failed=1, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001350
1351Option directives affect only the example that they appear with; they
1352do not change the options for surrounding examples:
Edward Loper8e4a34b2004-08-12 02:34:27 +00001353
Edward Loper74bca7a2004-08-12 02:27:44 +00001354 >>> def f(x): r'''
Tim Peters8485b562004-08-04 18:46:34 +00001355 ... >>> print range(10) # Should fail: no ellipsis
1356 ... [0, 1, ..., 9]
1357 ...
Edward Loper74bca7a2004-08-12 02:27:44 +00001358 ... >>> print range(10) # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001359 ... [0, 1, ..., 9]
1360 ...
Tim Peters8485b562004-08-04 18:46:34 +00001361 ... >>> print range(10) # Should fail: no ellipsis
1362 ... [0, 1, ..., 9]
1363 ... '''
1364 >>> test = doctest.DocTestFinder().find(f)[0]
1365 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001366 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001367 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001368 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001369 Failed example:
1370 print range(10) # Should fail: no ellipsis
1371 Expected:
1372 [0, 1, ..., 9]
1373 Got:
1374 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Tim Peters8485b562004-08-04 18:46:34 +00001375 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001376 File ..., line 8, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001377 Failed example:
1378 print range(10) # Should fail: no ellipsis
1379 Expected:
1380 [0, 1, ..., 9]
1381 Got:
1382 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001383 TestResults(failed=2, attempted=3)
Tim Peters8485b562004-08-04 18:46:34 +00001384
Edward Loper74bca7a2004-08-12 02:27:44 +00001385Multiple options may be modified by a single option directive. They
1386may be separated by whitespace, commas, or both:
Tim Peters8485b562004-08-04 18:46:34 +00001387
1388 >>> def f(x): r'''
1389 ... >>> print range(10) # Should fail
1390 ... [0, 1, ..., 9]
Tim Peters8485b562004-08-04 18:46:34 +00001391 ... >>> print range(10) # Should succeed
Edward Loper74bca7a2004-08-12 02:27:44 +00001392 ... ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
Tim Peters8485b562004-08-04 18:46:34 +00001393 ... [0, 1, ..., 9]
1394 ... '''
1395 >>> test = doctest.DocTestFinder().find(f)[0]
1396 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001397 ... # doctest: +ELLIPSIS
Tim Peters8485b562004-08-04 18:46:34 +00001398 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001399 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001400 Failed example:
1401 print range(10) # Should fail
1402 Expected:
1403 [0, 1, ..., 9]
1404 Got:
1405 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001406 TestResults(failed=1, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001407
1408 >>> def f(x): r'''
1409 ... >>> print range(10) # Should fail
1410 ... [0, 1, ..., 9]
1411 ... >>> print range(10) # Should succeed
1412 ... ... # doctest: +ELLIPSIS,+NORMALIZE_WHITESPACE
1413 ... [0, 1, ..., 9]
1414 ... '''
1415 >>> test = doctest.DocTestFinder().find(f)[0]
1416 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001417 ... # doctest: +ELLIPSIS
Edward Loper74bca7a2004-08-12 02:27:44 +00001418 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001419 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001420 Failed example:
1421 print range(10) # Should fail
1422 Expected:
1423 [0, 1, ..., 9]
1424 Got:
1425 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001426 TestResults(failed=1, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001427
1428 >>> def f(x): r'''
1429 ... >>> print range(10) # Should fail
1430 ... [0, 1, ..., 9]
1431 ... >>> print range(10) # Should succeed
1432 ... ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
1433 ... [0, 1, ..., 9]
1434 ... '''
1435 >>> test = doctest.DocTestFinder().find(f)[0]
1436 >>> doctest.DocTestRunner(verbose=False).run(test)
Tim Peters17b56372004-09-11 17:33:27 +00001437 ... # doctest: +ELLIPSIS
Edward Loper74bca7a2004-08-12 02:27:44 +00001438 **********************************************************************
Tim Peters17b56372004-09-11 17:33:27 +00001439 File ..., line 2, in f
Jim Fulton07a349c2004-08-22 14:10:00 +00001440 Failed example:
1441 print range(10) # Should fail
1442 Expected:
1443 [0, 1, ..., 9]
1444 Got:
1445 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001446 TestResults(failed=1, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001447
1448The option directive may be put on the line following the source, as
1449long as a continuation prompt is used:
1450
1451 >>> def f(x): r'''
1452 ... >>> print range(10)
1453 ... ... # doctest: +ELLIPSIS
1454 ... [0, 1, ..., 9]
1455 ... '''
1456 >>> test = doctest.DocTestFinder().find(f)[0]
1457 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001458 TestResults(failed=0, attempted=1)
Edward Loper8e4a34b2004-08-12 02:34:27 +00001459
Edward Loper74bca7a2004-08-12 02:27:44 +00001460For examples with multi-line source, the option directive may appear
1461at the end of any line:
1462
1463 >>> def f(x): r'''
1464 ... >>> for x in range(10): # doctest: +ELLIPSIS
1465 ... ... print x,
1466 ... 0 1 2 ... 9
1467 ...
1468 ... >>> for x in range(10):
1469 ... ... print x, # doctest: +ELLIPSIS
1470 ... 0 1 2 ... 9
1471 ... '''
1472 >>> test = doctest.DocTestFinder().find(f)[0]
1473 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001474 TestResults(failed=0, attempted=2)
Edward Loper74bca7a2004-08-12 02:27:44 +00001475
1476If more than one line of an example with multi-line source has an
1477option directive, then they are combined:
1478
1479 >>> def f(x): r'''
1480 ... Should fail (option directive not on the last line):
1481 ... >>> for x in range(10): # doctest: +ELLIPSIS
1482 ... ... print x, # doctest: +NORMALIZE_WHITESPACE
1483 ... 0 1 2...9
1484 ... '''
1485 >>> test = doctest.DocTestFinder().find(f)[0]
1486 >>> doctest.DocTestRunner(verbose=False).run(test)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001487 TestResults(failed=0, attempted=1)
Edward Loper74bca7a2004-08-12 02:27:44 +00001488
1489It is an error to have a comment of the form ``# doctest:`` that is
1490*not* followed by words of the form ``+OPTION`` or ``-OPTION``, where
1491``OPTION`` is an option that has been registered with
1492`register_option`:
1493
1494 >>> # Error: Option not registered
1495 >>> s = '>>> print 12 #doctest: +BADOPTION'
1496 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1497 Traceback (most recent call last):
1498 ValueError: line 1 of the doctest for s has an invalid option: '+BADOPTION'
1499
1500 >>> # Error: No + or - prefix
1501 >>> s = '>>> print 12 #doctest: ELLIPSIS'
1502 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1503 Traceback (most recent call last):
1504 ValueError: line 1 of the doctest for s has an invalid option: 'ELLIPSIS'
1505
1506It is an error to use an option directive on a line that contains no
1507source:
1508
1509 >>> s = '>>> # doctest: +ELLIPSIS'
1510 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1511 Traceback (most recent call last):
1512 ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS'
Tim Peters8485b562004-08-04 18:46:34 +00001513"""
1514
1515def test_testsource(): r"""
1516Unit tests for `testsource()`.
1517
1518The testsource() function takes a module and a name, finds the (first)
Tim Peters19397e52004-08-06 22:02:59 +00001519test with that name in that module, and converts it to a script. The
1520example code is converted to regular Python code. The surrounding
1521words and expected output are converted to comments:
Tim Peters8485b562004-08-04 18:46:34 +00001522
1523 >>> import test.test_doctest
1524 >>> name = 'test.test_doctest.sample_func'
1525 >>> print doctest.testsource(test.test_doctest, name)
Edward Lopera5db6002004-08-12 02:41:30 +00001526 # Blah blah
Tim Peters19397e52004-08-06 22:02:59 +00001527 #
Tim Peters8485b562004-08-04 18:46:34 +00001528 print sample_func(22)
1529 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00001530 ## 44
Tim Peters19397e52004-08-06 22:02:59 +00001531 #
Edward Lopera5db6002004-08-12 02:41:30 +00001532 # Yee ha!
Georg Brandlecf93c72005-06-26 23:09:51 +00001533 <BLANKLINE>
Tim Peters8485b562004-08-04 18:46:34 +00001534
1535 >>> name = 'test.test_doctest.SampleNewStyleClass'
1536 >>> print doctest.testsource(test.test_doctest, name)
1537 print '1\n2\n3'
1538 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00001539 ## 1
1540 ## 2
1541 ## 3
Georg Brandlecf93c72005-06-26 23:09:51 +00001542 <BLANKLINE>
Tim Peters8485b562004-08-04 18:46:34 +00001543
1544 >>> name = 'test.test_doctest.SampleClass.a_classmethod'
1545 >>> print doctest.testsource(test.test_doctest, name)
1546 print SampleClass.a_classmethod(10)
1547 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00001548 ## 12
Tim Peters8485b562004-08-04 18:46:34 +00001549 print SampleClass(0).a_classmethod(10)
1550 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00001551 ## 12
Georg Brandlecf93c72005-06-26 23:09:51 +00001552 <BLANKLINE>
Tim Peters8485b562004-08-04 18:46:34 +00001553"""
1554
1555def test_debug(): r"""
1556
1557Create a docstring that we want to debug:
1558
1559 >>> s = '''
1560 ... >>> x = 12
1561 ... >>> print x
1562 ... 12
1563 ... '''
1564
1565Create some fake stdin input, to feed to the debugger:
1566
1567 >>> import tempfile
Tim Peters8485b562004-08-04 18:46:34 +00001568 >>> real_stdin = sys.stdin
Edward Loper2de91ba2004-08-27 02:07:46 +00001569 >>> sys.stdin = _FakeInput(['next', 'print x', 'continue'])
Tim Peters8485b562004-08-04 18:46:34 +00001570
1571Run the debugger on the docstring, and then restore sys.stdin.
1572
Edward Loper2de91ba2004-08-27 02:07:46 +00001573 >>> try: doctest.debug_src(s)
1574 ... finally: sys.stdin = real_stdin
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001575 > <string>(1)<module>()
Edward Loper2de91ba2004-08-27 02:07:46 +00001576 (Pdb) next
1577 12
Tim Peters8485b562004-08-04 18:46:34 +00001578 --Return--
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001579 > <string>(1)<module>()->None
Edward Loper2de91ba2004-08-27 02:07:46 +00001580 (Pdb) print x
1581 12
1582 (Pdb) continue
Tim Peters8485b562004-08-04 18:46:34 +00001583
1584"""
1585
Jim Fulton356fd192004-08-09 11:34:47 +00001586def test_pdb_set_trace():
Tim Peters50c6bdb2004-11-08 22:07:37 +00001587 """Using pdb.set_trace from a doctest.
Jim Fulton356fd192004-08-09 11:34:47 +00001588
Tim Peters413ced62004-08-09 15:43:47 +00001589 You can use pdb.set_trace from a doctest. To do so, you must
Jim Fulton356fd192004-08-09 11:34:47 +00001590 retrieve the set_trace function from the pdb module at the time
Tim Peters413ced62004-08-09 15:43:47 +00001591 you use it. The doctest module changes sys.stdout so that it can
1592 capture program output. It also temporarily replaces pdb.set_trace
1593 with a version that restores stdout. This is necessary for you to
Jim Fulton356fd192004-08-09 11:34:47 +00001594 see debugger output.
1595
1596 >>> doc = '''
1597 ... >>> x = 42
1598 ... >>> import pdb; pdb.set_trace()
1599 ... '''
Edward Lopera1ef6112004-08-09 16:14:41 +00001600 >>> parser = doctest.DocTestParser()
1601 >>> test = parser.get_doctest(doc, {}, "foo", "foo.py", 0)
Jim Fulton356fd192004-08-09 11:34:47 +00001602 >>> runner = doctest.DocTestRunner(verbose=False)
1603
1604 To demonstrate this, we'll create a fake standard input that
1605 captures our debugger input:
1606
1607 >>> import tempfile
Edward Loper2de91ba2004-08-27 02:07:46 +00001608 >>> real_stdin = sys.stdin
1609 >>> sys.stdin = _FakeInput([
Jim Fulton356fd192004-08-09 11:34:47 +00001610 ... 'print x', # print data defined by the example
1611 ... 'continue', # stop debugging
Edward Loper2de91ba2004-08-27 02:07:46 +00001612 ... ''])
Jim Fulton356fd192004-08-09 11:34:47 +00001613
Edward Loper2de91ba2004-08-27 02:07:46 +00001614 >>> try: runner.run(test)
1615 ... finally: sys.stdin = real_stdin
Jim Fulton356fd192004-08-09 11:34:47 +00001616 --Return--
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001617 > <doctest foo[1]>(1)<module>()->None
Edward Loper2de91ba2004-08-27 02:07:46 +00001618 -> import pdb; pdb.set_trace()
1619 (Pdb) print x
1620 42
1621 (Pdb) continue
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001622 TestResults(failed=0, attempted=2)
Jim Fulton356fd192004-08-09 11:34:47 +00001623
1624 You can also put pdb.set_trace in a function called from a test:
1625
1626 >>> def calls_set_trace():
1627 ... y=2
1628 ... import pdb; pdb.set_trace()
1629
1630 >>> doc = '''
1631 ... >>> x=1
1632 ... >>> calls_set_trace()
1633 ... '''
Edward Lopera1ef6112004-08-09 16:14:41 +00001634 >>> test = parser.get_doctest(doc, globals(), "foo", "foo.py", 0)
Edward Loper2de91ba2004-08-27 02:07:46 +00001635 >>> real_stdin = sys.stdin
1636 >>> sys.stdin = _FakeInput([
Jim Fulton356fd192004-08-09 11:34:47 +00001637 ... 'print y', # print data defined in the function
1638 ... 'up', # out of function
1639 ... 'print x', # print data defined by the example
1640 ... 'continue', # stop debugging
Edward Loper2de91ba2004-08-27 02:07:46 +00001641 ... ''])
Jim Fulton356fd192004-08-09 11:34:47 +00001642
Tim Peters50c6bdb2004-11-08 22:07:37 +00001643 >>> try:
1644 ... runner.run(test)
1645 ... finally:
1646 ... sys.stdin = real_stdin
Jim Fulton356fd192004-08-09 11:34:47 +00001647 --Return--
Edward Loper2de91ba2004-08-27 02:07:46 +00001648 > <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None
1649 -> import pdb; pdb.set_trace()
1650 (Pdb) print y
1651 2
1652 (Pdb) up
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001653 > <doctest foo[1]>(1)<module>()
Edward Loper2de91ba2004-08-27 02:07:46 +00001654 -> calls_set_trace()
1655 (Pdb) print x
1656 1
1657 (Pdb) continue
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001658 TestResults(failed=0, attempted=2)
Edward Loper2de91ba2004-08-27 02:07:46 +00001659
1660 During interactive debugging, source code is shown, even for
1661 doctest examples:
1662
1663 >>> doc = '''
1664 ... >>> def f(x):
1665 ... ... g(x*2)
1666 ... >>> def g(x):
1667 ... ... print x+3
1668 ... ... import pdb; pdb.set_trace()
1669 ... >>> f(3)
1670 ... '''
1671 >>> test = parser.get_doctest(doc, globals(), "foo", "foo.py", 0)
1672 >>> real_stdin = sys.stdin
1673 >>> sys.stdin = _FakeInput([
1674 ... 'list', # list source from example 2
1675 ... 'next', # return from g()
1676 ... 'list', # list source from example 1
1677 ... 'next', # return from f()
1678 ... 'list', # list source from example 3
1679 ... 'continue', # stop debugging
1680 ... ''])
1681 >>> try: runner.run(test)
1682 ... finally: sys.stdin = real_stdin
1683 ... # doctest: +NORMALIZE_WHITESPACE
1684 --Return--
1685 > <doctest foo[1]>(3)g()->None
1686 -> import pdb; pdb.set_trace()
1687 (Pdb) list
1688 1 def g(x):
1689 2 print x+3
1690 3 -> import pdb; pdb.set_trace()
1691 [EOF]
1692 (Pdb) next
1693 --Return--
1694 > <doctest foo[0]>(2)f()->None
1695 -> g(x*2)
1696 (Pdb) list
1697 1 def f(x):
1698 2 -> g(x*2)
1699 [EOF]
1700 (Pdb) next
1701 --Return--
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001702 > <doctest foo[2]>(1)<module>()->None
Edward Loper2de91ba2004-08-27 02:07:46 +00001703 -> f(3)
1704 (Pdb) list
1705 1 -> f(3)
1706 [EOF]
1707 (Pdb) continue
1708 **********************************************************************
1709 File "foo.py", line 7, in foo
1710 Failed example:
1711 f(3)
1712 Expected nothing
1713 Got:
1714 9
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001715 TestResults(failed=1, attempted=3)
Jim Fulton356fd192004-08-09 11:34:47 +00001716 """
1717
Tim Peters50c6bdb2004-11-08 22:07:37 +00001718def test_pdb_set_trace_nested():
1719 """This illustrates more-demanding use of set_trace with nested functions.
1720
1721 >>> class C(object):
1722 ... def calls_set_trace(self):
1723 ... y = 1
1724 ... import pdb; pdb.set_trace()
1725 ... self.f1()
1726 ... y = 2
1727 ... def f1(self):
1728 ... x = 1
1729 ... self.f2()
1730 ... x = 2
1731 ... def f2(self):
1732 ... z = 1
1733 ... z = 2
1734
1735 >>> calls_set_trace = C().calls_set_trace
1736
1737 >>> doc = '''
1738 ... >>> a = 1
1739 ... >>> calls_set_trace()
1740 ... '''
1741 >>> parser = doctest.DocTestParser()
1742 >>> runner = doctest.DocTestRunner(verbose=False)
1743 >>> test = parser.get_doctest(doc, globals(), "foo", "foo.py", 0)
1744 >>> real_stdin = sys.stdin
1745 >>> sys.stdin = _FakeInput([
1746 ... 'print y', # print data defined in the function
1747 ... 'step', 'step', 'step', 'step', 'step', 'step', 'print z',
1748 ... 'up', 'print x',
1749 ... 'up', 'print y',
1750 ... 'up', 'print foo',
1751 ... 'continue', # stop debugging
1752 ... ''])
1753
1754 >>> try:
1755 ... runner.run(test)
1756 ... finally:
1757 ... sys.stdin = real_stdin
1758 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
1759 -> self.f1()
1760 (Pdb) print y
1761 1
1762 (Pdb) step
1763 --Call--
1764 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1()
1765 -> def f1(self):
1766 (Pdb) step
1767 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1()
1768 -> x = 1
1769 (Pdb) step
1770 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
1771 -> self.f2()
1772 (Pdb) step
1773 --Call--
1774 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2()
1775 -> def f2(self):
1776 (Pdb) step
1777 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2()
1778 -> z = 1
1779 (Pdb) step
1780 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2()
1781 -> z = 2
1782 (Pdb) print z
1783 1
1784 (Pdb) up
1785 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
1786 -> self.f2()
1787 (Pdb) print x
1788 1
1789 (Pdb) up
1790 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
1791 -> self.f1()
1792 (Pdb) print y
1793 1
1794 (Pdb) up
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001795 > <doctest foo[1]>(1)<module>()
Tim Peters50c6bdb2004-11-08 22:07:37 +00001796 -> calls_set_trace()
1797 (Pdb) print foo
1798 *** NameError: name 'foo' is not defined
1799 (Pdb) continue
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00001800 TestResults(failed=0, attempted=2)
Tim Peters50c6bdb2004-11-08 22:07:37 +00001801"""
1802
Tim Peters19397e52004-08-06 22:02:59 +00001803def test_DocTestSuite():
Tim Peters1e277ee2004-08-07 05:37:52 +00001804 """DocTestSuite creates a unittest test suite from a doctest.
Tim Peters19397e52004-08-06 22:02:59 +00001805
1806 We create a Suite by providing a module. A module can be provided
1807 by passing a module object:
1808
1809 >>> import unittest
1810 >>> import test.sample_doctest
1811 >>> suite = doctest.DocTestSuite(test.sample_doctest)
1812 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001813 <unittest.result.TestResult run=9 errors=0 failures=4>
Tim Peters19397e52004-08-06 22:02:59 +00001814
1815 We can also supply the module by name:
1816
1817 >>> suite = doctest.DocTestSuite('test.sample_doctest')
1818 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001819 <unittest.result.TestResult run=9 errors=0 failures=4>
Tim Peters19397e52004-08-06 22:02:59 +00001820
1821 We can use the current module:
1822
1823 >>> suite = test.sample_doctest.test_suite()
1824 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001825 <unittest.result.TestResult run=9 errors=0 failures=4>
Tim Peters19397e52004-08-06 22:02:59 +00001826
1827 We can supply global variables. If we pass globs, they will be
1828 used instead of the module globals. Here we'll pass an empty
1829 globals, triggering an extra error:
1830
1831 >>> suite = doctest.DocTestSuite('test.sample_doctest', globs={})
1832 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001833 <unittest.result.TestResult run=9 errors=0 failures=5>
Tim Peters19397e52004-08-06 22:02:59 +00001834
1835 Alternatively, we can provide extra globals. Here we'll make an
1836 error go away by providing an extra global variable:
1837
1838 >>> suite = doctest.DocTestSuite('test.sample_doctest',
1839 ... extraglobs={'y': 1})
1840 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001841 <unittest.result.TestResult run=9 errors=0 failures=3>
Tim Peters19397e52004-08-06 22:02:59 +00001842
1843 You can pass option flags. Here we'll cause an extra error
1844 by disabling the blank-line feature:
1845
1846 >>> suite = doctest.DocTestSuite('test.sample_doctest',
Tim Peters1e277ee2004-08-07 05:37:52 +00001847 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE)
Tim Peters19397e52004-08-06 22:02:59 +00001848 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001849 <unittest.result.TestResult run=9 errors=0 failures=5>
Tim Peters19397e52004-08-06 22:02:59 +00001850
Tim Peters1e277ee2004-08-07 05:37:52 +00001851 You can supply setUp and tearDown functions:
Tim Peters19397e52004-08-06 22:02:59 +00001852
Jim Fultonf54bad42004-08-28 14:57:56 +00001853 >>> def setUp(t):
Tim Peters19397e52004-08-06 22:02:59 +00001854 ... import test.test_doctest
1855 ... test.test_doctest.sillySetup = True
1856
Jim Fultonf54bad42004-08-28 14:57:56 +00001857 >>> def tearDown(t):
Tim Peters19397e52004-08-06 22:02:59 +00001858 ... import test.test_doctest
1859 ... del test.test_doctest.sillySetup
1860
1861 Here, we installed a silly variable that the test expects:
1862
1863 >>> suite = doctest.DocTestSuite('test.sample_doctest',
1864 ... setUp=setUp, tearDown=tearDown)
1865 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001866 <unittest.result.TestResult run=9 errors=0 failures=3>
Tim Peters19397e52004-08-06 22:02:59 +00001867
1868 But the tearDown restores sanity:
1869
1870 >>> import test.test_doctest
1871 >>> test.test_doctest.sillySetup
1872 Traceback (most recent call last):
1873 ...
1874 AttributeError: 'module' object has no attribute 'sillySetup'
1875
Jim Fultonf54bad42004-08-28 14:57:56 +00001876 The setUp and tearDown funtions are passed test objects. Here
1877 we'll use the setUp function to supply the missing variable y:
1878
1879 >>> def setUp(test):
1880 ... test.globs['y'] = 1
1881
1882 >>> suite = doctest.DocTestSuite('test.sample_doctest', setUp=setUp)
1883 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001884 <unittest.result.TestResult run=9 errors=0 failures=3>
Jim Fultonf54bad42004-08-28 14:57:56 +00001885
1886 Here, we didn't need to use a tearDown function because we
1887 modified the test globals, which are a copy of the
1888 sample_doctest module dictionary. The test globals are
1889 automatically cleared for us after a test.
Tim Peters19397e52004-08-06 22:02:59 +00001890 """
1891
1892def test_DocFileSuite():
1893 """We can test tests found in text files using a DocFileSuite.
1894
1895 We create a suite by providing the names of one or more text
1896 files that include examples:
1897
1898 >>> import unittest
1899 >>> suite = doctest.DocFileSuite('test_doctest.txt',
George Yoshidaf3c65de2006-05-28 16:39:09 +00001900 ... 'test_doctest2.txt',
1901 ... 'test_doctest4.txt')
Tim Peters19397e52004-08-06 22:02:59 +00001902 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001903 <unittest.result.TestResult run=3 errors=0 failures=3>
Tim Peters19397e52004-08-06 22:02:59 +00001904
1905 The test files are looked for in the directory containing the
1906 calling module. A package keyword argument can be provided to
1907 specify a different relative location.
1908
1909 >>> import unittest
1910 >>> suite = doctest.DocFileSuite('test_doctest.txt',
1911 ... 'test_doctest2.txt',
George Yoshidaf3c65de2006-05-28 16:39:09 +00001912 ... 'test_doctest4.txt',
Tim Peters19397e52004-08-06 22:02:59 +00001913 ... package='test')
1914 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001915 <unittest.result.TestResult run=3 errors=0 failures=3>
Tim Peters19397e52004-08-06 22:02:59 +00001916
Brett Cannon43e53f82007-11-21 00:47:36 +00001917 Support for using a package's __loader__.get_data() is also
1918 provided.
1919
1920 >>> import unittest, pkgutil, test
Brett Cannoneaa2c982007-11-23 00:06:51 +00001921 >>> added_loader = False
Brett Cannon43e53f82007-11-21 00:47:36 +00001922 >>> if not hasattr(test, '__loader__'):
1923 ... test.__loader__ = pkgutil.get_loader(test)
1924 ... added_loader = True
1925 >>> try:
1926 ... suite = doctest.DocFileSuite('test_doctest.txt',
1927 ... 'test_doctest2.txt',
1928 ... 'test_doctest4.txt',
1929 ... package='test')
1930 ... suite.run(unittest.TestResult())
1931 ... finally:
Brett Cannon9db1d5a2007-11-21 00:58:03 +00001932 ... if added_loader:
1933 ... del test.__loader__
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001934 <unittest.result.TestResult run=3 errors=0 failures=3>
Brett Cannon43e53f82007-11-21 00:47:36 +00001935
Edward Loper0273f5b2004-09-18 20:27:04 +00001936 '/' should be used as a path separator. It will be converted
1937 to a native separator at run time:
Tim Peters19397e52004-08-06 22:02:59 +00001938
1939 >>> suite = doctest.DocFileSuite('../test/test_doctest.txt')
1940 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001941 <unittest.result.TestResult run=1 errors=0 failures=1>
Tim Peters19397e52004-08-06 22:02:59 +00001942
Edward Loper0273f5b2004-09-18 20:27:04 +00001943 If DocFileSuite is used from an interactive session, then files
1944 are resolved relative to the directory of sys.argv[0]:
1945
Christian Heimesc756d002007-11-27 21:34:01 +00001946 >>> import types, os.path, test.test_doctest
Edward Loper0273f5b2004-09-18 20:27:04 +00001947 >>> save_argv = sys.argv
1948 >>> sys.argv = [test.test_doctest.__file__]
1949 >>> suite = doctest.DocFileSuite('test_doctest.txt',
Christian Heimesc756d002007-11-27 21:34:01 +00001950 ... package=types.ModuleType('__main__'))
Edward Loper0273f5b2004-09-18 20:27:04 +00001951 >>> sys.argv = save_argv
1952
Edward Loper052d0cd2004-09-19 17:19:33 +00001953 By setting `module_relative=False`, os-specific paths may be
1954 used (including absolute paths and paths relative to the
1955 working directory):
Edward Loper0273f5b2004-09-18 20:27:04 +00001956
1957 >>> # Get the absolute path of the test package.
1958 >>> test_doctest_path = os.path.abspath(test.test_doctest.__file__)
1959 >>> test_pkg_path = os.path.split(test_doctest_path)[0]
1960
1961 >>> # Use it to find the absolute path of test_doctest.txt.
1962 >>> test_file = os.path.join(test_pkg_path, 'test_doctest.txt')
1963
Edward Loper052d0cd2004-09-19 17:19:33 +00001964 >>> suite = doctest.DocFileSuite(test_file, module_relative=False)
Edward Loper0273f5b2004-09-18 20:27:04 +00001965 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001966 <unittest.result.TestResult run=1 errors=0 failures=1>
Edward Loper0273f5b2004-09-18 20:27:04 +00001967
Edward Loper052d0cd2004-09-19 17:19:33 +00001968 It is an error to specify `package` when `module_relative=False`:
1969
1970 >>> suite = doctest.DocFileSuite(test_file, module_relative=False,
1971 ... package='test')
1972 Traceback (most recent call last):
1973 ValueError: Package may only be specified for module-relative paths.
1974
Tim Peters19397e52004-08-06 22:02:59 +00001975 You can specify initial global variables:
1976
1977 >>> suite = doctest.DocFileSuite('test_doctest.txt',
1978 ... 'test_doctest2.txt',
George Yoshidaf3c65de2006-05-28 16:39:09 +00001979 ... 'test_doctest4.txt',
Tim Peters19397e52004-08-06 22:02:59 +00001980 ... globs={'favorite_color': 'blue'})
1981 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001982 <unittest.result.TestResult run=3 errors=0 failures=2>
Tim Peters19397e52004-08-06 22:02:59 +00001983
1984 In this case, we supplied a missing favorite color. You can
1985 provide doctest options:
1986
1987 >>> suite = doctest.DocFileSuite('test_doctest.txt',
1988 ... 'test_doctest2.txt',
George Yoshidaf3c65de2006-05-28 16:39:09 +00001989 ... 'test_doctest4.txt',
Tim Peters19397e52004-08-06 22:02:59 +00001990 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE,
1991 ... globs={'favorite_color': 'blue'})
1992 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00001993 <unittest.result.TestResult run=3 errors=0 failures=3>
Tim Peters19397e52004-08-06 22:02:59 +00001994
1995 And, you can provide setUp and tearDown functions:
1996
Jim Fultonf54bad42004-08-28 14:57:56 +00001997 >>> def setUp(t):
Tim Peters19397e52004-08-06 22:02:59 +00001998 ... import test.test_doctest
1999 ... test.test_doctest.sillySetup = True
2000
Jim Fultonf54bad42004-08-28 14:57:56 +00002001 >>> def tearDown(t):
Tim Peters19397e52004-08-06 22:02:59 +00002002 ... import test.test_doctest
2003 ... del test.test_doctest.sillySetup
2004
2005 Here, we installed a silly variable that the test expects:
2006
2007 >>> suite = doctest.DocFileSuite('test_doctest.txt',
2008 ... 'test_doctest2.txt',
George Yoshidaf3c65de2006-05-28 16:39:09 +00002009 ... 'test_doctest4.txt',
Tim Peters19397e52004-08-06 22:02:59 +00002010 ... setUp=setUp, tearDown=tearDown)
2011 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00002012 <unittest.result.TestResult run=3 errors=0 failures=2>
Tim Peters19397e52004-08-06 22:02:59 +00002013
2014 But the tearDown restores sanity:
2015
2016 >>> import test.test_doctest
2017 >>> test.test_doctest.sillySetup
2018 Traceback (most recent call last):
2019 ...
2020 AttributeError: 'module' object has no attribute 'sillySetup'
2021
Jim Fultonf54bad42004-08-28 14:57:56 +00002022 The setUp and tearDown funtions are passed test objects.
2023 Here, we'll use a setUp function to set the favorite color in
2024 test_doctest.txt:
2025
2026 >>> def setUp(test):
2027 ... test.globs['favorite_color'] = 'blue'
2028
2029 >>> suite = doctest.DocFileSuite('test_doctest.txt', setUp=setUp)
2030 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00002031 <unittest.result.TestResult run=1 errors=0 failures=0>
Jim Fultonf54bad42004-08-28 14:57:56 +00002032
2033 Here, we didn't need to use a tearDown function because we
2034 modified the test globals. The test globals are
2035 automatically cleared for us after a test.
Tim Petersdf7a2082004-08-29 00:38:17 +00002036
Fred Drake7c404a42004-12-21 23:46:34 +00002037 Tests in a file run using `DocFileSuite` can also access the
2038 `__file__` global, which is set to the name of the file
2039 containing the tests:
2040
2041 >>> suite = doctest.DocFileSuite('test_doctest3.txt')
2042 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00002043 <unittest.result.TestResult run=1 errors=0 failures=0>
Fred Drake7c404a42004-12-21 23:46:34 +00002044
George Yoshidaf3c65de2006-05-28 16:39:09 +00002045 If the tests contain non-ASCII characters, we have to specify which
2046 encoding the file is encoded with. We do so by using the `encoding`
2047 parameter:
2048
2049 >>> suite = doctest.DocFileSuite('test_doctest.txt',
2050 ... 'test_doctest2.txt',
2051 ... 'test_doctest4.txt',
2052 ... encoding='utf-8')
2053 >>> suite.run(unittest.TestResult())
Benjamin Petersond7b0eeb2009-07-19 20:18:21 +00002054 <unittest.result.TestResult run=3 errors=0 failures=2>
George Yoshidaf3c65de2006-05-28 16:39:09 +00002055
Jim Fultonf54bad42004-08-28 14:57:56 +00002056 """
Tim Peters19397e52004-08-06 22:02:59 +00002057
Jim Fulton07a349c2004-08-22 14:10:00 +00002058def test_trailing_space_in_test():
2059 """
Tim Petersa7def722004-08-23 22:13:22 +00002060 Trailing spaces in expected output are significant:
Tim Petersc6cbab02004-08-22 19:43:28 +00002061
Jim Fulton07a349c2004-08-22 14:10:00 +00002062 >>> x, y = 'foo', ''
2063 >>> print x, y
2064 foo \n
2065 """
Tim Peters19397e52004-08-06 22:02:59 +00002066
Jim Fultonf54bad42004-08-28 14:57:56 +00002067
2068def test_unittest_reportflags():
2069 """Default unittest reporting flags can be set to control reporting
2070
2071 Here, we'll set the REPORT_ONLY_FIRST_FAILURE option so we see
2072 only the first failure of each test. First, we'll look at the
2073 output without the flag. The file test_doctest.txt file has two
2074 tests. They both fail if blank lines are disabled:
2075
2076 >>> suite = doctest.DocFileSuite('test_doctest.txt',
2077 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE)
2078 >>> import unittest
2079 >>> result = suite.run(unittest.TestResult())
2080 >>> print result.failures[0][1] # doctest: +ELLIPSIS
2081 Traceback ...
2082 Failed example:
2083 favorite_color
2084 ...
2085 Failed example:
2086 if 1:
2087 ...
2088
2089 Note that we see both failures displayed.
2090
2091 >>> old = doctest.set_unittest_reportflags(
2092 ... doctest.REPORT_ONLY_FIRST_FAILURE)
2093
2094 Now, when we run the test:
2095
2096 >>> result = suite.run(unittest.TestResult())
2097 >>> print result.failures[0][1] # doctest: +ELLIPSIS
2098 Traceback ...
2099 Failed example:
2100 favorite_color
2101 Exception raised:
2102 ...
2103 NameError: name 'favorite_color' is not defined
2104 <BLANKLINE>
2105 <BLANKLINE>
Tim Petersdf7a2082004-08-29 00:38:17 +00002106
Jim Fultonf54bad42004-08-28 14:57:56 +00002107 We get only the first failure.
2108
2109 If we give any reporting options when we set up the tests,
2110 however:
2111
2112 >>> suite = doctest.DocFileSuite('test_doctest.txt',
2113 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE | doctest.REPORT_NDIFF)
2114
2115 Then the default eporting options are ignored:
2116
2117 >>> result = suite.run(unittest.TestResult())
2118 >>> print result.failures[0][1] # doctest: +ELLIPSIS
2119 Traceback ...
2120 Failed example:
2121 favorite_color
2122 ...
2123 Failed example:
2124 if 1:
2125 print 'a'
2126 print
2127 print 'b'
2128 Differences (ndiff with -expected +actual):
2129 a
2130 - <BLANKLINE>
2131 +
2132 b
2133 <BLANKLINE>
2134 <BLANKLINE>
2135
2136
2137 Test runners can restore the formatting flags after they run:
2138
2139 >>> ignored = doctest.set_unittest_reportflags(old)
2140
2141 """
2142
Edward Loper052d0cd2004-09-19 17:19:33 +00002143def test_testfile(): r"""
2144Tests for the `testfile()` function. This function runs all the
2145doctest examples in a given file. In its simple invokation, it is
2146called with the name of a file, which is taken to be relative to the
2147calling module. The return value is (#failures, #tests).
2148
Florent Xicluna2a903b22010-02-27 13:31:23 +00002149We don't want `-v` in sys.argv for these tests.
2150
2151 >>> save_argv = sys.argv
2152 >>> if '-v' in sys.argv:
2153 ... sys.argv = [arg for arg in save_argv if arg != '-v']
2154
2155
Edward Loper052d0cd2004-09-19 17:19:33 +00002156 >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS
2157 **********************************************************************
2158 File "...", line 6, in test_doctest.txt
2159 Failed example:
2160 favorite_color
2161 Exception raised:
2162 ...
2163 NameError: name 'favorite_color' is not defined
2164 **********************************************************************
2165 1 items had failures:
2166 1 of 2 in test_doctest.txt
2167 ***Test Failed*** 1 failures.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002168 TestResults(failed=1, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002169 >>> doctest.master = None # Reset master.
2170
2171(Note: we'll be clearing doctest.master after each call to
2172`doctest.testfile`, to supress warnings about multiple tests with the
2173same name.)
2174
2175Globals may be specified with the `globs` and `extraglobs` parameters:
2176
2177 >>> globs = {'favorite_color': 'blue'}
2178 >>> doctest.testfile('test_doctest.txt', globs=globs)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002179 TestResults(failed=0, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002180 >>> doctest.master = None # Reset master.
2181
2182 >>> extraglobs = {'favorite_color': 'red'}
2183 >>> doctest.testfile('test_doctest.txt', globs=globs,
2184 ... extraglobs=extraglobs) # doctest: +ELLIPSIS
2185 **********************************************************************
2186 File "...", line 6, in test_doctest.txt
2187 Failed example:
2188 favorite_color
2189 Expected:
2190 'blue'
2191 Got:
2192 'red'
2193 **********************************************************************
2194 1 items had failures:
2195 1 of 2 in test_doctest.txt
2196 ***Test Failed*** 1 failures.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002197 TestResults(failed=1, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002198 >>> doctest.master = None # Reset master.
2199
2200The file may be made relative to a given module or package, using the
2201optional `module_relative` parameter:
2202
2203 >>> doctest.testfile('test_doctest.txt', globs=globs,
2204 ... module_relative='test')
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002205 TestResults(failed=0, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002206 >>> doctest.master = None # Reset master.
2207
2208Verbosity can be increased with the optional `verbose` paremter:
2209
2210 >>> doctest.testfile('test_doctest.txt', globs=globs, verbose=True)
2211 Trying:
2212 favorite_color
2213 Expecting:
2214 'blue'
2215 ok
2216 Trying:
2217 if 1:
2218 print 'a'
2219 print
2220 print 'b'
2221 Expecting:
2222 a
2223 <BLANKLINE>
2224 b
2225 ok
2226 1 items passed all tests:
2227 2 tests in test_doctest.txt
2228 2 tests in 1 items.
2229 2 passed and 0 failed.
2230 Test passed.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002231 TestResults(failed=0, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002232 >>> doctest.master = None # Reset master.
2233
2234The name of the test may be specified with the optional `name`
2235parameter:
2236
2237 >>> doctest.testfile('test_doctest.txt', name='newname')
2238 ... # doctest: +ELLIPSIS
2239 **********************************************************************
2240 File "...", line 6, in newname
2241 ...
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002242 TestResults(failed=1, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002243 >>> doctest.master = None # Reset master.
2244
2245The summary report may be supressed with the optional `report`
2246parameter:
2247
2248 >>> doctest.testfile('test_doctest.txt', report=False)
2249 ... # doctest: +ELLIPSIS
2250 **********************************************************************
2251 File "...", line 6, in test_doctest.txt
2252 Failed example:
2253 favorite_color
2254 Exception raised:
2255 ...
2256 NameError: name 'favorite_color' is not defined
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002257 TestResults(failed=1, attempted=2)
Edward Loper052d0cd2004-09-19 17:19:33 +00002258 >>> doctest.master = None # Reset master.
2259
2260The optional keyword argument `raise_on_error` can be used to raise an
2261exception on the first error (which may be useful for postmortem
2262debugging):
2263
2264 >>> doctest.testfile('test_doctest.txt', raise_on_error=True)
2265 ... # doctest: +ELLIPSIS
2266 Traceback (most recent call last):
2267 UnexpectedException: ...
2268 >>> doctest.master = None # Reset master.
George Yoshidaf3c65de2006-05-28 16:39:09 +00002269
2270If the tests contain non-ASCII characters, the tests might fail, since
2271it's unknown which encoding is used. The encoding can be specified
2272using the optional keyword argument `encoding`:
2273
2274 >>> doctest.testfile('test_doctest4.txt') # doctest: +ELLIPSIS
2275 **********************************************************************
2276 File "...", line 7, in test_doctest4.txt
2277 Failed example:
2278 u'...'
2279 Expected:
2280 u'f\xf6\xf6'
2281 Got:
2282 u'f\xc3\xb6\xc3\xb6'
2283 **********************************************************************
2284 ...
2285 **********************************************************************
2286 1 items had failures:
2287 2 of 4 in test_doctest4.txt
2288 ***Test Failed*** 2 failures.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002289 TestResults(failed=2, attempted=4)
George Yoshidaf3c65de2006-05-28 16:39:09 +00002290 >>> doctest.master = None # Reset master.
2291
2292 >>> doctest.testfile('test_doctest4.txt', encoding='utf-8')
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002293 TestResults(failed=0, attempted=4)
George Yoshidaf3c65de2006-05-28 16:39:09 +00002294 >>> doctest.master = None # Reset master.
Florent Xicluna2a903b22010-02-27 13:31:23 +00002295
2296Switch the module encoding to 'utf-8' to test the verbose output without
2297bothering with the current sys.stdout encoding.
2298
2299 >>> doctest._encoding, saved_encoding = 'utf-8', doctest._encoding
2300 >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True)
2301 Trying:
2302 u'föö'
2303 Expecting:
2304 u'f\xf6\xf6'
2305 ok
2306 Trying:
2307 u'bąr'
2308 Expecting:
2309 u'b\u0105r'
2310 ok
2311 Trying:
2312 'föö'
2313 Expecting:
2314 'f\xc3\xb6\xc3\xb6'
2315 ok
2316 Trying:
2317 'bąr'
2318 Expecting:
2319 'b\xc4\x85r'
2320 ok
2321 1 items passed all tests:
2322 4 tests in test_doctest4.txt
2323 4 tests in 1 items.
2324 4 passed and 0 failed.
2325 Test passed.
2326 TestResults(failed=0, attempted=4)
2327 >>> doctest._encoding = saved_encoding
2328 >>> doctest.master = None # Reset master.
2329 >>> sys.argv = save_argv
Edward Loper052d0cd2004-09-19 17:19:33 +00002330"""
2331
Tim Petersa7def722004-08-23 22:13:22 +00002332# old_test1, ... used to live in doctest.py, but cluttered it. Note
2333# that these use the deprecated doctest.Tester, so should go away (or
2334# be rewritten) someday.
2335
2336# Ignore all warnings about the use of class Tester in this module.
2337# Note that the name of this module may differ depending on how it's
2338# imported, so the use of __name__ is important.
2339warnings.filterwarnings("ignore", "class Tester", DeprecationWarning,
2340 __name__, 0)
2341
2342def old_test1(): r"""
2343>>> from doctest import Tester
2344>>> t = Tester(globs={'x': 42}, verbose=0)
2345>>> t.runstring(r'''
2346... >>> x = x * 2
2347... >>> print x
2348... 42
2349... ''', 'XYZ')
2350**********************************************************************
2351Line 3, in XYZ
2352Failed example:
2353 print x
2354Expected:
2355 42
2356Got:
2357 84
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002358TestResults(failed=1, attempted=2)
Tim Petersa7def722004-08-23 22:13:22 +00002359>>> t.runstring(">>> x = x * 2\n>>> print x\n84\n", 'example2')
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002360TestResults(failed=0, attempted=2)
Tim Petersa7def722004-08-23 22:13:22 +00002361>>> t.summarize()
2362**********************************************************************
23631 items had failures:
2364 1 of 2 in XYZ
2365***Test Failed*** 1 failures.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002366TestResults(failed=1, attempted=4)
Tim Petersa7def722004-08-23 22:13:22 +00002367>>> t.summarize(verbose=1)
23681 items passed all tests:
2369 2 tests in example2
2370**********************************************************************
23711 items had failures:
2372 1 of 2 in XYZ
23734 tests in 2 items.
23743 passed and 1 failed.
2375***Test Failed*** 1 failures.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002376TestResults(failed=1, attempted=4)
Tim Petersa7def722004-08-23 22:13:22 +00002377"""
2378
2379def old_test2(): r"""
2380 >>> from doctest import Tester
2381 >>> t = Tester(globs={}, verbose=1)
2382 >>> test = r'''
2383 ... # just an example
2384 ... >>> x = 1 + 2
2385 ... >>> x
2386 ... 3
2387 ... '''
2388 >>> t.runstring(test, "Example")
2389 Running string Example
Edward Loperaacf0832004-08-26 01:19:50 +00002390 Trying:
2391 x = 1 + 2
2392 Expecting nothing
Tim Petersa7def722004-08-23 22:13:22 +00002393 ok
Edward Loperaacf0832004-08-26 01:19:50 +00002394 Trying:
2395 x
2396 Expecting:
2397 3
Tim Petersa7def722004-08-23 22:13:22 +00002398 ok
2399 0 of 2 examples failed in string Example
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002400 TestResults(failed=0, attempted=2)
Tim Petersa7def722004-08-23 22:13:22 +00002401"""
2402
2403def old_test3(): r"""
2404 >>> from doctest import Tester
2405 >>> t = Tester(globs={}, verbose=0)
2406 >>> def _f():
2407 ... '''Trivial docstring example.
2408 ... >>> assert 2 == 2
2409 ... '''
2410 ... return 32
2411 ...
2412 >>> t.rundoc(_f) # expect 0 failures in 1 example
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002413 TestResults(failed=0, attempted=1)
Tim Petersa7def722004-08-23 22:13:22 +00002414"""
2415
2416def old_test4(): """
Christian Heimesc756d002007-11-27 21:34:01 +00002417 >>> import types
2418 >>> m1 = types.ModuleType('_m1')
2419 >>> m2 = types.ModuleType('_m2')
Tim Petersa7def722004-08-23 22:13:22 +00002420 >>> test_data = \"""
2421 ... def _f():
2422 ... '''>>> assert 1 == 1
2423 ... '''
2424 ... def g():
2425 ... '''>>> assert 2 != 1
2426 ... '''
2427 ... class H:
2428 ... '''>>> assert 2 > 1
2429 ... '''
2430 ... def bar(self):
2431 ... '''>>> assert 1 < 2
2432 ... '''
2433 ... \"""
2434 >>> exec test_data in m1.__dict__
2435 >>> exec test_data in m2.__dict__
2436 >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H})
2437
2438 Tests that objects outside m1 are excluded:
2439
2440 >>> from doctest import Tester
2441 >>> t = Tester(globs={}, verbose=0)
2442 >>> t.rundict(m1.__dict__, "rundict_test", m1) # f2 and g2 and h2 skipped
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002443 TestResults(failed=0, attempted=4)
Tim Petersa7def722004-08-23 22:13:22 +00002444
2445 Once more, not excluding stuff outside m1:
2446
2447 >>> t = Tester(globs={}, verbose=0)
2448 >>> t.rundict(m1.__dict__, "rundict_test_pvt") # None are skipped.
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002449 TestResults(failed=0, attempted=8)
Tim Petersa7def722004-08-23 22:13:22 +00002450
2451 The exclusion of objects from outside the designated module is
2452 meant to be invoked automagically by testmod.
2453
2454 >>> doctest.testmod(m1, verbose=False)
Raymond Hettingerfff4e6e2008-01-11 01:25:54 +00002455 TestResults(failed=0, attempted=4)
Tim Petersa7def722004-08-23 22:13:22 +00002456"""
2457
Tim Peters8485b562004-08-04 18:46:34 +00002458######################################################################
2459## Main
2460######################################################################
2461
2462def test_main():
2463 # Check the doctest cases in doctest itself:
2464 test_support.run_doctest(doctest, verbosity=True)
2465 # Check the doctest cases defined here:
2466 from test import test_doctest
2467 test_support.run_doctest(test_doctest, verbosity=True)
2468
Christian Heimesc5f05e42008-02-23 17:40:11 +00002469import trace, sys
Tim Peters8485b562004-08-04 18:46:34 +00002470def test_coverage(coverdir):
2471 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
2472 trace=0, count=1)
2473 tracer.run('reload(doctest); test_main()')
2474 r = tracer.results()
2475 print 'Writing coverage results...'
2476 r.write_results(show_missing=True, summary=True,
2477 coverdir=coverdir)
2478
2479if __name__ == '__main__':
2480 if '-c' in sys.argv:
2481 test_coverage('/tmp/doctest.cover')
2482 else:
2483 test_main()