blob: 234733e5651c5359d2aee3704b6bd7494c76f54f [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',
Thomas Wouters477c8d52006-05-27 19:21:47 +000057 'SKIP',
Tim Peters1fbf9c52004-09-04 17:21:02 +000058 'IGNORE_EXCEPTION_DETAIL',
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
Edward Loperb7503ff2004-08-19 19:19:03 +000066 # 2. Example & DocTest
Tim Peters8485b562004-08-04 18:46:34 +000067 'Example',
68 'DocTest',
Edward Loperb7503ff2004-08-19 19:19:03 +000069 # 3. Doctest Parser
70 'DocTestParser',
71 # 4. Doctest Finder
Tim Peters8485b562004-08-04 18:46:34 +000072 'DocTestFinder',
Edward Loperb7503ff2004-08-19 19:19:03 +000073 # 5. Doctest Runner
Tim Peters8485b562004-08-04 18:46:34 +000074 'DocTestRunner',
Edward Loperb7503ff2004-08-19 19:19:03 +000075 'OutputChecker',
76 'DocTestFailure',
77 'UnexpectedException',
78 'DebugRunner',
79 # 6. Test Functions
Tim Peters4fd9e2f2001-08-18 00:05:50 +000080 'testmod',
Edward Loper052d0cd2004-09-19 17:19:33 +000081 'testfile',
Tim Peters4fd9e2f2001-08-18 00:05:50 +000082 'run_docstring_examples',
Georg Brandlcc80bfe2008-05-12 18:06:23 +000083 # 7. Unittest Support
Tim Petersdb3756d2003-06-29 05:30:48 +000084 'DocTestSuite',
Edward Loperb7503ff2004-08-19 19:19:03 +000085 'DocFileSuite',
Tim Peters9d02a7c2004-09-26 01:50:24 +000086 'set_unittest_reportflags',
Georg Brandlcc80bfe2008-05-12 18:06:23 +000087 # 8. Debugging Support
Edward Loperb7503ff2004-08-19 19:19:03 +000088 'script_from_examples',
Tim Petersdb3756d2003-06-29 05:30:48 +000089 'testsource',
Edward Loperb7503ff2004-08-19 19:19:03 +000090 'debug_src',
Tim Petersdb3756d2003-06-29 05:30:48 +000091 'debug',
Tim Peters4fd9e2f2001-08-18 00:05:50 +000092]
Tim Peters8a7d2d52001-01-16 07:10:57 +000093
Tim Peters4fd9e2f2001-08-18 00:05:50 +000094import __future__
Victor Stinner12b8d142011-06-30 17:35:55 +020095import difflib
96import inspect
97import linecache
98import os
99import pdb
100import re
101import sys
102import traceback
103import unittest
Guido van Rossum34d19282007-08-09 01:03:29 +0000104from io import StringIO
Christian Heimes25bb7832008-01-11 16:17:00 +0000105from collections import namedtuple
106
107TestResults = namedtuple('TestResults', 'failed attempted')
Tim Peters7402f792001-10-02 03:53:41 +0000108
Tim Peters19397e52004-08-06 22:02:59 +0000109# There are 4 basic classes:
110# - Example: a <source, want> pair, plus an intra-docstring line number.
111# - DocTest: a collection of examples, parsed from a docstring, plus
112# info about where the docstring came from (name, filename, lineno).
113# - DocTestFinder: extracts DocTests from a given object's docstring and
114# its contained objects' docstrings.
115# - DocTestRunner: runs DocTest cases, and accumulates statistics.
116#
117# So the basic picture is:
118#
119# list of:
120# +------+ +---------+ +-------+
121# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
122# +------+ +---------+ +-------+
123# | Example |
124# | ... |
125# | Example |
126# +---------+
127
Edward Loperac20f572004-08-12 02:02:24 +0000128# Option constants.
Tim Peters38330fe2004-08-30 16:19:24 +0000129
Edward Loperac20f572004-08-12 02:02:24 +0000130OPTIONFLAGS_BY_NAME = {}
131def register_optionflag(name):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132 # Create a new flag unless `name` is already known.
133 return OPTIONFLAGS_BY_NAME.setdefault(name, 1 << len(OPTIONFLAGS_BY_NAME))
Edward Loperac20f572004-08-12 02:02:24 +0000134
135DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
136DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
137NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
138ELLIPSIS = register_optionflag('ELLIPSIS')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139SKIP = register_optionflag('SKIP')
Tim Peters1fbf9c52004-09-04 17:21:02 +0000140IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
Tim Peters38330fe2004-08-30 16:19:24 +0000141
142COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
143 DONT_ACCEPT_BLANKLINE |
144 NORMALIZE_WHITESPACE |
Tim Peters1fbf9c52004-09-04 17:21:02 +0000145 ELLIPSIS |
Thomas Wouters477c8d52006-05-27 19:21:47 +0000146 SKIP |
Edward Loper7d88a582004-09-28 05:50:57 +0000147 IGNORE_EXCEPTION_DETAIL)
Tim Peters38330fe2004-08-30 16:19:24 +0000148
Edward Loper71f55af2004-08-26 01:41:51 +0000149REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
150REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
151REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
Edward Lopera89f88d2004-08-26 02:45:51 +0000152REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
Edward Loperac20f572004-08-12 02:02:24 +0000153
Tim Peters38330fe2004-08-30 16:19:24 +0000154REPORTING_FLAGS = (REPORT_UDIFF |
155 REPORT_CDIFF |
156 REPORT_NDIFF |
157 REPORT_ONLY_FIRST_FAILURE)
158
Edward Loperac20f572004-08-12 02:02:24 +0000159# Special string markers for use in `want` strings:
160BLANKLINE_MARKER = '<BLANKLINE>'
161ELLIPSIS_MARKER = '...'
162
Tim Peters8485b562004-08-04 18:46:34 +0000163######################################################################
164## Table of Contents
165######################################################################
Edward Loper7c748462004-08-09 02:06:06 +0000166# 1. Utility Functions
167# 2. Example & DocTest -- store test cases
168# 3. DocTest Parser -- extracts examples from strings
169# 4. DocTest Finder -- extracts test cases from objects
170# 5. DocTest Runner -- runs test cases
171# 6. Test Functions -- convenient wrappers for testing
Georg Brandl31835852008-05-12 17:38:56 +0000172# 7. Unittest Support
173# 8. Debugging Support
174# 9. Example Usage
Tim Peters8a7d2d52001-01-16 07:10:57 +0000175
Tim Peters8485b562004-08-04 18:46:34 +0000176######################################################################
177## 1. Utility Functions
178######################################################################
Tim Peters8a7d2d52001-01-16 07:10:57 +0000179
Tim Peters8485b562004-08-04 18:46:34 +0000180def _extract_future_flags(globs):
181 """
182 Return the compiler-flags associated with the future features that
183 have been imported into the given namespace (globs).
184 """
185 flags = 0
186 for fname in __future__.all_feature_names:
187 feature = globs.get(fname, None)
188 if feature is getattr(__future__, fname):
189 flags |= feature.compiler_flag
190 return flags
Tim Peters7402f792001-10-02 03:53:41 +0000191
Tim Peters8485b562004-08-04 18:46:34 +0000192def _normalize_module(module, depth=2):
193 """
194 Return the module specified by `module`. In particular:
195 - If `module` is a module, then return module.
196 - If `module` is a string, then import and return the
197 module with that name.
198 - If `module` is None, then return the calling module.
199 The calling module is assumed to be the module of
200 the stack frame at the given depth in the call stack.
201 """
202 if inspect.ismodule(module):
203 return module
Walter Dörwaldaa97f042007-05-03 21:05:51 +0000204 elif isinstance(module, str):
Tim Peters8485b562004-08-04 18:46:34 +0000205 return __import__(module, globals(), locals(), ["*"])
206 elif module is None:
207 return sys.modules[sys._getframe(depth).f_globals['__name__']]
208 else:
209 raise TypeError("Expected a module, string, or None")
Tim Peters7402f792001-10-02 03:53:41 +0000210
Guido van Rossum1b81e7b2007-08-29 03:53:53 +0000211def _load_testfile(filename, package, module_relative, encoding):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000212 if module_relative:
213 package = _normalize_module(package, 3)
214 filename = _module_relative_path(package, filename)
215 if hasattr(package, '__loader__'):
216 if hasattr(package.__loader__, 'get_data'):
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000217 file_contents = package.__loader__.get_data(filename)
218 file_contents = file_contents.decode(encoding)
219 # get_data() opens files as 'rb', so one must do the equivalent
220 # conversion as universal newlines would do.
221 return file_contents.replace(os.linesep, '\n'), filename
Antoine Pitrou92f60ed2010-10-14 22:11:44 +0000222 with open(filename, encoding=encoding) as f:
223 return f.read(), filename
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000224
Edward Loperaacf0832004-08-26 01:19:50 +0000225def _indent(s, indent=4):
Tim Peters8485b562004-08-04 18:46:34 +0000226 """
Florent Xicluna59250852010-02-27 14:21:57 +0000227 Add the given number of space characters to the beginning of
228 every non-blank line in `s`, and return the result.
Tim Peters8485b562004-08-04 18:46:34 +0000229 """
Edward Loperaacf0832004-08-26 01:19:50 +0000230 # This regexp matches the start of non-blank lines:
231 return re.sub('(?m)^(?!$)', indent*' ', s)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000232
Edward Loper8e4a34b2004-08-12 02:34:27 +0000233def _exception_traceback(exc_info):
234 """
235 Return a string containing a traceback message for the given
236 exc_info tuple (as returned by sys.exc_info()).
237 """
238 # Get a traceback message.
239 excout = StringIO()
240 exc_type, exc_val, exc_tb = exc_info
241 traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
242 return excout.getvalue()
243
Tim Peters8485b562004-08-04 18:46:34 +0000244# Override some StringIO methods.
245class _SpoofOut(StringIO):
246 def getvalue(self):
247 result = StringIO.getvalue(self)
248 # If anything at all was written, make sure there's a trailing
249 # newline. There's no way for the expected output to indicate
250 # that a trailing newline is missing.
251 if result and not result.endswith("\n"):
252 result += "\n"
Tim Peters8485b562004-08-04 18:46:34 +0000253 return result
Tim Peters8a7d2d52001-01-16 07:10:57 +0000254
Guido van Rossum79139b22007-02-09 23:20:19 +0000255 def truncate(self, size=None):
Antoine Pitroub3d77002010-01-31 23:12:29 +0000256 self.seek(size)
257 StringIO.truncate(self)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000258
Tim Peters26b3ebb2004-08-19 08:10:08 +0000259# Worst-case linear-time ellipsis matching.
Tim Petersb0a04e12004-08-20 02:08:04 +0000260def _ellipsis_match(want, got):
Tim Petersdc5de3b2004-08-19 14:06:20 +0000261 """
262 Essentially the only subtle case:
Tim Petersb0a04e12004-08-20 02:08:04 +0000263 >>> _ellipsis_match('aa...aa', 'aaa')
Tim Petersdc5de3b2004-08-19 14:06:20 +0000264 False
265 """
Tim Peters26b3ebb2004-08-19 08:10:08 +0000266 if ELLIPSIS_MARKER not in want:
267 return want == got
Tim Petersdc5de3b2004-08-19 14:06:20 +0000268
Tim Peters26b3ebb2004-08-19 08:10:08 +0000269 # Find "the real" strings.
270 ws = want.split(ELLIPSIS_MARKER)
271 assert len(ws) >= 2
Tim Peters26b3ebb2004-08-19 08:10:08 +0000272
Tim Petersdc5de3b2004-08-19 14:06:20 +0000273 # Deal with exact matches possibly needed at one or both ends.
274 startpos, endpos = 0, len(got)
275 w = ws[0]
276 if w: # starts with exact match
277 if got.startswith(w):
278 startpos = len(w)
279 del ws[0]
280 else:
281 return False
282 w = ws[-1]
283 if w: # ends with exact match
284 if got.endswith(w):
285 endpos -= len(w)
286 del ws[-1]
287 else:
288 return False
289
290 if startpos > endpos:
291 # Exact end matches required more characters than we have, as in
Tim Petersb0a04e12004-08-20 02:08:04 +0000292 # _ellipsis_match('aa...aa', 'aaa')
Tim Petersdc5de3b2004-08-19 14:06:20 +0000293 return False
294
295 # For the rest, we only need to find the leftmost non-overlapping
296 # match for each piece. If there's no overall match that way alone,
297 # there's no overall match period.
Tim Peters26b3ebb2004-08-19 08:10:08 +0000298 for w in ws:
299 # w may be '' at times, if there are consecutive ellipses, or
300 # due to an ellipsis at the start or end of `want`. That's OK.
Tim Petersdc5de3b2004-08-19 14:06:20 +0000301 # Search for an empty string succeeds, and doesn't change startpos.
302 startpos = got.find(w, startpos, endpos)
303 if startpos < 0:
Tim Peters26b3ebb2004-08-19 08:10:08 +0000304 return False
Tim Petersdc5de3b2004-08-19 14:06:20 +0000305 startpos += len(w)
Tim Peters26b3ebb2004-08-19 08:10:08 +0000306
Tim Petersdc5de3b2004-08-19 14:06:20 +0000307 return True
Tim Peters26b3ebb2004-08-19 08:10:08 +0000308
Edward Loper00f8da72004-08-26 18:05:07 +0000309def _comment_line(line):
310 "Return a commented form of the given line"
311 line = line.rstrip()
312 if line:
313 return '# '+line
314 else:
315 return '#'
316
Edward Loper2de91ba2004-08-27 02:07:46 +0000317class _OutputRedirectingPdb(pdb.Pdb):
318 """
319 A specialized version of the python debugger that redirects stdout
320 to a given stream when interacting with the user. Stdout is *not*
321 redirected when traced code is executed.
322 """
323 def __init__(self, out):
324 self.__out = out
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000325 self.__debugger_used = False
Georg Brandl34748cd2010-12-04 17:11:36 +0000326 # do not play signal games in the pdb
327 pdb.Pdb.__init__(self, stdout=out, nosigint=True)
Georg Brandld72e0432010-07-30 09:59:28 +0000328 # still use input() to get user input
329 self.use_rawinput = 1
Edward Loper2de91ba2004-08-27 02:07:46 +0000330
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +0000331 def set_trace(self, frame=None):
332 self.__debugger_used = True
333 if frame is None:
334 frame = sys._getframe().f_back
335 pdb.Pdb.set_trace(self, frame)
336
337 def set_continue(self):
338 # Calling set_continue unconditionally would break unit test
339 # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
340 if self.__debugger_used:
341 pdb.Pdb.set_continue(self)
342
Edward Loper2de91ba2004-08-27 02:07:46 +0000343 def trace_dispatch(self, *args):
344 # Redirect stdout to the given stream.
345 save_stdout = sys.stdout
346 sys.stdout = self.__out
347 # Call Pdb's trace dispatch method.
Tim Petersd7bbbbc2004-11-08 22:30:28 +0000348 try:
349 return pdb.Pdb.trace_dispatch(self, *args)
350 finally:
Tim Petersd7bbbbc2004-11-08 22:30:28 +0000351 sys.stdout = save_stdout
Edward Loper2de91ba2004-08-27 02:07:46 +0000352
Edward Lopera2fc7ec2004-09-21 03:24:24 +0000353# [XX] Normalize with respect to os.path.pardir?
Edward Loper052d0cd2004-09-19 17:19:33 +0000354def _module_relative_path(module, path):
355 if not inspect.ismodule(module):
Collin Winterce36ad82007-08-30 01:19:48 +0000356 raise TypeError('Expected a module: %r' % module)
Edward Loper052d0cd2004-09-19 17:19:33 +0000357 if path.startswith('/'):
Collin Winterce36ad82007-08-30 01:19:48 +0000358 raise ValueError('Module-relative files may not have absolute paths')
Edward Loper052d0cd2004-09-19 17:19:33 +0000359
360 # Find the base directory for the path.
361 if hasattr(module, '__file__'):
362 # A normal module/package
363 basedir = os.path.split(module.__file__)[0]
364 elif module.__name__ == '__main__':
365 # An interactive session.
366 if len(sys.argv)>0 and sys.argv[0] != '':
367 basedir = os.path.split(sys.argv[0])[0]
368 else:
369 basedir = os.curdir
370 else:
371 # A module w/o __file__ (this includes builtins)
372 raise ValueError("Can't resolve paths relative to the module " +
373 module + " (it has no __file__)")
374
375 # Combine the base directory and the path.
376 return os.path.join(basedir, *(path.split('/')))
377
Tim Peters8485b562004-08-04 18:46:34 +0000378######################################################################
379## 2. Example & DocTest
380######################################################################
381## - An "example" is a <source, want> pair, where "source" is a
382## fragment of source code, and "want" is the expected output for
383## "source." The Example class also includes information about
384## where the example was extracted from.
385##
Edward Lopera1ef6112004-08-09 16:14:41 +0000386## - A "doctest" is a collection of examples, typically extracted from
387## a string (such as an object's docstring). The DocTest class also
388## includes information about where the string was extracted from.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000389
Tim Peters8485b562004-08-04 18:46:34 +0000390class Example:
391 """
392 A single doctest example, consisting of source code and expected
Edward Lopera1ef6112004-08-09 16:14:41 +0000393 output. `Example` defines the following attributes:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000394
Edward Loper74bca7a2004-08-12 02:27:44 +0000395 - source: A single Python statement, always ending with a newline.
Tim Petersbb431472004-08-09 03:51:46 +0000396 The constructor adds a newline if needed.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000397
Edward Loper74bca7a2004-08-12 02:27:44 +0000398 - want: The expected output from running the source code (either
Tim Petersbb431472004-08-09 03:51:46 +0000399 from stdout, or a traceback in case of exception). `want` ends
400 with a newline unless it's empty, in which case it's an empty
401 string. The constructor adds a newline if needed.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000402
Edward Lopera6b68322004-08-26 00:05:43 +0000403 - exc_msg: The exception message generated by the example, if
404 the example is expected to generate an exception; or `None` if
405 it is not expected to generate an exception. This exception
406 message is compared against the return value of
407 `traceback.format_exception_only()`. `exc_msg` ends with a
408 newline unless it's `None`. The constructor adds a newline
409 if needed.
410
Edward Loper74bca7a2004-08-12 02:27:44 +0000411 - lineno: The line number within the DocTest string containing
Tim Peters8485b562004-08-04 18:46:34 +0000412 this Example where the Example begins. This line number is
413 zero-based, with respect to the beginning of the DocTest.
Edward Loper74bca7a2004-08-12 02:27:44 +0000414
415 - indent: The example's indentation in the DocTest string.
416 I.e., the number of space characters that preceed the
417 example's first prompt.
418
419 - options: A dictionary mapping from option flags to True or
420 False, which is used to override default options for this
421 example. Any option flags not contained in this dictionary
422 are left at their default value (as specified by the
423 DocTestRunner's optionflags). By default, no options are set.
Tim Peters8485b562004-08-04 18:46:34 +0000424 """
Edward Lopera6b68322004-08-26 00:05:43 +0000425 def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
426 options=None):
Tim Petersbb431472004-08-09 03:51:46 +0000427 # Normalize inputs.
428 if not source.endswith('\n'):
429 source += '\n'
430 if want and not want.endswith('\n'):
431 want += '\n'
Edward Lopera6b68322004-08-26 00:05:43 +0000432 if exc_msg is not None and not exc_msg.endswith('\n'):
433 exc_msg += '\n'
Tim Peters8485b562004-08-04 18:46:34 +0000434 # Store properties.
435 self.source = source
436 self.want = want
437 self.lineno = lineno
Edward Loper74bca7a2004-08-12 02:27:44 +0000438 self.indent = indent
439 if options is None: options = {}
440 self.options = options
Edward Lopera6b68322004-08-26 00:05:43 +0000441 self.exc_msg = exc_msg
Tim Peters8a7d2d52001-01-16 07:10:57 +0000442
Antoine Pitrou2bc801c2011-12-18 19:27:45 +0100443 def __eq__(self, other):
444 if type(self) is not type(other):
445 return NotImplemented
446
447 return self.source == other.source and \
448 self.want == other.want and \
449 self.lineno == other.lineno and \
450 self.indent == other.indent and \
451 self.options == other.options and \
452 self.exc_msg == other.exc_msg
453
454 def __ne__(self, other):
455 return not self == other
456
Antoine Pitrou165b1282011-12-18 20:20:17 +0100457 def __hash__(self):
458 return hash((self.source, self.want, self.lineno, self.indent,
459 self.exc_msg))
460
Antoine Pitrou2bc801c2011-12-18 19:27:45 +0100461
Tim Peters8485b562004-08-04 18:46:34 +0000462class DocTest:
463 """
464 A collection of doctest examples that should be run in a single
Edward Lopera1ef6112004-08-09 16:14:41 +0000465 namespace. Each `DocTest` defines the following attributes:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000466
Tim Peters8485b562004-08-04 18:46:34 +0000467 - examples: the list of examples.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000468
Tim Peters8485b562004-08-04 18:46:34 +0000469 - globs: The namespace (aka globals) that the examples should
470 be run in.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000471
Tim Peters8485b562004-08-04 18:46:34 +0000472 - name: A name identifying the DocTest (typically, the name of
473 the object whose docstring this DocTest was extracted from).
Tim Peters8a7d2d52001-01-16 07:10:57 +0000474
Tim Peters8485b562004-08-04 18:46:34 +0000475 - filename: The name of the file that this DocTest was extracted
Edward Lopera1ef6112004-08-09 16:14:41 +0000476 from, or `None` if the filename is unknown.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000477
Tim Peters8485b562004-08-04 18:46:34 +0000478 - lineno: The line number within filename where this DocTest
Edward Lopera1ef6112004-08-09 16:14:41 +0000479 begins, or `None` if the line number is unavailable. This
480 line number is zero-based, with respect to the beginning of
481 the file.
482
483 - docstring: The string that the examples were extracted from,
484 or `None` if the string is unavailable.
Tim Peters8485b562004-08-04 18:46:34 +0000485 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000486 def __init__(self, examples, globs, name, filename, lineno, docstring):
Tim Peters8485b562004-08-04 18:46:34 +0000487 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000488 Create a new DocTest containing the given examples. The
489 DocTest's globals are initialized with a copy of `globs`.
Tim Peters8485b562004-08-04 18:46:34 +0000490 """
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000491 assert not isinstance(examples, str), \
Edward Lopera1ef6112004-08-09 16:14:41 +0000492 "DocTest no longer accepts str; use DocTestParser instead"
493 self.examples = examples
494 self.docstring = docstring
Tim Peters8485b562004-08-04 18:46:34 +0000495 self.globs = globs.copy()
Tim Peters8485b562004-08-04 18:46:34 +0000496 self.name = name
497 self.filename = filename
498 self.lineno = lineno
Tim Peters8485b562004-08-04 18:46:34 +0000499
500 def __repr__(self):
501 if len(self.examples) == 0:
502 examples = 'no examples'
503 elif len(self.examples) == 1:
504 examples = '1 example'
505 else:
506 examples = '%d examples' % len(self.examples)
507 return ('<DocTest %s from %s:%s (%s)>' %
508 (self.name, self.filename, self.lineno, examples))
509
Antoine Pitrou2bc801c2011-12-18 19:27:45 +0100510 def __eq__(self, other):
511 if type(self) is not type(other):
512 return NotImplemented
513
514 return self.examples == other.examples and \
515 self.docstring == other.docstring and \
516 self.globs == other.globs and \
517 self.name == other.name and \
518 self.filename == other.filename and \
519 self.lineno == other.lineno
520
521 def __ne__(self, other):
522 return not self == other
Tim Peters8485b562004-08-04 18:46:34 +0000523
Antoine Pitrou165b1282011-12-18 20:20:17 +0100524 def __hash__(self):
525 return hash((self.docstring, self.name, self.filename, self.lineno))
526
Tim Peters8485b562004-08-04 18:46:34 +0000527 # This lets us sort tests by name:
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000528 def __lt__(self, other):
Tim Peters8485b562004-08-04 18:46:34 +0000529 if not isinstance(other, DocTest):
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000530 return NotImplemented
531 return ((self.name, self.filename, self.lineno, id(self))
532 <
533 (other.name, other.filename, other.lineno, id(other)))
Tim Peters8485b562004-08-04 18:46:34 +0000534
535######################################################################
Edward Loperb7503ff2004-08-19 19:19:03 +0000536## 3. DocTestParser
Edward Loper7c748462004-08-09 02:06:06 +0000537######################################################################
538
Edward Lopera1ef6112004-08-09 16:14:41 +0000539class DocTestParser:
Edward Loper7c748462004-08-09 02:06:06 +0000540 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000541 A class used to parse strings containing doctest examples.
Edward Loper7c748462004-08-09 02:06:06 +0000542 """
Edward Loper8e4a34b2004-08-12 02:34:27 +0000543 # This regular expression is used to find doctest examples in a
544 # string. It defines three groups: `source` is the source code
545 # (including leading indentation and prompts); `indent` is the
546 # indentation of the first (PS1) line of the source code; and
547 # `want` is the expected output (including leading indentation).
Edward Loper7c748462004-08-09 02:06:06 +0000548 _EXAMPLE_RE = re.compile(r'''
Tim Petersd40a92b2004-08-09 03:28:45 +0000549 # Source consists of a PS1 line followed by zero or more PS2 lines.
550 (?P<source>
551 (?:^(?P<indent> [ ]*) >>> .*) # PS1 line
552 (?:\n [ ]* \.\.\. .*)*) # PS2 lines
553 \n?
554 # Want consists of any non-blank lines that do not start with PS1.
555 (?P<want> (?:(?![ ]*$) # Not a blank line
556 (?![ ]*>>>) # Not a line starting with PS1
557 .*$\n? # But any other line
558 )*)
559 ''', re.MULTILINE | re.VERBOSE)
Edward Loper8e4a34b2004-08-12 02:34:27 +0000560
Edward Lopera6b68322004-08-26 00:05:43 +0000561 # A regular expression for handling `want` strings that contain
562 # expected exceptions. It divides `want` into three pieces:
563 # - the traceback header line (`hdr`)
564 # - the traceback stack (`stack`)
565 # - the exception message (`msg`), as generated by
566 # traceback.format_exception_only()
567 # `msg` may have multiple lines. We assume/require that the
568 # exception message is the first non-indented line starting with a word
569 # character following the traceback header line.
570 _EXCEPTION_RE = re.compile(r"""
571 # Grab the traceback header. Different versions of Python have
572 # said different things on the first traceback line.
573 ^(?P<hdr> Traceback\ \(
574 (?: most\ recent\ call\ last
575 | innermost\ last
576 ) \) :
577 )
578 \s* $ # toss trailing whitespace on the header.
579 (?P<stack> .*?) # don't blink: absorb stuff until...
580 ^ (?P<msg> \w+ .*) # a line *starts* with alphanum.
581 """, re.VERBOSE | re.MULTILINE | re.DOTALL)
582
Tim Peters7ea48dd2004-08-13 01:52:59 +0000583 # A callable returning a true value iff its argument is a blank line
584 # or contains a single comment.
Edward Loper8e4a34b2004-08-12 02:34:27 +0000585 _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
Edward Loper7c748462004-08-09 02:06:06 +0000586
Edward Loper00f8da72004-08-26 18:05:07 +0000587 def parse(self, string, name='<string>'):
588 """
589 Divide the given string into examples and intervening text,
590 and return them as a list of alternating Examples and strings.
591 Line numbers for the Examples are 0-based. The optional
592 argument `name` is a name identifying this string, and is only
593 used for error messages.
594 """
595 string = string.expandtabs()
596 # If all lines begin with the same indentation, then strip it.
597 min_indent = self._min_indent(string)
598 if min_indent > 0:
599 string = '\n'.join([l[min_indent:] for l in string.split('\n')])
600
601 output = []
602 charno, lineno = 0, 0
603 # Find all doctest examples in the string:
Edward Loper2de91ba2004-08-27 02:07:46 +0000604 for m in self._EXAMPLE_RE.finditer(string):
Edward Loper00f8da72004-08-26 18:05:07 +0000605 # Add the pre-example text to `output`.
606 output.append(string[charno:m.start()])
607 # Update lineno (lines before this example)
608 lineno += string.count('\n', charno, m.start())
609 # Extract info from the regexp match.
610 (source, options, want, exc_msg) = \
611 self._parse_example(m, name, lineno)
612 # Create an Example, and add it to the list.
613 if not self._IS_BLANK_OR_COMMENT(source):
614 output.append( Example(source, want, exc_msg,
615 lineno=lineno,
616 indent=min_indent+len(m.group('indent')),
617 options=options) )
618 # Update lineno (lines inside this example)
619 lineno += string.count('\n', m.start(), m.end())
620 # Update charno.
621 charno = m.end()
622 # Add any remaining post-example text to `output`.
623 output.append(string[charno:])
624 return output
625
Edward Lopera1ef6112004-08-09 16:14:41 +0000626 def get_doctest(self, string, globs, name, filename, lineno):
Edward Loper7c748462004-08-09 02:06:06 +0000627 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000628 Extract all doctest examples from the given string, and
629 collect them into a `DocTest` object.
630
631 `globs`, `name`, `filename`, and `lineno` are attributes for
632 the new `DocTest` object. See the documentation for `DocTest`
633 for more information.
634 """
635 return DocTest(self.get_examples(string, name), globs,
636 name, filename, lineno, string)
637
638 def get_examples(self, string, name='<string>'):
639 """
640 Extract all doctest examples from the given string, and return
641 them as a list of `Example` objects. Line numbers are
642 0-based, because it's most common in doctests that nothing
643 interesting appears on the same line as opening triple-quote,
644 and so the first interesting line is called \"line 1\" then.
645
646 The optional argument `name` is a name identifying this
647 string, and is only used for error messages.
Edward Loper7c748462004-08-09 02:06:06 +0000648 """
Edward Loper00f8da72004-08-26 18:05:07 +0000649 return [x for x in self.parse(string, name)
650 if isinstance(x, Example)]
Edward Loper7c748462004-08-09 02:06:06 +0000651
Edward Loper74bca7a2004-08-12 02:27:44 +0000652 def _parse_example(self, m, name, lineno):
653 """
654 Given a regular expression match from `_EXAMPLE_RE` (`m`),
655 return a pair `(source, want)`, where `source` is the matched
656 example's source code (with prompts and indentation stripped);
657 and `want` is the example's expected output (with indentation
658 stripped).
659
660 `name` is the string's name, and `lineno` is the line number
661 where the example starts; both are used for error messages.
662 """
Edward Loper7c748462004-08-09 02:06:06 +0000663 # Get the example's indentation level.
664 indent = len(m.group('indent'))
665
666 # Divide source into lines; check that they're properly
667 # indented; and then strip their indentation & prompts.
668 source_lines = m.group('source').split('\n')
Edward Lopera1ef6112004-08-09 16:14:41 +0000669 self._check_prompt_blank(source_lines, indent, name, lineno)
Tim Petersc5049152004-08-22 17:34:58 +0000670 self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
Edward Loper7c748462004-08-09 02:06:06 +0000671 source = '\n'.join([sl[indent+4:] for sl in source_lines])
Edward Loper7c748462004-08-09 02:06:06 +0000672
Tim Petersc5049152004-08-22 17:34:58 +0000673 # Divide want into lines; check that it's properly indented; and
674 # then strip the indentation. Spaces before the last newline should
675 # be preserved, so plain rstrip() isn't good enough.
Jim Fulton07a349c2004-08-22 14:10:00 +0000676 want = m.group('want')
Jim Fulton07a349c2004-08-22 14:10:00 +0000677 want_lines = want.split('\n')
Tim Petersc5049152004-08-22 17:34:58 +0000678 if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
679 del want_lines[-1] # forget final newline & spaces after it
Edward Lopera1ef6112004-08-09 16:14:41 +0000680 self._check_prefix(want_lines, ' '*indent, name,
Tim Petersc5049152004-08-22 17:34:58 +0000681 lineno + len(source_lines))
Edward Loper7c748462004-08-09 02:06:06 +0000682 want = '\n'.join([wl[indent:] for wl in want_lines])
Edward Loper7c748462004-08-09 02:06:06 +0000683
Edward Lopera6b68322004-08-26 00:05:43 +0000684 # If `want` contains a traceback message, then extract it.
685 m = self._EXCEPTION_RE.match(want)
686 if m:
687 exc_msg = m.group('msg')
688 else:
689 exc_msg = None
690
Edward Loper00f8da72004-08-26 18:05:07 +0000691 # Extract options from the source.
692 options = self._find_options(source, name, lineno)
693
694 return source, options, want, exc_msg
Edward Loper7c748462004-08-09 02:06:06 +0000695
Edward Loper74bca7a2004-08-12 02:27:44 +0000696 # This regular expression looks for option directives in the
697 # source code of an example. Option directives are comments
698 # starting with "doctest:". Warning: this may give false
699 # positives for string-literals that contain the string
700 # "#doctest:". Eliminating these false positives would require
701 # actually parsing the string; but we limit them by ignoring any
702 # line containing "#doctest:" that is *followed* by a quote mark.
703 _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
704 re.MULTILINE)
705
706 def _find_options(self, source, name, lineno):
707 """
708 Return a dictionary containing option overrides extracted from
709 option directives in the given source string.
710
711 `name` is the string's name, and `lineno` is the line number
712 where the example starts; both are used for error messages.
713 """
714 options = {}
715 # (note: with the current regexp, this will match at most once:)
716 for m in self._OPTION_DIRECTIVE_RE.finditer(source):
717 option_strings = m.group(1).replace(',', ' ').split()
718 for option in option_strings:
719 if (option[0] not in '+-' or
720 option[1:] not in OPTIONFLAGS_BY_NAME):
721 raise ValueError('line %r of the doctest for %s '
722 'has an invalid option: %r' %
723 (lineno+1, name, option))
724 flag = OPTIONFLAGS_BY_NAME[option[1:]]
725 options[flag] = (option[0] == '+')
726 if options and self._IS_BLANK_OR_COMMENT(source):
727 raise ValueError('line %r of the doctest for %s has an option '
728 'directive on a line with no example: %r' %
729 (lineno, name, source))
730 return options
731
Edward Lopera5db6002004-08-12 02:41:30 +0000732 # This regular expression finds the indentation of every non-blank
733 # line in a string.
Edward Loper00f8da72004-08-26 18:05:07 +0000734 _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
Edward Lopera5db6002004-08-12 02:41:30 +0000735
736 def _min_indent(self, s):
737 "Return the minimum indentation of any non-blank line in `s`"
Edward Loper00f8da72004-08-26 18:05:07 +0000738 indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
739 if len(indents) > 0:
740 return min(indents)
Tim Petersdd0e4752004-08-09 03:31:56 +0000741 else:
Edward Loper00f8da72004-08-26 18:05:07 +0000742 return 0
Edward Loper7c748462004-08-09 02:06:06 +0000743
Edward Lopera1ef6112004-08-09 16:14:41 +0000744 def _check_prompt_blank(self, lines, indent, name, lineno):
Edward Loper74bca7a2004-08-12 02:27:44 +0000745 """
746 Given the lines of a source string (including prompts and
747 leading indentation), check to make sure that every prompt is
748 followed by a space character. If any line is not followed by
749 a space character, then raise ValueError.
750 """
Edward Loper7c748462004-08-09 02:06:06 +0000751 for i, line in enumerate(lines):
752 if len(line) >= indent+4 and line[indent+3] != ' ':
753 raise ValueError('line %r of the docstring for %s '
754 'lacks blank after %s: %r' %
Edward Lopera1ef6112004-08-09 16:14:41 +0000755 (lineno+i+1, name,
Edward Loper7c748462004-08-09 02:06:06 +0000756 line[indent:indent+3], line))
757
Edward Lopera1ef6112004-08-09 16:14:41 +0000758 def _check_prefix(self, lines, prefix, name, lineno):
Edward Loper74bca7a2004-08-12 02:27:44 +0000759 """
760 Check that every line in the given list starts with the given
761 prefix; if any line does not, then raise a ValueError.
762 """
Edward Loper7c748462004-08-09 02:06:06 +0000763 for i, line in enumerate(lines):
764 if line and not line.startswith(prefix):
765 raise ValueError('line %r of the docstring for %s has '
766 'inconsistent leading whitespace: %r' %
Edward Lopera1ef6112004-08-09 16:14:41 +0000767 (lineno+i+1, name, line))
Edward Loper7c748462004-08-09 02:06:06 +0000768
769
770######################################################################
771## 4. DocTest Finder
Tim Peters8485b562004-08-04 18:46:34 +0000772######################################################################
773
774class DocTestFinder:
775 """
776 A class used to extract the DocTests that are relevant to a given
777 object, from its docstring and the docstrings of its contained
778 objects. Doctests can currently be extracted from the following
779 object types: modules, functions, classes, methods, staticmethods,
780 classmethods, and properties.
Tim Peters8485b562004-08-04 18:46:34 +0000781 """
782
Edward Lopera1ef6112004-08-09 16:14:41 +0000783 def __init__(self, verbose=False, parser=DocTestParser(),
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000784 recurse=True, exclude_empty=True):
Tim Peters8485b562004-08-04 18:46:34 +0000785 """
786 Create a new doctest finder.
787
Edward Lopera1ef6112004-08-09 16:14:41 +0000788 The optional argument `parser` specifies a class or
Tim Peters19397e52004-08-06 22:02:59 +0000789 function that should be used to create new DocTest objects (or
Tim Peters161c9632004-08-08 03:38:33 +0000790 objects that implement the same interface as DocTest). The
Tim Peters19397e52004-08-06 22:02:59 +0000791 signature for this factory function should match the signature
792 of the DocTest constructor.
793
Tim Peters8485b562004-08-04 18:46:34 +0000794 If the optional argument `recurse` is false, then `find` will
795 only examine the given object, and not any contained objects.
Edward Loper32ddbf72004-09-13 05:47:24 +0000796
Tim Peters958cc892004-09-13 14:53:28 +0000797 If the optional argument `exclude_empty` is false, then `find`
798 will include tests for objects with empty docstrings.
Tim Peters8485b562004-08-04 18:46:34 +0000799 """
Edward Lopera1ef6112004-08-09 16:14:41 +0000800 self._parser = parser
Tim Peters8485b562004-08-04 18:46:34 +0000801 self._verbose = verbose
Tim Peters8485b562004-08-04 18:46:34 +0000802 self._recurse = recurse
Edward Loper32ddbf72004-09-13 05:47:24 +0000803 self._exclude_empty = exclude_empty
Tim Peters8485b562004-08-04 18:46:34 +0000804
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000805 def find(self, obj, name=None, module=None, globs=None, extraglobs=None):
Tim Peters8485b562004-08-04 18:46:34 +0000806 """
807 Return a list of the DocTests that are defined by the given
808 object's docstring, or by any of its contained objects'
809 docstrings.
810
811 The optional parameter `module` is the module that contains
Tim Petersf3f57472004-08-08 06:11:48 +0000812 the given object. If the module is not specified or is None, then
813 the test finder will attempt to automatically determine the
Tim Peters8485b562004-08-04 18:46:34 +0000814 correct module. The object's module is used:
815
816 - As a default namespace, if `globs` is not specified.
817 - To prevent the DocTestFinder from extracting DocTests
Tim Petersf3f57472004-08-08 06:11:48 +0000818 from objects that are imported from other modules.
Tim Peters8485b562004-08-04 18:46:34 +0000819 - To find the name of the file containing the object.
820 - To help find the line number of the object within its
821 file.
822
Tim Petersf3f57472004-08-08 06:11:48 +0000823 Contained objects whose module does not match `module` are ignored.
824
825 If `module` is False, no attempt to find the module will be made.
826 This is obscure, of use mostly in tests: if `module` is False, or
827 is None but cannot be found automatically, then all objects are
828 considered to belong to the (non-existent) module, so all contained
829 objects will (recursively) be searched for doctests.
830
Tim Peters8485b562004-08-04 18:46:34 +0000831 The globals for each DocTest is formed by combining `globs`
832 and `extraglobs` (bindings in `extraglobs` override bindings
833 in `globs`). A new copy of the globals dictionary is created
834 for each DocTest. If `globs` is not specified, then it
835 defaults to the module's `__dict__`, if specified, or {}
836 otherwise. If `extraglobs` is not specified, then it defaults
837 to {}.
838
Tim Peters8485b562004-08-04 18:46:34 +0000839 """
840 # If name was not specified, then extract it from the object.
841 if name is None:
842 name = getattr(obj, '__name__', None)
843 if name is None:
844 raise ValueError("DocTestFinder.find: name must be given "
845 "when obj.__name__ doesn't exist: %r" %
846 (type(obj),))
847
848 # Find the module that contains the given object (if obj is
849 # a module, then module=obj.). Note: this may fail, in which
850 # case module will be None.
Tim Petersf3f57472004-08-08 06:11:48 +0000851 if module is False:
852 module = None
853 elif module is None:
Tim Peters8485b562004-08-04 18:46:34 +0000854 module = inspect.getmodule(obj)
855
856 # Read the module's source code. This is used by
857 # DocTestFinder._find_lineno to find the line number for a
858 # given object's docstring.
859 try:
R. David Murray58641de2009-06-12 15:33:19 +0000860 file = inspect.getsourcefile(obj)
Tim Peters8485b562004-08-04 18:46:34 +0000861 except TypeError:
862 source_lines = None
R. David Murray58641de2009-06-12 15:33:19 +0000863 else:
864 if not file:
865 # Check to see if it's one of our special internal "files"
866 # (see __patched_linecache_getlines).
867 file = inspect.getfile(obj)
868 if not file[0]+file[-2:] == '<]>': file = None
R. David Murray765b9762009-07-15 14:16:54 +0000869 if file is None:
870 source_lines = None
R. David Murray58641de2009-06-12 15:33:19 +0000871 else:
872 if module is not None:
873 # Supply the module globals in case the module was
874 # originally loaded via a PEP 302 loader and
875 # file is not a valid filesystem path
876 source_lines = linecache.getlines(file, module.__dict__)
877 else:
878 # No access to a loader, so assume it's a normal
879 # filesystem path
880 source_lines = linecache.getlines(file)
881 if not source_lines:
882 source_lines = None
Tim Peters8485b562004-08-04 18:46:34 +0000883
884 # Initialize globals, and merge in extraglobs.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000885 if globs is None:
Tim Peters8485b562004-08-04 18:46:34 +0000886 if module is None:
887 globs = {}
888 else:
889 globs = module.__dict__.copy()
890 else:
891 globs = globs.copy()
892 if extraglobs is not None:
893 globs.update(extraglobs)
Raymond Hettinger0f055172009-01-27 10:06:09 +0000894 if '__name__' not in globs:
895 globs['__name__'] = '__main__' # provide a default module name
Tim Peters8a7d2d52001-01-16 07:10:57 +0000896
Tim Peters8485b562004-08-04 18:46:34 +0000897 # Recursively expore `obj`, extracting DocTests.
898 tests = []
Tim Petersf3f57472004-08-08 06:11:48 +0000899 self._find(tests, obj, name, module, source_lines, globs, {})
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000900 # Sort the tests by alpha order of names, for consistency in
901 # verbose-mode output. This was a feature of doctest in Pythons
902 # <= 2.3 that got lost by accident in 2.4. It was repaired in
903 # 2.4.4 and 2.5.
904 tests.sort()
Tim Peters8485b562004-08-04 18:46:34 +0000905 return tests
906
Tim Peters8485b562004-08-04 18:46:34 +0000907 def _from_module(self, module, object):
908 """
909 Return true if the given object is defined in the given
910 module.
911 """
912 if module is None:
913 return True
Benjamin Peterson6cadba72008-11-19 22:38:29 +0000914 elif inspect.getmodule(object) is not None:
915 return module is inspect.getmodule(object)
Tim Peters8485b562004-08-04 18:46:34 +0000916 elif inspect.isfunction(object):
Neal Norwitz221085d2007-02-25 20:55:47 +0000917 return module.__dict__ is object.__globals__
Tim Peters8485b562004-08-04 18:46:34 +0000918 elif inspect.isclass(object):
919 return module.__name__ == object.__module__
Tim Peters8485b562004-08-04 18:46:34 +0000920 elif hasattr(object, '__module__'):
921 return module.__name__ == object.__module__
922 elif isinstance(object, property):
923 return True # [XX] no way not be sure.
924 else:
925 raise ValueError("object must be a class or function")
926
Tim Petersf3f57472004-08-08 06:11:48 +0000927 def _find(self, tests, obj, name, module, source_lines, globs, seen):
Tim Peters8485b562004-08-04 18:46:34 +0000928 """
929 Find tests for the given object and any contained objects, and
930 add them to `tests`.
931 """
932 if self._verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000933 print('Finding tests in %s' % name)
Tim Peters8485b562004-08-04 18:46:34 +0000934
935 # If we've already processed this object, then ignore it.
936 if id(obj) in seen:
937 return
938 seen[id(obj)] = 1
939
940 # Find a test for this object, and add it to the list of tests.
941 test = self._get_test(obj, name, module, globs, source_lines)
942 if test is not None:
943 tests.append(test)
944
945 # Look for tests in a module's contained objects.
946 if inspect.ismodule(obj) and self._recurse:
947 for valname, val in obj.__dict__.items():
Tim Peters8485b562004-08-04 18:46:34 +0000948 valname = '%s.%s' % (name, valname)
949 # Recurse to functions & classes.
950 if ((inspect.isfunction(val) or inspect.isclass(val)) and
Tim Petersf3f57472004-08-08 06:11:48 +0000951 self._from_module(module, val)):
Tim Peters8485b562004-08-04 18:46:34 +0000952 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +0000953 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +0000954
955 # Look for tests in a module's __test__ dictionary.
956 if inspect.ismodule(obj) and self._recurse:
957 for valname, val in getattr(obj, '__test__', {}).items():
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000958 if not isinstance(valname, str):
Tim Peters8485b562004-08-04 18:46:34 +0000959 raise ValueError("DocTestFinder.find: __test__ keys "
960 "must be strings: %r" %
961 (type(valname),))
962 if not (inspect.isfunction(val) or inspect.isclass(val) or
963 inspect.ismethod(val) or inspect.ismodule(val) or
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000964 isinstance(val, str)):
Tim Peters8485b562004-08-04 18:46:34 +0000965 raise ValueError("DocTestFinder.find: __test__ values "
966 "must be strings, functions, methods, "
967 "classes, or modules: %r" %
968 (type(val),))
Tim Petersc5684782004-09-13 01:07:12 +0000969 valname = '%s.__test__.%s' % (name, valname)
Tim Peters8485b562004-08-04 18:46:34 +0000970 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +0000971 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +0000972
973 # Look for tests in a class's contained objects.
974 if inspect.isclass(obj) and self._recurse:
975 for valname, val in obj.__dict__.items():
Tim Peters8485b562004-08-04 18:46:34 +0000976 # Special handling for staticmethod/classmethod.
977 if isinstance(val, staticmethod):
978 val = getattr(obj, valname)
979 if isinstance(val, classmethod):
Christian Heimesff737952007-11-27 10:40:20 +0000980 val = getattr(obj, valname).__func__
Tim Peters8485b562004-08-04 18:46:34 +0000981
982 # Recurse to methods, properties, and nested classes.
983 if ((inspect.isfunction(val) or inspect.isclass(val) or
Tim Petersf3f57472004-08-08 06:11:48 +0000984 isinstance(val, property)) and
985 self._from_module(module, val)):
Tim Peters8485b562004-08-04 18:46:34 +0000986 valname = '%s.%s' % (name, valname)
987 self._find(tests, val, valname, module, source_lines,
Tim Petersf3f57472004-08-08 06:11:48 +0000988 globs, seen)
Tim Peters8485b562004-08-04 18:46:34 +0000989
990 def _get_test(self, obj, name, module, globs, source_lines):
991 """
992 Return a DocTest for the given object, if it defines a docstring;
993 otherwise, return None.
994 """
995 # Extract the object's docstring. If it doesn't have one,
996 # then return None (no test for this object).
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000997 if isinstance(obj, str):
Tim Peters8485b562004-08-04 18:46:34 +0000998 docstring = obj
999 else:
1000 try:
1001 if obj.__doc__ is None:
Edward Loper32ddbf72004-09-13 05:47:24 +00001002 docstring = ''
1003 else:
Jim Fulton7d428782004-10-13 14:15:32 +00001004 docstring = obj.__doc__
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001005 if not isinstance(docstring, str):
Jim Fulton7d428782004-10-13 14:15:32 +00001006 docstring = str(docstring)
Tim Peters8485b562004-08-04 18:46:34 +00001007 except (TypeError, AttributeError):
Edward Loper32ddbf72004-09-13 05:47:24 +00001008 docstring = ''
Tim Peters8485b562004-08-04 18:46:34 +00001009
1010 # Find the docstring's location in the file.
1011 lineno = self._find_lineno(obj, source_lines)
1012
Edward Loper32ddbf72004-09-13 05:47:24 +00001013 # Don't bother if the docstring is empty.
1014 if self._exclude_empty and not docstring:
1015 return None
1016
Tim Peters8485b562004-08-04 18:46:34 +00001017 # Return a DocTest for this object.
1018 if module is None:
1019 filename = None
1020 else:
1021 filename = getattr(module, '__file__', module.__name__)
Jim Fulton07a349c2004-08-22 14:10:00 +00001022 if filename[-4:] in (".pyc", ".pyo"):
1023 filename = filename[:-1]
Edward Lopera1ef6112004-08-09 16:14:41 +00001024 return self._parser.get_doctest(docstring, globs, name,
1025 filename, lineno)
Tim Peters8485b562004-08-04 18:46:34 +00001026
1027 def _find_lineno(self, obj, source_lines):
1028 """
1029 Return a line number of the given object's docstring. Note:
1030 this method assumes that the object has a docstring.
1031 """
1032 lineno = None
1033
1034 # Find the line number for modules.
1035 if inspect.ismodule(obj):
1036 lineno = 0
1037
1038 # Find the line number for classes.
1039 # Note: this could be fooled if a class is defined multiple
1040 # times in a single file.
1041 if inspect.isclass(obj):
1042 if source_lines is None:
1043 return None
1044 pat = re.compile(r'^\s*class\s*%s\b' %
1045 getattr(obj, '__name__', '-'))
1046 for i, line in enumerate(source_lines):
1047 if pat.match(line):
1048 lineno = i
1049 break
1050
1051 # Find the line number for functions & methods.
Christian Heimesff737952007-11-27 10:40:20 +00001052 if inspect.ismethod(obj): obj = obj.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +00001053 if inspect.isfunction(obj): obj = obj.__code__
Tim Peters8485b562004-08-04 18:46:34 +00001054 if inspect.istraceback(obj): obj = obj.tb_frame
1055 if inspect.isframe(obj): obj = obj.f_code
1056 if inspect.iscode(obj):
1057 lineno = getattr(obj, 'co_firstlineno', None)-1
1058
1059 # Find the line number where the docstring starts. Assume
1060 # that it's the first line that begins with a quote mark.
1061 # Note: this could be fooled by a multiline function
1062 # signature, where a continuation line begins with a quote
1063 # mark.
1064 if lineno is not None:
1065 if source_lines is None:
1066 return lineno+1
1067 pat = re.compile('(^|.*:)\s*\w*("|\')')
1068 for lineno in range(lineno, len(source_lines)):
1069 if pat.match(source_lines[lineno]):
1070 return lineno
1071
1072 # We couldn't find the line number.
1073 return None
1074
1075######################################################################
Edward Loper7c748462004-08-09 02:06:06 +00001076## 5. DocTest Runner
Tim Peters8485b562004-08-04 18:46:34 +00001077######################################################################
1078
Tim Peters8485b562004-08-04 18:46:34 +00001079class DocTestRunner:
1080 """
1081 A class used to run DocTest test cases, and accumulate statistics.
1082 The `run` method is used to process a single DocTest case. It
1083 returns a tuple `(f, t)`, where `t` is the number of test cases
1084 tried, and `f` is the number of test cases that failed.
1085
1086 >>> tests = DocTestFinder().find(_TestClass)
1087 >>> runner = DocTestRunner(verbose=False)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001088 >>> tests.sort(key = lambda test: test.name)
Tim Peters8485b562004-08-04 18:46:34 +00001089 >>> for test in tests:
Guido van Rossum7131f842007-02-09 20:13:25 +00001090 ... print(test.name, '->', runner.run(test))
Christian Heimes25bb7832008-01-11 16:17:00 +00001091 _TestClass -> TestResults(failed=0, attempted=2)
1092 _TestClass.__init__ -> TestResults(failed=0, attempted=2)
1093 _TestClass.get -> TestResults(failed=0, attempted=2)
1094 _TestClass.square -> TestResults(failed=0, attempted=1)
Tim Peters8485b562004-08-04 18:46:34 +00001095
1096 The `summarize` method prints a summary of all the test cases that
1097 have been run by the runner, and returns an aggregated `(f, t)`
1098 tuple:
1099
1100 >>> runner.summarize(verbose=1)
1101 4 items passed all tests:
1102 2 tests in _TestClass
1103 2 tests in _TestClass.__init__
1104 2 tests in _TestClass.get
1105 1 tests in _TestClass.square
1106 7 tests in 4 items.
1107 7 passed and 0 failed.
1108 Test passed.
Christian Heimes25bb7832008-01-11 16:17:00 +00001109 TestResults(failed=0, attempted=7)
Tim Peters8485b562004-08-04 18:46:34 +00001110
1111 The aggregated number of tried examples and failed examples is
1112 also available via the `tries` and `failures` attributes:
1113
1114 >>> runner.tries
1115 7
1116 >>> runner.failures
1117 0
1118
1119 The comparison between expected outputs and actual outputs is done
Edward Loper34fcb142004-08-09 02:45:41 +00001120 by an `OutputChecker`. This comparison may be customized with a
1121 number of option flags; see the documentation for `testmod` for
1122 more information. If the option flags are insufficient, then the
1123 comparison may also be customized by passing a subclass of
1124 `OutputChecker` to the constructor.
Tim Peters8485b562004-08-04 18:46:34 +00001125
1126 The test runner's display output can be controlled in two ways.
1127 First, an output function (`out) can be passed to
1128 `TestRunner.run`; this function will be called with strings that
1129 should be displayed. It defaults to `sys.stdout.write`. If
1130 capturing the output is not sufficient, then the display output
1131 can be also customized by subclassing DocTestRunner, and
1132 overriding the methods `report_start`, `report_success`,
1133 `report_unexpected_exception`, and `report_failure`.
1134 """
1135 # This divider string is used to separate failure messages, and to
1136 # separate sections of the summary.
1137 DIVIDER = "*" * 70
1138
Edward Loper34fcb142004-08-09 02:45:41 +00001139 def __init__(self, checker=None, verbose=None, optionflags=0):
Tim Peters8485b562004-08-04 18:46:34 +00001140 """
1141 Create a new test runner.
1142
Edward Loper34fcb142004-08-09 02:45:41 +00001143 Optional keyword arg `checker` is the `OutputChecker` that
1144 should be used to compare the expected outputs and actual
1145 outputs of doctest examples.
1146
Tim Peters8485b562004-08-04 18:46:34 +00001147 Optional keyword arg 'verbose' prints lots of stuff if true,
1148 only failures if false; by default, it's true iff '-v' is in
1149 sys.argv.
1150
1151 Optional argument `optionflags` can be used to control how the
1152 test runner compares expected output to actual output, and how
1153 it displays failures. See the documentation for `testmod` for
1154 more information.
1155 """
Edward Loper34fcb142004-08-09 02:45:41 +00001156 self._checker = checker or OutputChecker()
Tim Peters8a7d2d52001-01-16 07:10:57 +00001157 if verbose is None:
Tim Peters8485b562004-08-04 18:46:34 +00001158 verbose = '-v' in sys.argv
1159 self._verbose = verbose
Tim Peters6ebe61f2003-06-27 20:48:05 +00001160 self.optionflags = optionflags
Jim Fulton07a349c2004-08-22 14:10:00 +00001161 self.original_optionflags = optionflags
Tim Peters6ebe61f2003-06-27 20:48:05 +00001162
Tim Peters8485b562004-08-04 18:46:34 +00001163 # Keep track of the examples we've run.
1164 self.tries = 0
1165 self.failures = 0
1166 self._name2ft = {}
Tim Peters8a7d2d52001-01-16 07:10:57 +00001167
Tim Peters8485b562004-08-04 18:46:34 +00001168 # Create a fake output target for capturing doctest output.
1169 self._fakeout = _SpoofOut()
Tim Peters4fd9e2f2001-08-18 00:05:50 +00001170
Tim Peters8485b562004-08-04 18:46:34 +00001171 #/////////////////////////////////////////////////////////////////
Tim Peters8485b562004-08-04 18:46:34 +00001172 # Reporting methods
1173 #/////////////////////////////////////////////////////////////////
Tim Peters17111f32001-10-03 04:08:26 +00001174
Tim Peters8485b562004-08-04 18:46:34 +00001175 def report_start(self, out, test, example):
Tim Peters8a7d2d52001-01-16 07:10:57 +00001176 """
Tim Peters8485b562004-08-04 18:46:34 +00001177 Report that the test runner is about to process the given
1178 example. (Only displays a message if verbose=True)
1179 """
1180 if self._verbose:
Edward Loperaacf0832004-08-26 01:19:50 +00001181 if example.want:
1182 out('Trying:\n' + _indent(example.source) +
1183 'Expecting:\n' + _indent(example.want))
1184 else:
1185 out('Trying:\n' + _indent(example.source) +
1186 'Expecting nothing\n')
Tim Peters8a7d2d52001-01-16 07:10:57 +00001187
Tim Peters8485b562004-08-04 18:46:34 +00001188 def report_success(self, out, test, example, got):
1189 """
1190 Report that the given example ran successfully. (Only
1191 displays a message if verbose=True)
1192 """
1193 if self._verbose:
1194 out("ok\n")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001195
Tim Peters8485b562004-08-04 18:46:34 +00001196 def report_failure(self, out, test, example, got):
1197 """
1198 Report that the given example failed.
1199 """
Edward Loper8e4a34b2004-08-12 02:34:27 +00001200 out(self._failure_header(test, example) +
Edward Loperca9111e2004-08-26 03:00:24 +00001201 self._checker.output_difference(example, got, self.optionflags))
Tim Peters7402f792001-10-02 03:53:41 +00001202
Tim Peters8485b562004-08-04 18:46:34 +00001203 def report_unexpected_exception(self, out, test, example, exc_info):
1204 """
1205 Report that the given example raised an unexpected exception.
1206 """
Edward Loper8e4a34b2004-08-12 02:34:27 +00001207 out(self._failure_header(test, example) +
Edward Loperaacf0832004-08-26 01:19:50 +00001208 'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
Tim Peters7402f792001-10-02 03:53:41 +00001209
Edward Loper8e4a34b2004-08-12 02:34:27 +00001210 def _failure_header(self, test, example):
Jim Fulton07a349c2004-08-22 14:10:00 +00001211 out = [self.DIVIDER]
1212 if test.filename:
1213 if test.lineno is not None and example.lineno is not None:
1214 lineno = test.lineno + example.lineno + 1
1215 else:
1216 lineno = '?'
1217 out.append('File "%s", line %s, in %s' %
1218 (test.filename, lineno, test.name))
Tim Peters8485b562004-08-04 18:46:34 +00001219 else:
Jim Fulton07a349c2004-08-22 14:10:00 +00001220 out.append('Line %s, in %s' % (example.lineno+1, test.name))
1221 out.append('Failed example:')
1222 source = example.source
Edward Loperaacf0832004-08-26 01:19:50 +00001223 out.append(_indent(source))
1224 return '\n'.join(out)
Tim Peters7402f792001-10-02 03:53:41 +00001225
Tim Peters8485b562004-08-04 18:46:34 +00001226 #/////////////////////////////////////////////////////////////////
1227 # DocTest Running
1228 #/////////////////////////////////////////////////////////////////
Tim Peters7402f792001-10-02 03:53:41 +00001229
Tim Peters8485b562004-08-04 18:46:34 +00001230 def __run(self, test, compileflags, out):
Tim Peters8a7d2d52001-01-16 07:10:57 +00001231 """
Tim Peters8485b562004-08-04 18:46:34 +00001232 Run the examples in `test`. Write the outcome of each example
1233 with one of the `DocTestRunner.report_*` methods, using the
1234 writer function `out`. `compileflags` is the set of compiler
1235 flags that should be used to execute examples. Return a tuple
1236 `(f, t)`, where `t` is the number of examples tried, and `f`
1237 is the number of examples that failed. The examples are run
1238 in the namespace `test.globs`.
1239 """
1240 # Keep track of the number of failures and tries.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001241 failures = tries = 0
Tim Peters8485b562004-08-04 18:46:34 +00001242
1243 # Save the option flags (since option directives can be used
1244 # to modify them).
1245 original_optionflags = self.optionflags
1246
Tim Peters1fbf9c52004-09-04 17:21:02 +00001247 SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
1248
1249 check = self._checker.check_output
1250
Tim Peters8485b562004-08-04 18:46:34 +00001251 # Process each example.
Edward Loper2de91ba2004-08-27 02:07:46 +00001252 for examplenum, example in enumerate(test.examples):
1253
Ezio Melotti13925002011-03-16 11:05:33 +02001254 # If REPORT_ONLY_FIRST_FAILURE is set, then suppress
Edward Lopera89f88d2004-08-26 02:45:51 +00001255 # reporting after the first failure.
1256 quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
1257 failures > 0)
1258
Edward Loper74bca7a2004-08-12 02:27:44 +00001259 # Merge in the example's options.
1260 self.optionflags = original_optionflags
1261 if example.options:
1262 for (optionflag, val) in example.options.items():
1263 if val:
1264 self.optionflags |= optionflag
1265 else:
1266 self.optionflags &= ~optionflag
Tim Peters8485b562004-08-04 18:46:34 +00001267
Thomas Wouters477c8d52006-05-27 19:21:47 +00001268 # If 'SKIP' is set, then skip this example.
1269 if self.optionflags & SKIP:
1270 continue
1271
Tim Peters8485b562004-08-04 18:46:34 +00001272 # Record that we started this example.
1273 tries += 1
Edward Lopera89f88d2004-08-26 02:45:51 +00001274 if not quiet:
1275 self.report_start(out, test, example)
Tim Peters8485b562004-08-04 18:46:34 +00001276
Edward Loper2de91ba2004-08-27 02:07:46 +00001277 # Use a special filename for compile(), so we can retrieve
1278 # the source code during interactive debugging (see
1279 # __patched_linecache_getlines).
1280 filename = '<doctest %s[%d]>' % (test.name, examplenum)
1281
Tim Peters8485b562004-08-04 18:46:34 +00001282 # Run the example in the given context (globs), and record
1283 # any exception that gets raised. (But don't intercept
1284 # keyboard interrupts.)
1285 try:
Tim Peters208ca702004-08-09 04:12:36 +00001286 # Don't blink! This is where the user's code gets run.
Georg Brandl7cae87c2006-09-06 06:51:57 +00001287 exec(compile(example.source, filename, "single",
1288 compileflags, 1), test.globs)
Edward Loper2de91ba2004-08-27 02:07:46 +00001289 self.debugger.set_continue() # ==== Example Finished ====
Tim Peters8485b562004-08-04 18:46:34 +00001290 exception = None
1291 except KeyboardInterrupt:
1292 raise
1293 except:
1294 exception = sys.exc_info()
Edward Loper2de91ba2004-08-27 02:07:46 +00001295 self.debugger.set_continue() # ==== Example Finished ====
Tim Peters8485b562004-08-04 18:46:34 +00001296
Tim Peters208ca702004-08-09 04:12:36 +00001297 got = self._fakeout.getvalue() # the actual output
Tim Peters8485b562004-08-04 18:46:34 +00001298 self._fakeout.truncate(0)
Tim Peters1fbf9c52004-09-04 17:21:02 +00001299 outcome = FAILURE # guilty until proved innocent or insane
Tim Peters8485b562004-08-04 18:46:34 +00001300
1301 # If the example executed without raising any exceptions,
Tim Peters1fbf9c52004-09-04 17:21:02 +00001302 # verify its output.
Tim Peters8485b562004-08-04 18:46:34 +00001303 if exception is None:
Tim Peters1fbf9c52004-09-04 17:21:02 +00001304 if check(example.want, got, self.optionflags):
1305 outcome = SUCCESS
Tim Peters8485b562004-08-04 18:46:34 +00001306
Tim Peters1fbf9c52004-09-04 17:21:02 +00001307 # The example raised an exception: check if it was expected.
Tim Peters8485b562004-08-04 18:46:34 +00001308 else:
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001309 exc_msg = traceback.format_exception_only(*exception[:2])[-1]
Tim Peters1fbf9c52004-09-04 17:21:02 +00001310 if not quiet:
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001311 got += _exception_traceback(exception)
Tim Peters8485b562004-08-04 18:46:34 +00001312
Tim Peters1fbf9c52004-09-04 17:21:02 +00001313 # If `example.exc_msg` is None, then we weren't expecting
1314 # an exception.
Edward Lopera6b68322004-08-26 00:05:43 +00001315 if example.exc_msg is None:
Tim Peters1fbf9c52004-09-04 17:21:02 +00001316 outcome = BOOM
1317
1318 # We expected an exception: see whether it matches.
1319 elif check(example.exc_msg, exc_msg, self.optionflags):
1320 outcome = SUCCESS
1321
1322 # Another chance if they didn't care about the detail.
1323 elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
Nick Coghlan5e76e942010-06-12 13:42:46 +00001324 m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg)
1325 m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg)
1326 if m1 and m2 and check(m1.group(1), m2.group(1),
Tim Peters1fbf9c52004-09-04 17:21:02 +00001327 self.optionflags):
1328 outcome = SUCCESS
1329
1330 # Report the outcome.
1331 if outcome is SUCCESS:
1332 if not quiet:
1333 self.report_success(out, test, example, got)
1334 elif outcome is FAILURE:
1335 if not quiet:
1336 self.report_failure(out, test, example, got)
1337 failures += 1
1338 elif outcome is BOOM:
1339 if not quiet:
1340 self.report_unexpected_exception(out, test, example,
Benjamin Petersoneec3d712008-06-11 15:59:43 +00001341 exception)
Tim Peters1fbf9c52004-09-04 17:21:02 +00001342 failures += 1
1343 else:
1344 assert False, ("unknown outcome", outcome)
Tim Peters8485b562004-08-04 18:46:34 +00001345
1346 # Restore the option flags (in case they were modified)
1347 self.optionflags = original_optionflags
1348
1349 # Record and return the number of failures and tries.
1350 self.__record_outcome(test, failures, tries)
Christian Heimes25bb7832008-01-11 16:17:00 +00001351 return TestResults(failures, tries)
Tim Peters8a7d2d52001-01-16 07:10:57 +00001352
Tim Peters8485b562004-08-04 18:46:34 +00001353 def __record_outcome(self, test, f, t):
1354 """
1355 Record the fact that the given DocTest (`test`) generated `f`
1356 failures out of `t` tried examples.
1357 """
1358 f2, t2 = self._name2ft.get(test.name, (0,0))
1359 self._name2ft[test.name] = (f+f2, t+t2)
1360 self.failures += f
1361 self.tries += t
1362
Edward Loper2de91ba2004-08-27 02:07:46 +00001363 __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
Florent Xiclunad9f57632010-10-14 20:56:20 +00001364 r'(?P<name>.+)'
Edward Loper2de91ba2004-08-27 02:07:46 +00001365 r'\[(?P<examplenum>\d+)\]>$')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001366 def __patched_linecache_getlines(self, filename, module_globals=None):
Edward Loper2de91ba2004-08-27 02:07:46 +00001367 m = self.__LINECACHE_FILENAME_RE.match(filename)
1368 if m and m.group('name') == self.test.name:
1369 example = self.test.examples[int(m.group('examplenum'))]
Benjamin Peterson04b50002010-04-11 21:39:55 +00001370 return example.source.splitlines(True)
Edward Loper2de91ba2004-08-27 02:07:46 +00001371 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372 return self.save_linecache_getlines(filename, module_globals)
Edward Loper2de91ba2004-08-27 02:07:46 +00001373
Tim Peters8485b562004-08-04 18:46:34 +00001374 def run(self, test, compileflags=None, out=None, clear_globs=True):
1375 """
1376 Run the examples in `test`, and display the results using the
1377 writer function `out`.
1378
1379 The examples are run in the namespace `test.globs`. If
1380 `clear_globs` is true (the default), then this namespace will
1381 be cleared after the test runs, to help with garbage
1382 collection. If you would like to examine the namespace after
1383 the test completes, then use `clear_globs=False`.
1384
1385 `compileflags` gives the set of flags that should be used by
1386 the Python compiler when running the examples. If not
1387 specified, then it will default to the set of future-import
1388 flags that apply to `globs`.
1389
1390 The output of each example is checked using
1391 `DocTestRunner.check_output`, and the results are formatted by
1392 the `DocTestRunner.report_*` methods.
1393 """
Edward Loper2de91ba2004-08-27 02:07:46 +00001394 self.test = test
1395
Tim Peters8485b562004-08-04 18:46:34 +00001396 if compileflags is None:
1397 compileflags = _extract_future_flags(test.globs)
Jim Fulton356fd192004-08-09 11:34:47 +00001398
Tim Peters6c542b72004-08-09 16:43:36 +00001399 save_stdout = sys.stdout
Tim Peters8485b562004-08-04 18:46:34 +00001400 if out is None:
Florent Xicluna59250852010-02-27 14:21:57 +00001401 encoding = save_stdout.encoding
1402 if encoding is None or encoding.lower() == 'utf-8':
1403 out = save_stdout.write
1404 else:
1405 # Use backslashreplace error handling on write
1406 def out(s):
1407 s = str(s.encode(encoding, 'backslashreplace'), encoding)
1408 save_stdout.write(s)
Tim Peters6c542b72004-08-09 16:43:36 +00001409 sys.stdout = self._fakeout
Tim Peters8485b562004-08-04 18:46:34 +00001410
Edward Loper2de91ba2004-08-27 02:07:46 +00001411 # Patch pdb.set_trace to restore sys.stdout during interactive
1412 # debugging (so it's not still redirected to self._fakeout).
1413 # Note that the interactive output will go to *our*
1414 # save_stdout, even if that's not the real sys.stdout; this
1415 # allows us to write test cases for the set_trace behavior.
Tim Peters6c542b72004-08-09 16:43:36 +00001416 save_set_trace = pdb.set_trace
Edward Loper2de91ba2004-08-27 02:07:46 +00001417 self.debugger = _OutputRedirectingPdb(save_stdout)
1418 self.debugger.reset()
1419 pdb.set_trace = self.debugger.set_trace
1420
1421 # Patch linecache.getlines, so we can see the example's source
1422 # when we're inside the debugger.
1423 self.save_linecache_getlines = linecache.getlines
1424 linecache.getlines = self.__patched_linecache_getlines
1425
Georg Brandl25fbb892010-07-30 09:23:23 +00001426 # Make sure sys.displayhook just prints the value to stdout
1427 save_displayhook = sys.displayhook
1428 sys.displayhook = sys.__displayhook__
1429
Tim Peters8485b562004-08-04 18:46:34 +00001430 try:
Tim Peters8485b562004-08-04 18:46:34 +00001431 return self.__run(test, compileflags, out)
1432 finally:
Tim Peters6c542b72004-08-09 16:43:36 +00001433 sys.stdout = save_stdout
1434 pdb.set_trace = save_set_trace
Edward Loper2de91ba2004-08-27 02:07:46 +00001435 linecache.getlines = self.save_linecache_getlines
Georg Brandl25fbb892010-07-30 09:23:23 +00001436 sys.displayhook = save_displayhook
Tim Peters8485b562004-08-04 18:46:34 +00001437 if clear_globs:
1438 test.globs.clear()
Benjamin Petersonfbf66bd2008-07-29 15:55:50 +00001439 import builtins
1440 builtins._ = None
Tim Peters8485b562004-08-04 18:46:34 +00001441
1442 #/////////////////////////////////////////////////////////////////
1443 # Summarization
1444 #/////////////////////////////////////////////////////////////////
Tim Peters8a7d2d52001-01-16 07:10:57 +00001445 def summarize(self, verbose=None):
1446 """
Tim Peters8485b562004-08-04 18:46:34 +00001447 Print a summary of all the test cases that have been run by
1448 this DocTestRunner, and return a tuple `(f, t)`, where `f` is
1449 the total number of failed examples, and `t` is the total
1450 number of tried examples.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001451
Tim Peters8485b562004-08-04 18:46:34 +00001452 The optional `verbose` argument controls how detailed the
1453 summary is. If the verbosity is not specified, then the
1454 DocTestRunner's verbosity is used.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001455 """
Tim Peters8a7d2d52001-01-16 07:10:57 +00001456 if verbose is None:
Tim Peters8485b562004-08-04 18:46:34 +00001457 verbose = self._verbose
Tim Peters8a7d2d52001-01-16 07:10:57 +00001458 notests = []
1459 passed = []
1460 failed = []
1461 totalt = totalf = 0
Tim Peters8485b562004-08-04 18:46:34 +00001462 for x in self._name2ft.items():
Tim Peters8a7d2d52001-01-16 07:10:57 +00001463 name, (f, t) = x
1464 assert f <= t
Tim Peters8485b562004-08-04 18:46:34 +00001465 totalt += t
1466 totalf += f
Tim Peters8a7d2d52001-01-16 07:10:57 +00001467 if t == 0:
1468 notests.append(name)
1469 elif f == 0:
1470 passed.append( (name, t) )
1471 else:
1472 failed.append(x)
1473 if verbose:
1474 if notests:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001475 print(len(notests), "items had no tests:")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001476 notests.sort()
1477 for thing in notests:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001478 print(" ", thing)
Tim Peters8a7d2d52001-01-16 07:10:57 +00001479 if passed:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001480 print(len(passed), "items passed all tests:")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001481 passed.sort()
1482 for thing, count in passed:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001483 print(" %3d tests in %s" % (count, thing))
Tim Peters8a7d2d52001-01-16 07:10:57 +00001484 if failed:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001485 print(self.DIVIDER)
1486 print(len(failed), "items had failures:")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001487 failed.sort()
1488 for thing, (f, t) in failed:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001489 print(" %3d of %3d in %s" % (f, t, thing))
Tim Peters8a7d2d52001-01-16 07:10:57 +00001490 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001491 print(totalt, "tests in", len(self._name2ft), "items.")
1492 print(totalt - totalf, "passed and", totalf, "failed.")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001493 if totalf:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001494 print("***Test Failed***", totalf, "failures.")
Tim Peters8a7d2d52001-01-16 07:10:57 +00001495 elif verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001496 print("Test passed.")
Christian Heimes25bb7832008-01-11 16:17:00 +00001497 return TestResults(totalf, totalt)
Tim Peters8a7d2d52001-01-16 07:10:57 +00001498
Tim Peters82076ef2004-09-13 00:52:51 +00001499 #/////////////////////////////////////////////////////////////////
1500 # Backward compatibility cruft to maintain doctest.master.
1501 #/////////////////////////////////////////////////////////////////
1502 def merge(self, other):
1503 d = self._name2ft
1504 for name, (f, t) in other._name2ft.items():
1505 if name in d:
Nick Coghlan38622002008-12-15 12:01:34 +00001506 # Don't print here by default, since doing
1507 # so breaks some of the buildbots
1508 #print("*** DocTestRunner.merge: '" + name + "' in both" \
1509 # " testers; summing outcomes.")
Tim Peters82076ef2004-09-13 00:52:51 +00001510 f2, t2 = d[name]
1511 f = f + f2
1512 t = t + t2
1513 d[name] = f, t
1514
Edward Loper34fcb142004-08-09 02:45:41 +00001515class OutputChecker:
1516 """
1517 A class used to check the whether the actual output from a doctest
1518 example matches the expected output. `OutputChecker` defines two
1519 methods: `check_output`, which compares a given pair of outputs,
1520 and returns true if they match; and `output_difference`, which
1521 returns a string describing the differences between two outputs.
1522 """
Georg Brandl559e5d72008-06-11 18:37:52 +00001523 def _toAscii(self, s):
1524 """
1525 Convert string to hex-escaped ASCII string.
1526 """
1527 return str(s.encode('ASCII', 'backslashreplace'), "ASCII")
1528
Edward Loper34fcb142004-08-09 02:45:41 +00001529 def check_output(self, want, got, optionflags):
1530 """
Edward Loper74bca7a2004-08-12 02:27:44 +00001531 Return True iff the actual output from an example (`got`)
1532 matches the expected output (`want`). These strings are
1533 always considered to match if they are identical; but
1534 depending on what option flags the test runner is using,
1535 several non-exact match types are also possible. See the
1536 documentation for `TestRunner` for more information about
1537 option flags.
Edward Loper34fcb142004-08-09 02:45:41 +00001538 """
Georg Brandl559e5d72008-06-11 18:37:52 +00001539
1540 # If `want` contains hex-escaped character such as "\u1234",
1541 # then `want` is a string of six characters(e.g. [\,u,1,2,3,4]).
1542 # On the other hand, `got` could be an another sequence of
1543 # characters such as [\u1234], so `want` and `got` should
1544 # be folded to hex-escaped ASCII string to compare.
1545 got = self._toAscii(got)
1546 want = self._toAscii(want)
1547
Edward Loper34fcb142004-08-09 02:45:41 +00001548 # Handle the common case first, for efficiency:
1549 # if they're string-identical, always return true.
1550 if got == want:
1551 return True
1552
1553 # The values True and False replaced 1 and 0 as the return
1554 # value for boolean comparisons in Python 2.3.
1555 if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
1556 if (got,want) == ("True\n", "1\n"):
1557 return True
1558 if (got,want) == ("False\n", "0\n"):
1559 return True
1560
1561 # <BLANKLINE> can be used as a special sequence to signify a
1562 # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
1563 if not (optionflags & DONT_ACCEPT_BLANKLINE):
1564 # Replace <BLANKLINE> in want with a blank line.
1565 want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
1566 '', want)
1567 # If a line in got contains only spaces, then remove the
1568 # spaces.
1569 got = re.sub('(?m)^\s*?$', '', got)
1570 if got == want:
1571 return True
1572
1573 # This flag causes doctest to ignore any differences in the
1574 # contents of whitespace strings. Note that this can be used
Tim Peters3fa8c202004-08-23 21:43:39 +00001575 # in conjunction with the ELLIPSIS flag.
Tim Peters1cf3aa62004-08-19 06:49:33 +00001576 if optionflags & NORMALIZE_WHITESPACE:
Edward Loper34fcb142004-08-09 02:45:41 +00001577 got = ' '.join(got.split())
1578 want = ' '.join(want.split())
1579 if got == want:
1580 return True
1581
1582 # 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
Neal Norwitzc082cb72006-08-29 05:40:08 +00001670 - example: the Example object that failed
Tim Peters19397e52004-08-06 22:02:59 +00001671
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
Guido van Rossum6a2a2a02006-08-26 20:37:44 +00001689 - example: the Example object that failed
Tim Peters19397e52004-08-06 22:02:59 +00001690
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)
Guido van Rossumb940e112007-01-10 16:19:56 +00001712 ... except UnexpectedException as f:
1713 ... failure = f
Tim Peters19397e52004-08-06 22:02:59 +00001714
1715 >>> failure.test is test
1716 True
1717
1718 >>> failure.example.want
1719 '42\n'
1720
1721 >>> exc_info = failure.exc_info
Collin Winter828f04a2007-08-31 00:04:24 +00001722 >>> raise exc_info[1] # Already has the traceback
Tim Peters19397e52004-08-06 22:02:59 +00001723 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)
Guido van Rossumb940e112007-01-10 16:19:56 +00001740 ... except DocTestFailure as f:
1741 ... failure = f
Tim Peters19397e52004-08-06 22:02:59 +00001742
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 ...
Guido van Rossum6a2a2a02006-08-26 20:37:44 +00001772 doctest.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)
Christian Heimes25bb7832008-01-11 16:17:00 +00001785 TestResults(failed=0, attempted=1)
Tim Peters19397e52004-08-06 22:02:59 +00001786
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
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001813def testmod(m=None, name=None, globs=None, verbose=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):
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001816 """m=None, name=None, globs=None, verbose=None, report=True,
1817 optionflags=0, extraglobs=None, raise_on_error=False,
Tim Peters958cc892004-09-13 14:53:28 +00001818 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
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001822 with m.__doc__.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001823
1824 Also test examples reachable from dict m.__test__ if it exists and is
Tim Petersc2388a22004-08-10 01:41:28 +00001825 not None. m.__test__ maps names to functions, classes and strings;
Tim Peters8a7d2d52001-01-16 07:10:57 +00001826 function and class docstrings are tested even if the name is private;
1827 strings are tested directly, as if they were docstrings.
1828
1829 Return (#failures, #tests).
1830
Alexander Belopolsky977a6842010-08-16 20:17:07 +00001831 See help(doctest) for an overview.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001832
1833 Optional keyword arg "name" gives the name of the module; by default
1834 use m.__name__.
1835
1836 Optional keyword arg "globs" gives a dict to be used as the globals
1837 when executing examples; by default, use m.__dict__. A copy of this
1838 dict is actually used for each docstring, so that each docstring's
1839 examples start with a clean slate.
1840
Tim Peters8485b562004-08-04 18:46:34 +00001841 Optional keyword arg "extraglobs" gives a dictionary that should be
1842 merged into the globals that are used to execute examples. By
1843 default, no extra globals are used. This is new in 2.4.
1844
Tim Peters8a7d2d52001-01-16 07:10:57 +00001845 Optional keyword arg "verbose" prints lots of stuff if true, prints
1846 only failures if false; by default, it's true iff "-v" is in sys.argv.
1847
Tim Peters8a7d2d52001-01-16 07:10:57 +00001848 Optional keyword arg "report" prints a summary at the end when true,
1849 else prints nothing at the end. In verbose mode, the summary is
1850 detailed, else very brief (in fact, empty if all tests passed).
1851
Tim Peters6ebe61f2003-06-27 20:48:05 +00001852 Optional keyword arg "optionflags" or's together module constants,
Tim Petersf82a9de2004-08-22 20:51:53 +00001853 and defaults to 0. This is new in 2.3. Possible values (see the
1854 docs for details):
Tim Peters6ebe61f2003-06-27 20:48:05 +00001855
1856 DONT_ACCEPT_TRUE_FOR_1
Tim Peters8485b562004-08-04 18:46:34 +00001857 DONT_ACCEPT_BLANKLINE
Tim Peters8485b562004-08-04 18:46:34 +00001858 NORMALIZE_WHITESPACE
Tim Peters8485b562004-08-04 18:46:34 +00001859 ELLIPSIS
Thomas Wouters477c8d52006-05-27 19:21:47 +00001860 SKIP
Edward Loper052d0cd2004-09-19 17:19:33 +00001861 IGNORE_EXCEPTION_DETAIL
Edward Loper71f55af2004-08-26 01:41:51 +00001862 REPORT_UDIFF
1863 REPORT_CDIFF
1864 REPORT_NDIFF
Edward Lopera89f88d2004-08-26 02:45:51 +00001865 REPORT_ONLY_FIRST_FAILURE
Tim Peters19397e52004-08-06 22:02:59 +00001866
1867 Optional keyword arg "raise_on_error" raises an exception on the
1868 first unexpected exception or failure. This allows failures to be
1869 post-mortem debugged.
1870
Tim Peters8a7d2d52001-01-16 07:10:57 +00001871 Advanced tomfoolery: testmod runs methods of a local instance of
1872 class doctest.Tester, then merges the results into (or creates)
1873 global Tester instance doctest.master. Methods of doctest.master
1874 can be called directly too, if you want to do something unusual.
1875 Passing report=0 to testmod is especially useful then, to delay
1876 displaying a summary. Invoke doctest.master.summarize(verbose)
1877 when you're done fiddling.
1878 """
Tim Peters82076ef2004-09-13 00:52:51 +00001879 global master
1880
Tim Peters8485b562004-08-04 18:46:34 +00001881 # If no module was given, then use __main__.
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001882 if m is None:
Martin v. Löwis4581cfa2002-11-22 08:23:09 +00001883 # DWA - m will still be None if this wasn't invoked from the command
1884 # line, in which case the following TypeError is about as good an error
1885 # as we should expect
1886 m = sys.modules.get('__main__')
1887
Tim Peters8485b562004-08-04 18:46:34 +00001888 # Check that we were actually given a module.
1889 if not inspect.ismodule(m):
Walter Dörwald70a6b492004-02-12 17:35:32 +00001890 raise TypeError("testmod: module required; %r" % (m,))
Tim Peters8485b562004-08-04 18:46:34 +00001891
1892 # If no name was given, then use the module's name.
Tim Peters8a7d2d52001-01-16 07:10:57 +00001893 if name is None:
1894 name = m.__name__
Tim Peters8485b562004-08-04 18:46:34 +00001895
1896 # Find, parse, and run all tests in the given module.
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001897 finder = DocTestFinder(exclude_empty=exclude_empty)
Tim Peters19397e52004-08-06 22:02:59 +00001898
1899 if raise_on_error:
1900 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
1901 else:
1902 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
1903
Tim Peters8485b562004-08-04 18:46:34 +00001904 for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
1905 runner.run(test)
1906
Tim Peters8a7d2d52001-01-16 07:10:57 +00001907 if report:
Tim Peters8485b562004-08-04 18:46:34 +00001908 runner.summarize()
Tim Peters8a7d2d52001-01-16 07:10:57 +00001909
Tim Peters82076ef2004-09-13 00:52:51 +00001910 if master is None:
1911 master = runner
1912 else:
1913 master.merge(runner)
1914
Christian Heimes25bb7832008-01-11 16:17:00 +00001915 return TestResults(runner.failures, runner.tries)
Tim Petersdb3756d2003-06-29 05:30:48 +00001916
Edward Loper052d0cd2004-09-19 17:19:33 +00001917def testfile(filename, module_relative=True, name=None, package=None,
1918 globs=None, verbose=None, report=True, optionflags=0,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001919 extraglobs=None, raise_on_error=False, parser=DocTestParser(),
1920 encoding=None):
Edward Loper052d0cd2004-09-19 17:19:33 +00001921 """
1922 Test examples in the given file. Return (#failures, #tests).
1923
1924 Optional keyword arg "module_relative" specifies how filenames
1925 should be interpreted:
1926
1927 - If "module_relative" is True (the default), then "filename"
1928 specifies a module-relative path. By default, this path is
1929 relative to the calling module's directory; but if the
1930 "package" argument is specified, then it is relative to that
1931 package. To ensure os-independence, "filename" should use
1932 "/" characters to separate path segments, and should not
1933 be an absolute path (i.e., it may not begin with "/").
1934
1935 - If "module_relative" is False, then "filename" specifies an
1936 os-specific path. The path may be absolute or relative (to
1937 the current working directory).
1938
Edward Lopera2fc7ec2004-09-21 03:24:24 +00001939 Optional keyword arg "name" gives the name of the test; by default
1940 use the file's basename.
Edward Loper052d0cd2004-09-19 17:19:33 +00001941
1942 Optional keyword argument "package" is a Python package or the
1943 name of a Python package whose directory should be used as the
1944 base directory for a module relative filename. If no package is
1945 specified, then the calling module's directory is used as the base
1946 directory for module relative filenames. It is an error to
1947 specify "package" if "module_relative" is False.
1948
1949 Optional keyword arg "globs" gives a dict to be used as the globals
1950 when executing examples; by default, use {}. A copy of this dict
1951 is actually used for each docstring, so that each docstring's
1952 examples start with a clean slate.
1953
1954 Optional keyword arg "extraglobs" gives a dictionary that should be
1955 merged into the globals that are used to execute examples. By
1956 default, no extra globals are used.
1957
1958 Optional keyword arg "verbose" prints lots of stuff if true, prints
1959 only failures if false; by default, it's true iff "-v" is in sys.argv.
1960
1961 Optional keyword arg "report" prints a summary at the end when true,
1962 else prints nothing at the end. In verbose mode, the summary is
1963 detailed, else very brief (in fact, empty if all tests passed).
1964
1965 Optional keyword arg "optionflags" or's together module constants,
1966 and defaults to 0. Possible values (see the docs for details):
1967
1968 DONT_ACCEPT_TRUE_FOR_1
1969 DONT_ACCEPT_BLANKLINE
1970 NORMALIZE_WHITESPACE
1971 ELLIPSIS
Thomas Wouters477c8d52006-05-27 19:21:47 +00001972 SKIP
Edward Loper052d0cd2004-09-19 17:19:33 +00001973 IGNORE_EXCEPTION_DETAIL
1974 REPORT_UDIFF
1975 REPORT_CDIFF
1976 REPORT_NDIFF
1977 REPORT_ONLY_FIRST_FAILURE
1978
1979 Optional keyword arg "raise_on_error" raises an exception on the
1980 first unexpected exception or failure. This allows failures to be
1981 post-mortem debugged.
1982
Edward Loper498a1862004-09-27 03:42:58 +00001983 Optional keyword arg "parser" specifies a DocTestParser (or
1984 subclass) that should be used to extract tests from the files.
1985
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001986 Optional keyword arg "encoding" specifies an encoding that should
1987 be used to convert the file to unicode.
1988
Edward Loper052d0cd2004-09-19 17:19:33 +00001989 Advanced tomfoolery: testmod runs methods of a local instance of
1990 class doctest.Tester, then merges the results into (or creates)
1991 global Tester instance doctest.master. Methods of doctest.master
1992 can be called directly too, if you want to do something unusual.
1993 Passing report=0 to testmod is especially useful then, to delay
1994 displaying a summary. Invoke doctest.master.summarize(verbose)
1995 when you're done fiddling.
1996 """
1997 global master
1998
1999 if package and not module_relative:
2000 raise ValueError("Package may only be specified for module-"
2001 "relative paths.")
Tim Petersbab3e992004-09-20 19:52:34 +00002002
Edward Loper052d0cd2004-09-19 17:19:33 +00002003 # Relativize the path
Guido van Rossum1b81e7b2007-08-29 03:53:53 +00002004 text, filename = _load_testfile(filename, package, module_relative,
2005 encoding or "utf-8")
Edward Loper052d0cd2004-09-19 17:19:33 +00002006
2007 # If no name was given, then use the file's name.
2008 if name is None:
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002009 name = os.path.basename(filename)
Edward Loper052d0cd2004-09-19 17:19:33 +00002010
2011 # Assemble the globals.
2012 if globs is None:
2013 globs = {}
2014 else:
2015 globs = globs.copy()
2016 if extraglobs is not None:
2017 globs.update(extraglobs)
Raymond Hettinger0f055172009-01-27 10:06:09 +00002018 if '__name__' not in globs:
2019 globs['__name__'] = '__main__'
Edward Loper052d0cd2004-09-19 17:19:33 +00002020
2021 if raise_on_error:
2022 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
2023 else:
2024 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
2025
2026 # Read the file, convert it to a test, and run it.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002027 test = parser.get_doctest(text, globs, name, filename, 0)
Edward Loper052d0cd2004-09-19 17:19:33 +00002028 runner.run(test)
2029
2030 if report:
2031 runner.summarize()
2032
2033 if master is None:
2034 master = runner
2035 else:
2036 master.merge(runner)
2037
Christian Heimes25bb7832008-01-11 16:17:00 +00002038 return TestResults(runner.failures, runner.tries)
Edward Loper052d0cd2004-09-19 17:19:33 +00002039
Tim Peters8485b562004-08-04 18:46:34 +00002040def run_docstring_examples(f, globs, verbose=False, name="NoName",
2041 compileflags=None, optionflags=0):
2042 """
2043 Test examples in the given object's docstring (`f`), using `globs`
2044 as globals. Optional argument `name` is used in failure messages.
2045 If the optional argument `verbose` is true, then generate output
2046 even if there are no failures.
Tim Petersdb3756d2003-06-29 05:30:48 +00002047
Tim Peters8485b562004-08-04 18:46:34 +00002048 `compileflags` gives the set of flags that should be used by the
2049 Python compiler when running the examples. If not specified, then
2050 it will default to the set of future-import flags that apply to
2051 `globs`.
Tim Petersdb3756d2003-06-29 05:30:48 +00002052
Tim Peters8485b562004-08-04 18:46:34 +00002053 Optional keyword arg `optionflags` specifies options for the
2054 testing and output. See the documentation for `testmod` for more
2055 information.
2056 """
2057 # Find, parse, and run all tests in the given module.
2058 finder = DocTestFinder(verbose=verbose, recurse=False)
2059 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
2060 for test in finder.find(f, name, globs=globs):
2061 runner.run(test, compileflags=compileflags)
Tim Petersdb3756d2003-06-29 05:30:48 +00002062
Tim Peters8485b562004-08-04 18:46:34 +00002063######################################################################
Georg Brandl31835852008-05-12 17:38:56 +00002064## 7. Unittest Support
Tim Peters8485b562004-08-04 18:46:34 +00002065######################################################################
Tim Petersdb3756d2003-06-29 05:30:48 +00002066
Jim Fultonf54bad42004-08-28 14:57:56 +00002067_unittest_reportflags = 0
Tim Peters38330fe2004-08-30 16:19:24 +00002068
Jim Fultonf54bad42004-08-28 14:57:56 +00002069def set_unittest_reportflags(flags):
Tim Peters38330fe2004-08-30 16:19:24 +00002070 """Sets the unittest option flags.
Jim Fultonf54bad42004-08-28 14:57:56 +00002071
2072 The old flag is returned so that a runner could restore the old
2073 value if it wished to:
2074
Tim Petersb7e99b62005-03-28 23:50:54 +00002075 >>> import doctest
2076 >>> old = doctest._unittest_reportflags
2077 >>> doctest.set_unittest_reportflags(REPORT_NDIFF |
Jim Fultonf54bad42004-08-28 14:57:56 +00002078 ... REPORT_ONLY_FIRST_FAILURE) == old
2079 True
2080
Jim Fultonf54bad42004-08-28 14:57:56 +00002081 >>> doctest._unittest_reportflags == (REPORT_NDIFF |
2082 ... REPORT_ONLY_FIRST_FAILURE)
2083 True
Tim Petersdf7a2082004-08-29 00:38:17 +00002084
Jim Fultonf54bad42004-08-28 14:57:56 +00002085 Only reporting flags can be set:
2086
Tim Petersb7e99b62005-03-28 23:50:54 +00002087 >>> doctest.set_unittest_reportflags(ELLIPSIS)
Jim Fultonf54bad42004-08-28 14:57:56 +00002088 Traceback (most recent call last):
2089 ...
Tim Peters38330fe2004-08-30 16:19:24 +00002090 ValueError: ('Only reporting flags allowed', 8)
Jim Fultonf54bad42004-08-28 14:57:56 +00002091
Tim Petersb7e99b62005-03-28 23:50:54 +00002092 >>> doctest.set_unittest_reportflags(old) == (REPORT_NDIFF |
Jim Fultonf54bad42004-08-28 14:57:56 +00002093 ... REPORT_ONLY_FIRST_FAILURE)
2094 True
Jim Fultonf54bad42004-08-28 14:57:56 +00002095 """
Jim Fultonf54bad42004-08-28 14:57:56 +00002096 global _unittest_reportflags
Tim Peters38330fe2004-08-30 16:19:24 +00002097
2098 if (flags & REPORTING_FLAGS) != flags:
2099 raise ValueError("Only reporting flags allowed", flags)
Jim Fultonf54bad42004-08-28 14:57:56 +00002100 old = _unittest_reportflags
2101 _unittest_reportflags = flags
2102 return old
Tim Petersdf7a2082004-08-29 00:38:17 +00002103
Jim Fultonf54bad42004-08-28 14:57:56 +00002104
Tim Peters19397e52004-08-06 22:02:59 +00002105class DocTestCase(unittest.TestCase):
Tim Petersdb3756d2003-06-29 05:30:48 +00002106
Edward Loper34fcb142004-08-09 02:45:41 +00002107 def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
2108 checker=None):
Jim Fulton07a349c2004-08-22 14:10:00 +00002109
Jim Fultona643b652004-07-14 19:06:50 +00002110 unittest.TestCase.__init__(self)
Tim Peters19397e52004-08-06 22:02:59 +00002111 self._dt_optionflags = optionflags
Edward Loper34fcb142004-08-09 02:45:41 +00002112 self._dt_checker = checker
Tim Peters19397e52004-08-06 22:02:59 +00002113 self._dt_test = test
2114 self._dt_setUp = setUp
2115 self._dt_tearDown = tearDown
Tim Petersdb3756d2003-06-29 05:30:48 +00002116
Jim Fultona643b652004-07-14 19:06:50 +00002117 def setUp(self):
Jim Fultonf54bad42004-08-28 14:57:56 +00002118 test = self._dt_test
Tim Petersdf7a2082004-08-29 00:38:17 +00002119
Tim Peters19397e52004-08-06 22:02:59 +00002120 if self._dt_setUp is not None:
Jim Fultonf54bad42004-08-28 14:57:56 +00002121 self._dt_setUp(test)
Jim Fultona643b652004-07-14 19:06:50 +00002122
2123 def tearDown(self):
Jim Fultonf54bad42004-08-28 14:57:56 +00002124 test = self._dt_test
2125
Tim Peters19397e52004-08-06 22:02:59 +00002126 if self._dt_tearDown is not None:
Jim Fultonf54bad42004-08-28 14:57:56 +00002127 self._dt_tearDown(test)
2128
2129 test.globs.clear()
Jim Fultona643b652004-07-14 19:06:50 +00002130
2131 def runTest(self):
Tim Peters19397e52004-08-06 22:02:59 +00002132 test = self._dt_test
Jim Fultona643b652004-07-14 19:06:50 +00002133 old = sys.stdout
2134 new = StringIO()
Jim Fultonf54bad42004-08-28 14:57:56 +00002135 optionflags = self._dt_optionflags
Tim Petersdf7a2082004-08-29 00:38:17 +00002136
Tim Peters38330fe2004-08-30 16:19:24 +00002137 if not (optionflags & REPORTING_FLAGS):
Jim Fultonf54bad42004-08-28 14:57:56 +00002138 # The option flags don't include any reporting flags,
2139 # so add the default reporting flags
2140 optionflags |= _unittest_reportflags
Tim Petersdf7a2082004-08-29 00:38:17 +00002141
Jim Fultonf54bad42004-08-28 14:57:56 +00002142 runner = DocTestRunner(optionflags=optionflags,
Edward Loper34fcb142004-08-09 02:45:41 +00002143 checker=self._dt_checker, verbose=False)
Tim Peters19397e52004-08-06 22:02:59 +00002144
Jim Fultona643b652004-07-14 19:06:50 +00002145 try:
Tim Peters19397e52004-08-06 22:02:59 +00002146 runner.DIVIDER = "-"*70
Jim Fultonf54bad42004-08-28 14:57:56 +00002147 failures, tries = runner.run(
2148 test, out=new.write, clear_globs=False)
Jim Fultona643b652004-07-14 19:06:50 +00002149 finally:
2150 sys.stdout = old
2151
2152 if failures:
Tim Peters19397e52004-08-06 22:02:59 +00002153 raise self.failureException(self.format_failure(new.getvalue()))
Tim Peters8485b562004-08-04 18:46:34 +00002154
Tim Peters19397e52004-08-06 22:02:59 +00002155 def format_failure(self, err):
2156 test = self._dt_test
2157 if test.lineno is None:
2158 lineno = 'unknown line number'
2159 else:
Jim Fulton07a349c2004-08-22 14:10:00 +00002160 lineno = '%s' % test.lineno
Tim Peters19397e52004-08-06 22:02:59 +00002161 lname = '.'.join(test.name.split('.')[-1:])
2162 return ('Failed doctest test for %s\n'
2163 ' File "%s", line %s, in %s\n\n%s'
2164 % (test.name, test.filename, lineno, lname, err)
2165 )
2166
2167 def debug(self):
2168 r"""Run the test case without results and without catching exceptions
2169
2170 The unit test framework includes a debug method on test cases
2171 and test suites to support post-mortem debugging. The test code
2172 is run in such a way that errors are not caught. This way a
2173 caller can catch the errors and initiate post-mortem debugging.
2174
2175 The DocTestCase provides a debug method that raises
Ezio Melotti13925002011-03-16 11:05:33 +02002176 UnexpectedException errors if there is an unexpected
Tim Peters19397e52004-08-06 22:02:59 +00002177 exception:
2178
Edward Lopera1ef6112004-08-09 16:14:41 +00002179 >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
Tim Peters19397e52004-08-06 22:02:59 +00002180 ... {}, 'foo', 'foo.py', 0)
2181 >>> case = DocTestCase(test)
2182 >>> try:
2183 ... case.debug()
Guido van Rossumb940e112007-01-10 16:19:56 +00002184 ... except UnexpectedException as f:
2185 ... failure = f
Tim Peters19397e52004-08-06 22:02:59 +00002186
2187 The UnexpectedException contains the test, the example, and
2188 the original exception:
2189
2190 >>> failure.test is test
2191 True
2192
2193 >>> failure.example.want
2194 '42\n'
2195
2196 >>> exc_info = failure.exc_info
Collin Winter828f04a2007-08-31 00:04:24 +00002197 >>> raise exc_info[1] # Already has the traceback
Tim Peters19397e52004-08-06 22:02:59 +00002198 Traceback (most recent call last):
2199 ...
2200 KeyError
2201
2202 If the output doesn't match, then a DocTestFailure is raised:
2203
Edward Lopera1ef6112004-08-09 16:14:41 +00002204 >>> test = DocTestParser().get_doctest('''
Tim Peters19397e52004-08-06 22:02:59 +00002205 ... >>> x = 1
2206 ... >>> x
2207 ... 2
2208 ... ''', {}, 'foo', 'foo.py', 0)
2209 >>> case = DocTestCase(test)
2210
2211 >>> try:
2212 ... case.debug()
Guido van Rossumb940e112007-01-10 16:19:56 +00002213 ... except DocTestFailure as f:
2214 ... failure = f
Tim Peters19397e52004-08-06 22:02:59 +00002215
2216 DocTestFailure objects provide access to the test:
2217
2218 >>> failure.test is test
2219 True
2220
2221 As well as to the example:
2222
2223 >>> failure.example.want
2224 '2\n'
2225
2226 and the actual output:
2227
2228 >>> failure.got
2229 '1\n'
2230
2231 """
2232
Jim Fultonf54bad42004-08-28 14:57:56 +00002233 self.setUp()
Edward Loper34fcb142004-08-09 02:45:41 +00002234 runner = DebugRunner(optionflags=self._dt_optionflags,
2235 checker=self._dt_checker, verbose=False)
Alexandre Vassalottieca20b62008-05-16 02:54:33 +00002236 runner.run(self._dt_test, clear_globs=False)
Jim Fultonf54bad42004-08-28 14:57:56 +00002237 self.tearDown()
Jim Fultona643b652004-07-14 19:06:50 +00002238
2239 def id(self):
Tim Peters19397e52004-08-06 22:02:59 +00002240 return self._dt_test.name
Jim Fultona643b652004-07-14 19:06:50 +00002241
Antoine Pitrou2bc801c2011-12-18 19:27:45 +01002242 def __eq__(self, other):
2243 if type(self) is not type(other):
2244 return NotImplemented
2245
2246 return self._dt_test == other._dt_test and \
2247 self._dt_optionflags == other._dt_optionflags and \
2248 self._dt_setUp == other._dt_setUp and \
2249 self._dt_tearDown == other._dt_tearDown and \
2250 self._dt_checker == other._dt_checker
2251
2252 def __ne__(self, other):
2253 return not self == other
2254
Antoine Pitrou165b1282011-12-18 20:20:17 +01002255 def __hash__(self):
2256 return hash((self._dt_optionflags, self._dt_setUp, self._dt_tearDown,
2257 self._dt_checker))
2258
Jim Fultona643b652004-07-14 19:06:50 +00002259 def __repr__(self):
Tim Peters19397e52004-08-06 22:02:59 +00002260 name = self._dt_test.name.split('.')
Jim Fultona643b652004-07-14 19:06:50 +00002261 return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
2262
2263 __str__ = __repr__
2264
2265 def shortDescription(self):
Tim Peters19397e52004-08-06 22:02:59 +00002266 return "Doctest: " + self._dt_test.name
Jim Fultona643b652004-07-14 19:06:50 +00002267
R. David Murray378c0cf2010-02-24 01:46:21 +00002268class SkipDocTestCase(DocTestCase):
2269 def __init__(self):
2270 DocTestCase.__init__(self, None)
2271
2272 def setUp(self):
2273 self.skipTest("DocTestSuite will not work with -O2 and above")
2274
2275 def test_skip(self):
2276 pass
2277
2278 def shortDescription(self):
2279 return "Skipping tests from %s" % module.__name__
2280
Jim Fultonf54bad42004-08-28 14:57:56 +00002281def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
2282 **options):
Tim Peters8485b562004-08-04 18:46:34 +00002283 """
Tim Peters75dc5e12004-08-22 17:50:45 +00002284 Convert doctest tests for a module to a unittest test suite.
Jim Fultona643b652004-07-14 19:06:50 +00002285
Tim Peters19397e52004-08-06 22:02:59 +00002286 This converts each documentation string in a module that
2287 contains doctest tests to a unittest test case. If any of the
2288 tests in a doc string fail, then the test case fails. An exception
2289 is raised showing the name of the file containing the test and a
Jim Fultona643b652004-07-14 19:06:50 +00002290 (sometimes approximate) line number.
2291
Tim Peters19397e52004-08-06 22:02:59 +00002292 The `module` argument provides the module to be tested. The argument
Jim Fultona643b652004-07-14 19:06:50 +00002293 can be either a module or a module name.
2294
2295 If no argument is given, the calling module is used.
Jim Fultonf54bad42004-08-28 14:57:56 +00002296
2297 A number of options may be provided as keyword arguments:
2298
Jim Fultonf54bad42004-08-28 14:57:56 +00002299 setUp
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002300 A set-up function. This is called before running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002301 tests in each file. The setUp function will be passed a DocTest
2302 object. The setUp function can access the test globals as the
2303 globs attribute of the test passed.
2304
2305 tearDown
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002306 A tear-down function. This is called after running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002307 tests in each file. The tearDown function will be passed a DocTest
2308 object. The tearDown function can access the test globals as the
2309 globs attribute of the test passed.
2310
2311 globs
2312 A dictionary containing initial global variables for the tests.
2313
2314 optionflags
2315 A set of doctest option flags expressed as an integer.
Jim Fultona643b652004-07-14 19:06:50 +00002316 """
Jim Fultona643b652004-07-14 19:06:50 +00002317
Tim Peters8485b562004-08-04 18:46:34 +00002318 if test_finder is None:
2319 test_finder = DocTestFinder()
Tim Peters8485b562004-08-04 18:46:34 +00002320
Tim Peters19397e52004-08-06 22:02:59 +00002321 module = _normalize_module(module)
2322 tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
R. David Murray378c0cf2010-02-24 01:46:21 +00002323
2324 if not tests and sys.flags.optimize >=2:
2325 # Skip doctests when running with -O2
2326 suite = unittest.TestSuite()
2327 suite.addTest(SkipDocTestCase())
2328 return suite
2329 elif not tests:
Jim Fultonf54bad42004-08-28 14:57:56 +00002330 # Why do we want to do this? Because it reveals a bug that might
2331 # otherwise be hidden.
Tim Peters19397e52004-08-06 22:02:59 +00002332 raise ValueError(module, "has no tests")
Tim Petersdb3756d2003-06-29 05:30:48 +00002333
2334 tests.sort()
2335 suite = unittest.TestSuite()
R. David Murray378c0cf2010-02-24 01:46:21 +00002336
Tim Peters8485b562004-08-04 18:46:34 +00002337 for test in tests:
Tim Peters19397e52004-08-06 22:02:59 +00002338 if len(test.examples) == 0:
2339 continue
Tim Peters8485b562004-08-04 18:46:34 +00002340 if not test.filename:
Tim Petersdb3756d2003-06-29 05:30:48 +00002341 filename = module.__file__
Jim Fulton07a349c2004-08-22 14:10:00 +00002342 if filename[-4:] in (".pyc", ".pyo"):
Tim Petersdb3756d2003-06-29 05:30:48 +00002343 filename = filename[:-1]
Tim Peters8485b562004-08-04 18:46:34 +00002344 test.filename = filename
Jim Fultonf54bad42004-08-28 14:57:56 +00002345 suite.addTest(DocTestCase(test, **options))
Tim Peters19397e52004-08-06 22:02:59 +00002346
2347 return suite
2348
2349class DocFileCase(DocTestCase):
2350
2351 def id(self):
2352 return '_'.join(self._dt_test.name.split('.'))
2353
2354 def __repr__(self):
2355 return self._dt_test.filename
2356 __str__ = __repr__
2357
2358 def format_failure(self, err):
2359 return ('Failed doctest test for %s\n File "%s", line 0\n\n%s'
2360 % (self._dt_test.name, self._dt_test.filename, err)
2361 )
2362
Edward Loper052d0cd2004-09-19 17:19:33 +00002363def DocFileTest(path, module_relative=True, package=None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002364 globs=None, parser=DocTestParser(),
2365 encoding=None, **options):
Tim Peters19397e52004-08-06 22:02:59 +00002366 if globs is None:
2367 globs = {}
Fred Drake7c404a42004-12-21 23:46:34 +00002368 else:
2369 globs = globs.copy()
Tim Peters19397e52004-08-06 22:02:59 +00002370
Edward Loper052d0cd2004-09-19 17:19:33 +00002371 if package and not module_relative:
2372 raise ValueError("Package may only be specified for module-"
2373 "relative paths.")
Tim Petersbab3e992004-09-20 19:52:34 +00002374
Edward Loper052d0cd2004-09-19 17:19:33 +00002375 # Relativize the path.
Guido van Rossum1b81e7b2007-08-29 03:53:53 +00002376 doc, path = _load_testfile(path, package, module_relative,
2377 encoding or "utf-8")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002378
Fred Drake7c404a42004-12-21 23:46:34 +00002379 if "__file__" not in globs:
2380 globs["__file__"] = path
Tim Peters19397e52004-08-06 22:02:59 +00002381
Edward Loper052d0cd2004-09-19 17:19:33 +00002382 # Find the file and read it.
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002383 name = os.path.basename(path)
Edward Loper052d0cd2004-09-19 17:19:33 +00002384
2385 # Convert it to a test, and wrap it in a DocFileCase.
Edward Loper498a1862004-09-27 03:42:58 +00002386 test = parser.get_doctest(doc, globs, name, path, 0)
Jim Fultonf54bad42004-08-28 14:57:56 +00002387 return DocFileCase(test, **options)
Tim Peters19397e52004-08-06 22:02:59 +00002388
2389def DocFileSuite(*paths, **kw):
Edward Loper052d0cd2004-09-19 17:19:33 +00002390 """A unittest suite for one or more doctest files.
Tim Petersbab3e992004-09-20 19:52:34 +00002391
Edward Loper052d0cd2004-09-19 17:19:33 +00002392 The path to each doctest file is given as a string; the
2393 interpretation of that string depends on the keyword argument
2394 "module_relative".
Tim Peters19397e52004-08-06 22:02:59 +00002395
2396 A number of options may be provided as keyword arguments:
2397
Edward Loper052d0cd2004-09-19 17:19:33 +00002398 module_relative
2399 If "module_relative" is True, then the given file paths are
2400 interpreted as os-independent module-relative paths. By
2401 default, these paths are relative to the calling module's
2402 directory; but if the "package" argument is specified, then
2403 they are relative to that package. To ensure os-independence,
2404 "filename" should use "/" characters to separate path
2405 segments, and may not be an absolute path (i.e., it may not
2406 begin with "/").
Tim Petersbab3e992004-09-20 19:52:34 +00002407
Edward Loper052d0cd2004-09-19 17:19:33 +00002408 If "module_relative" is False, then the given file paths are
2409 interpreted as os-specific paths. These paths may be absolute
2410 or relative (to the current working directory).
2411
Tim Peters19397e52004-08-06 22:02:59 +00002412 package
Edward Loper052d0cd2004-09-19 17:19:33 +00002413 A Python package or the name of a Python package whose directory
2414 should be used as the base directory for module relative paths.
2415 If "package" is not specified, then the calling module's
2416 directory is used as the base directory for module relative
2417 filenames. It is an error to specify "package" if
2418 "module_relative" is False.
Tim Peters19397e52004-08-06 22:02:59 +00002419
2420 setUp
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002421 A set-up function. This is called before running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002422 tests in each file. The setUp function will be passed a DocTest
2423 object. The setUp function can access the test globals as the
2424 globs attribute of the test passed.
Tim Peters19397e52004-08-06 22:02:59 +00002425
2426 tearDown
Edward Lopera2fc7ec2004-09-21 03:24:24 +00002427 A tear-down function. This is called after running the
Jim Fultonf54bad42004-08-28 14:57:56 +00002428 tests in each file. The tearDown function will be passed a DocTest
2429 object. The tearDown function can access the test globals as the
2430 globs attribute of the test passed.
Tim Peters19397e52004-08-06 22:02:59 +00002431
2432 globs
2433 A dictionary containing initial global variables for the tests.
Jim Fultonf54bad42004-08-28 14:57:56 +00002434
2435 optionflags
Edward Loper498a1862004-09-27 03:42:58 +00002436 A set of doctest option flags expressed as an integer.
2437
2438 parser
2439 A DocTestParser (or subclass) that should be used to extract
2440 tests from the files.
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00002441
2442 encoding
2443 An encoding that will be used to convert the files to unicode.
Tim Peters19397e52004-08-06 22:02:59 +00002444 """
2445 suite = unittest.TestSuite()
2446
2447 # We do this here so that _normalize_module is called at the right
2448 # level. If it were called in DocFileTest, then this function
2449 # would be the caller and we might guess the package incorrectly.
Edward Loper052d0cd2004-09-19 17:19:33 +00002450 if kw.get('module_relative', True):
2451 kw['package'] = _normalize_module(kw.get('package'))
Tim Peters19397e52004-08-06 22:02:59 +00002452
2453 for path in paths:
2454 suite.addTest(DocFileTest(path, **kw))
Jim Fultona643b652004-07-14 19:06:50 +00002455
Tim Petersdb3756d2003-06-29 05:30:48 +00002456 return suite
2457
Tim Peters8485b562004-08-04 18:46:34 +00002458######################################################################
Georg Brandl31835852008-05-12 17:38:56 +00002459## 8. Debugging Support
Tim Peters8485b562004-08-04 18:46:34 +00002460######################################################################
Jim Fultona643b652004-07-14 19:06:50 +00002461
Tim Peters19397e52004-08-06 22:02:59 +00002462def script_from_examples(s):
2463 r"""Extract script from text with examples.
2464
2465 Converts text with examples to a Python script. Example input is
2466 converted to regular code. Example output and all other words
2467 are converted to comments:
2468
2469 >>> text = '''
2470 ... Here are examples of simple math.
2471 ...
2472 ... Python has super accurate integer addition
2473 ...
2474 ... >>> 2 + 2
2475 ... 5
2476 ...
2477 ... And very friendly error messages:
2478 ...
2479 ... >>> 1/0
2480 ... To Infinity
2481 ... And
2482 ... Beyond
2483 ...
2484 ... You can use logic if you want:
2485 ...
2486 ... >>> if 0:
2487 ... ... blah
2488 ... ... blah
2489 ... ...
2490 ...
2491 ... Ho hum
2492 ... '''
2493
Guido van Rossum7131f842007-02-09 20:13:25 +00002494 >>> print(script_from_examples(text))
Edward Lopera5db6002004-08-12 02:41:30 +00002495 # Here are examples of simple math.
Tim Peters19397e52004-08-06 22:02:59 +00002496 #
Edward Lopera5db6002004-08-12 02:41:30 +00002497 # Python has super accurate integer addition
Tim Peters19397e52004-08-06 22:02:59 +00002498 #
2499 2 + 2
2500 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00002501 ## 5
Tim Peters19397e52004-08-06 22:02:59 +00002502 #
Edward Lopera5db6002004-08-12 02:41:30 +00002503 # And very friendly error messages:
Tim Peters19397e52004-08-06 22:02:59 +00002504 #
2505 1/0
2506 # Expected:
Edward Lopera5db6002004-08-12 02:41:30 +00002507 ## To Infinity
2508 ## And
2509 ## Beyond
Tim Peters19397e52004-08-06 22:02:59 +00002510 #
Edward Lopera5db6002004-08-12 02:41:30 +00002511 # You can use logic if you want:
Tim Peters19397e52004-08-06 22:02:59 +00002512 #
2513 if 0:
2514 blah
2515 blah
Tim Peters19397e52004-08-06 22:02:59 +00002516 #
Edward Lopera5db6002004-08-12 02:41:30 +00002517 # Ho hum
Georg Brandlecf93c72005-06-26 23:09:51 +00002518 <BLANKLINE>
Tim Peters19397e52004-08-06 22:02:59 +00002519 """
Edward Loper00f8da72004-08-26 18:05:07 +00002520 output = []
2521 for piece in DocTestParser().parse(s):
2522 if isinstance(piece, Example):
2523 # Add the example's source code (strip trailing NL)
2524 output.append(piece.source[:-1])
2525 # Add the expected output:
2526 want = piece.want
2527 if want:
2528 output.append('# Expected:')
2529 output += ['## '+l for l in want.split('\n')[:-1]]
2530 else:
2531 # Add non-example text.
2532 output += [_comment_line(l)
2533 for l in piece.split('\n')[:-1]]
Tim Peters19397e52004-08-06 22:02:59 +00002534
Edward Loper00f8da72004-08-26 18:05:07 +00002535 # Trim junk on both ends.
2536 while output and output[-1] == '#':
2537 output.pop()
2538 while output and output[0] == '#':
2539 output.pop(0)
2540 # Combine the output, and return it.
Georg Brandl1f149642005-06-26 22:22:31 +00002541 # Add a courtesy newline to prevent exec from choking (see bug #1172785)
2542 return '\n'.join(output) + '\n'
Tim Petersdb3756d2003-06-29 05:30:48 +00002543
2544def testsource(module, name):
Tim Peters19397e52004-08-06 22:02:59 +00002545 """Extract the test sources from a doctest docstring as a script.
Tim Petersdb3756d2003-06-29 05:30:48 +00002546
2547 Provide the module (or dotted name of the module) containing the
Jim Fultona643b652004-07-14 19:06:50 +00002548 test to be debugged and the name (within the module) of the object
2549 with the doc string with tests to be debugged.
Tim Petersdb3756d2003-06-29 05:30:48 +00002550 """
Tim Peters8485b562004-08-04 18:46:34 +00002551 module = _normalize_module(module)
2552 tests = DocTestFinder().find(module)
2553 test = [t for t in tests if t.name == name]
Tim Petersdb3756d2003-06-29 05:30:48 +00002554 if not test:
2555 raise ValueError(name, "not found in tests")
2556 test = test[0]
Tim Peters19397e52004-08-06 22:02:59 +00002557 testsrc = script_from_examples(test.docstring)
Jim Fultona643b652004-07-14 19:06:50 +00002558 return testsrc
Tim Petersdb3756d2003-06-29 05:30:48 +00002559
Jim Fultona643b652004-07-14 19:06:50 +00002560def debug_src(src, pm=False, globs=None):
Tim Peters19397e52004-08-06 22:02:59 +00002561 """Debug a single doctest docstring, in argument `src`'"""
2562 testsrc = script_from_examples(src)
Tim Peters8485b562004-08-04 18:46:34 +00002563 debug_script(testsrc, pm, globs)
Tim Petersdb3756d2003-06-29 05:30:48 +00002564
Jim Fultona643b652004-07-14 19:06:50 +00002565def debug_script(src, pm=False, globs=None):
Tim Peters19397e52004-08-06 22:02:59 +00002566 "Debug a test script. `src` is the script, as a string."
Tim Petersdb3756d2003-06-29 05:30:48 +00002567 import pdb
Tim Petersdb3756d2003-06-29 05:30:48 +00002568
Victor Stinner12b8d142011-06-30 17:35:55 +02002569 if globs:
2570 globs = globs.copy()
2571 else:
2572 globs = {}
Tim Peters8485b562004-08-04 18:46:34 +00002573
Victor Stinner12b8d142011-06-30 17:35:55 +02002574 if pm:
2575 try:
2576 exec(src, globs, globs)
2577 except:
2578 print(sys.exc_info()[1])
2579 p = pdb.Pdb(nosigint=True)
2580 p.reset()
2581 p.interaction(None, sys.exc_info()[2])
2582 else:
2583 pdb.Pdb(nosigint=True).run("exec(%r)" % src, globs, globs)
Tim Petersdb3756d2003-06-29 05:30:48 +00002584
Jim Fultona643b652004-07-14 19:06:50 +00002585def debug(module, name, pm=False):
Tim Peters19397e52004-08-06 22:02:59 +00002586 """Debug a single doctest docstring.
Jim Fultona643b652004-07-14 19:06:50 +00002587
2588 Provide the module (or dotted name of the module) containing the
2589 test to be debugged and the name (within the module) of the object
Tim Peters19397e52004-08-06 22:02:59 +00002590 with the docstring with tests to be debugged.
Jim Fultona643b652004-07-14 19:06:50 +00002591 """
Tim Peters8485b562004-08-04 18:46:34 +00002592 module = _normalize_module(module)
Jim Fultona643b652004-07-14 19:06:50 +00002593 testsrc = testsource(module, name)
2594 debug_script(testsrc, pm, module.__dict__)
2595
Tim Peters8485b562004-08-04 18:46:34 +00002596######################################################################
Georg Brandl31835852008-05-12 17:38:56 +00002597## 9. Example Usage
Tim Peters8485b562004-08-04 18:46:34 +00002598######################################################################
Tim Peters8a7d2d52001-01-16 07:10:57 +00002599class _TestClass:
2600 """
2601 A pointless class, for sanity-checking of docstring testing.
2602
2603 Methods:
2604 square()
2605 get()
2606
2607 >>> _TestClass(13).get() + _TestClass(-12).get()
2608 1
2609 >>> hex(_TestClass(13).square().get())
2610 '0xa9'
2611 """
2612
2613 def __init__(self, val):
2614 """val -> _TestClass object with associated value val.
2615
2616 >>> t = _TestClass(123)
Guido van Rossum7131f842007-02-09 20:13:25 +00002617 >>> print(t.get())
Tim Peters8a7d2d52001-01-16 07:10:57 +00002618 123
2619 """
2620
2621 self.val = val
2622
2623 def square(self):
2624 """square() -> square TestClass's associated value
2625
2626 >>> _TestClass(13).square().get()
2627 169
2628 """
2629
2630 self.val = self.val ** 2
2631 return self
2632
2633 def get(self):
2634 """get() -> return TestClass's associated value.
2635
2636 >>> x = _TestClass(-42)
Guido van Rossum7131f842007-02-09 20:13:25 +00002637 >>> print(x.get())
Tim Peters8a7d2d52001-01-16 07:10:57 +00002638 -42
2639 """
2640
2641 return self.val
2642
2643__test__ = {"_TestClass": _TestClass,
2644 "string": r"""
2645 Example of a string object, searched as-is.
2646 >>> x = 1; y = 2
2647 >>> x + y, x * y
2648 (3, 2)
Tim Peters6ebe61f2003-06-27 20:48:05 +00002649 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002650
Tim Peters6ebe61f2003-06-27 20:48:05 +00002651 "bool-int equivalence": r"""
2652 In 2.2, boolean expressions displayed
2653 0 or 1. By default, we still accept
2654 them. This can be disabled by passing
2655 DONT_ACCEPT_TRUE_FOR_1 to the new
2656 optionflags argument.
2657 >>> 4 == 4
2658 1
2659 >>> 4 == 4
2660 True
2661 >>> 4 > 4
2662 0
2663 >>> 4 > 4
2664 False
2665 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002666
Tim Peters8485b562004-08-04 18:46:34 +00002667 "blank lines": r"""
Tim Peters3fa8c202004-08-23 21:43:39 +00002668 Blank lines can be marked with <BLANKLINE>:
Guido van Rossum7131f842007-02-09 20:13:25 +00002669 >>> print('foo\n\nbar\n')
Tim Peters3fa8c202004-08-23 21:43:39 +00002670 foo
2671 <BLANKLINE>
2672 bar
2673 <BLANKLINE>
Tim Peters8485b562004-08-04 18:46:34 +00002674 """,
Tim Peters3fa8c202004-08-23 21:43:39 +00002675
2676 "ellipsis": r"""
2677 If the ellipsis flag is used, then '...' can be used to
2678 elide substrings in the desired output:
Guido van Rossum805365e2007-05-07 22:24:25 +00002679 >>> print(list(range(1000))) #doctest: +ELLIPSIS
Tim Peters3fa8c202004-08-23 21:43:39 +00002680 [0, 1, 2, ..., 999]
2681 """,
2682
2683 "whitespace normalization": r"""
2684 If the whitespace normalization flag is used, then
2685 differences in whitespace are ignored.
Guido van Rossum805365e2007-05-07 22:24:25 +00002686 >>> print(list(range(30))) #doctest: +NORMALIZE_WHITESPACE
Tim Peters3fa8c202004-08-23 21:43:39 +00002687 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2688 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
2689 27, 28, 29]
2690 """,
2691 }
Tim Peters8485b562004-08-04 18:46:34 +00002692
R. David Murray445448c2009-12-20 17:28:31 +00002693
Tim Peters8a7d2d52001-01-16 07:10:57 +00002694def _test():
Guido van Rossumd8faa362007-04-27 19:54:29 +00002695 testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-']
R. David Murray445448c2009-12-20 17:28:31 +00002696 if not testfiles:
2697 name = os.path.basename(sys.argv[0])
R. David Murray0f72d6c2009-12-21 12:50:02 +00002698 if '__loader__' in globals(): # python -m
R. David Murray445448c2009-12-20 17:28:31 +00002699 name, _ = os.path.splitext(name)
2700 print("usage: {0} [-v] file ...".format(name))
2701 return 2
2702 for filename in testfiles:
2703 if filename.endswith(".py"):
2704 # It is a module -- insert its dir into sys.path and try to
2705 # import it. If it is part of a package, that possibly
2706 # won't work because of package imports.
2707 dirname, filename = os.path.split(filename)
2708 sys.path.insert(0, dirname)
2709 m = __import__(filename[:-3])
2710 del sys.path[0]
2711 failures, _ = testmod(m)
2712 else:
2713 failures, _ = testfile(filename, module_relative=False)
2714 if failures:
2715 return 1
Christian Heimes895627f2007-12-08 17:28:33 +00002716 return 0
Tim Peters8a7d2d52001-01-16 07:10:57 +00002717
R. David Murray445448c2009-12-20 17:28:31 +00002718
Tim Peters8a7d2d52001-01-16 07:10:57 +00002719if __name__ == "__main__":
Christian Heimes895627f2007-12-08 17:28:33 +00002720 sys.exit(_test())