blob: dfd8bb9275e6682f16b863d677bbec37478634c5 [file] [log] [blame]
Tim Peters4fd9e2f2001-08-18 00:05:50 +00001# Module doctest.
Tim Peters8485b562004-08-04 18:46:34 +00002# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
Tim Peters19397e52004-08-06 22:02:59 +00003# Major enhancements and refactoring by:
Tim Peters8485b562004-08-04 18:46:34 +00004# Jim Fulton
5# Edward Loper
Tim Peters8a7d2d52001-01-16 07:10:57 +00006
7# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
8
Martin v. Löwis92816de2004-05-31 19:01:00 +00009r"""Module doctest -- a framework for running examples in docstrings.
Tim Peters8a7d2d52001-01-16 07:10:57 +000010
Tim Peters80e53142004-08-09 04:34:45 +000011In simplest use, end each module M to be tested with:
Tim Peters8a7d2d52001-01-16 07:10:57 +000012
13def _test():
Tim Peters80e53142004-08-09 04:34:45 +000014 import doctest
Tim Peters48983fc2004-09-25 02:41:28 +000015 doctest.testmod()
Tim Peters8a7d2d52001-01-16 07:10:57 +000016
17if __name__ == "__main__":
18 _test()
19
20Then running the module as a script will cause the examples in the
21docstrings to get executed and verified:
22
23python M.py
24
25This won't display anything unless an example fails, in which case the
26failing example(s) and the cause(s) of the failure(s) are printed to stdout
27(why not stderr? because stderr is a lame hack <0.2 wink>), and the final
28line of output is "Test failed.".
29
30Run it with the -v switch instead:
31
32python M.py -v
33
34and a detailed report of all examples tried is printed to stdout, along
35with assorted summaries at the end.
36
Tim Peters80e53142004-08-09 04:34:45 +000037You can force verbose mode by passing "verbose=True" to testmod, or prohibit
38it by passing "verbose=False". In either of those cases, sys.argv is not
Tim Peters8a7d2d52001-01-16 07:10:57 +000039examined by testmod.
40
Tim Peters80e53142004-08-09 04:34:45 +000041There are a variety of other ways to run doctests, including integration
42with the unittest framework, and support for running non-Python text
43files containing doctests. There are also many ways to override parts
44of doctest's default behaviors. See the Library Reference Manual for
45details.
Tim Peters8a7d2d52001-01-16 07:10:57 +000046"""
Tim Peters48983fc2004-09-25 02:41:28 +000047
Edward Loper8e4a34b2004-08-12 02:34:27 +000048__docformat__ = 'reStructuredText en'
Tim Peters8a7d2d52001-01-16 07:10:57 +000049
Tim Peters4fd9e2f2001-08-18 00:05:50 +000050__all__ = [
Edward Loperb7503ff2004-08-19 19:19:03 +000051 # 0, Option Flags
52 'register_optionflag',
53 'DONT_ACCEPT_TRUE_FOR_1',
54 'DONT_ACCEPT_BLANKLINE',
55 'NORMALIZE_WHITESPACE',
56 'ELLIPSIS',
Tim Peters1fbf9c52004-09-04 17:21:02 +000057 'IGNORE_EXCEPTION_DETAIL',
Edward Loperaec3c9b2004-09-28 04:29:57 +000058 'NORMALIZE_NUMBERS',
Tim Petersba601962004-09-04 15:04:06 +000059 'COMPARISON_FLAGS',
Edward Loper71f55af2004-08-26 01:41:51 +000060 'REPORT_UDIFF',
61 'REPORT_CDIFF',
62 'REPORT_NDIFF',
Jim Fultonf54bad42004-08-28 14:57:56 +000063 'REPORT_ONLY_FIRST_FAILURE',
Tim Petersba601962004-09-04 15:04:06 +000064 'REPORTING_FLAGS',
Edward Loperb7503ff2004-08-19 19:19:03 +000065 # 1. Utility Functions
Tim Peters8485b562004-08-04 18:46:34 +000066 'is_private',
Edward Loperb7503ff2004-08-19 19:19:03 +000067 # 2. Example & DocTest
Tim Peters8485b562004-08-04 18:46:34 +000068 'Example',
69 'DocTest',
Edward Loperb7503ff2004-08-19 19:19:03 +000070 # 3. Doctest Parser
71 'DocTestParser',
72 # 4. Doctest Finder
Tim Peters8485b562004-08-04 18:46:34 +000073 'DocTestFinder',
Edward Loperb7503ff2004-08-19 19:19:03 +000074 # 5. Doctest Runner
Tim Peters8485b562004-08-04 18:46:34 +000075 'DocTestRunner',
Edward Loperb7503ff2004-08-19 19:19:03 +000076 'OutputChecker',
77 'DocTestFailure',
78 'UnexpectedException',
79 'DebugRunner',
80 # 6. Test Functions
Tim Peters4fd9e2f2001-08-18 00:05:50 +000081 'testmod',
Edward Loper052d0cd2004-09-19 17:19:33 +000082 'testfile',
Tim Peters4fd9e2f2001-08-18 00:05:50 +000083 'run_docstring_examples',
Edward Loperb7503ff2004-08-19 19:19:03 +000084 # 7. Tester
Tim Peters4fd9e2f2001-08-18 00:05:50 +000085 'Tester',
Edward Loperb7503ff2004-08-19 19:19:03 +000086 # 8. Unittest Support
Tim Petersdb3756d2003-06-29 05:30:48 +000087 'DocTestSuite',
Edward Loperb7503ff2004-08-19 19:19:03 +000088 'DocFileSuite',
Tim Peters9d02a7c2004-09-26 01:50:24 +000089 'set_unittest_reportflags',
Edward Loperb7503ff2004-08-19 19:19:03 +000090 # 9. Debugging Support
91 'script_from_examples',
Tim Petersdb3756d2003-06-29 05:30:48 +000092 'testsource',
Edward Loperb7503ff2004-08-19 19:19:03 +000093 'debug_src',
Tim Petersdb3756d2003-06-29 05:30:48 +000094 'debug',
Tim Peters4fd9e2f2001-08-18 00:05:50 +000095]
Tim Peters8a7d2d52001-01-16 07:10:57 +000096
Tim Peters4fd9e2f2001-08-18 00:05:50 +000097import __future__
Tim Peters8a7d2d52001-01-16 07:10:57 +000098
Tim Peters19397e52004-08-06 22:02:59 +000099import sys, traceback, inspect, linecache, os, re, types
Jim Fulton356fd192004-08-09 11:34:47 +0000100import unittest, difflib, pdb, tempfile
Tim Petersf727c6c2004-08-08 01:48:59 +0000101import warnings
Tim Peters8485b562004-08-04 18:46:34 +0000102from StringIO import StringIO
Tim Peters7402f792001-10-02 03:53:41 +0000103
Tim Petersdd50cb72004-08-23 22:42:55 +0000104# Don't whine about the deprecated is_private function in this
105# module's tests.
106warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
107 __name__, 0)
108
Jim Fulton356fd192004-08-09 11:34:47 +0000109real_pdb_set_trace = pdb.set_trace
110
Tim Peters19397e52004-08-06 22:02:59 +0000111# There are 4 basic classes:
112# - Example: a <source, want> pair, plus an intra-docstring line number.
113# - DocTest: a collection of examples, parsed from a docstring, plus
114# info about where the docstring came from (name, filename, lineno).
115# - DocTestFinder: extracts DocTests from a given object's docstring and
116# its contained objects' docstrings.
117# - DocTestRunner: runs DocTest cases, and accumulates statistics.
118#
119# So the basic picture is:
120#
121# list of:
122# +------+ +---------+ +-------+
123# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
124# +------+ +---------+ +-------+
125# | Example |
126# | ... |
127# | Example |
128# +---------+
129
Edward Loperac20f572004-08-12 02:02:24 +0000130# Option constants.
Tim Peters38330fe2004-08-30 16:19:24 +0000131
Edward Loperac20f572004-08-12 02:02:24 +0000132OPTIONFLAGS_BY_NAME = {}
133def register_optionflag(name):
134 flag = 1 << len(OPTIONFLAGS_BY_NAME)
135 OPTIONFLAGS_BY_NAME[name] = flag
136 return flag
137
138DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
139DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
140NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
141ELLIPSIS = register_optionflag('ELLIPSIS')
Tim Peters1fbf9c52004-09-04 17:21:02 +0000142IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
Edward Loperaec3c9b2004-09-28 04:29:57 +0000143NORMALIZE_NUMBERS = register_optionflag('NORMALIZE_NUMBERS')
Tim Peters38330fe2004-08-30 16:19:24 +0000144
145COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
146 DONT_ACCEPT_BLANKLINE |
147 NORMALIZE_WHITESPACE |
Tim Peters1fbf9c52004-09-04 17:21:02 +0000148 ELLIPSIS |
Edward Loperaec3c9b2004-09-28 04:29:57 +0000149 IGNORE_EXCEPTION_DETAIL |
150 NORMALIZE_NUMBERS)
Tim Peters38330fe2004-08-30 16:19:24 +0000151
Edward Loper71f55af2004-08-26 01:41:51 +0000152REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
153REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
154REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
Edward Lopera89f88d2004-08-26 02:45:51 +0000155REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
Edward Loperac20f572004-08-12 02:02:24 +0000156
Tim Peters38330fe2004-08-30 16:19:24 +0000157REPORTING_FLAGS = (REPORT_UDIFF |
158 REPORT_CDIFF |
159 REPORT_NDIFF |
160 REPORT_ONLY_FIRST_FAILURE)
161
Edward Loperac20f572004-08-12 02:02:24 +0000162# Special string markers for use in `want` strings:
163BLANKLINE_MARKER = '<BLANKLINE>'
164ELLIPSIS_MARKER = '...'
165
Tim Peters8485b562004-08-04 18:46:34 +0000166######################################################################
167## Table of Contents
168######################################################################
Edward Loper7c748462004-08-09 02:06:06 +0000169# 1. Utility Functions
170# 2. Example & DocTest -- store test cases
171# 3. DocTest Parser -- extracts examples from strings
172# 4. DocTest Finder -- extracts test cases from objects
173# 5. DocTest Runner -- runs test cases
174# 6. Test Functions -- convenient wrappers for testing
175# 7. Tester Class -- for backwards compatibility
176# 8. Unittest Support
177# 9. Debugging Support
178# 10. Example Usage
Tim Peters8a7d2d52001-01-16 07:10:57 +0000179
Tim Peters8485b562004-08-04 18:46:34 +0000180######################################################################
181## 1. Utility Functions
182######################################################################
Tim Peters8a7d2d52001-01-16 07:10:57 +0000183
184def is_private(prefix, base):
185 """prefix, base -> true iff name prefix + "." + base is "private".
186
187 Prefix may be an empty string, and base does not contain a period.
188 Prefix is ignored (although functions you write conforming to this
189 protocol may make use of it).
190 Return true iff base begins with an (at least one) underscore, but
191 does not both begin and end with (at least) two underscores.
192
193 >>> is_private("a.b", "my_func")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000194 False
Tim Peters8a7d2d52001-01-16 07:10:57 +0000195 >>> is_private("____", "_my_func")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000196 True
Tim Peters8a7d2d52001-01-16 07:10:57 +0000197 >>> is_private("someclass", "__init__")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000198 False
Tim Peters8a7d2d52001-01-16 07:10:57 +0000199 >>> is_private("sometypo", "__init_")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000200 True
Tim Peters8a7d2d52001-01-16 07:10:57 +0000201 >>> is_private("x.y.z", "_")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000202 True
Tim Peters8a7d2d52001-01-16 07:10:57 +0000203 >>> is_private("_x.y.z", "__")
Guido van Rossum77f6a652002-04-03 22:41:51 +0000204 False
Tim Peters8a7d2d52001-01-16 07:10:57 +0000205 >>> is_private("", "") # senseless but consistent
Guido van Rossum77f6a652002-04-03 22:41:51 +0000206 False
Tim Peters8a7d2d52001-01-16 07:10:57 +0000207 """
Tim Petersbafb1fe2004-08-08 01:52:57 +0000208 warnings.warn("is_private is deprecated; it wasn't useful; "
209 "examine DocTestFinder.find() lists instead",
Tim Peters3ddd60a2004-08-08 02:43:33 +0000210 DeprecationWarning, stacklevel=2)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000211 return base[:1] == "_" and not base[:2] == "__" == base[-2:]
212
Tim Peters8485b562004-08-04 18:46:34 +0000213def _extract_future_flags(globs):
214 """
215 Return the compiler-flags associated with the future features that
216 have been imported into the given namespace (globs).
217 """
218 flags = 0
219 for fname in __future__.all_feature_names:
220 feature = globs.get(fname, None)
221 if feature is getattr(__future__, fname):
222 flags |= feature.compiler_flag
223 return flags
Tim Peters7402f792001-10-02 03:53:41 +0000224
Tim Peters8485b562004-08-04 18:46:34 +0000225def _normalize_module(module, depth=2):
226 """
227 Return the module specified by `module`. In particular:
228 - If `module` is a module, then return module.
229 - If `module` is a string, then import and return the
230 module with that name.
231 - If `module` is None, then return the calling module.
232 The calling module is assumed to be the module of
233 the stack frame at the given depth in the call stack.
234 """
235 if inspect.ismodule(module):
236 return module
237 elif isinstance(module, (str, unicode)):
238 return __import__(module, globals(), locals(), ["*"])
239 elif module is None:
240 return sys.modules[sys._getframe(depth).f_globals['__name__']]
241 else:
242 raise TypeError("Expected a module, string, or None")
Tim Peters7402f792001-10-02 03:53:41 +0000243
Edward Loperaacf0832004-08-26 01:19:50 +0000244def _indent(s, indent=4):
Tim Peters8485b562004-08-04 18:46:34 +0000245 """
Edward Loperaacf0832004-08-26 01:19:50 +0000246 Add the given number of space characters to the beginning every
247 non-blank line in `s`, and return the result.
Tim Peters8485b562004-08-04 18:46:34 +0000248 """
Edward Loperaacf0832004-08-26 01:19:50 +0000249 # This regexp matches the start of non-blank lines:
250 return re.sub('(?m)^(?!$)', indent*' ', s)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000251
Edward Loper8e4a34b2004-08-12 02:34:27 +0000252def _exception_traceback(exc_info):
253 """
254 Return a string containing a traceback message for the given
255 exc_info tuple (as returned by sys.exc_info()).
256 """
257 # Get a traceback message.
258 excout = StringIO()
259 exc_type, exc_val, exc_tb = exc_info
260 traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
261 return excout.getvalue()
262
Tim Peters8485b562004-08-04 18:46:34 +0000263# Override some StringIO methods.
264class _SpoofOut(StringIO):
265 def getvalue(self):
266 result = StringIO.getvalue(self)
267 # If anything at all was written, make sure there's a trailing
268 # newline. There's no way for the expected output to indicate
269 # that a trailing newline is missing.
270 if result and not result.endswith("\n"):
271 result += "\n"
272 # Prevent softspace from screwing up the next test case, in
273 # case they used print with a trailing comma in an example.
274 if hasattr(self, "softspace"):
275 del self.softspace
276 return result
Tim Peters8a7d2d52001-01-16 07:10:57 +0000277
Tim Peters8485b562004-08-04 18:46:34 +0000278 def truncate(self, size=None):
279 StringIO.truncate(self, size)
280 if hasattr(self, "softspace"):
281 del self.softspace
Tim Peters8a7d2d52001-01-16 07:10:57 +0000282
Edward Loperaec3c9b2004-09-28 04:29:57 +0000283# The number of digits of precision that must be equal for
284# NORMALIZE_NUMBERS to consider two numbers equal.
285_NORMALIZE_NUMBERS_PRECISION_THRESHOLD = 10
286
287# A regular expression that matches Python number literals. This is
288# used by _normalize_numbers to look for numbers that should be
289# normalized.
290_NUMBER_LITERAL = re.compile(r'''
291 (\d+[.]\d*(?:[eE][-+]?\d+)?[jJ]? | # float (w/ digits left of ".")
292 [.]\d+(?:[eE][-+]?\d+)?[jJ]? | # float (no digits left of ".")
293 \d+ (?:[eE][-+]?\d+) [jJ]? | # float (no ".", exponent only)
294 \d [jJ] | # float (no ".", imaginary only)
295 0[xX]\d+[lL]? | # hexint
296 0[0-7]*[lL]? | # octint or zero
297 \d+[lL]? ) # decint
298 ''', re.VERBOSE)
299
300def _normalize_numbers(want, got):
301 """
302 If all the numbers in `want` and `got` match (one-for-one), then
303 return a new version of `got` with the exact number strings from
304 `want` spliced in. Two numbers match if `str` of their float
305 values are equal. (I.e., `x` matches `y` if
306 `str(float(x))==str(float(y))`).
307 """
308 want_pieces = _NUMBER_LITERAL.split(want)
309 got_pieces = _NUMBER_LITERAL.split(got)
310
311 # If they don't have the same number of numbers, fail immediately.
312 if len(want_pieces) != len(got_pieces):
313 return got
314
315 # If any individual numbers don't match, then fail.
316 for i in range(1, len(got_pieces), 2):
317 w, g = eval(want_pieces[i]), eval(got_pieces[i])
318 if not _numbers_match(w, g):
319 return got
320
321 # Success; replace numbers in got w/ numbers from want.
322 for i in range(1, len(got_pieces), 2):
323 got_pieces[i] = want_pieces[i]
324 return ''.join(got_pieces)
325
326def _numbers_match(x, y):
327 """
328 A helper function for _normalize_numbers, that returns true if the
329 numbers `x` and `y` are close enough to match for NORMALIZE_NUMBERS.
330 """
331 # Equal numbers match.
332 if x == y:
333 return True
334 # Split up complex numbers into real & imag.
335 if isinstance(x, complex):
336 return (isinstance(y, complex) and
337 _numbers_match(x.real, y.real) and
338 _numbers_match(x.imag, y.imag))
339 # If the signs are different, they don't match.
340 if x*y < 0:
341 return False
342 # If one is zero and the other isn't, they don't match.
343 if x==0 or y==0:
344 return False
345 # They're not exactly equal, but are they close enough?
346 threshold = 10**-_NORMALIZE_NUMBERS_PRECISION_THRESHOLD
347 return (abs(x-y) / min(abs(x), abs(y))) < threshold
348
Tim Peters26b3ebb2004-08-19 08:10:08 +0000349# Worst-case linear-time ellipsis matching.
Tim Petersb0a04e12004-08-20 02:08:04 +0000350def _ellipsis_match(want, got):
Tim Petersdc5de3b2004-08-19 14:06:20 +0000351 """
352 Essentially the only subtle case:
Tim Petersb0a04e12004-08-20 02:08:04 +0000353 >>> _ellipsis_match('aa...aa', 'aaa')
Tim Petersdc5de3b2004-08-19 14:06:20 +0000354 False
355 """
Tim Peters26b3ebb2004-08-19 08:10:08 +0000356 if ELLIPSIS_MARKER not in want:
357 return want == got
Tim Petersdc5de3b2004-08-19 14:06:20 +0000358
Tim Peters26b3ebb2004-08-19 08:10:08 +0000359 # Find "the real" strings.
360 ws = want.split(ELLIPSIS_MARKER)
361 assert len(ws) >= 2
Tim Peters26b3ebb2004-08-19 08:10:08 +0000362
Tim Petersdc5de3b2004-08-19 14:06:20 +0000363 # Deal with exact matches possibly needed at one or both ends.
364 startpos, endpos = 0, len(got)
365 w = ws[0]
366 if w: # starts with exact match
367 if got.startswith(w):
368 startpos = len(w)
369 del ws[0]
370 else:
371 return False
372 w = ws[-1]
373 if w: # ends with exact match
374 if got.endswith(w):
375 endpos -= len(w)
376 del ws[-1]
377 else:
378 return False
379
380 if startpos > endpos:
381 # Exact end matches required more characters than we have, as in
Tim Petersb0a04e12004-08-20 02:08:04 +0000382 # _ellipsis_match('aa...aa', 'aaa')
Tim Petersdc5de3b2004-08-19 14:06:20 +0000383 return False
384
385 # For the rest, we only need to find the leftmost non-overlapping
386 # match for each piece. If there's no overall match that way alone,
387 # there's no overall match period.
Tim Peters26b3ebb2004-08-19 08:10:08 +0000388 for w in ws:
389 # w may be '' at times, if there are consecutive ellipses, or
390 # due to an ellipsis at the start or end of `want`. That's OK.
Tim Petersdc5de3b2004-08-19 14:06:20 +0000391 # Search for an empty string succeeds, and doesn't change startpos.
392 startpos = got.find(w, startpos, endpos)
393 if startpos < 0:
Tim Peters26b3ebb2004-08-19 08:10:08 +0000394 return False
Tim Petersdc5de3b2004-08-19 14:06:20 +0000395 startpos += len(w)
Tim Peters26b3ebb2004-08-19 08:10:08 +0000396
Tim Petersdc5de3b2004-08-19 14:06:20 +0000397 return True
Tim Peters26b3ebb2004-08-19 08:10:08 +0000398
Edward Loper00f8da72004-08-26 18:05:07 +0000399def _comment_line(line):
400 "Return a commented form of the given line"
401 line = line.rstrip()
402 if line:
403 return '# '+line
404 else:
405 return '#'
406
Edward Loper2de91ba2004-08-27 02:07:46 +0000407class _OutputRedirectingPdb(pdb.Pdb):
408 """
409 A specialized version of the python debugger that redirects stdout
410 to a given stream when interacting with the user. Stdout is *not*
411 redirected when traced code is executed.
412 """
413 def __init__(self, out):
414 self.__out = out
415 pdb.Pdb.__init__(self)
416
417 def trace_dispatch(self, *args):
418 # Redirect stdout to the given stream.
419 save_stdout = sys.stdout
420 sys.stdout = self.__out
421 # Call Pdb's trace dispatch method.
422 pdb.Pdb.trace_dispatch(self, *args)
423 # Restore stdout.
424 sys.stdout = save_stdout
425
Edward Lopera2fc7ec2004-09-21 03:24:24 +0000426# [XX] Normalize with respect to os.path.pardir?
Edward Loper052d0cd2004-09-19 17:19:33 +0000427def _module_relative_path(module, path):
428 if not inspect.ismodule(module):
429 raise TypeError, 'Expected a module: %r' % module
430 if path.startswith('/'):
431 raise ValueError, 'Module-relative files may not have absolute paths'
432
433 # Find the base directory for the path.
434 if hasattr(module, '__file__'):
435 # A normal module/package
436 basedir = os.path.split(module.__file__)[0]
437 elif module.__name__ == '__main__':
438 # An interactive session.
439 if len(sys.argv)>0 and sys.argv[0] != '':
440 basedir = os.path.split(sys.argv[0])[0]
441 else:
442 basedir = os.curdir
443 else:
444 # A module w/o __file__ (this includes builtins)
445 raise ValueError("Can't resolve paths relative to the module " +
446 module + " (it has no __file__)")
447
448 # Combine the base directory and the path.
449 return os.path.join(basedir, *(path.split('/')))
450
Tim Peters8485b562004-08-04 18:46:34 +0000451######################################################################
452## 2. Example & DocTest
453######################################################################
454## - An "example" is a <source, want> pair, where "source" is a
455## fragment of source code, and "want" is the expected output for
456## "source." The Example class also includes information about
457## where the example was extracted from.
458##
Edward Lopera1ef6112004-08-09 16:14:41 +0000459## - A "doctest" is a collection of examples, typically extracted from
460## a string (such as an object's docstring). The DocTest class also
461## includes information about where the string was extracted from.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000462
Tim Peters8485b562004-08-04 18:46:34 +0000463class Example:
464 """
465 A single doctest example, consisting of source code and expected
Edward Lopera1ef6112004-08-09 16:14:41 +0000466 output. `Example` defines the following attributes:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000467
Edward Loper74bca7a2004-08-12 02:27:44 +0000468 - source: A single Python statement, always ending with a newline.
Tim Petersbb431472004-08-09 03:51:46 +0000469 The constructor adds a newline if needed.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000470
Edward Loper74bca7a2004-08-12 02:27:44 +0000471 - want: The expected output from running the source code (either
Tim Petersbb431472004-08-09 03:51:46 +0000472 from stdout, or a traceback in case of exception). `want` ends
473 with a newline unless it's empty, in which case it's an empty
474 string. The constructor adds a newline if needed.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000475
Edward Lopera6b68322004-08-26 00:05:43 +0000476 - exc_msg: The exception message generated by the example, if
477 the example is expected to generate an exception; or `None` if
478 it is not expected to generate an exception. This exception
479 message is compared against the return value of
480 `traceback.format_exception_only()`. `exc_msg` ends with a
481 newline unless it's `None`. The constructor adds a newline
482 if needed.
483
Edward Loper74bca7a2004-08-12 02:27:44 +0000484 - lineno: The line number within the DocTest string containing
Tim Peters8485b562004-08-04 18:46:34 +0000485 this Example where the Example begins. This line number is
486 zero-based, with respect to the beginning of the DocTest.
Edward Loper74bca7a2004-08-12 02:27:44 +0000487
488 - indent: The example's indentation in the DocTest string.
489 I.e., the number of space characters that preceed the
490 example's first prompt.
491
492 - options: A dictionary mapping from option flags to True or
493 False, which is used to override default options for this
494 example. Any option flags not contained in this dictionary
495 are left at their default value (as specified by the
496 DocTestRunner's optionflags). By default, no options are set.
Tim Peters8485b562004-08-04 18:46:34 +0000497 """
Edward Lopera6b68322004-08-26 00:05:43 +0000498 def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
499 options=None):
Tim Petersbb431472004-08-09 03:51:46 +0000500 # Normalize inputs.
501 if not source.endswith('\n'):
502 source += '\n'
503 if want and not want.endswith('\n'):
504 want += '\n'
Edward Lopera6b68322004-08-26 00:05:43 +0000505 if exc_msg is not None and not exc_msg.endswith('\n'):
506 exc_msg += '\n'
Tim Peters8485b562004-08-04 18:46:34 +0000507 # Store properties.
508 self.source = source
509 self.want = want
510 self.lineno = lineno
Edward Loper74bca7a2004-08-12 02:27:44 +0000511 self.indent = indent
512 if options is None: options = {}
513 self.options = options
Edward Lopera6b68322004-08-26 00:05:43 +0000514 self.exc_msg = exc_msg
Tim Peters8a7d2d52001-01-16 07:10:57 +0000515
Tim Peters8485b562004-08-04 18:46:34 +0000516class DocTest:
517 """
518 A collection of doctest examples that should be run in a single
Edward Lopera1ef6112004-08-09 16:14:41 +0000519 namespace. Each `DocTest` defines the following attributes:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000520
Tim Peters8485b562004-08-04 18:46:34 +0000521 - examples: the list of examples.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000522
Tim Peters8485b562004-08-04 18:46:34 +0000523 - globs: The namespace (aka globals) that the examples should
524 be run in.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000525
Tim Peters8485b562004-08-04 18:46:34 +0000526 - name: A name identifying the DocTest (typically, the name of
527 the object whose docstring this DocTest was extracted from).
Tim Peters8a7d2d52001-01-16 07:10:57 +0000528
Tim Peters8485b562004-08-04 18:46:34 +0000529 - filename: The name of the file that this DocTest was extracted
Edward Lopera1ef6112004-08-09 16:14:41 +0000530 from, or `None` if the filename is unknown.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000531
Tim Peters8485b562004-08-04 18:46:34 +0000532 - lineno: The line number within filename where this DocTest
Edward Lopera1ef6112004-08-09 16:14:41 +0000533 begins, or `None` if the line number is unavailable. This
534 line number is zero-based, with respect to the beginning of
535 the file.
536
537 - docstring: The string that the examples were extracted from,
538 or `None` if the string is unavailable.
Tim Peters8485b562004-08-04 18:46:34 +0000539 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000540 def __init__(self, examples, globs, name, filename, lineno, docstring):
Tim Peters8485b562004-08-04 18:46:34 +0000541 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000542 Create a new DocTest containing the given examples. The
543 DocTest's globals are initialized with a copy of `globs`.
Tim Peters8485b562004-08-04 18:46:34 +0000544 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000545 assert not isinstance(examples, basestring), \
546 "DocTest no longer accepts str; use DocTestParser instead"
547 self.examples = examples
548 self.docstring = docstring
Tim Peters8485b562004-08-04 18:46:34 +0000549 self.globs = globs.copy()
Tim Peters8485b562004-08-04 18:46:34 +0000550 self.name = name
551 self.filename = filename
552 self.lineno = lineno
Tim Peters8485b562004-08-04 18:46:34 +0000553
554 def __repr__(self):
555 if len(self.examples) == 0:
556 examples = 'no examples'
557 elif len(self.examples) == 1:
558 examples = '1 example'
559 else:
560 examples = '%d examples' % len(self.examples)
561 return ('<DocTest %s from %s:%s (%s)>' %
562 (self.name, self.filename, self.lineno, examples))
563
564
565 # This lets us sort tests by name:
566 def __cmp__(self, other):
567 if not isinstance(other, DocTest):
568 return -1
569 return cmp((self.name, self.filename, self.lineno, id(self)),
570 (other.name, other.filename, other.lineno, id(other)))
571
572######################################################################
Edward Loperb7503ff2004-08-19 19:19:03 +0000573## 3. DocTestParser
Edward Loper7c748462004-08-09 02:06:06 +0000574######################################################################
575
Edward Lopera1ef6112004-08-09 16:14:41 +0000576class DocTestParser:
Edward Loper7c748462004-08-09 02:06:06 +0000577 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000578 A class used to parse strings containing doctest examples.
Edward Loper7c748462004-08-09 02:06:06 +0000579 """
Edward Loper8e4a34b2004-08-12 02:34:27 +0000580 # This regular expression is used to find doctest examples in a
581 # string. It defines three groups: `source` is the source code
582 # (including leading indentation and prompts); `indent` is the
583 # indentation of the first (PS1) line of the source code; and
584 # `want` is the expected output (including leading indentation).
Edward Loper7c748462004-08-09 02:06:06 +0000585 _EXAMPLE_RE = re.compile(r'''
Tim Petersd40a92b2004-08-09 03:28:45 +0000586 # Source consists of a PS1 line followed by zero or more PS2 lines.
587 (?P<source>
588 (?:^(?P<indent> [ ]*) >>> .*) # PS1 line
589 (?:\n [ ]* \.\.\. .*)*) # PS2 lines
590 \n?
591 # Want consists of any non-blank lines that do not start with PS1.
592 (?P<want> (?:(?![ ]*$) # Not a blank line
593 (?![ ]*>>>) # Not a line starting with PS1
594 .*$\n? # But any other line
595 )*)
596 ''', re.MULTILINE | re.VERBOSE)
Edward Loper8e4a34b2004-08-12 02:34:27 +0000597
Edward Lopera6b68322004-08-26 00:05:43 +0000598 # A regular expression for handling `want` strings that contain
599 # expected exceptions. It divides `want` into three pieces:
600 # - the traceback header line (`hdr`)
601 # - the traceback stack (`stack`)
602 # - the exception message (`msg`), as generated by
603 # traceback.format_exception_only()
604 # `msg` may have multiple lines. We assume/require that the
605 # exception message is the first non-indented line starting with a word
606 # character following the traceback header line.
607 _EXCEPTION_RE = re.compile(r"""
608 # Grab the traceback header. Different versions of Python have
609 # said different things on the first traceback line.
610 ^(?P<hdr> Traceback\ \(
611 (?: most\ recent\ call\ last
612 | innermost\ last
613 ) \) :
614 )
615 \s* $ # toss trailing whitespace on the header.
616 (?P<stack> .*?) # don't blink: absorb stuff until...
617 ^ (?P<msg> \w+ .*) # a line *starts* with alphanum.
618 """, re.VERBOSE | re.MULTILINE | re.DOTALL)
619
Tim Peters7ea48dd2004-08-13 01:52:59 +0000620 # A callable returning a true value iff its argument is a blank line
621 # or contains a single comment.
Edward Loper8e4a34b2004-08-12 02:34:27 +0000622 _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
Edward Loper7c748462004-08-09 02:06:06 +0000623
Edward Loper00f8da72004-08-26 18:05:07 +0000624 def parse(self, string, name='<string>'):
625 """
626 Divide the given string into examples and intervening text,
627 and return them as a list of alternating Examples and strings.
628 Line numbers for the Examples are 0-based. The optional
629 argument `name` is a name identifying this string, and is only
630 used for error messages.
631 """
632 string = string.expandtabs()
633 # If all lines begin with the same indentation, then strip it.
634 min_indent = self._min_indent(string)
635 if min_indent > 0:
636 string = '\n'.join([l[min_indent:] for l in string.split('\n')])
637
638 output = []
639 charno, lineno = 0, 0
640 # Find all doctest examples in the string:
Edward Loper2de91ba2004-08-27 02:07:46 +0000641 for m in self._EXAMPLE_RE.finditer(string):
Edward Loper00f8da72004-08-26 18:05:07 +0000642 # Add the pre-example text to `output`.
643 output.append(string[charno:m.start()])
644 # Update lineno (lines before this example)
645 lineno += string.count('\n', charno, m.start())
646 # Extract info from the regexp match.
647 (source, options, want, exc_msg) = \
648 self._parse_example(m, name, lineno)
649 # Create an Example, and add it to the list.
650 if not self._IS_BLANK_OR_COMMENT(source):
651 output.append( Example(source, want, exc_msg,
652 lineno=lineno,
653 indent=min_indent+len(m.group('indent')),
654 options=options) )
655 # Update lineno (lines inside this example)
656 lineno += string.count('\n', m.start(), m.end())
657 # Update charno.
658 charno = m.end()
659 # Add any remaining post-example text to `output`.
660 output.append(string[charno:])
661 return output
662
Edward Lopera1ef6112004-08-09 16:14:41 +0000663 def get_doctest(self, string, globs, name, filename, lineno):
Edward Loper7c748462004-08-09 02:06:06 +0000664 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000665 Extract all doctest examples from the given string, and
666 collect them into a `DocTest` object.
667
668 `globs`, `name`, `filename`, and `lineno` are attributes for
669 the new `DocTest` object. See the documentation for `DocTest`
670 for more information.
671 """
672 return DocTest(self.get_examples(string, name), globs,
673 name, filename, lineno, string)
674
675 def get_examples(self, string, name='<string>'):
676 """
677 Extract all doctest examples from the given string, and return
678 them as a list of `Example` objects. Line numbers are
679 0-based, because it's most common in doctests that nothing
680 interesting appears on the same line as opening triple-quote,
681 and so the first interesting line is called \"line 1\" then.
682
683 The optional argument `name` is a name identifying this
684 string, and is only used for error messages.
Edward Loper7c748462004-08-09 02:06:06 +0000685 """
Edward Loper00f8da72004-08-26 18:05:07 +0000686 return [x for x in self.parse(string, name)
687 if isinstance(x, Example)]
Edward Loper7c748462004-08-09 02:06:06 +0000688
Edward Loper74bca7a2004-08-12 02:27:44 +0000689 def _parse_example(self, m, name, lineno):
690 """
691 Given a regular expression match from `_EXAMPLE_RE` (`m`),
692 return a pair `(source, want)`, where `source` is the matched
693 example's source code (with prompts and indentation stripped);
694 and `want` is the example's expected output (with indentation
695 stripped).
696
697 `name` is the string's name, and `lineno` is the line number
698 where the example starts; both are used for error messages.
699 """
Edward Loper7c748462004-08-09 02:06:06 +0000700 # Get the example's indentation level.
701 indent = len(m.group('indent'))
702
703 # Divide source into lines; check that they're properly
704 # indented; and then strip their indentation & prompts.
705 source_lines = m.group('source').split('\n')
Edward Lopera1ef6112004-08-09 16:14:41 +0000706 self._check_prompt_blank(source_lines, indent, name, lineno)
Tim Petersc5049152004-08-22 17:34:58 +0000707 self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
Edward Loper7c748462004-08-09 02:06:06 +0000708 source = '\n'.join([sl[indent+4:] for sl in source_lines])
Edward Loper7c748462004-08-09 02:06:06 +0000709
Tim Petersc5049152004-08-22 17:34:58 +0000710 # Divide want into lines; check that it's properly indented; and
711 # then strip the indentation. Spaces before the last newline should
712 # be preserved, so plain rstrip() isn't good enough.
Jim Fulton07a349c2004-08-22 14:10:00 +0000713 want = m.group('want')
Jim Fulton07a349c2004-08-22 14:10:00 +0000714 want_lines = want.split('\n')
Tim Petersc5049152004-08-22 17:34:58 +0000715 if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
716 del want_lines[-1] # forget final newline & spaces after it
Edward Lopera1ef6112004-08-09 16:14:41 +0000717 self._check_prefix(want_lines, ' '*indent, name,
Tim Petersc5049152004-08-22 17:34:58 +0000718 lineno + len(source_lines))
Edward Loper7c748462004-08-09 02:06:06 +0000719 want = '\n'.join([wl[indent:] for wl in want_lines])
Edward Loper7c748462004-08-09 02:06:06 +0000720
Edward Lopera6b68322004-08-26 00:05:43 +0000721 # If `want` contains a traceback message, then extract it.
722 m = self._EXCEPTION_RE.match(want)
723 if m:
724 exc_msg = m.group('msg')
725 else:
726 exc_msg = None
727
Edward Loper00f8da72004-08-26 18:05:07 +0000728 # Extract options from the source.
729 options = self._find_options(source, name, lineno)
730
731 return source, options, want, exc_msg
Edward Loper7c748462004-08-09 02:06:06 +0000732
Edward Loper74bca7a2004-08-12 02:27:44 +0000733 # This regular expression looks for option directives in the
734 # source code of an example. Option directives are comments
735 # starting with "doctest:". Warning: this may give false
736 # positives for string-literals that contain the string
737 # "#doctest:". Eliminating these false positives would require
738 # actually parsing the string; but we limit them by ignoring any
739 # line containing "#doctest:" that is *followed* by a quote mark.
740 _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
741 re.MULTILINE)
742
743 def _find_options(self, source, name, lineno):
744 """
745 Return a dictionary containing option overrides extracted from
746 option directives in the given source string.
747
748 `name` is the string's name, and `lineno` is the line number
749 where the example starts; both are used for error messages.
750 """
751 options = {}
752 # (note: with the current regexp, this will match at most once:)
753 for m in self._OPTION_DIRECTIVE_RE.finditer(source):
754 option_strings = m.group(1).replace(',', ' ').split()
755 for option in option_strings:
756 if (option[0] not in '+-' or
757 option[1:] not in OPTIONFLAGS_BY_NAME):
758 raise ValueError('line %r of the doctest for %s '
759 'has an invalid option: %r' %
760 (lineno+1, name, option))
761 flag = OPTIONFLAGS_BY_NAME[option[1:]]
762 options[flag] = (option[0] == '+')
763 if options and self._IS_BLANK_OR_COMMENT(source):
764 raise ValueError('line %r of the doctest for %s has an option '
765 'directive on a line with no example: %r' %
766 (lineno, name, source))
767 return options
768
Edward Lopera5db6002004-08-12 02:41:30 +0000769 # This regular expression finds the indentation of every non-blank
770 # line in a string.
Edward Loper00f8da72004-08-26 18:05:07 +0000771 _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
Edward Lopera5db6002004-08-12 02:41:30 +0000772
773 def _min_indent(self, s):
774 "Return the minimum indentation of any non-blank line in `s`"
Edward Loper00f8da72004-08-26 18:05:07 +0000775 indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
776 if len(indents) > 0:
777 return min(indents)
Tim Petersdd0e4752004-08-09 03:31:56 +0000778 else:
Edward Loper00f8da72004-08-26 18:05:07 +0000779 return 0
Edward Loper7c748462004-08-09 02:06:06 +0000780
Edward Lopera1ef6112004-08-09 16:14:41 +0000781 def _check_prompt_blank(self, lines, indent, name, lineno):
Edward Loper74bca7a2004-08-12 02:27:44 +0000782 """
783 Given the lines of a source string (including prompts and
784 leading indentation), check to make sure that every prompt is
785 followed by a space character. If any line is not followed by
786 a space character, then raise ValueError.
787 """
Edward Loper7c748462004-08-09 02:06:06 +0000788 for i, line in enumerate(lines):
789 if len(line) >= indent+4 and line[indent+3] != ' ':
790 raise ValueError('line %r of the docstring for %s '
791 'lacks blank after %s: %r' %
Edward Lopera1ef6112004-08-09 16:14:41 +0000792 (lineno+i+1, name,
Edward Loper7c748462004-08-09 02:06:06 +0000793 line[indent:indent+3], line))
794
Edward Lopera1ef6112004-08-09 16:14:41 +0000795 def _check_prefix(self, lines, prefix, name, lineno):
Edward Loper74bca7a2004-08-12 02:27:44 +0000796 """
797 Check that every line in the given list starts with the given
798 prefix; if any line does not, then raise a ValueError.
799 """
Edward Loper7c748462004-08-09 02:06:06 +0000800 for i, line in enumerate(lines):
801 if line and not line.startswith(prefix):
802 raise ValueError('line %r of the docstring for %s has '
803 'inconsistent leading whitespace: %r' %
Edward Lopera1ef6112004-08-09 16:14:41 +0000804 (lineno+i+1, name, line))
Edward Loper7c748462004-08-09 02:06:06 +0000805
806
807######################################################################
808## 4. DocTest Finder
Tim Peters8485b562004-08-04 18:46:34 +0000809######################################################################
810
811class DocTestFinder:
812 """
813 A class used to extract the DocTests that are relevant to a given
814 object, from its docstring and the docstrings of its contained
815 objects. Doctests can currently be extracted from the following
816 object types: modules, functions, classes, methods, staticmethods,
817 classmethods, and properties.
Tim Peters8485b562004-08-04 18:46:34 +0000818 """
819
Edward Lopera1ef6112004-08-09 16:14:41 +0000820 def __init__(self, verbose=False, parser=DocTestParser(),
Tim Peters958cc892004-09-13 14:53:28 +0000821 recurse=True, _namefilter=None, exclude_empty=True):
Tim Peters8485b562004-08-04 18:46:34 +0000822 """
823 Create a new doctest finder.
824
Edward Lopera1ef6112004-08-09 16:14:41 +0000825 The optional argument `parser` specifies a class or
Tim Peters19397e52004-08-06 22:02:59 +0000826 function that should be used to create new DocTest objects (or
Tim Peters161c9632004-08-08 03:38:33 +0000827 objects that implement the same interface as DocTest). The
Tim Peters19397e52004-08-06 22:02:59 +0000828 signature for this factory function should match the signature
829 of the DocTest constructor.
830
Tim Peters8485b562004-08-04 18:46:34 +0000831 If the optional argument `recurse` is false, then `find` will
832 only examine the given object, and not any contained objects.
Edward Loper32ddbf72004-09-13 05:47:24 +0000833
Tim Peters958cc892004-09-13 14:53:28 +0000834 If the optional argument `exclude_empty` is false, then `find`
835 will include tests for objects with empty docstrings.
Tim Peters8485b562004-08-04 18:46:34 +0000836 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000837 self._parser = parser
Tim Peters8485b562004-08-04 18:46:34 +0000838 self._verbose = verbose
Tim Peters8485b562004-08-04 18:46:34 +0000839 self._recurse = recurse
Edward Loper32ddbf72004-09-13 05:47:24 +0000840 self._exclude_empty = exclude_empty
Tim Petersf727c6c2004-08-08 01:48:59 +0000841 # _namefilter is undocumented, and exists only for temporary backward-
842 # compatibility support of testmod's deprecated isprivate mess.
843 self._namefilter = _namefilter
Tim Peters8485b562004-08-04 18:46:34 +0000844
845 def find(self, obj, name=None, module=None, globs=None,
Tim Petersf3f57472004-08-08 06:11:48 +0000846 extraglobs=None):
Tim Peters8485b562004-08-04 18:46:34 +0000847 """
848 Return a list of the DocTests that are defined by the given
849 object's docstring, or by any of its contained objects'
850 docstrings.
851
852 The optional parameter `module` is the module that contains
Tim Petersf3f57472004-08-08 06:11:48 +0000853 the given object. If the module is not specified or is None, then
854 the test finder will attempt to automatically determine the
Tim Peters8485b562004-08-04 18:46:34 +0000855 correct module. The object's module is used:
856
857 - As a default namespace, if `globs` is not specified.
858 - To prevent the DocTestFinder from extracting DocTests
Tim Petersf3f57472004-08-08 06:11:48 +0000859 from objects that are imported from other modules.
Tim Peters8485b562004-08-04 18:46:34 +0000860 - To find the name of the file containing the object.
861 - To help find the line number of the object within its
862 file.
863
Tim Petersf3f57472004-08-08 06:11:48 +0000864 Contained objects whose module does not match `module` are ignored.
865
866 If `module` is False, no attempt to find the module will be made.
867 This is obscure, of use mostly in tests: if `module` is False, or
868 is None but cannot be found automatically, then all objects are
869 considered to belong to the (non-existent) module, so all contained
870 objects will (recursively) be searched for doctests.
871
Tim Peters8485b562004-08-04 18:46:34 +0000872 The globals for each DocTest is formed by combining `globs`
873 and `extraglobs` (bindings in `extraglobs` override bindings
874 in `globs`). A new copy of the globals dictionary is created
875 for each DocTest. If `globs` is not specified, then it
876 defaults to the module's `__dict__`, if specified, or {}
877 otherwise. If `extraglobs` is not specified, then it defaults
878 to {}.
879
Tim Peters8485b562004-08-04 18:46:34 +0000880 """
881 # If name was not specified, then extract it from the object.
882 if name is None:
883 name = getattr(obj, '__name__', None)
884 if name is None:
885 raise ValueError("DocTestFinder.find: name must be given "
886 "when obj.__name__ doesn't exist: %r" %
887 (type(obj),))
888
889 # Find the module that contains the given object (if obj is
890 # a module, then module=obj.). Note: this may fail, in which
891 # case module will be None.
Tim Petersf3f57472004-08-08 06:11:48 +0000892 if module is False:
893 module = None
894 elif module is None:
Tim Peters8485b562004-08-04 18:46:34 +0000895 module = inspect.getmodule(obj)
896
897 # Read the module's source code. This is used by
898 # DocTestFinder._find_lineno to find the line number for a
899 # given object's docstring.
900 try:
901 file = inspect.getsourcefile(obj) or inspect.getfile(obj)
902 source_lines = linecache.getlines(file)
903 if not source_lines:
904 source_lines = None
905 except TypeError:
906 source_lines = None
907
908 # Initialize globals, and merge in extraglobs.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000909 if globs is None:
Tim Peters8485b562004-08-04 18:46:34 +0000910 if module is None:
911 globs = {}
912 else:
913 globs = module.__dict__.copy()
914 else:
915 globs = globs.copy()
916 if extraglobs is not None:
917 globs.update(extraglobs)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000918
Tim Peters8485b562004-08-04 18:46:34 +0000919 # Recursively expore `obj`, extracting DocTests.
920 tests = []
Tim Petersf3f57472004-08-08 06:11:48 +0000921 self._find(tests, obj, name, module, source_lines, globs, {})
Tim Peters8485b562004-08-04 18:46:34 +0000922 return tests
923
924 def _filter(self, obj, prefix, base):
925 """
926 Return true if the given object should not be examined.
927 """
Tim Petersf727c6c2004-08-08 01:48:59 +0000928 return (self._namefilter is not None and
929 self._namefilter(prefix, base))
Tim Peters8485b562004-08-04 18:46:34 +0000930
931 def _from_module(self, module, object):
932 """
933 Return true if the given object is defined in the given
934 module.
935 """
936 if module is None:
937 return True
938 elif inspect.isfunction(object):
939 return module.__dict__ is object.func_globals
940 elif inspect.isclass(object):
941 return module.__name__ == object.__module__
942 elif inspect.getmodule(object) is not None:
943 return module is inspect.getmodule(object)
944 elif hasattr(object, '__module__'):
945 return module.__name__ == object.__module__
946 elif isinstance(object, property):
947 return True # [XX] no way not be sure.
948 else:
949 raise ValueError("object must be a class or function")
950
Tim Petersf3f57472004-08-08 06:11:48 +0000951 def _find(self, tests, obj, name, module, source_lines, globs, seen):
Tim Peters8485b562004-08-04 18:46:34 +0000952 """
953 Find tests for the given object and any contained objects, and
954 add them to `tests`.
955 """
956 if self._verbose:
957 print 'Finding tests in %s' % name
958
959 # If we've already processed this object, then ignore it.
960 if id(obj) in seen:
961 return
962 seen[id(obj)] = 1
963
964 # Find a test for this object, and add it to the list of tests.
965 test = self._get_test(obj, name, module, globs, source_lines)
966 if test is not None:
967 tests.append(test)
968
969 # Look for tests in a module's contained objects.
970 if inspect.ismodule(obj) and self._recurse:
971 for valname, val in obj.__dict__.items():
972 # Check if this contained object should be ignored.
973 if self._filter(val, name, valname):
974 continue
975 valname = '%s.%s' % (name, valname)
976 # Recurse to functions & classes.
977 if ((inspect.isfunction(val) or inspect.isclass(val)) and
Tim Petersf3f57472004-08-08 06:11:48 +0000978 self._from_module(module, val)):
Tim Peters8485b562004-08-04 18:46:34 +0000979 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +0000980 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +0000981
982 # Look for tests in a module's __test__ dictionary.
983 if inspect.ismodule(obj) and self._recurse:
984 for valname, val in getattr(obj, '__test__', {}).items():
985 if not isinstance(valname, basestring):
986 raise ValueError("DocTestFinder.find: __test__ keys "
987 "must be strings: %r" %
988 (type(valname),))
989 if not (inspect.isfunction(val) or inspect.isclass(val) or
990 inspect.ismethod(val) or inspect.ismodule(val) or
991 isinstance(val, basestring)):
992 raise ValueError("DocTestFinder.find: __test__ values "
993 "must be strings, functions, methods, "
994 "classes, or modules: %r" %
995 (type(val),))
Tim Petersc5684782004-09-13 01:07:12 +0000996 valname = '%s.__test__.%s' % (name, valname)
Tim Peters8485b562004-08-04 18:46:34 +0000997 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +0000998 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +0000999
1000 # Look for tests in a class's contained objects.
1001 if inspect.isclass(obj) and self._recurse:
1002 for valname, val in obj.__dict__.items():
1003 # Check if this contained object should be ignored.
1004 if self._filter(val, name, valname):
1005 continue
1006 # Special handling for staticmethod/classmethod.
1007 if isinstance(val, staticmethod):
1008 val = getattr(obj, valname)
1009 if isinstance(val, classmethod):
1010 val = getattr(obj, valname).im_func
1011
1012 # Recurse to methods, properties, and nested classes.
1013 if ((inspect.isfunction(val) or inspect.isclass(val) or
Tim Petersf3f57472004-08-08 06:11:48 +00001014 isinstance(val, property)) and
1015 self._from_module(module, val)):
Tim Peters8485b562004-08-04 18:46:34 +00001016 valname = '%s.%s' % (name, valname)
1017 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +00001018 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +00001019
1020 def _get_test(self, obj, name, module, globs, source_lines):
1021 """
1022 Return a DocTest for the given object, if it defines a docstring;
1023 otherwise, return None.
1024 """
1025 # Extract the object's docstring. If it doesn't have one,
1026 # then return None (no test for this object).
1027 if isinstance(obj, basestring):
1028 docstring = obj
1029 else:
1030 try:
1031 if obj.__doc__ is None:
Edward Loper32ddbf72004-09-13 05:47:24 +00001032 docstring = ''
1033 else:
1034 docstring = str(obj.__doc__)
Tim Peters8485b562004-08-04 18:46:34 +00001035 except (TypeError, AttributeError):
Edward Loper32ddbf72004-09-13 05:47:24 +00001036 docstring = ''
Tim Peters8485b562004-08-04 18:46:34 +00001037
1038 # Find the docstring's location in the file.
1039 lineno = self._find_lineno(obj, source_lines)
1040
Edward Loper32ddbf72004-09-13 05:47:24 +00001041 # Don't bother if the docstring is empty.
1042 if self._exclude_empty and not docstring:
1043 return None
1044
Tim Peters8485b562004-08-04 18:46:34 +00001045 # Return a DocTest for this object.
1046 if module is None:
1047 filename = None
1048 else:
1049 filename = getattr(module, '__file__', module.__name__)
Jim Fulton07a349c2004-08-22 14:10:00 +00001050 if filename[-4:] in (".pyc", ".pyo"):
1051 filename = filename[:-1]
Edward Lopera1ef6112004-08-09 16:14:41 +00001052 return self._parser.get_doctest(docstring, globs, name,
1053 filename, lineno)
Tim Peters8485b562004-08-04 18:46:34 +00001054
1055 def _find_lineno(self, obj, source_lines):
1056 """
1057 Return a line number of the given object's docstring. Note:
1058 this method assumes that the object has a docstring.
1059 """
1060 lineno = None
1061
1062 # Find the line number for modules.
1063 if inspect.ismodule(obj):
1064 lineno = 0
1065
1066 # Find the line number for classes.
1067 # Note: this could be fooled if a class is defined multiple
1068 # times in a single file.
1069 if inspect.isclass(obj):
1070 if source_lines is None:
1071 return None
1072 pat = re.compile(r'^\s*class\s*%s\b' %
1073 getattr(obj, '__name__', '-'))
1074 for i, line in enumerate(source_lines):
1075 if pat.match(line):
1076 lineno = i
1077 break
1078
1079 # Find the line number for functions & methods.
1080 if inspect.ismethod(obj): obj = obj.im_func
1081 if inspect.isfunction(obj): obj = obj.func_code
1082 if inspect.istraceback(obj): obj = obj.tb_frame
1083 if inspect.isframe(obj): obj = obj.f_code
1084 if inspect.iscode(obj):
1085 lineno = getattr(obj, 'co_firstlineno', None)-1
1086
1087 # Find the line number where the docstring starts. Assume
1088 # that it's the first line that begins with a quote mark.
1089 # Note: this could be fooled by a multiline function
1090 # signature, where a continuation line begins with a quote
1091 # mark.
1092 if lineno is not None:
1093 if source_lines is None:
1094 return lineno+1
1095 pat = re.compile('(^|.*:)\s*\w*("|\')')
1096 for lineno in range(lineno, len(source_lines)):
1097 if pat.match(source_lines[lineno]):
1098 return lineno
1099
1100 # We couldn't find the line number.
1101 return None
1102
1103######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00001104## 5. DocTest Runner
Tim Peters8485b562004-08-04 18:46:34 +00001105######################################################################
1106
Tim Peters8485b562004-08-04 18:46:34 +00001107class DocTestRunner:
1108 """
1109 A class used to run DocTest test cases, and accumulate statistics.
1110 The `run` method is used to process a single DocTest case. It
1111 returns a tuple `(f, t)`, where `t` is the number of test cases
1112 tried, and `f` is the number of test cases that failed.
1113
1114 >>> tests = DocTestFinder().find(_TestClass)
1115 >>> runner = DocTestRunner(verbose=False)
1116 >>> for test in tests:
1117 ... print runner.run(test)
1118 (0, 2)
1119 (0, 1)
1120 (0, 2)
1121 (0, 2)
1122
1123 The `summarize` method prints a summary of all the test cases that
1124 have been run by the runner, and returns an aggregated `(f, t)`
1125 tuple:
1126
1127 >>> runner.summarize(verbose=1)
1128 4 items passed all tests:
1129 2 tests in _TestClass
1130 2 tests in _TestClass.__init__
1131 2 tests in _TestClass.get
1132 1 tests in _TestClass.square
1133 7 tests in 4 items.
1134 7 passed and 0 failed.
1135 Test passed.
1136 (0, 7)
1137
1138 The aggregated number of tried examples and failed examples is
1139 also available via the `tries` and `failures` attributes:
1140
1141 >>> runner.tries
1142 7
1143 >>> runner.failures
1144 0
1145
1146 The comparison between expected outputs and actual outputs is done
Edward Loper34fcb142004-08-09 02:45:41 +00001147 by an `OutputChecker`. This comparison may be customized with a
1148 number of option flags; see the documentation for `testmod` for
1149 more information. If the option flags are insufficient, then the
1150 comparison may also be customized by passing a subclass of
1151 `OutputChecker` to the constructor.
Tim Peters8485b562004-08-04 18:46:34 +00001152
1153 The test runner's display output can be controlled in two ways.
1154 First, an output function (`out) can be passed to
1155 `TestRunner.run`; this function will be called with strings that
1156 should be displayed. It defaults to `sys.stdout.write`. If
1157 capturing the output is not sufficient, then the display output
1158 can be also customized by subclassing DocTestRunner, and
1159 overriding the methods `report_start`, `report_success`,
1160 `report_unexpected_exception`, and `report_failure`.
1161 """
1162 # This divider string is used to separate failure messages, and to
1163 # separate sections of the summary.
1164 DIVIDER = "*" * 70
1165
Edward Loper34fcb142004-08-09 02:45:41 +00001166 def __init__(self, checker=None, verbose=None, optionflags=0):
Tim Peters8485b562004-08-04 18:46:34 +00001167 """
1168 Create a new test runner.
1169
Edward Loper34fcb142004-08-09 02:45:41 +00001170 Optional keyword arg `checker` is the `OutputChecker` that
1171 should be used to compare the expected outputs and actual
1172 outputs of doctest examples.
1173
Tim Peters8485b562004-08-04 18:46:34 +00001174 Optional keyword arg 'verbose' prints lots of stuff if true,
1175 only failures if false; by default, it's true iff '-v' is in
1176 sys.argv.
1177
1178 Optional argument `optionflags` can be used to control how the
1179 test runner compares expected output to actual output, and how
1180 it displays failures. See the documentation for `testmod` for
1181 more information.
1182 """
Edward Loper34fcb142004-08-09 02:45:41 +00001183 self._checker = checker or OutputChecker()
Tim Peters8a7d2d52001-01-16 07:10:57 +00001184 if verbose is None:
Tim Peters8485b562004-08-04 18:46:34 +00001185 verbose = '-v' in sys.argv
1186 self._verbose = verbose
Tim Peters6ebe61f2003-06-27 20:48:05 +00001187 self.optionflags = optionflags
Jim Fulton07a349c2004-08-22 14:10:00 +00001188 self.original_optionflags = optionflags
Tim Peters6ebe61f2003-06-27 20:48:05 +00001189
Tim Peters8485b562004-08-04 18:46:34 +00001190 # Keep track of the examples we've run.
1191 self.tries = 0
1192 self.failures = 0
1193 self._name2ft = {}
Tim Peters8a7d2d52001-01-16 07:10:57 +00001194
Tim Peters8485b562004-08-04 18:46:34 +00001195 # Create a fake output target for capturing doctest output.
1196 self._fakeout = _SpoofOut()
Tim Peters4fd9e2f2001-08-18 00:05:50 +00001197
Tim Peters8485b562004-08-04 18:46:34 +00001198 #/////////////////////////////////////////////////////////////////
Tim Peters8485b562004-08-04 18:46:34 +00001199 # Reporting methods
1200 #/////////////////////////////////////////////////////////////////
Tim Peters17111f32001-10-03 04:08:26 +00001201
Tim Peters8485b562004-08-04 18:46:34 +00001202 def report_start(self, out, test, example):
Tim Peters8a7d2d52001-01-16 07:10:57 +00001203 """
Tim Peters8485b562004-08-04 18:46:34 +00001204 Report that the test runner is about to process the given
1205 example. (Only displays a message if verbose=True)
1206 """
1207 if self._verbose:
Edward Loperaacf0832004-08-26 01:19:50 +00001208 if example.want:
1209 out('Trying:\n' + _indent(example.source) +
1210 'Expecting:\n' + _indent(example.want))
1211 else:
1212 out('Trying:\n' + _indent(example.source) +
1213 'Expecting nothing\n')
Tim Peters8a7d2d52001-01-16 07:10:57 +00001214
Tim Peters8485b562004-08-04 18:46:34 +00001215 def report_success(self, out, test, example, got):
1216 """
1217 Report that the given example ran successfully. (Only
1218 displays a message if verbose=True)
1219 """
1220 if self._verbose:
1221 out("ok\n")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001222
Tim Peters8485b562004-08-04 18:46:34 +00001223 def report_failure(self, out, test, example, got):
1224 """
1225 Report that the given example failed.
1226 """
Edward Loper8e4a34b2004-08-12 02:34:27 +00001227 out(self._failure_header(test, example) +
Edward Loperca9111e2004-08-26 03:00:24 +00001228 self._checker.output_difference(example, got, self.optionflags))
Tim Peters7402f792001-10-02 03:53:41 +00001229
Tim Peters8485b562004-08-04 18:46:34 +00001230 def report_unexpected_exception(self, out, test, example, exc_info):
1231 """
1232 Report that the given example raised an unexpected exception.
1233 """
Edward Loper8e4a34b2004-08-12 02:34:27 +00001234 out(self._failure_header(test, example) +
Edward Loperaacf0832004-08-26 01:19:50 +00001235 'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
Tim Peters7402f792001-10-02 03:53:41 +00001236
Edward Loper8e4a34b2004-08-12 02:34:27 +00001237 def _failure_header(self, test, example):
Jim Fulton07a349c2004-08-22 14:10:00 +00001238 out = [self.DIVIDER]
1239 if test.filename:
1240 if test.lineno is not None and example.lineno is not None:
1241 lineno = test.lineno + example.lineno + 1
1242 else:
1243 lineno = '?'
1244 out.append('File "%s", line %s, in %s' %
1245 (test.filename, lineno, test.name))
Tim Peters8485b562004-08-04 18:46:34 +00001246 else:
Jim Fulton07a349c2004-08-22 14:10:00 +00001247 out.append('Line %s, in %s' % (example.lineno+1, test.name))
1248 out.append('Failed example:')
1249 source = example.source
Edward Loperaacf0832004-08-26 01:19:50 +00001250 out.append(_indent(source))
1251 return '\n'.join(out)
Tim Peters7402f792001-10-02 03:53:41 +00001252
Tim Peters8485b562004-08-04 18:46:34 +00001253 #/////////////////////////////////////////////////////////////////
1254 # DocTest Running
1255 #/////////////////////////////////////////////////////////////////
Tim Peters7402f792001-10-02 03:53:41 +00001256
Tim Peters8485b562004-08-04 18:46:34 +00001257 def __run(self, test, compileflags, out):
Tim Peters8a7d2d52001-01-16 07:10:57 +00001258 """
Tim Peters8485b562004-08-04 18:46:34 +00001259 Run the examples in `test`. Write the outcome of each example
1260 with one of the `DocTestRunner.report_*` methods, using the
1261 writer function `out`. `compileflags` is the set of compiler
1262 flags that should be used to execute examples. Return a tuple
1263 `(f, t)`, where `t` is the number of examples tried, and `f`
1264 is the number of examples that failed. The examples are run
1265 in the namespace `test.globs`.
1266 """
1267 # Keep track of the number of failures and tries.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001268 failures = tries = 0
Tim Peters8485b562004-08-04 18:46:34 +00001269
1270 # Save the option flags (since option directives can be used
1271 # to modify them).
1272 original_optionflags = self.optionflags
1273
Tim Peters1fbf9c52004-09-04 17:21:02 +00001274 SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
1275
1276 check = self._checker.check_output
1277
Tim Peters8485b562004-08-04 18:46:34 +00001278 # Process each example.
Edward Loper2de91ba2004-08-27 02:07:46 +00001279 for examplenum, example in enumerate(test.examples):
1280
Edward Lopera89f88d2004-08-26 02:45:51 +00001281 # If REPORT_ONLY_FIRST_FAILURE is set, then supress
1282 # reporting after the first failure.
1283 quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
1284 failures > 0)
1285
Edward Loper74bca7a2004-08-12 02:27:44 +00001286 # Merge in the example's options.
1287 self.optionflags = original_optionflags
1288 if example.options:
1289 for (optionflag, val) in example.options.items():
1290 if val:
1291 self.optionflags |= optionflag
1292 else:
1293 self.optionflags &= ~optionflag
Tim Peters8485b562004-08-04 18:46:34 +00001294
1295 # Record that we started this example.
1296 tries += 1
Edward Lopera89f88d2004-08-26 02:45:51 +00001297 if not quiet:
1298 self.report_start(out, test, example)
Tim Peters8485b562004-08-04 18:46:34 +00001299
Edward Loper2de91ba2004-08-27 02:07:46 +00001300 # Use a special filename for compile(), so we can retrieve
1301 # the source code during interactive debugging (see
1302 # __patched_linecache_getlines).
1303 filename = '<doctest %s[%d]>' % (test.name, examplenum)
1304
Tim Peters8485b562004-08-04 18:46:34 +00001305 # Run the example in the given context (globs), and record
1306 # any exception that gets raised. (But don't intercept
1307 # keyboard interrupts.)
1308 try:
Tim Peters208ca702004-08-09 04:12:36 +00001309 # Don't blink! This is where the user's code gets run.
Edward Loper2de91ba2004-08-27 02:07:46 +00001310 exec compile(example.source, filename, "single",
Tim Peters8485b562004-08-04 18:46:34 +00001311 compileflags, 1) in test.globs
Edward Loper2de91ba2004-08-27 02:07:46 +00001312 self.debugger.set_continue() # ==== Example Finished ====
Tim Peters8485b562004-08-04 18:46:34 +00001313 exception = None
1314 except KeyboardInterrupt:
1315 raise
1316 except:
1317 exception = sys.exc_info()
Edward Loper2de91ba2004-08-27 02:07:46 +00001318 self.debugger.set_continue() # ==== Example Finished ====
Tim Peters8485b562004-08-04 18:46:34 +00001319
Tim Peters208ca702004-08-09 04:12:36 +00001320 got = self._fakeout.getvalue() # the actual output
Tim Peters8485b562004-08-04 18:46:34 +00001321 self._fakeout.truncate(0)
Tim Peters1fbf9c52004-09-04 17:21:02 +00001322 outcome = FAILURE # guilty until proved innocent or insane
Tim Peters8485b562004-08-04 18:46:34 +00001323
1324 # If the example executed without raising any exceptions,
Tim Peters1fbf9c52004-09-04 17:21:02 +00001325 # verify its output.
Tim Peters8485b562004-08-04 18:46:34 +00001326 if exception is None:
Tim Peters1fbf9c52004-09-04 17:21:02 +00001327 if check(example.want, got, self.optionflags):
1328 outcome = SUCCESS
Tim Peters8485b562004-08-04 18:46:34 +00001329
Tim Peters1fbf9c52004-09-04 17:21:02 +00001330 # The example raised an exception: check if it was expected.
Tim Peters8485b562004-08-04 18:46:34 +00001331 else:
1332 exc_info = sys.exc_info()
1333 exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
Tim Peters1fbf9c52004-09-04 17:21:02 +00001334 if not quiet:
1335 got += _exception_traceback(exc_info)
Tim Peters8485b562004-08-04 18:46:34 +00001336
Tim Peters1fbf9c52004-09-04 17:21:02 +00001337 # If `example.exc_msg` is None, then we weren't expecting
1338 # an exception.
Edward Lopera6b68322004-08-26 00:05:43 +00001339 if example.exc_msg is None:
Tim Peters1fbf9c52004-09-04 17:21:02 +00001340 outcome = BOOM
1341
1342 # We expected an exception: see whether it matches.
1343 elif check(example.exc_msg, exc_msg, self.optionflags):
1344 outcome = SUCCESS
1345
1346 # Another chance if they didn't care about the detail.
1347 elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
1348 m1 = re.match(r'[^:]*:', example.exc_msg)
1349 m2 = re.match(r'[^:]*:', exc_msg)
1350 if m1 and m2 and check(m1.group(0), m2.group(0),
1351 self.optionflags):
1352 outcome = SUCCESS
1353
1354 # Report the outcome.
1355 if outcome is SUCCESS:
1356 if not quiet:
1357 self.report_success(out, test, example, got)
1358 elif outcome is FAILURE:
1359 if not quiet:
1360 self.report_failure(out, test, example, got)
1361 failures += 1
1362 elif outcome is BOOM:
1363 if not quiet:
1364 self.report_unexpected_exception(out, test, example,
1365 exc_info)
1366 failures += 1
1367 else:
1368 assert False, ("unknown outcome", outcome)
Tim Peters8485b562004-08-04 18:46:34 +00001369
1370 # Restore the option flags (in case they were modified)
1371 self.optionflags = original_optionflags
1372
1373 # Record and return the number of failures and tries.
1374 self.__record_outcome(test, failures, tries)
Tim Peters8a7d2d52001-01-16 07:10:57 +00001375 return failures, tries
1376
Tim Peters8485b562004-08-04 18:46:34 +00001377 def __record_outcome(self, test, f, t):
1378 """
1379 Record the fact that the given DocTest (`test`) generated `f`
1380 failures out of `t` tried examples.
1381 """
1382 f2, t2 = self._name2ft.get(test.name, (0,0))
1383 self._name2ft[test.name] = (f+f2, t+t2)
1384 self.failures += f
1385 self.tries += t
1386
Edward Loper2de91ba2004-08-27 02:07:46 +00001387 __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
1388 r'(?P<name>[\w\.]+)'
1389 r'\[(?P<examplenum>\d+)\]>$')
1390 def __patched_linecache_getlines(self, filename):
1391 m = self.__LINECACHE_FILENAME_RE.match(filename)
1392 if m and m.group('name') == self.test.name:
1393 example = self.test.examples[int(m.group('examplenum'))]
1394 return example.source.splitlines(True)
1395 else:
1396 return self.save_linecache_getlines(filename)
1397
Tim Peters8485b562004-08-04 18:46:34 +00001398 def run(self, test, compileflags=None, out=None, clear_globs=True):
1399 """
1400 Run the examples in `test`, and display the results using the
1401 writer function `out`.
1402
1403 The examples are run in the namespace `test.globs`. If
1404 `clear_globs` is true (the default), then this namespace will
1405 be cleared after the test runs, to help with garbage
1406 collection. If you would like to examine the namespace after
1407 the test completes, then use `clear_globs=False`.
1408
1409 `compileflags` gives the set of flags that should be used by
1410 the Python compiler when running the examples. If not
1411 specified, then it will default to the set of future-import
1412 flags that apply to `globs`.
1413
1414 The output of each example is checked using
1415 `DocTestRunner.check_output`, and the results are formatted by
1416 the `DocTestRunner.report_*` methods.
1417 """
Edward Loper2de91ba2004-08-27 02:07:46 +00001418 self.test = test
1419
Tim Peters8485b562004-08-04 18:46:34 +00001420 if compileflags is None:
1421 compileflags = _extract_future_flags(test.globs)
Jim Fulton356fd192004-08-09 11:34:47 +00001422
Tim Peters6c542b72004-08-09 16:43:36 +00001423 save_stdout = sys.stdout
Tim Peters8485b562004-08-04 18:46:34 +00001424 if out is None:
Tim Peters6c542b72004-08-09 16:43:36 +00001425 out = save_stdout.write
1426 sys.stdout = self._fakeout
Tim Peters8485b562004-08-04 18:46:34 +00001427
Edward Loper2de91ba2004-08-27 02:07:46 +00001428 # Patch pdb.set_trace to restore sys.stdout during interactive
1429 # debugging (so it's not still redirected to self._fakeout).
1430 # Note that the interactive output will go to *our*
1431 # save_stdout, even if that's not the real sys.stdout; this
1432 # allows us to write test cases for the set_trace behavior.
Tim Peters6c542b72004-08-09 16:43:36 +00001433 save_set_trace = pdb.set_trace
Edward Loper2de91ba2004-08-27 02:07:46 +00001434 self.debugger = _OutputRedirectingPdb(save_stdout)
1435 self.debugger.reset()
1436 pdb.set_trace = self.debugger.set_trace
1437
1438 # Patch linecache.getlines, so we can see the example's source
1439 # when we're inside the debugger.
1440 self.save_linecache_getlines = linecache.getlines
1441 linecache.getlines = self.__patched_linecache_getlines
1442
Tim Peters8485b562004-08-04 18:46:34 +00001443 try:
Tim Peters8485b562004-08-04 18:46:34 +00001444 return self.__run(test, compileflags, out)
1445 finally:
Tim Peters6c542b72004-08-09 16:43:36 +00001446 sys.stdout = save_stdout
1447 pdb.set_trace = save_set_trace
Edward Loper2de91ba2004-08-27 02:07:46 +00001448 linecache.getlines = self.save_linecache_getlines
Tim Peters8485b562004-08-04 18:46:34 +00001449 if clear_globs:
1450 test.globs.clear()
1451
1452 #/////////////////////////////////////////////////////////////////
1453 # Summarization
1454 #/////////////////////////////////////////////////////////////////
Tim Peters8a7d2d52001-01-16 07:10:57 +00001455 def summarize(self, verbose=None):
1456 """
Tim Peters8485b562004-08-04 18:46:34 +00001457 Print a summary of all the test cases that have been run by
1458 this DocTestRunner, and return a tuple `(f, t)`, where `f` is
1459 the total number of failed examples, and `t` is the total
1460 number of tried examples.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001461
Tim Peters8485b562004-08-04 18:46:34 +00001462 The optional `verbose` argument controls how detailed the
1463 summary is. If the verbosity is not specified, then the
1464 DocTestRunner's verbosity is used.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001465 """
Tim Peters8a7d2d52001-01-16 07:10:57 +00001466 if verbose is None:
Tim Peters8485b562004-08-04 18:46:34 +00001467 verbose = self._verbose
Tim Peters8a7d2d52001-01-16 07:10:57 +00001468 notests = []
1469 passed = []
1470 failed = []
1471 totalt = totalf = 0
Tim Peters8485b562004-08-04 18:46:34 +00001472 for x in self._name2ft.items():
Tim Peters8a7d2d52001-01-16 07:10:57 +00001473 name, (f, t) = x
1474 assert f <= t
Tim Peters8485b562004-08-04 18:46:34 +00001475 totalt += t
1476 totalf += f
Tim Peters8a7d2d52001-01-16 07:10:57 +00001477 if t == 0:
1478 notests.append(name)
1479 elif f == 0:
1480 passed.append( (name, t) )
1481 else:
1482 failed.append(x)
1483 if verbose:
1484 if notests:
1485 print len(notests), "items had no tests:"
1486 notests.sort()
1487 for thing in notests:
1488 print " ", thing
1489 if passed:
1490 print len(passed), "items passed all tests:"
1491 passed.sort()
1492 for thing, count in passed:
1493 print " %3d tests in %s" % (count, thing)
1494 if failed:
Tim Peters8485b562004-08-04 18:46:34 +00001495 print self.DIVIDER
Tim Peters8a7d2d52001-01-16 07:10:57 +00001496 print len(failed), "items had failures:"
1497 failed.sort()
1498 for thing, (f, t) in failed:
1499 print " %3d of %3d in %s" % (f, t, thing)
1500 if verbose:
Tim Peters8485b562004-08-04 18:46:34 +00001501 print totalt, "tests in", len(self._name2ft), "items."
Tim Peters8a7d2d52001-01-16 07:10:57 +00001502 print totalt - totalf, "passed and", totalf, "failed."
1503 if totalf:
1504 print "***Test Failed***", totalf, "failures."
1505 elif verbose:
1506 print "Test passed."
1507 return totalf, totalt
1508
Tim Peters82076ef2004-09-13 00:52:51 +00001509 #/////////////////////////////////////////////////////////////////
1510 # Backward compatibility cruft to maintain doctest.master.
1511 #/////////////////////////////////////////////////////////////////
1512 def merge(self, other):
1513 d = self._name2ft
1514 for name, (f, t) in other._name2ft.items():
1515 if name in d:
1516 print "*** DocTestRunner.merge: '" + name + "' in both" \
1517 " testers; summing outcomes."
1518 f2, t2 = d[name]
1519 f = f + f2
1520 t = t + t2
1521 d[name] = f, t
1522
Edward Loper34fcb142004-08-09 02:45:41 +00001523class OutputChecker:
1524 """
1525 A class used to check the whether the actual output from a doctest
1526 example matches the expected output. `OutputChecker` defines two
1527 methods: `check_output`, which compares a given pair of outputs,
1528 and returns true if they match; and `output_difference`, which
1529 returns a string describing the differences between two outputs.
1530 """
1531 def check_output(self, want, got, optionflags):
1532 """
Edward Loper74bca7a2004-08-12 02:27:44 +00001533 Return True iff the actual output from an example (`got`)
1534 matches the expected output (`want`). These strings are
1535 always considered to match if they are identical; but
1536 depending on what option flags the test runner is using,
1537 several non-exact match types are also possible. See the
1538 documentation for `TestRunner` for more information about
1539 option flags.
Edward Loper34fcb142004-08-09 02:45:41 +00001540 """
1541 # Handle the common case first, for efficiency:
1542 # if they're string-identical, always return true.
1543 if got == want:
1544 return True
1545
1546 # The values True and False replaced 1 and 0 as the return
1547 # value for boolean comparisons in Python 2.3.
1548 if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
1549 if (got,want) == ("True\n", "1\n"):
1550 return True
1551 if (got,want) == ("False\n", "0\n"):
1552 return True
1553
1554 # <BLANKLINE> can be used as a special sequence to signify a
1555 # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
1556 if not (optionflags & DONT_ACCEPT_BLANKLINE):
1557 # Replace <BLANKLINE> in want with a blank line.
1558 want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
1559 '', want)
1560 # If a line in got contains only spaces, then remove the
1561 # spaces.
1562 got = re.sub('(?m)^\s*?$', '', got)
1563 if got == want:
1564 return True
1565
1566 # This flag causes doctest to ignore any differences in the
1567 # contents of whitespace strings. Note that this can be used
Tim Peters3fa8c202004-08-23 21:43:39 +00001568 # in conjunction with the ELLIPSIS flag.
Tim Peters1cf3aa62004-08-19 06:49:33 +00001569 if optionflags & NORMALIZE_WHITESPACE:
Edward Loper34fcb142004-08-09 02:45:41 +00001570 got = ' '.join(got.split())
1571 want = ' '.join(want.split())
1572 if got == want:
1573 return True
1574
Edward Loperaec3c9b2004-09-28 04:29:57 +00001575 # This flag causes doctest to treat numbers that are within a
1576 # small threshold as if they are equal.
1577 if optionflags & NORMALIZE_NUMBERS:
1578 got = _normalize_numbers(want, got)
1579 if got == want:
1580 return True
1581
Edward Loper34fcb142004-08-09 02:45:41 +00001582 # The ELLIPSIS flag says to let the sequence "..." in `want`
Tim Peters26b3ebb2004-08-19 08:10:08 +00001583 # match any substring in `got`.
Tim Peters1cf3aa62004-08-19 06:49:33 +00001584 if optionflags & ELLIPSIS:
Tim Petersb0a04e12004-08-20 02:08:04 +00001585 if _ellipsis_match(want, got):
Edward Loper34fcb142004-08-09 02:45:41 +00001586 return True
1587
1588 # We didn't find any match; return false.
1589 return False
1590
Tim Petersc6cbab02004-08-22 19:43:28 +00001591 # Should we do a fancy diff?
1592 def _do_a_fancy_diff(self, want, got, optionflags):
1593 # Not unless they asked for a fancy diff.
Edward Loper71f55af2004-08-26 01:41:51 +00001594 if not optionflags & (REPORT_UDIFF |
1595 REPORT_CDIFF |
1596 REPORT_NDIFF):
Tim Petersc6cbab02004-08-22 19:43:28 +00001597 return False
Tim Peters5b799c12004-08-26 05:21:59 +00001598
Tim Petersc6cbab02004-08-22 19:43:28 +00001599 # If expected output uses ellipsis, a meaningful fancy diff is
Tim Peters5b799c12004-08-26 05:21:59 +00001600 # too hard ... or maybe not. In two real-life failures Tim saw,
1601 # a diff was a major help anyway, so this is commented out.
1602 # [todo] _ellipsis_match() knows which pieces do and don't match,
1603 # and could be the basis for a kick-ass diff in this case.
1604 ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
1605 ## return False
1606
Tim Petersc6cbab02004-08-22 19:43:28 +00001607 # ndiff does intraline difference marking, so can be useful even
Tim Peters5b799c12004-08-26 05:21:59 +00001608 # for 1-line differences.
Edward Loper71f55af2004-08-26 01:41:51 +00001609 if optionflags & REPORT_NDIFF:
Tim Petersc6cbab02004-08-22 19:43:28 +00001610 return True
Tim Peters5b799c12004-08-26 05:21:59 +00001611
Tim Petersc6cbab02004-08-22 19:43:28 +00001612 # The other diff types need at least a few lines to be helpful.
1613 return want.count('\n') > 2 and got.count('\n') > 2
1614
Edward Loperca9111e2004-08-26 03:00:24 +00001615 def output_difference(self, example, got, optionflags):
Edward Loper34fcb142004-08-09 02:45:41 +00001616 """
1617 Return a string describing the differences between the
Edward Loperca9111e2004-08-26 03:00:24 +00001618 expected output for a given example (`example`) and the actual
1619 output (`got`). `optionflags` is the set of option flags used
1620 to compare `want` and `got`.
Edward Loper34fcb142004-08-09 02:45:41 +00001621 """
Edward Loperca9111e2004-08-26 03:00:24 +00001622 want = example.want
Edward Loper68ba9a62004-08-12 02:43:49 +00001623 # If <BLANKLINE>s are being used, then replace blank lines
1624 # with <BLANKLINE> in the actual output string.
Edward Loper34fcb142004-08-09 02:45:41 +00001625 if not (optionflags & DONT_ACCEPT_BLANKLINE):
Edward Loper68ba9a62004-08-12 02:43:49 +00001626 got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
Edward Loper34fcb142004-08-09 02:45:41 +00001627
Tim Peters5b799c12004-08-26 05:21:59 +00001628 # Check if we should use diff.
Tim Petersc6cbab02004-08-22 19:43:28 +00001629 if self._do_a_fancy_diff(want, got, optionflags):
Edward Loper34fcb142004-08-09 02:45:41 +00001630 # Split want & got into lines.
Tim Peterse7edcb82004-08-26 05:44:27 +00001631 want_lines = want.splitlines(True) # True == keep line ends
1632 got_lines = got.splitlines(True)
Edward Loper34fcb142004-08-09 02:45:41 +00001633 # Use difflib to find their differences.
Edward Loper71f55af2004-08-26 01:41:51 +00001634 if optionflags & REPORT_UDIFF:
Edward Loper56629292004-08-26 01:31:56 +00001635 diff = difflib.unified_diff(want_lines, got_lines, n=2)
1636 diff = list(diff)[2:] # strip the diff header
1637 kind = 'unified diff with -expected +actual'
Edward Loper71f55af2004-08-26 01:41:51 +00001638 elif optionflags & REPORT_CDIFF:
Edward Loper56629292004-08-26 01:31:56 +00001639 diff = difflib.context_diff(want_lines, got_lines, n=2)
1640 diff = list(diff)[2:] # strip the diff header
1641 kind = 'context diff with expected followed by actual'
Edward Loper71f55af2004-08-26 01:41:51 +00001642 elif optionflags & REPORT_NDIFF:
Tim Petersc6cbab02004-08-22 19:43:28 +00001643 engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
1644 diff = list(engine.compare(want_lines, got_lines))
1645 kind = 'ndiff with -expected +actual'
Edward Loper34fcb142004-08-09 02:45:41 +00001646 else:
1647 assert 0, 'Bad diff option'
1648 # Remove trailing whitespace on diff output.
1649 diff = [line.rstrip() + '\n' for line in diff]
Edward Loperaacf0832004-08-26 01:19:50 +00001650 return 'Differences (%s):\n' % kind + _indent(''.join(diff))
Edward Loper34fcb142004-08-09 02:45:41 +00001651
1652 # If we're not using diff, then simply list the expected
1653 # output followed by the actual output.
Edward Loperaacf0832004-08-26 01:19:50 +00001654 if want and got:
1655 return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
1656 elif want:
1657 return 'Expected:\n%sGot nothing\n' % _indent(want)
1658 elif got:
1659 return 'Expected nothing\nGot:\n%s' % _indent(got)
1660 else:
1661 return 'Expected nothing\nGot nothing\n'
Edward Loper34fcb142004-08-09 02:45:41 +00001662
Tim Peters19397e52004-08-06 22:02:59 +00001663class DocTestFailure(Exception):
1664 """A DocTest example has failed in debugging mode.
1665
1666 The exception instance has variables:
1667
1668 - test: the DocTest object being run
1669
1670 - excample: the Example object that failed
1671
1672 - got: the actual output
1673 """
1674 def __init__(self, test, example, got):
1675 self.test = test
1676 self.example = example
1677 self.got = got
1678
1679 def __str__(self):
1680 return str(self.test)
1681
1682class UnexpectedException(Exception):
1683 """A DocTest example has encountered an unexpected exception
1684
1685 The exception instance has variables:
1686
1687 - test: the DocTest object being run
1688
1689 - excample: the Example object that failed
1690
1691 - exc_info: the exception info
1692 """
1693 def __init__(self, test, example, exc_info):
1694 self.test = test
1695 self.example = example
1696 self.exc_info = exc_info
1697
1698 def __str__(self):
1699 return str(self.test)
Tim Petersd1b78272004-08-07 06:03:09 +00001700
Tim Peters19397e52004-08-06 22:02:59 +00001701class DebugRunner(DocTestRunner):
1702 r"""Run doc tests but raise an exception as soon as there is a failure.
1703
1704 If an unexpected exception occurs, an UnexpectedException is raised.
1705 It contains the test, the example, and the original exception:
1706
1707 >>> runner = DebugRunner(verbose=False)
Edward Lopera1ef6112004-08-09 16:14:41 +00001708 >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
1709 ... {}, 'foo', 'foo.py', 0)
Tim Peters19397e52004-08-06 22:02:59 +00001710 >>> try:
1711 ... runner.run(test)
1712 ... except UnexpectedException, failure:
1713 ... pass
1714
1715 >>> failure.test is test
1716 True
1717
1718 >>> failure.example.want
1719 '42\n'
1720
1721 >>> exc_info = failure.exc_info
1722 >>> raise exc_info[0], exc_info[1], exc_info[2]
1723 Traceback (most recent call last):
1724 ...
1725 KeyError
1726
1727 We wrap the original exception to give the calling application
1728 access to the test and example information.
1729
1730 If the output doesn't match, then a DocTestFailure is raised:
1731
Edward Lopera1ef6112004-08-09 16:14:41 +00001732 >>> test = DocTestParser().get_doctest('''
Tim Peters19397e52004-08-06 22:02:59 +00001733 ... >>> x = 1
1734 ... >>> x
1735 ... 2
1736 ... ''', {}, 'foo', 'foo.py', 0)
1737
1738 >>> try:
1739 ... runner.run(test)
1740 ... except DocTestFailure, failure:
1741 ... pass
1742
1743 DocTestFailure objects provide access to the test:
1744
1745 >>> failure.test is test
1746 True
1747
1748 As well as to the example:
1749
1750 >>> failure.example.want
1751 '2\n'
1752
1753 and the actual output:
1754
1755 >>> failure.got
1756 '1\n'
1757
1758 If a failure or error occurs, the globals are left intact:
1759
1760 >>> del test.globs['__builtins__']
1761 >>> test.globs
1762 {'x': 1}
1763
Edward Lopera1ef6112004-08-09 16:14:41 +00001764 >>> test = DocTestParser().get_doctest('''
Tim Peters19397e52004-08-06 22:02:59 +00001765 ... >>> x = 2
1766 ... >>> raise KeyError
1767 ... ''', {}, 'foo', 'foo.py', 0)
1768
1769 >>> runner.run(test)
1770 Traceback (most recent call last):
1771 ...
1772 UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
Tim Petersd1b78272004-08-07 06:03:09 +00001773
Tim Peters19397e52004-08-06 22:02:59 +00001774 >>> del test.globs['__builtins__']
1775 >>> test.globs
1776 {'x': 2}
1777
1778 But the globals are cleared if there is no error:
1779
Edward Lopera1ef6112004-08-09 16:14:41 +00001780 >>> test = DocTestParser().get_doctest('''
Tim Peters19397e52004-08-06 22:02:59 +00001781 ... >>> x = 2
1782 ... ''', {}, 'foo', 'foo.py', 0)
1783
1784 >>> runner.run(test)
1785 (0, 1)
1786
1787 >>> test.globs
1788 {}
1789
1790 """
1791
1792 def run(self, test, compileflags=None, out=None, clear_globs=True):
1793 r = DocTestRunner.run(self, test, compileflags, out, False)
1794 if clear_globs:
1795 test.globs.clear()
1796 return r
1797
1798 def report_unexpected_exception(self, out, test, example, exc_info):
1799 raise UnexpectedException(test, example, exc_info)
1800
1801 def report_failure(self, out, test, example, got):
1802 raise DocTestFailure(test, example, got)
1803
Tim Peters8485b562004-08-04 18:46:34 +00001804######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00001805## 6. Test Functions
Tim Peters8485b562004-08-04 18:46:34 +00001806######################################################################
1807# These should be backwards compatible.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001808
Tim Peters82076ef2004-09-13 00:52:51 +00001809# For backward compatibility, a global instance of a DocTestRunner
1810# class, updated by testmod.
1811master = None
1812
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001813def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
Tim Peters19397e52004-08-06 22:02:59 +00001814 report=True, optionflags=0, extraglobs=None,
Tim Peters958cc892004-09-13 14:53:28 +00001815 raise_on_error=False, exclude_empty=False):
Tim Peters6ebe61f2003-06-27 20:48:05 +00001816 """m=None, name=None, globs=None, verbose=None, isprivate=None,
Tim Peters958cc892004-09-13 14:53:28 +00001817 report=True, optionflags=0, extraglobs=None, raise_on_error=False,
1818 exclude_empty=False
Tim Peters8a7d2d52001-01-16 07:10:57 +00001819
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001820 Test examples in docstrings in functions and classes reachable
1821 from module m (or the current module if m is not supplied), starting
Raymond Hettinger71adf7e2003-07-16 19:25:22 +00001822 with m.__doc__. Unless isprivate is specified, private names
1823 are not skipped.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001824
1825 Also test examples reachable from dict m.__test__ if it exists and is
Tim Petersc2388a22004-08-10 01:41:28 +00001826 not None. m.__test__ maps names to functions, classes and strings;
Tim Peters8a7d2d52001-01-16 07:10:57 +00001827 function and class docstrings are tested even if the name is private;
1828 strings are tested directly, as if they were docstrings.
1829
1830 Return (#failures, #tests).
1831
1832 See doctest.__doc__ for an overview.
1833
1834 Optional keyword arg "name" gives the name of the module; by default
1835 use m.__name__.
1836
1837 Optional keyword arg "globs" gives a dict to be used as the globals
1838 when executing examples; by default, use m.__dict__. A copy of this
1839 dict is actually used for each docstring, so that each docstring's
1840 examples start with a clean slate.
1841
Tim Peters8485b562004-08-04 18:46:34 +00001842 Optional keyword arg "extraglobs" gives a dictionary that should be
1843 merged into the globals that are used to execute examples. By
1844 default, no extra globals are used. This is new in 2.4.
1845
Tim Peters8a7d2d52001-01-16 07:10:57 +00001846 Optional keyword arg "verbose" prints lots of stuff if true, prints
1847 only failures if false; by default, it's true iff "-v" is in sys.argv.
1848
Tim Peters8a7d2d52001-01-16 07:10:57 +00001849 Optional keyword arg "report" prints a summary at the end when true,
1850 else prints nothing at the end. In verbose mode, the summary is
1851 detailed, else very brief (in fact, empty if all tests passed).
1852
Tim Peters6ebe61f2003-06-27 20:48:05 +00001853 Optional keyword arg "optionflags" or's together module constants,
Tim Petersf82a9de2004-08-22 20:51:53 +00001854 and defaults to 0. This is new in 2.3. Possible values (see the
1855 docs for details):
Tim Peters6ebe61f2003-06-27 20:48:05 +00001856
1857 DONT_ACCEPT_TRUE_FOR_1
Tim Peters8485b562004-08-04 18:46:34 +00001858 DONT_ACCEPT_BLANKLINE
Tim Peters8485b562004-08-04 18:46:34 +00001859 NORMALIZE_WHITESPACE
Tim Peters8485b562004-08-04 18:46:34 +00001860 ELLIPSIS
Edward Loper052d0cd2004-09-19 17:19:33 +00001861 IGNORE_EXCEPTION_DETAIL
Edward Loperaec3c9b2004-09-28 04:29:57 +00001862 NORMALIZE_NUMBERS
Edward Loper71f55af2004-08-26 01:41:51 +00001863 REPORT_UDIFF
1864 REPORT_CDIFF
1865 REPORT_NDIFF
Edward Lopera89f88d2004-08-26 02:45:51 +00001866 REPORT_ONLY_FIRST_FAILURE
Tim Peters19397e52004-08-06 22:02:59 +00001867
1868 Optional keyword arg "raise_on_error" raises an exception on the
1869 first unexpected exception or failure. This allows failures to be
1870 post-mortem debugged.
1871
Tim Petersf727c6c2004-08-08 01:48:59 +00001872 Deprecated in Python 2.4:
1873 Optional keyword arg "isprivate" specifies a function used to
1874 determine whether a name is private. The default function is
1875 treat all functions as public. Optionally, "isprivate" can be
1876 set to doctest.is_private to skip over functions marked as private
1877 using the underscore naming convention; see its docs for details.
Tim Peters8485b562004-08-04 18:46:34 +00001878
Tim Peters8a7d2d52001-01-16 07:10:57 +00001879 Advanced tomfoolery: testmod runs methods of a local instance of
1880 class doctest.Tester, then merges the results into (or creates)
1881 global Tester instance doctest.master. Methods of doctest.master
1882 can be called directly too, if you want to do something unusual.
1883 Passing report=0 to testmod is especially useful then, to delay
1884 displaying a summary. Invoke doctest.master.summarize(verbose)
1885 when you're done fiddling.
1886 """
Tim Peters82076ef2004-09-13 00:52:51 +00001887 global master
1888
Tim Petersf727c6c2004-08-08 01:48:59 +00001889 if isprivate is not None:
1890 warnings.warn("the isprivate argument is deprecated; "
1891 "examine DocTestFinder.find() lists instead",
1892 DeprecationWarning)
1893
Tim Peters8485b562004-08-04 18:46:34 +00001894 # If no module was given, then use __main__.
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001895 if m is None:
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001896 # DWA - m will still be None if this wasn't invoked from the command
1897 # line, in which case the following TypeError is about as good an error
1898 # as we should expect
1899 m = sys.modules.get('__main__')
1900
Tim Peters8485b562004-08-04 18:46:34 +00001901 # Check that we were actually given a module.
1902 if not inspect.ismodule(m):
Walter Dörwald70a6b492004-02-12 17:35:32 +00001903 raise TypeError("testmod: module required; %r" % (m,))
Tim Peters8485b562004-08-04 18:46:34 +00001904
1905 # If no name was given, then use the module's name.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001906 if name is None:
1907 name = m.__name__
Tim Peters8485b562004-08-04 18:46:34 +00001908
1909 # Find, parse, and run all tests in the given module.
Tim Peters958cc892004-09-13 14:53:28 +00001910 finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty)
Tim Peters19397e52004-08-06 22:02:59 +00001911
1912 if raise_on_error:
1913 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
1914 else:
1915 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
1916
Tim Peters8485b562004-08-04 18:46:34 +00001917 for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
1918 runner.run(test)
1919
Tim Peters8a7d2d52001-01-16 07:10:57 +00001920 if report:
Tim Peters8485b562004-08-04 18:46:34 +00001921 runner.summarize()
Tim Peters8a7d2d52001-01-16 07:10:57 +00001922
Tim Peters82076ef2004-09-13 00:52:51 +00001923 if master is None:
1924 master = runner
1925 else:
1926 master.merge(runner)
1927
Tim Peters8485b562004-08-04 18:46:34 +00001928 return runner.failures, runner.tries
Tim Petersdb3756d2003-06-29 05:30:48 +00001929
Edward Loper052d0cd2004-09-19 17:19:33 +00001930def testfile(filename, module_relative=True, name=None, package=None,
1931 globs=None, verbose=None, report=True, optionflags=0,
Edward Loper498a1862004-09-27 03:42:58 +00001932 extraglobs=None, raise_on_error=False, parser=DocTestParser()):
Edward Loper052d0cd2004-09-19 17:19:33 +00001933 """
1934 Test examples in the given file. Return (#failures, #tests).
1935
1936 Optional keyword arg "module_relative" specifies how filenames
1937 should be interpreted:
1938
1939 - If "module_relative" is True (the default), then "filename"
1940 specifies a module-relative path. By default, this path is
1941 relative to the calling module's directory; but if the
1942 "package" argument is specified, then it is relative to that
1943 package. To ensure os-independence, "filename" should use
1944 "/" characters to separate path segments, and should not
1945 be an absolute path (i.e., it may not begin with "/").
1946
1947 - If "module_relative" is False, then "filename" specifies an
1948 os-specific path. The path may be absolute or relative (to
1949 the current working directory).
1950
Edward Lopera2fc7ec2004-09-21 03:24:24 +00001951 Optional keyword arg "name" gives the name of the test; by default
1952 use the file's basename.
Edward Loper052d0cd2004-09-19 17:19:33 +00001953
1954 Optional keyword argument "package" is a Python package or the
1955 name of a Python package whose directory should be used as the
1956 base directory for a module relative filename. If no package is
1957 specified, then the calling module's directory is used as the base
1958 directory for module relative filenames. It is an error to
1959 specify "package" if "module_relative" is False.
1960
1961 Optional keyword arg "globs" gives a dict to be used as the globals
1962 when executing examples; by default, use {}. A copy of this dict
1963 is actually used for each docstring, so that each docstring's
1964 examples start with a clean slate.
1965
1966 Optional keyword arg "extraglobs" gives a dictionary that should be
1967 merged into the globals that are used to execute examples. By
1968 default, no extra globals are used.
1969
1970 Optional keyword arg "verbose" prints lots of stuff if true, prints
1971 only failures if false; by default, it's true iff "-v" is in sys.argv.
1972
1973 Optional keyword arg "report" prints a summary at the end when true,
1974 else prints nothing at the end. In verbose mode, the summary is
1975 detailed, else very brief (in fact, empty if all tests passed).
1976
1977 Optional keyword arg "optionflags" or's together module constants,
1978 and defaults to 0. Possible values (see the docs for details):
1979
1980 DONT_ACCEPT_TRUE_FOR_1
1981 DONT_ACCEPT_BLANKLINE
1982 NORMALIZE_WHITESPACE
1983 ELLIPSIS
1984 IGNORE_EXCEPTION_DETAIL
Edward Loperaec3c9b2004-09-28 04:29:57 +00001985 NORMALIZE_NUMBERS
Edward Loper052d0cd2004-09-19 17:19:33 +00001986 REPORT_UDIFF
1987 REPORT_CDIFF
1988 REPORT_NDIFF
1989 REPORT_ONLY_FIRST_FAILURE
1990
1991 Optional keyword arg "raise_on_error" raises an exception on the
1992 first unexpected exception or failure. This allows failures to be
1993 post-mortem debugged.
1994
Edward Loper498a1862004-09-27 03:42:58 +00001995 Optional keyword arg "parser" specifies a DocTestParser (or
1996 subclass) that should be used to extract tests from the files.
1997
Edward Loper052d0cd2004-09-19 17:19:33 +00001998 Advanced tomfoolery: testmod runs methods of a local instance of
1999 class doctest.Tester, then merges the results into (or creates)
2000 global Tester instance doctest.master. Methods of doctest.master
2001 can be called directly too, if you want to do something unusual.
2002 Passing report=0 to testmod is especially useful then, to delay
2003 displaying a summary. Invoke doctest.master.summarize(verbose)
2004 when you're done fiddling.
2005 """
2006 global master
2007
2008 if package and not module_relative:
2009 raise ValueError("Package may only be specified for module-"
2010 "relative paths.")
Tim Petersbab3e992004-09-20 19:52:34 +00002011
Edward Loper052d0cd2004-09-19 17:19:33 +00002012 # Relativize the path
2013 if module_relative:
2014 package = _normalize_module(package)
2015 filename = _module_relative_path(package, filename)
2016
2017 # If no name was given, then use the file's name.
2018 if name is None:
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002019 name = os.path.basename(filename)
Edward Loper052d0cd2004-09-19 17:19:33 +00002020
2021 # Assemble the globals.
2022 if globs is None:
2023 globs = {}
2024 else:
2025 globs = globs.copy()
2026 if extraglobs is not None:
2027 globs.update(extraglobs)
2028
2029 if raise_on_error:
2030 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
2031 else:
2032 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
2033
2034 # Read the file, convert it to a test, and run it.
2035 s = open(filename).read()
Edward Loper498a1862004-09-27 03:42:58 +00002036 test = parser.get_doctest(s, globs, name, filename, 0)
Edward Loper052d0cd2004-09-19 17:19:33 +00002037 runner.run(test)
2038
2039 if report:
2040 runner.summarize()
2041
2042 if master is None:
2043 master = runner
2044 else:
2045 master.merge(runner)
2046
2047 return runner.failures, runner.tries
2048
Tim Peters8485b562004-08-04 18:46:34 +00002049def run_docstring_examples(f, globs, verbose=False, name="NoName",
2050 compileflags=None, optionflags=0):
2051 """
2052 Test examples in the given object's docstring (`f`), using `globs`
2053 as globals. Optional argument `name` is used in failure messages.
2054 If the optional argument `verbose` is true, then generate output
2055 even if there are no failures.
Tim Petersdb3756d2003-06-29 05:30:48 +00002056
Tim Peters8485b562004-08-04 18:46:34 +00002057 `compileflags` gives the set of flags that should be used by the
2058 Python compiler when running the examples. If not specified, then
2059 it will default to the set of future-import flags that apply to
2060 `globs`.
Tim Petersdb3756d2003-06-29 05:30:48 +00002061
Tim Peters8485b562004-08-04 18:46:34 +00002062 Optional keyword arg `optionflags` specifies options for the
2063 testing and output. See the documentation for `testmod` for more
2064 information.
2065 """
2066 # Find, parse, and run all tests in the given module.
2067 finder = DocTestFinder(verbose=verbose, recurse=False)
2068 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
2069 for test in finder.find(f, name, globs=globs):
2070 runner.run(test, compileflags=compileflags)
Tim Petersdb3756d2003-06-29 05:30:48 +00002071
Tim Peters8485b562004-08-04 18:46:34 +00002072######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00002073## 7. Tester
Tim Peters8485b562004-08-04 18:46:34 +00002074######################################################################
2075# This is provided only for backwards compatibility. It's not
2076# actually used in any way.
Tim Petersdb3756d2003-06-29 05:30:48 +00002077
Tim Peters8485b562004-08-04 18:46:34 +00002078class Tester:
2079 def __init__(self, mod=None, globs=None, verbose=None,
2080 isprivate=None, optionflags=0):
Tim Peters3ddd60a2004-08-08 02:43:33 +00002081
2082 warnings.warn("class Tester is deprecated; "
2083 "use class doctest.DocTestRunner instead",
2084 DeprecationWarning, stacklevel=2)
Tim Peters8485b562004-08-04 18:46:34 +00002085 if mod is None and globs is None:
2086 raise TypeError("Tester.__init__: must specify mod or globs")
Tim Peters4be7a922004-09-12 22:39:46 +00002087 if mod is not None and not inspect.ismodule(mod):
Tim Peters8485b562004-08-04 18:46:34 +00002088 raise TypeError("Tester.__init__: mod must be a module; %r" %
2089 (mod,))
2090 if globs is None:
2091 globs = mod.__dict__
2092 self.globs = globs
Tim Petersdb3756d2003-06-29 05:30:48 +00002093
Tim Peters8485b562004-08-04 18:46:34 +00002094 self.verbose = verbose
2095 self.isprivate = isprivate
2096 self.optionflags = optionflags
Tim Petersf727c6c2004-08-08 01:48:59 +00002097 self.testfinder = DocTestFinder(_namefilter=isprivate)
Tim Peters8485b562004-08-04 18:46:34 +00002098 self.testrunner = DocTestRunner(verbose=verbose,
2099 optionflags=optionflags)
Tim Petersdb3756d2003-06-29 05:30:48 +00002100
Tim Peters8485b562004-08-04 18:46:34 +00002101 def runstring(self, s, name):
Edward Lopera1ef6112004-08-09 16:14:41 +00002102 test = DocTestParser().get_doctest(s, self.globs, name, None, None)
Tim Peters8485b562004-08-04 18:46:34 +00002103 if self.verbose:
2104 print "Running string", name
2105 (f,t) = self.testrunner.run(test)
2106 if self.verbose:
2107 print f, "of", t, "examples failed in string", name
2108 return (f,t)
Tim Petersdb3756d2003-06-29 05:30:48 +00002109
Tim Petersf3f57472004-08-08 06:11:48 +00002110 def rundoc(self, object, name=None, module=None):
Tim Peters8485b562004-08-04 18:46:34 +00002111 f = t = 0
2112 tests = self.testfinder.find(object, name, module=module,
Tim Petersf3f57472004-08-08 06:11:48 +00002113 globs=self.globs)
Tim Peters8485b562004-08-04 18:46:34 +00002114 for test in tests:
2115 (f2, t2) = self.testrunner.run(test)
2116 (f,t) = (f+f2, t+t2)
2117 return (f,t)
Tim Petersdb3756d2003-06-29 05:30:48 +00002118
Tim Peters8485b562004-08-04 18:46:34 +00002119 def rundict(self, d, name, module=None):
2120 import new
2121 m = new.module(name)
2122 m.__dict__.update(d)
Tim Petersf3f57472004-08-08 06:11:48 +00002123 if module is None:
2124 module = False
2125 return self.rundoc(m, name, module)
Tim Petersdb3756d2003-06-29 05:30:48 +00002126
Tim Peters8485b562004-08-04 18:46:34 +00002127 def run__test__(self, d, name):
2128 import new
2129 m = new.module(name)
2130 m.__test__ = d
Tim Peters9661f9a2004-09-12 22:45:17 +00002131 return self.rundoc(m, name)
Tim Petersdb3756d2003-06-29 05:30:48 +00002132
Tim Peters8485b562004-08-04 18:46:34 +00002133 def summarize(self, verbose=None):
2134 return self.testrunner.summarize(verbose)
Tim Petersdb3756d2003-06-29 05:30:48 +00002135
Tim Peters8485b562004-08-04 18:46:34 +00002136 def merge(self, other):
Tim Peters82076ef2004-09-13 00:52:51 +00002137 self.testrunner.merge(other.testrunner)
Tim Petersdb3756d2003-06-29 05:30:48 +00002138
Tim Peters8485b562004-08-04 18:46:34 +00002139######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00002140## 8. Unittest Support
Tim Peters8485b562004-08-04 18:46:34 +00002141######################################################################
Tim Petersdb3756d2003-06-29 05:30:48 +00002142
Jim Fultonf54bad42004-08-28 14:57:56 +00002143_unittest_reportflags = 0
Tim Peters38330fe2004-08-30 16:19:24 +00002144
Jim Fultonf54bad42004-08-28 14:57:56 +00002145def set_unittest_reportflags(flags):
Tim Peters38330fe2004-08-30 16:19:24 +00002146 """Sets the unittest option flags.
Jim Fultonf54bad42004-08-28 14:57:56 +00002147
2148 The old flag is returned so that a runner could restore the old
2149 value if it wished to:
2150
2151 >>> old = _unittest_reportflags
2152 >>> set_unittest_reportflags(REPORT_NDIFF |
2153 ... REPORT_ONLY_FIRST_FAILURE) == old
2154 True
2155
2156 >>> import doctest
2157 >>> doctest._unittest_reportflags == (REPORT_NDIFF |
2158 ... REPORT_ONLY_FIRST_FAILURE)
2159 True
Tim Petersdf7a2082004-08-29 00:38:17 +00002160
Jim Fultonf54bad42004-08-28 14:57:56 +00002161 Only reporting flags can be set:
2162
2163 >>> set_unittest_reportflags(ELLIPSIS)
2164 Traceback (most recent call last):
2165 ...
Tim Peters38330fe2004-08-30 16:19:24 +00002166 ValueError: ('Only reporting flags allowed', 8)
Jim Fultonf54bad42004-08-28 14:57:56 +00002167
2168 >>> set_unittest_reportflags(old) == (REPORT_NDIFF |
2169 ... REPORT_ONLY_FIRST_FAILURE)
2170 True
Jim Fultonf54bad42004-08-28 14:57:56 +00002171 """
Jim Fultonf54bad42004-08-28 14:57:56 +00002172 global _unittest_reportflags
Tim Peters38330fe2004-08-30 16:19:24 +00002173
2174 if (flags & REPORTING_FLAGS) != flags:
2175 raise ValueError("Only reporting flags allowed", flags)
Jim Fultonf54bad42004-08-28 14:57:56 +00002176 old = _unittest_reportflags
2177 _unittest_reportflags = flags
2178 return old
Tim Petersdf7a2082004-08-29 00:38:17 +00002179
Jim Fultonf54bad42004-08-28 14:57:56 +00002180
Tim Peters19397e52004-08-06 22:02:59 +00002181class DocTestCase(unittest.TestCase):
Tim Petersdb3756d2003-06-29 05:30:48 +00002182
Edward Loper34fcb142004-08-09 02:45:41 +00002183 def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
2184 checker=None):
Jim Fulton07a349c2004-08-22 14:10:00 +00002185
Jim Fultona643b652004-07-14 19:06:50 +00002186 unittest.TestCase.__init__(self)
Tim Peters19397e52004-08-06 22:02:59 +00002187 self._dt_optionflags = optionflags
Edward Loper34fcb142004-08-09 02:45:41 +00002188 self._dt_checker = checker
Tim Peters19397e52004-08-06 22:02:59 +00002189 self._dt_test = test
2190 self._dt_setUp = setUp
2191 self._dt_tearDown = tearDown
Tim Petersdb3756d2003-06-29 05:30:48 +00002192
Jim Fultona643b652004-07-14 19:06:50 +00002193 def setUp(self):
Jim Fultonf54bad42004-08-28 14:57:56 +00002194 test = self._dt_test
Tim Petersdf7a2082004-08-29 00:38:17 +00002195
Tim Peters19397e52004-08-06 22:02:59 +00002196 if self._dt_setUp is not None:
Jim Fultonf54bad42004-08-28 14:57:56 +00002197 self._dt_setUp(test)
Jim Fultona643b652004-07-14 19:06:50 +00002198
2199 def tearDown(self):
Jim Fultonf54bad42004-08-28 14:57:56 +00002200 test = self._dt_test
2201
Tim Peters19397e52004-08-06 22:02:59 +00002202 if self._dt_tearDown is not None:
Jim Fultonf54bad42004-08-28 14:57:56 +00002203 self._dt_tearDown(test)
2204
2205 test.globs.clear()
Jim Fultona643b652004-07-14 19:06:50 +00002206
2207 def runTest(self):
Tim Peters19397e52004-08-06 22:02:59 +00002208 test = self._dt_test
Jim Fultona643b652004-07-14 19:06:50 +00002209 old = sys.stdout
2210 new = StringIO()
Jim Fultonf54bad42004-08-28 14:57:56 +00002211 optionflags = self._dt_optionflags
Tim Petersdf7a2082004-08-29 00:38:17 +00002212
Tim Peters38330fe2004-08-30 16:19:24 +00002213 if not (optionflags & REPORTING_FLAGS):
Jim Fultonf54bad42004-08-28 14:57:56 +00002214 # The option flags don't include any reporting flags,
2215 # so add the default reporting flags
2216 optionflags |= _unittest_reportflags
Tim Petersdf7a2082004-08-29 00:38:17 +00002217
Jim Fultonf54bad42004-08-28 14:57:56 +00002218 runner = DocTestRunner(optionflags=optionflags,
Edward Loper34fcb142004-08-09 02:45:41 +00002219 checker=self._dt_checker, verbose=False)
Tim Peters19397e52004-08-06 22:02:59 +00002220
Jim Fultona643b652004-07-14 19:06:50 +00002221 try:
Tim Peters19397e52004-08-06 22:02:59 +00002222 runner.DIVIDER = "-"*70
Jim Fultonf54bad42004-08-28 14:57:56 +00002223 failures, tries = runner.run(
2224 test, out=new.write, clear_globs=False)
Jim Fultona643b652004-07-14 19:06:50 +00002225 finally:
2226 sys.stdout = old
2227
2228 if failures:
Tim Peters19397e52004-08-06 22:02:59 +00002229 raise self.failureException(self.format_failure(new.getvalue()))
Tim Peters8485b562004-08-04 18:46:34 +00002230
Tim Peters19397e52004-08-06 22:02:59 +00002231 def format_failure(self, err):
2232 test = self._dt_test
2233 if test.lineno is None:
2234 lineno = 'unknown line number'
2235 else:
Jim Fulton07a349c2004-08-22 14:10:00 +00002236 lineno = '%s' % test.lineno
Tim Peters19397e52004-08-06 22:02:59 +00002237 lname = '.'.join(test.name.split('.')[-1:])
2238 return ('Failed doctest test for %s\n'
2239 ' File "%s", line %s, in %s\n\n%s'
2240 % (test.name, test.filename, lineno, lname, err)
2241 )
2242
2243 def debug(self):
2244 r"""Run the test case without results and without catching exceptions
2245
2246 The unit test framework includes a debug method on test cases
2247 and test suites to support post-mortem debugging. The test code
2248 is run in such a way that errors are not caught. This way a
2249 caller can catch the errors and initiate post-mortem debugging.
2250
2251 The DocTestCase provides a debug method that raises
2252 UnexpectedException errors if there is an unexepcted
2253 exception:
2254
Edward Lopera1ef6112004-08-09 16:14:41 +00002255 >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
Tim Peters19397e52004-08-06 22:02:59 +00002256 ... {}, 'foo', 'foo.py', 0)
2257 >>> case = DocTestCase(test)
2258 >>> try:
2259 ... case.debug()
2260 ... except UnexpectedException, failure:
2261 ... pass
2262
2263 The UnexpectedException contains the test, the example, and
2264 the original exception:
2265
2266 >>> failure.test is test
2267 True
2268
2269 >>> failure.example.want
2270 '42\n'
2271
2272 >>> exc_info = failure.exc_info
2273 >>> raise exc_info[0], exc_info[1], exc_info[2]
2274 Traceback (most recent call last):
2275 ...
2276 KeyError
2277
2278 If the output doesn't match, then a DocTestFailure is raised:
2279
Edward Lopera1ef6112004-08-09 16:14:41 +00002280 >>> test = DocTestParser().get_doctest('''
Tim Peters19397e52004-08-06 22:02:59 +00002281 ... >>> x = 1
2282 ... >>> x
2283 ... 2
2284 ... ''', {}, 'foo', 'foo.py', 0)
2285 >>> case = DocTestCase(test)
2286
2287 >>> try:
2288 ... case.debug()
2289 ... except DocTestFailure, failure:
2290 ... pass
2291
2292 DocTestFailure objects provide access to the test:
2293
2294 >>> failure.test is test
2295 True
2296
2297 As well as to the example:
2298
2299 >>> failure.example.want
2300 '2\n'
2301
2302 and the actual output:
2303
2304 >>> failure.got
2305 '1\n'
2306
2307 """
2308
Jim Fultonf54bad42004-08-28 14:57:56 +00002309 self.setUp()
Edward Loper34fcb142004-08-09 02:45:41 +00002310 runner = DebugRunner(optionflags=self._dt_optionflags,
2311 checker=self._dt_checker, verbose=False)
Edward Loper3a3817f2004-08-19 19:26:06 +00002312 runner.run(self._dt_test)
Jim Fultonf54bad42004-08-28 14:57:56 +00002313 self.tearDown()
Jim Fultona643b652004-07-14 19:06:50 +00002314
2315 def id(self):
Tim Peters19397e52004-08-06 22:02:59 +00002316 return self._dt_test.name
Jim Fultona643b652004-07-14 19:06:50 +00002317
2318 def __repr__(self):
Tim Peters19397e52004-08-06 22:02:59 +00002319 name = self._dt_test.name.split('.')
Jim Fultona643b652004-07-14 19:06:50 +00002320 return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
2321
2322 __str__ = __repr__
2323
2324 def shortDescription(self):
Tim Peters19397e52004-08-06 22:02:59 +00002325 return "Doctest: " + self._dt_test.name
Jim Fultona643b652004-07-14 19:06:50 +00002326
Jim Fultonf54bad42004-08-28 14:57:56 +00002327def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
2328 **options):
Tim Peters8485b562004-08-04 18:46:34 +00002329 """
Tim Peters75dc5e12004-08-22 17:50:45 +00002330 Convert doctest tests for a module to a unittest test suite.
Jim Fultona643b652004-07-14 19:06:50 +00002331
Tim Peters19397e52004-08-06 22:02:59 +00002332 This converts each documentation string in a module that
2333 contains doctest tests to a unittest test case. If any of the
2334 tests in a doc string fail, then the test case fails. An exception
2335 is raised showing the name of the file containing the test and a
Jim Fultona643b652004-07-14 19:06:50 +00002336 (sometimes approximate) line number.
2337
Tim Peters19397e52004-08-06 22:02:59 +00002338 The `module` argument provides the module to be tested. The argument
Jim Fultona643b652004-07-14 19:06:50 +00002339 can be either a module or a module name.
2340
2341 If no argument is given, the calling module is used.
Jim Fultonf54bad42004-08-28 14:57:56 +00002342
2343 A number of options may be provided as keyword arguments:
2344
Jim Fultonf54bad42004-08-28 14:57:56 +00002345 setUp
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002346 A set-up function. This is called before running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002347 tests in each file. The setUp function will be passed a DocTest
2348 object. The setUp function can access the test globals as the
2349 globs attribute of the test passed.
2350
2351 tearDown
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002352 A tear-down function. This is called after running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002353 tests in each file. The tearDown function will be passed a DocTest
2354 object. The tearDown function can access the test globals as the
2355 globs attribute of the test passed.
2356
2357 globs
2358 A dictionary containing initial global variables for the tests.
2359
2360 optionflags
2361 A set of doctest option flags expressed as an integer.
Jim Fultona643b652004-07-14 19:06:50 +00002362 """
Jim Fultona643b652004-07-14 19:06:50 +00002363
Tim Peters8485b562004-08-04 18:46:34 +00002364 if test_finder is None:
2365 test_finder = DocTestFinder()
Tim Peters8485b562004-08-04 18:46:34 +00002366
Tim Peters19397e52004-08-06 22:02:59 +00002367 module = _normalize_module(module)
2368 tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
2369 if globs is None:
2370 globs = module.__dict__
Jim Fultonf54bad42004-08-28 14:57:56 +00002371 if not tests:
2372 # Why do we want to do this? Because it reveals a bug that might
2373 # otherwise be hidden.
Tim Peters19397e52004-08-06 22:02:59 +00002374 raise ValueError(module, "has no tests")
Tim Petersdb3756d2003-06-29 05:30:48 +00002375
2376 tests.sort()
2377 suite = unittest.TestSuite()
Tim Peters8485b562004-08-04 18:46:34 +00002378 for test in tests:
Tim Peters19397e52004-08-06 22:02:59 +00002379 if len(test.examples) == 0:
2380 continue
Tim Peters8485b562004-08-04 18:46:34 +00002381 if not test.filename:
Tim Petersdb3756d2003-06-29 05:30:48 +00002382 filename = module.__file__
Jim Fulton07a349c2004-08-22 14:10:00 +00002383 if filename[-4:] in (".pyc", ".pyo"):
Tim Petersdb3756d2003-06-29 05:30:48 +00002384 filename = filename[:-1]
Tim Peters8485b562004-08-04 18:46:34 +00002385 test.filename = filename
Jim Fultonf54bad42004-08-28 14:57:56 +00002386 suite.addTest(DocTestCase(test, **options))
Tim Peters19397e52004-08-06 22:02:59 +00002387
2388 return suite
2389
2390class DocFileCase(DocTestCase):
2391
2392 def id(self):
2393 return '_'.join(self._dt_test.name.split('.'))
2394
2395 def __repr__(self):
2396 return self._dt_test.filename
2397 __str__ = __repr__
2398
2399 def format_failure(self, err):
2400 return ('Failed doctest test for %s\n File "%s", line 0\n\n%s'
2401 % (self._dt_test.name, self._dt_test.filename, err)
2402 )
2403
Edward Loper052d0cd2004-09-19 17:19:33 +00002404def DocFileTest(path, module_relative=True, package=None,
Edward Loper498a1862004-09-27 03:42:58 +00002405 globs=None, parser=DocTestParser(), **options):
Tim Peters19397e52004-08-06 22:02:59 +00002406 if globs is None:
2407 globs = {}
2408
Edward Loper052d0cd2004-09-19 17:19:33 +00002409 if package and not module_relative:
2410 raise ValueError("Package may only be specified for module-"
2411 "relative paths.")
Tim Petersbab3e992004-09-20 19:52:34 +00002412
Edward Loper052d0cd2004-09-19 17:19:33 +00002413 # Relativize the path.
2414 if module_relative:
2415 package = _normalize_module(package)
2416 path = _module_relative_path(package, path)
Tim Peters19397e52004-08-06 22:02:59 +00002417
Edward Loper052d0cd2004-09-19 17:19:33 +00002418 # Find the file and read it.
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002419 name = os.path.basename(path)
Edward Loper052d0cd2004-09-19 17:19:33 +00002420 doc = open(path).read()
2421
2422 # Convert it to a test, and wrap it in a DocFileCase.
Edward Loper498a1862004-09-27 03:42:58 +00002423 test = parser.get_doctest(doc, globs, name, path, 0)
Jim Fultonf54bad42004-08-28 14:57:56 +00002424 return DocFileCase(test, **options)
Tim Peters19397e52004-08-06 22:02:59 +00002425
2426def DocFileSuite(*paths, **kw):
Edward Loper052d0cd2004-09-19 17:19:33 +00002427 """A unittest suite for one or more doctest files.
Tim Petersbab3e992004-09-20 19:52:34 +00002428
Edward Loper052d0cd2004-09-19 17:19:33 +00002429 The path to each doctest file is given as a string; the
2430 interpretation of that string depends on the keyword argument
2431 "module_relative".
Tim Peters19397e52004-08-06 22:02:59 +00002432
2433 A number of options may be provided as keyword arguments:
2434
Edward Loper052d0cd2004-09-19 17:19:33 +00002435 module_relative
2436 If "module_relative" is True, then the given file paths are
2437 interpreted as os-independent module-relative paths. By
2438 default, these paths are relative to the calling module's
2439 directory; but if the "package" argument is specified, then
2440 they are relative to that package. To ensure os-independence,
2441 "filename" should use "/" characters to separate path
2442 segments, and may not be an absolute path (i.e., it may not
2443 begin with "/").
Tim Petersbab3e992004-09-20 19:52:34 +00002444
Edward Loper052d0cd2004-09-19 17:19:33 +00002445 If "module_relative" is False, then the given file paths are
2446 interpreted as os-specific paths. These paths may be absolute
2447 or relative (to the current working directory).
2448
Tim Peters19397e52004-08-06 22:02:59 +00002449 package
Edward Loper052d0cd2004-09-19 17:19:33 +00002450 A Python package or the name of a Python package whose directory
2451 should be used as the base directory for module relative paths.
2452 If "package" is not specified, then the calling module's
2453 directory is used as the base directory for module relative
2454 filenames. It is an error to specify "package" if
2455 "module_relative" is False.
Tim Peters19397e52004-08-06 22:02:59 +00002456
2457 setUp
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002458 A set-up function. This is called before running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002459 tests in each file. The setUp function will be passed a DocTest
2460 object. The setUp function can access the test globals as the
2461 globs attribute of the test passed.
Tim Peters19397e52004-08-06 22:02:59 +00002462
2463 tearDown
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002464 A tear-down function. This is called after running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002465 tests in each file. The tearDown function will be passed a DocTest
2466 object. The tearDown function can access the test globals as the
2467 globs attribute of the test passed.
Tim Peters19397e52004-08-06 22:02:59 +00002468
2469 globs
2470 A dictionary containing initial global variables for the tests.
Jim Fultonf54bad42004-08-28 14:57:56 +00002471
2472 optionflags
Edward Loper498a1862004-09-27 03:42:58 +00002473 A set of doctest option flags expressed as an integer.
2474
2475 parser
2476 A DocTestParser (or subclass) that should be used to extract
2477 tests from the files.
Tim Peters19397e52004-08-06 22:02:59 +00002478 """
2479 suite = unittest.TestSuite()
2480
2481 # We do this here so that _normalize_module is called at the right
2482 # level. If it were called in DocFileTest, then this function
2483 # would be the caller and we might guess the package incorrectly.
Edward Loper052d0cd2004-09-19 17:19:33 +00002484 if kw.get('module_relative', True):
2485 kw['package'] = _normalize_module(kw.get('package'))
Tim Peters19397e52004-08-06 22:02:59 +00002486
2487 for path in paths:
2488 suite.addTest(DocFileTest(path, **kw))
Jim Fultona643b652004-07-14 19:06:50 +00002489
Tim Petersdb3756d2003-06-29 05:30:48 +00002490 return suite
2491
Tim Peters8485b562004-08-04 18:46:34 +00002492######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00002493## 9. Debugging Support
Tim Peters8485b562004-08-04 18:46:34 +00002494######################################################################
Jim Fultona643b652004-07-14 19:06:50 +00002495
Tim Peters19397e52004-08-06 22:02:59 +00002496def script_from_examples(s):
2497 r"""Extract script from text with examples.
2498
2499 Converts text with examples to a Python script. Example input is
2500 converted to regular code. Example output and all other words
2501 are converted to comments:
2502
2503 >>> text = '''
2504 ... Here are examples of simple math.
2505 ...
2506 ... Python has super accurate integer addition
2507 ...
2508 ... >>> 2 + 2
2509 ... 5
2510 ...
2511 ... And very friendly error messages:
2512 ...
2513 ... >>> 1/0
2514 ... To Infinity
2515 ... And
2516 ... Beyond
2517 ...
2518 ... You can use logic if you want:
2519 ...
2520 ... >>> if 0:
2521 ... ... blah
2522 ... ... blah
2523 ... ...
2524 ...
2525 ... Ho hum
2526 ... '''
2527
2528 >>> print script_from_examples(text)
Edward Lopera5db6002004-08-12 02:41:30 +00002529 # Here are examples of simple math.
Tim Peters19397e52004-08-06 22:02:59 +00002530 #
Edward Lopera5db6002004-08-12 02:41:30 +00002531 # Python has super accurate integer addition
Tim Peters19397e52004-08-06 22:02:59 +00002532 #
2533 2 + 2
2534 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00002535 ## 5
Tim Peters19397e52004-08-06 22:02:59 +00002536 #
Edward Lopera5db6002004-08-12 02:41:30 +00002537 # And very friendly error messages:
Tim Peters19397e52004-08-06 22:02:59 +00002538 #
2539 1/0
2540 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00002541 ## To Infinity
2542 ## And
2543 ## Beyond
Tim Peters19397e52004-08-06 22:02:59 +00002544 #
Edward Lopera5db6002004-08-12 02:41:30 +00002545 # You can use logic if you want:
Tim Peters19397e52004-08-06 22:02:59 +00002546 #
2547 if 0:
2548 blah
2549 blah
Tim Peters19397e52004-08-06 22:02:59 +00002550 #
Edward Lopera5db6002004-08-12 02:41:30 +00002551 # Ho hum
Tim Peters19397e52004-08-06 22:02:59 +00002552 """
Edward Loper00f8da72004-08-26 18:05:07 +00002553 output = []
2554 for piece in DocTestParser().parse(s):
2555 if isinstance(piece, Example):
2556 # Add the example's source code (strip trailing NL)
2557 output.append(piece.source[:-1])
2558 # Add the expected output:
2559 want = piece.want
2560 if want:
2561 output.append('# Expected:')
2562 output += ['## '+l for l in want.split('\n')[:-1]]
2563 else:
2564 # Add non-example text.
2565 output += [_comment_line(l)
2566 for l in piece.split('\n')[:-1]]
Tim Peters19397e52004-08-06 22:02:59 +00002567
Edward Loper00f8da72004-08-26 18:05:07 +00002568 # Trim junk on both ends.
2569 while output and output[-1] == '#':
2570 output.pop()
2571 while output and output[0] == '#':
2572 output.pop(0)
2573 # Combine the output, and return it.
2574 return '\n'.join(output)
Tim Petersdb3756d2003-06-29 05:30:48 +00002575
2576def testsource(module, name):
Tim Peters19397e52004-08-06 22:02:59 +00002577 """Extract the test sources from a doctest docstring as a script.
Tim Petersdb3756d2003-06-29 05:30:48 +00002578
2579 Provide the module (or dotted name of the module) containing the
Jim Fultona643b652004-07-14 19:06:50 +00002580 test to be debugged and the name (within the module) of the object
2581 with the doc string with tests to be debugged.
Tim Petersdb3756d2003-06-29 05:30:48 +00002582 """
Tim Peters8485b562004-08-04 18:46:34 +00002583 module = _normalize_module(module)
2584 tests = DocTestFinder().find(module)
2585 test = [t for t in tests if t.name == name]
Tim Petersdb3756d2003-06-29 05:30:48 +00002586 if not test:
2587 raise ValueError(name, "not found in tests")
2588 test = test[0]
Tim Peters19397e52004-08-06 22:02:59 +00002589 testsrc = script_from_examples(test.docstring)
Jim Fultona643b652004-07-14 19:06:50 +00002590 return testsrc
Tim Petersdb3756d2003-06-29 05:30:48 +00002591
Jim Fultona643b652004-07-14 19:06:50 +00002592def debug_src(src, pm=False, globs=None):
Tim Peters19397e52004-08-06 22:02:59 +00002593 """Debug a single doctest docstring, in argument `src`'"""
2594 testsrc = script_from_examples(src)
Tim Peters8485b562004-08-04 18:46:34 +00002595 debug_script(testsrc, pm, globs)
Tim Petersdb3756d2003-06-29 05:30:48 +00002596
Jim Fultona643b652004-07-14 19:06:50 +00002597def debug_script(src, pm=False, globs=None):
Tim Peters19397e52004-08-06 22:02:59 +00002598 "Debug a test script. `src` is the script, as a string."
Tim Petersdb3756d2003-06-29 05:30:48 +00002599 import pdb
Tim Petersdb3756d2003-06-29 05:30:48 +00002600
Tim Petersb6a04d62004-08-23 21:37:56 +00002601 # Note that tempfile.NameTemporaryFile() cannot be used. As the
2602 # docs say, a file so created cannot be opened by name a second time
2603 # on modern Windows boxes, and execfile() needs to open it.
2604 srcfilename = tempfile.mktemp(".py", "doctestdebug")
Tim Peters8485b562004-08-04 18:46:34 +00002605 f = open(srcfilename, 'w')
2606 f.write(src)
2607 f.close()
2608
Tim Petersb6a04d62004-08-23 21:37:56 +00002609 try:
2610 if globs:
2611 globs = globs.copy()
2612 else:
2613 globs = {}
Tim Petersdb3756d2003-06-29 05:30:48 +00002614
Tim Petersb6a04d62004-08-23 21:37:56 +00002615 if pm:
2616 try:
2617 execfile(srcfilename, globs, globs)
2618 except:
2619 print sys.exc_info()[1]
2620 pdb.post_mortem(sys.exc_info()[2])
2621 else:
2622 # Note that %r is vital here. '%s' instead can, e.g., cause
2623 # backslashes to get treated as metacharacters on Windows.
2624 pdb.run("execfile(%r)" % srcfilename, globs, globs)
2625
2626 finally:
2627 os.remove(srcfilename)
Tim Petersdb3756d2003-06-29 05:30:48 +00002628
Jim Fultona643b652004-07-14 19:06:50 +00002629def debug(module, name, pm=False):
Tim Peters19397e52004-08-06 22:02:59 +00002630 """Debug a single doctest docstring.
Jim Fultona643b652004-07-14 19:06:50 +00002631
2632 Provide the module (or dotted name of the module) containing the
2633 test to be debugged and the name (within the module) of the object
Tim Peters19397e52004-08-06 22:02:59 +00002634 with the docstring with tests to be debugged.
Jim Fultona643b652004-07-14 19:06:50 +00002635 """
Tim Peters8485b562004-08-04 18:46:34 +00002636 module = _normalize_module(module)
Jim Fultona643b652004-07-14 19:06:50 +00002637 testsrc = testsource(module, name)
2638 debug_script(testsrc, pm, module.__dict__)
2639
Tim Peters8485b562004-08-04 18:46:34 +00002640######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00002641## 10. Example Usage
Tim Peters8485b562004-08-04 18:46:34 +00002642######################################################################
Tim Peters8a7d2d52001-01-16 07:10:57 +00002643class _TestClass:
2644 """
2645 A pointless class, for sanity-checking of docstring testing.
2646
2647 Methods:
2648 square()
2649 get()
2650
2651 >>> _TestClass(13).get() + _TestClass(-12).get()
2652 1
2653 >>> hex(_TestClass(13).square().get())
2654 '0xa9'
2655 """
2656
2657 def __init__(self, val):
2658 """val -> _TestClass object with associated value val.
2659
2660 >>> t = _TestClass(123)
2661 >>> print t.get()
2662 123
2663 """
2664
2665 self.val = val
2666
2667 def square(self):
2668 """square() -> square TestClass's associated value
2669
2670 >>> _TestClass(13).square().get()
2671 169
2672 """
2673
2674 self.val = self.val ** 2
2675 return self
2676
2677 def get(self):
2678 """get() -> return TestClass's associated value.
2679
2680 >>> x = _TestClass(-42)
2681 >>> print x.get()
2682 -42
2683 """
2684
2685 return self.val
2686
2687__test__ = {"_TestClass": _TestClass,
2688 "string": r"""
2689 Example of a string object, searched as-is.
2690 >>> x = 1; y = 2
2691 >>> x + y, x * y
2692 (3, 2)
Tim Peters6ebe61f2003-06-27 20:48:05 +00002693 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002694
Tim Peters6ebe61f2003-06-27 20:48:05 +00002695 "bool-int equivalence": r"""
2696 In 2.2, boolean expressions displayed
2697 0 or 1. By default, we still accept
2698 them. This can be disabled by passing
2699 DONT_ACCEPT_TRUE_FOR_1 to the new
2700 optionflags argument.
2701 >>> 4 == 4
2702 1
2703 >>> 4 == 4
2704 True
2705 >>> 4 > 4
2706 0
2707 >>> 4 > 4
2708 False
2709 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002710
Tim Peters8485b562004-08-04 18:46:34 +00002711 "blank lines": r"""
Tim Peters3fa8c202004-08-23 21:43:39 +00002712 Blank lines can be marked with <BLANKLINE>:
2713 >>> print 'foo\n\nbar\n'
2714 foo
2715 <BLANKLINE>
2716 bar
2717 <BLANKLINE>
Tim Peters8485b562004-08-04 18:46:34 +00002718 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002719
2720 "ellipsis": r"""
2721 If the ellipsis flag is used, then '...' can be used to
2722 elide substrings in the desired output:
2723 >>> print range(1000) #doctest: +ELLIPSIS
2724 [0, 1, 2, ..., 999]
2725 """,
2726
2727 "whitespace normalization": r"""
2728 If the whitespace normalization flag is used, then
2729 differences in whitespace are ignored.
2730 >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
2731 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2732 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
2733 27, 28, 29]
2734 """,
2735 }
Tim Peters8485b562004-08-04 18:46:34 +00002736
Tim Peters8a7d2d52001-01-16 07:10:57 +00002737def _test():
Tim Peters8485b562004-08-04 18:46:34 +00002738 r = unittest.TextTestRunner()
2739 r.run(DocTestSuite())
Tim Peters8a7d2d52001-01-16 07:10:57 +00002740
2741if __name__ == "__main__":
2742 _test()