blob: b04b81bac42d11aa07c4ddec4db159778084a367 [file] [log] [blame]
Tor Norbye3a2425a2013-11-04 10:16:08 -08001# Module doctest.
2# Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
3# Major enhancements and refactoring by:
4# Jim Fulton
5# Edward Loper
6
7# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
8
9r"""Module doctest -- a framework for running examples in docstrings.
10
11In simplest use, end each module M to be tested with:
12
13def _test():
14 import doctest
15 doctest.testmod()
16
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
37You 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
39examined by testmod.
40
41There 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.
46"""
47
48__docformat__ = 'reStructuredText en'
49
50__all__ = [
51 # 0, Option Flags
52 'register_optionflag',
53 'DONT_ACCEPT_TRUE_FOR_1',
54 'DONT_ACCEPT_BLANKLINE',
55 'NORMALIZE_WHITESPACE',
56 'ELLIPSIS',
57 'SKIP',
58 'IGNORE_EXCEPTION_DETAIL',
59 'COMPARISON_FLAGS',
60 'REPORT_UDIFF',
61 'REPORT_CDIFF',
62 'REPORT_NDIFF',
63 'REPORT_ONLY_FIRST_FAILURE',
64 'REPORTING_FLAGS',
65 # 1. Utility Functions
66 # 2. Example & DocTest
67 'Example',
68 'DocTest',
69 # 3. Doctest Parser
70 'DocTestParser',
71 # 4. Doctest Finder
72 'DocTestFinder',
73 # 5. Doctest Runner
74 'DocTestRunner',
75 'OutputChecker',
76 'DocTestFailure',
77 'UnexpectedException',
78 'DebugRunner',
79 # 6. Test Functions
80 'testmod',
81 'testfile',
82 'run_docstring_examples',
83 # 7. Tester
84 'Tester',
85 # 8. Unittest Support
86 'DocTestSuite',
87 'DocFileSuite',
88 'set_unittest_reportflags',
89 # 9. Debugging Support
90 'script_from_examples',
91 'testsource',
92 'debug_src',
93 'debug',
94]
95
96import __future__
97
98import sys, traceback, inspect, linecache, os, re
99import unittest, difflib, pdb, tempfile
100import warnings
101from StringIO import StringIO
102
103# There are 4 basic classes:
104# - Example: a <source, want> pair, plus an intra-docstring line number.
105# - DocTest: a collection of examples, parsed from a docstring, plus
106# info about where the docstring came from (name, filename, lineno).
107# - DocTestFinder: extracts DocTests from a given object's docstring and
108# its contained objects' docstrings.
109# - DocTestRunner: runs DocTest cases, and accumulates statistics.
110#
111# So the basic picture is:
112#
113# list of:
114# +------+ +---------+ +-------+
115# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
116# +------+ +---------+ +-------+
117# | Example |
118# | ... |
119# | Example |
120# +---------+
121
122# Option constants.
123
124OPTIONFLAGS_BY_NAME = {}
125def register_optionflag(name):
126 # Create a new flag unless `name` is already known.
127 return OPTIONFLAGS_BY_NAME.setdefault(name, 1 << len(OPTIONFLAGS_BY_NAME))
128
129DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
130DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
131NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
132ELLIPSIS = register_optionflag('ELLIPSIS')
133SKIP = register_optionflag('SKIP')
134IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
135
136COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
137 DONT_ACCEPT_BLANKLINE |
138 NORMALIZE_WHITESPACE |
139 ELLIPSIS |
140 SKIP |
141 IGNORE_EXCEPTION_DETAIL)
142
143REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
144REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
145REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
146REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
147
148REPORTING_FLAGS = (REPORT_UDIFF |
149 REPORT_CDIFF |
150 REPORT_NDIFF |
151 REPORT_ONLY_FIRST_FAILURE)
152
153# Special string markers for use in `want` strings:
154BLANKLINE_MARKER = '<BLANKLINE>'
155ELLIPSIS_MARKER = '...'
156
157######################################################################
158## Table of Contents
159######################################################################
160# 1. Utility Functions
161# 2. Example & DocTest -- store test cases
162# 3. DocTest Parser -- extracts examples from strings
163# 4. DocTest Finder -- extracts test cases from objects
164# 5. DocTest Runner -- runs test cases
165# 6. Test Functions -- convenient wrappers for testing
166# 7. Tester Class -- for backwards compatibility
167# 8. Unittest Support
168# 9. Debugging Support
169# 10. Example Usage
170
171######################################################################
172## 1. Utility Functions
173######################################################################
174
175def _extract_future_flags(globs):
176 """
177 Return the compiler-flags associated with the future features that
178 have been imported into the given namespace (globs).
179 """
180 flags = 0
181 for fname in __future__.all_feature_names:
182 feature = globs.get(fname, None)
183 if feature is getattr(__future__, fname):
184 flags |= feature.compiler_flag
185 return flags
186
187def _normalize_module(module, depth=2):
188 """
189 Return the module specified by `module`. In particular:
190 - If `module` is a module, then return module.
191 - If `module` is a string, then import and return the
192 module with that name.
193 - If `module` is None, then return the calling module.
194 The calling module is assumed to be the module of
195 the stack frame at the given depth in the call stack.
196 """
197 if inspect.ismodule(module):
198 return module
199 elif isinstance(module, (str, unicode)):
200 return __import__(module, globals(), locals(), ["*"])
201 elif module is None:
202 return sys.modules[sys._getframe(depth).f_globals['__name__']]
203 else:
204 raise TypeError("Expected a module, string, or None")
205
206def _load_testfile(filename, package, module_relative):
207 if module_relative:
208 package = _normalize_module(package, 3)
209 filename = _module_relative_path(package, filename)
210 if hasattr(package, '__loader__'):
211 if hasattr(package.__loader__, 'get_data'):
212 file_contents = package.__loader__.get_data(filename)
213 # get_data() opens files as 'rb', so one must do the equivalent
214 # conversion as universal newlines would do.
215 return file_contents.replace(os.linesep, '\n'), filename
216 return open(filename).read(), filename
217
218def _indent(s, indent=4):
219 """
220 Add the given number of space characters to the beginning every
221 non-blank line in `s`, and return the result.
222 """
223 # This regexp matches the start of non-blank lines:
224 return re.sub('(?m)^(?!$)', indent*' ', s)
225
226def _exception_traceback(exc_info):
227 """
228 Return a string containing a traceback message for the given
229 exc_info tuple (as returned by sys.exc_info()).
230 """
231 # Get a traceback message.
232 excout = StringIO()
233 exc_type, exc_val, exc_tb = exc_info
234 traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
235 return excout.getvalue()
236
237# Override some StringIO methods.
238class _SpoofOut(StringIO):
239 def getvalue(self):
240 result = StringIO.getvalue(self)
241 # If anything at all was written, make sure there's a trailing
242 # newline. There's no way for the expected output to indicate
243 # that a trailing newline is missing.
244 if result and not result.endswith("\n"):
245 result += "\n"
246 # Prevent softspace from screwing up the next test case, in
247 # case they used print with a trailing comma in an example.
248 if hasattr(self, "softspace"):
249 del self.softspace
250 return result
251
252 def truncate(self, size=None):
253 StringIO.truncate(self, size)
254 if hasattr(self, "softspace"):
255 del self.softspace
256
257# Worst-case linear-time ellipsis matching.
258def _ellipsis_match(want, got):
259 """
260 Essentially the only subtle case:
261 >>> _ellipsis_match('aa...aa', 'aaa')
262 False
263 """
264 if ELLIPSIS_MARKER not in want:
265 return want == got
266
267 # Find "the real" strings.
268 ws = want.split(ELLIPSIS_MARKER)
269 assert len(ws) >= 2
270
271 # Deal with exact matches possibly needed at one or both ends.
272 startpos, endpos = 0, len(got)
273 w = ws[0]
274 if w: # starts with exact match
275 if got.startswith(w):
276 startpos = len(w)
277 del ws[0]
278 else:
279 return False
280 w = ws[-1]
281 if w: # ends with exact match
282 if got.endswith(w):
283 endpos -= len(w)
284 del ws[-1]
285 else:
286 return False
287
288 if startpos > endpos:
289 # Exact end matches required more characters than we have, as in
290 # _ellipsis_match('aa...aa', 'aaa')
291 return False
292
293 # For the rest, we only need to find the leftmost non-overlapping
294 # match for each piece. If there's no overall match that way alone,
295 # there's no overall match period.
296 for w in ws:
297 # w may be '' at times, if there are consecutive ellipses, or
298 # due to an ellipsis at the start or end of `want`. That's OK.
299 # Search for an empty string succeeds, and doesn't change startpos.
300 startpos = got.find(w, startpos, endpos)
301 if startpos < 0:
302 return False
303 startpos += len(w)
304
305 return True
306
307def _comment_line(line):
308 "Return a commented form of the given line"
309 line = line.rstrip()
310 if line:
311 return '# '+line
312 else:
313 return '#'
314
315class _OutputRedirectingPdb(pdb.Pdb):
316 """
317 A specialized version of the python debugger that redirects stdout
318 to a given stream when interacting with the user. Stdout is *not*
319 redirected when traced code is executed.
320 """
321 def __init__(self, out):
322 self.__out = out
323 self.__debugger_used = False
324 pdb.Pdb.__init__(self, stdout=out)
325
326 def set_trace(self, frame=None):
327 self.__debugger_used = True
328 if frame is None:
329 frame = sys._getframe().f_back
330 pdb.Pdb.set_trace(self, frame)
331
332 def set_continue(self):
333 # Calling set_continue unconditionally would break unit test
334 # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
335 if self.__debugger_used:
336 pdb.Pdb.set_continue(self)
337
338 def trace_dispatch(self, *args):
339 # Redirect stdout to the given stream.
340 save_stdout = sys.stdout
341 sys.stdout = self.__out
342 # Call Pdb's trace dispatch method.
343 try:
344 return pdb.Pdb.trace_dispatch(self, *args)
345 finally:
346 sys.stdout = save_stdout
347
348# [XX] Normalize with respect to os.path.pardir?
349def _module_relative_path(module, path):
350 if not inspect.ismodule(module):
351 raise TypeError, 'Expected a module: %r' % module
352 if path.startswith('/'):
353 raise ValueError, 'Module-relative files may not have absolute paths'
354
355 # Find the base directory for the path.
356 if hasattr(module, '__file__'):
357 # A normal module/package
358 basedir = os.path.split(module.__file__)[0]
359 elif module.__name__ == '__main__':
360 # An interactive session.
361 if len(sys.argv)>0 and sys.argv[0] != '':
362 basedir = os.path.split(sys.argv[0])[0]
363 else:
364 basedir = os.curdir
365 else:
366 # A module w/o __file__ (this includes builtins)
367 raise ValueError("Can't resolve paths relative to the module " +
368 module + " (it has no __file__)")
369
370 # Combine the base directory and the path.
371 return os.path.join(basedir, *(path.split('/')))
372
373######################################################################
374## 2. Example & DocTest
375######################################################################
376## - An "example" is a <source, want> pair, where "source" is a
377## fragment of source code, and "want" is the expected output for
378## "source." The Example class also includes information about
379## where the example was extracted from.
380##
381## - A "doctest" is a collection of examples, typically extracted from
382## a string (such as an object's docstring). The DocTest class also
383## includes information about where the string was extracted from.
384
385class Example:
386 """
387 A single doctest example, consisting of source code and expected
388 output. `Example` defines the following attributes:
389
390 - source: A single Python statement, always ending with a newline.
391 The constructor adds a newline if needed.
392
393 - want: The expected output from running the source code (either
394 from stdout, or a traceback in case of exception). `want` ends
395 with a newline unless it's empty, in which case it's an empty
396 string. The constructor adds a newline if needed.
397
398 - exc_msg: The exception message generated by the example, if
399 the example is expected to generate an exception; or `None` if
400 it is not expected to generate an exception. This exception
401 message is compared against the return value of
402 `traceback.format_exception_only()`. `exc_msg` ends with a
403 newline unless it's `None`. The constructor adds a newline
404 if needed.
405
406 - lineno: The line number within the DocTest string containing
407 this Example where the Example begins. This line number is
408 zero-based, with respect to the beginning of the DocTest.
409
410 - indent: The example's indentation in the DocTest string.
411 I.e., the number of space characters that preceed the
412 example's first prompt.
413
414 - options: A dictionary mapping from option flags to True or
415 False, which is used to override default options for this
416 example. Any option flags not contained in this dictionary
417 are left at their default value (as specified by the
418 DocTestRunner's optionflags). By default, no options are set.
419 """
420 def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
421 options=None):
422 # Normalize inputs.
423 if not source.endswith('\n'):
424 source += '\n'
425 if want and not want.endswith('\n'):
426 want += '\n'
427 if exc_msg is not None and not exc_msg.endswith('\n'):
428 exc_msg += '\n'
429 # Store properties.
430 self.source = source
431 self.want = want
432 self.lineno = lineno
433 self.indent = indent
434 if options is None: options = {}
435 self.options = options
436 self.exc_msg = exc_msg
437
438class DocTest:
439 """
440 A collection of doctest examples that should be run in a single
441 namespace. Each `DocTest` defines the following attributes:
442
443 - examples: the list of examples.
444
445 - globs: The namespace (aka globals) that the examples should
446 be run in.
447
448 - name: A name identifying the DocTest (typically, the name of
449 the object whose docstring this DocTest was extracted from).
450
451 - filename: The name of the file that this DocTest was extracted
452 from, or `None` if the filename is unknown.
453
454 - lineno: The line number within filename where this DocTest
455 begins, or `None` if the line number is unavailable. This
456 line number is zero-based, with respect to the beginning of
457 the file.
458
459 - docstring: The string that the examples were extracted from,
460 or `None` if the string is unavailable.
461 """
462 def __init__(self, examples, globs, name, filename, lineno, docstring):
463 """
464 Create a new DocTest containing the given examples. The
465 DocTest's globals are initialized with a copy of `globs`.
466 """
467 assert not isinstance(examples, basestring), \
468 "DocTest no longer accepts str; use DocTestParser instead"
469 self.examples = examples
470 self.docstring = docstring
471 self.globs = globs.copy()
472 self.name = name
473 self.filename = filename
474 self.lineno = lineno
475
476 def __repr__(self):
477 if len(self.examples) == 0:
478 examples = 'no examples'
479 elif len(self.examples) == 1:
480 examples = '1 example'
481 else:
482 examples = '%d examples' % len(self.examples)
483 return ('<DocTest %s from %s:%s (%s)>' %
484 (self.name, self.filename, self.lineno, examples))
485
486
487 # This lets us sort tests by name:
488 def __cmp__(self, other):
489 if not isinstance(other, DocTest):
490 return -1
491 return cmp((self.name, self.filename, self.lineno, id(self)),
492 (other.name, other.filename, other.lineno, id(other)))
493
494######################################################################
495## 3. DocTestParser
496######################################################################
497
498class DocTestParser:
499 """
500 A class used to parse strings containing doctest examples.
501 """
502 # This regular expression is used to find doctest examples in a
503 # string. It defines three groups: `source` is the source code
504 # (including leading indentation and prompts); `indent` is the
505 # indentation of the first (PS1) line of the source code; and
506 # `want` is the expected output (including leading indentation).
507 _EXAMPLE_RE = re.compile(r'''
508 # Source consists of a PS1 line followed by zero or more PS2 lines.
509 (?P<source>
510 (?:^(?P<indent> [ ]*) >>> .*) # PS1 line
511 (?:\n [ ]* \.\.\. .*)*) # PS2 lines
512 \n?
513 # Want consists of any non-blank lines that do not start with PS1.
514 (?P<want> (?:(?![ ]*$) # Not a blank line
515 (?![ ]*>>>) # Not a line starting with PS1
516 .*$\n? # But any other line
517 )*)
518 ''', re.MULTILINE | re.VERBOSE)
519
520 # A regular expression for handling `want` strings that contain
521 # expected exceptions. It divides `want` into three pieces:
522 # - the traceback header line (`hdr`)
523 # - the traceback stack (`stack`)
524 # - the exception message (`msg`), as generated by
525 # traceback.format_exception_only()
526 # `msg` may have multiple lines. We assume/require that the
527 # exception message is the first non-indented line starting with a word
528 # character following the traceback header line.
529 _EXCEPTION_RE = re.compile(r"""
530 # Grab the traceback header. Different versions of Python have
531 # said different things on the first traceback line.
532 ^(?P<hdr> Traceback\ \(
533 (?: most\ recent\ call\ last
534 | innermost\ last
535 ) \) :
536 )
537 \s* $ # toss trailing whitespace on the header.
538 (?P<stack> .*?) # don't blink: absorb stuff until...
539 ^ (?P<msg> \w+ .*) # a line *starts* with alphanum.
540 """, re.VERBOSE | re.MULTILINE | re.DOTALL)
541
542 # A callable returning a true value iff its argument is a blank line
543 # or contains a single comment.
544 _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
545
546 def parse(self, string, name='<string>'):
547 """
548 Divide the given string into examples and intervening text,
549 and return them as a list of alternating Examples and strings.
550 Line numbers for the Examples are 0-based. The optional
551 argument `name` is a name identifying this string, and is only
552 used for error messages.
553 """
554 string = string.expandtabs()
555 # If all lines begin with the same indentation, then strip it.
556 min_indent = self._min_indent(string)
557 if min_indent > 0:
558 string = '\n'.join([l[min_indent:] for l in string.split('\n')])
559
560 output = []
561 charno, lineno = 0, 0
562 # Find all doctest examples in the string:
563 for m in self._EXAMPLE_RE.finditer(string):
564 # Add the pre-example text to `output`.
565 output.append(string[charno:m.start()])
566 # Update lineno (lines before this example)
567 lineno += string.count('\n', charno, m.start())
568 # Extract info from the regexp match.
569 (source, options, want, exc_msg) = \
570 self._parse_example(m, name, lineno)
571 # Create an Example, and add it to the list.
572 if not self._IS_BLANK_OR_COMMENT(source):
573 output.append( Example(source, want, exc_msg,
574 lineno=lineno,
575 indent=min_indent+len(m.group('indent')),
576 options=options) )
577 # Update lineno (lines inside this example)
578 lineno += string.count('\n', m.start(), m.end())
579 # Update charno.
580 charno = m.end()
581 # Add any remaining post-example text to `output`.
582 output.append(string[charno:])
583 return output
584
585 def get_doctest(self, string, globs, name, filename, lineno):
586 """
587 Extract all doctest examples from the given string, and
588 collect them into a `DocTest` object.
589
590 `globs`, `name`, `filename`, and `lineno` are attributes for
591 the new `DocTest` object. See the documentation for `DocTest`
592 for more information.
593 """
594 return DocTest(self.get_examples(string, name), globs,
595 name, filename, lineno, string)
596
597 def get_examples(self, string, name='<string>'):
598 """
599 Extract all doctest examples from the given string, and return
600 them as a list of `Example` objects. Line numbers are
601 0-based, because it's most common in doctests that nothing
602 interesting appears on the same line as opening triple-quote,
603 and so the first interesting line is called \"line 1\" then.
604
605 The optional argument `name` is a name identifying this
606 string, and is only used for error messages.
607 """
608 return [x for x in self.parse(string, name)
609 if isinstance(x, Example)]
610
611 def _parse_example(self, m, name, lineno):
612 """
613 Given a regular expression match from `_EXAMPLE_RE` (`m`),
614 return a pair `(source, want)`, where `source` is the matched
615 example's source code (with prompts and indentation stripped);
616 and `want` is the example's expected output (with indentation
617 stripped).
618
619 `name` is the string's name, and `lineno` is the line number
620 where the example starts; both are used for error messages.
621 """
622 # Get the example's indentation level.
623 indent = len(m.group('indent'))
624
625 # Divide source into lines; check that they're properly
626 # indented; and then strip their indentation & prompts.
627 source_lines = m.group('source').split('\n')
628 self._check_prompt_blank(source_lines, indent, name, lineno)
629 self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
630 source = '\n'.join([sl[indent+4:] for sl in source_lines])
631
632 # Divide want into lines; check that it's properly indented; and
633 # then strip the indentation. Spaces before the last newline should
634 # be preserved, so plain rstrip() isn't good enough.
635 want = m.group('want')
636 want_lines = want.split('\n')
637 if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
638 del want_lines[-1] # forget final newline & spaces after it
639 self._check_prefix(want_lines, ' '*indent, name,
640 lineno + len(source_lines))
641 want = '\n'.join([wl[indent:] for wl in want_lines])
642
643 # If `want` contains a traceback message, then extract it.
644 m = self._EXCEPTION_RE.match(want)
645 if m:
646 exc_msg = m.group('msg')
647 else:
648 exc_msg = None
649
650 # Extract options from the source.
651 options = self._find_options(source, name, lineno)
652
653 return source, options, want, exc_msg
654
655 # This regular expression looks for option directives in the
656 # source code of an example. Option directives are comments
657 # starting with "doctest:". Warning: this may give false
658 # positives for string-literals that contain the string
659 # "#doctest:". Eliminating these false positives would require
660 # actually parsing the string; but we limit them by ignoring any
661 # line containing "#doctest:" that is *followed* by a quote mark.
662 _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
663 re.MULTILINE)
664
665 def _find_options(self, source, name, lineno):
666 """
667 Return a dictionary containing option overrides extracted from
668 option directives in the given source string.
669
670 `name` is the string's name, and `lineno` is the line number
671 where the example starts; both are used for error messages.
672 """
673 options = {}
674 # (note: with the current regexp, this will match at most once:)
675 for m in self._OPTION_DIRECTIVE_RE.finditer(source):
676 option_strings = m.group(1).replace(',', ' ').split()
677 for option in option_strings:
678 if (option[0] not in '+-' or
679 option[1:] not in OPTIONFLAGS_BY_NAME):
680 raise ValueError('line %r of the doctest for %s '
681 'has an invalid option: %r' %
682 (lineno+1, name, option))
683 flag = OPTIONFLAGS_BY_NAME[option[1:]]
684 options[flag] = (option[0] == '+')
685 if options and self._IS_BLANK_OR_COMMENT(source):
686 raise ValueError('line %r of the doctest for %s has an option '
687 'directive on a line with no example: %r' %
688 (lineno, name, source))
689 return options
690
691 # This regular expression finds the indentation of every non-blank
692 # line in a string.
693 _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
694
695 def _min_indent(self, s):
696 "Return the minimum indentation of any non-blank line in `s`"
697 indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
698 if len(indents) > 0:
699 return min(indents)
700 else:
701 return 0
702
703 def _check_prompt_blank(self, lines, indent, name, lineno):
704 """
705 Given the lines of a source string (including prompts and
706 leading indentation), check to make sure that every prompt is
707 followed by a space character. If any line is not followed by
708 a space character, then raise ValueError.
709 """
710 for i, line in enumerate(lines):
711 if len(line) >= indent+4 and line[indent+3] != ' ':
712 raise ValueError('line %r of the docstring for %s '
713 'lacks blank after %s: %r' %
714 (lineno+i+1, name,
715 line[indent:indent+3], line))
716
717 def _check_prefix(self, lines, prefix, name, lineno):
718 """
719 Check that every line in the given list starts with the given
720 prefix; if any line does not, then raise a ValueError.
721 """
722 for i, line in enumerate(lines):
723 if line and not line.startswith(prefix):
724 raise ValueError('line %r of the docstring for %s has '
725 'inconsistent leading whitespace: %r' %
726 (lineno+i+1, name, line))
727
728
729######################################################################
730## 4. DocTest Finder
731######################################################################
732
733class DocTestFinder:
734 """
735 A class used to extract the DocTests that are relevant to a given
736 object, from its docstring and the docstrings of its contained
737 objects. Doctests can currently be extracted from the following
738 object types: modules, functions, classes, methods, staticmethods,
739 classmethods, and properties.
740 """
741
742 def __init__(self, verbose=False, parser=DocTestParser(),
743 recurse=True, exclude_empty=True):
744 """
745 Create a new doctest finder.
746
747 The optional argument `parser` specifies a class or
748 function that should be used to create new DocTest objects (or
749 objects that implement the same interface as DocTest). The
750 signature for this factory function should match the signature
751 of the DocTest constructor.
752
753 If the optional argument `recurse` is false, then `find` will
754 only examine the given object, and not any contained objects.
755
756 If the optional argument `exclude_empty` is false, then `find`
757 will include tests for objects with empty docstrings.
758 """
759 self._parser = parser
760 self._verbose = verbose
761 self._recurse = recurse
762 self._exclude_empty = exclude_empty
763
764 def find(self, obj, name=None, module=None, globs=None, extraglobs=None):
765 """
766 Return a list of the DocTests that are defined by the given
767 object's docstring, or by any of its contained objects'
768 docstrings.
769
770 The optional parameter `module` is the module that contains
771 the given object. If the module is not specified or is None, then
772 the test finder will attempt to automatically determine the
773 correct module. The object's module is used:
774
775 - As a default namespace, if `globs` is not specified.
776 - To prevent the DocTestFinder from extracting DocTests
777 from objects that are imported from other modules.
778 - To find the name of the file containing the object.
779 - To help find the line number of the object within its
780 file.
781
782 Contained objects whose module does not match `module` are ignored.
783
784 If `module` is False, no attempt to find the module will be made.
785 This is obscure, of use mostly in tests: if `module` is False, or
786 is None but cannot be found automatically, then all objects are
787 considered to belong to the (non-existent) module, so all contained
788 objects will (recursively) be searched for doctests.
789
790 The globals for each DocTest is formed by combining `globs`
791 and `extraglobs` (bindings in `extraglobs` override bindings
792 in `globs`). A new copy of the globals dictionary is created
793 for each DocTest. If `globs` is not specified, then it
794 defaults to the module's `__dict__`, if specified, or {}
795 otherwise. If `extraglobs` is not specified, then it defaults
796 to {}.
797
798 """
799 # If name was not specified, then extract it from the object.
800 if name is None:
801 name = getattr(obj, '__name__', None)
802 if name is None:
803 raise ValueError("DocTestFinder.find: name must be given "
804 "when obj.__name__ doesn't exist: %r" %
805 (type(obj),))
806
807 # Find the module that contains the given object (if obj is
808 # a module, then module=obj.). Note: this may fail, in which
809 # case module will be None.
810 if module is False:
811 module = None
812 elif module is None:
813 module = inspect.getmodule(obj)
814
815 # Read the module's source code. This is used by
816 # DocTestFinder._find_lineno to find the line number for a
817 # given object's docstring.
818 try:
819 file = inspect.getsourcefile(obj) or inspect.getfile(obj)
820 source_lines = linecache.getlines(file)
821 if not source_lines:
822 source_lines = None
823 except TypeError:
824 source_lines = None
825
826 # Initialize globals, and merge in extraglobs.
827 if globs is None:
828 if module is None:
829 globs = {}
830 else:
831 globs = module.__dict__.copy()
832 else:
833 globs = globs.copy()
834 if extraglobs is not None:
835 globs.update(extraglobs)
836
837 # Recursively expore `obj`, extracting DocTests.
838 tests = []
839 self._find(tests, obj, name, module, source_lines, globs, {})
840 # Sort the tests by alpha order of names, for consistency in
841 # verbose-mode output. This was a feature of doctest in Pythons
842 # <= 2.3 that got lost by accident in 2.4. It was repaired in
843 # 2.4.4 and 2.5.
844 tests.sort()
845 return tests
846
847 def _from_module(self, module, object):
848 """
849 Return true if the given object is defined in the given
850 module.
851 """
852 if module is None:
853 return True
854 elif inspect.isfunction(object):
855 return module.__dict__ is object.func_globals
856 elif inspect.isclass(object):
857 # XXX: Jython transition 2.5
858 # Java classes appear as Python classes to inspect, but they
859 # have no __module__ http://jython.org/bugs/1758279
860 # org.python.modules uses Java classes to masq
861 if not hasattr(object, '__module__'):
862 return False
863 return module.__name__ == object.__module__
864 elif inspect.getmodule(object) is not None:
865 return module is inspect.getmodule(object)
866 elif hasattr(object, '__module__'):
867 return module.__name__ == object.__module__
868 elif isinstance(object, property):
869 return True # [XX] no way not be sure.
870 else:
871 raise ValueError("object must be a class or function")
872
873 def _find(self, tests, obj, name, module, source_lines, globs, seen):
874 """
875 Find tests for the given object and any contained objects, and
876 add them to `tests`.
877 """
878 if self._verbose:
879 print 'Finding tests in %s' % name
880
881 # If we've already processed this object, then ignore it.
882 if id(obj) in seen:
883 return
884 seen[id(obj)] = 1
885
886 # Find a test for this object, and add it to the list of tests.
887 test = self._get_test(obj, name, module, globs, source_lines)
888 if test is not None:
889 tests.append(test)
890
891 # Look for tests in a module's contained objects.
892 if inspect.ismodule(obj) and self._recurse:
893 for valname, val in obj.__dict__.items():
894 valname = '%s.%s' % (name, valname)
895 # Recurse to functions & classes.
896 if ((inspect.isfunction(val) or inspect.isclass(val)) and
897 self._from_module(module, val)):
898 self._find(tests, val, valname, module, source_lines,
899 globs, seen)
900
901 # Look for tests in a module's __test__ dictionary.
902 if inspect.ismodule(obj) and self._recurse:
903 for valname, val in getattr(obj, '__test__', {}).items():
904 if not isinstance(valname, basestring):
905 raise ValueError("DocTestFinder.find: __test__ keys "
906 "must be strings: %r" %
907 (type(valname),))
908 if not (inspect.isfunction(val) or inspect.isclass(val) or
909 inspect.ismethod(val) or inspect.ismodule(val) or
910 isinstance(val, basestring)):
911 raise ValueError("DocTestFinder.find: __test__ values "
912 "must be strings, functions, methods, "
913 "classes, or modules: %r" %
914 (type(val),))
915 valname = '%s.__test__.%s' % (name, valname)
916 self._find(tests, val, valname, module, source_lines,
917 globs, seen)
918
919 # Look for tests in a class's contained objects.
920 if inspect.isclass(obj) and self._recurse:
921 for valname, val in obj.__dict__.items():
922 # Special handling for staticmethod/classmethod.
923 if isinstance(val, staticmethod):
924 val = getattr(obj, valname)
925 if isinstance(val, classmethod):
926 val = getattr(obj, valname).im_func
927
928 # Recurse to methods, properties, and nested classes.
929 if ((inspect.isfunction(val) or inspect.isclass(val) or
930 isinstance(val, property)) and
931 self._from_module(module, val)):
932 valname = '%s.%s' % (name, valname)
933 self._find(tests, val, valname, module, source_lines,
934 globs, seen)
935
936 def _get_test(self, obj, name, module, globs, source_lines):
937 """
938 Return a DocTest for the given object, if it defines a docstring;
939 otherwise, return None.
940 """
941 # Extract the object's docstring. If it doesn't have one,
942 # then return None (no test for this object).
943 if isinstance(obj, basestring):
944 docstring = obj
945 else:
946 try:
947 if obj.__doc__ is None:
948 docstring = ''
949 else:
950 docstring = obj.__doc__
951 if not isinstance(docstring, basestring):
952 docstring = str(docstring)
953 except (TypeError, AttributeError):
954 docstring = ''
955
956 # Find the docstring's location in the file.
957 lineno = self._find_lineno(obj, source_lines)
958
959 # Don't bother if the docstring is empty.
960 if self._exclude_empty and not docstring:
961 return None
962
963 # Return a DocTest for this object.
964 if module is None:
965 filename = None
966 else:
967 filename = getattr(module, '__file__', module.__name__)
968 if filename[-4:] in (".pyc", ".pyo"):
969 filename = filename[:-1]
970 elif filename.endswith('$py.class'):
971 filename = '%s.py' % filename[:-9]
972 return self._parser.get_doctest(docstring, globs, name,
973 filename, lineno)
974
975 def _find_lineno(self, obj, source_lines):
976 """
977 Return a line number of the given object's docstring. Note:
978 this method assumes that the object has a docstring.
979 """
980 lineno = None
981
982 # Find the line number for modules.
983 if inspect.ismodule(obj):
984 lineno = 0
985
986 # Find the line number for classes.
987 # Note: this could be fooled if a class is defined multiple
988 # times in a single file.
989 if inspect.isclass(obj):
990 if source_lines is None:
991 return None
992 pat = re.compile(r'^\s*class\s*%s\b' %
993 getattr(obj, '__name__', '-'))
994 for i, line in enumerate(source_lines):
995 if pat.match(line):
996 lineno = i
997 break
998
999 # Find the line number for functions & methods.
1000 if inspect.ismethod(obj): obj = obj.im_func
1001 if inspect.isfunction(obj): obj = obj.func_code
1002 if inspect.istraceback(obj): obj = obj.tb_frame
1003 if inspect.isframe(obj): obj = obj.f_code
1004 if inspect.iscode(obj):
1005 lineno = getattr(obj, 'co_firstlineno', None)-1
1006
1007 # Find the line number where the docstring starts. Assume
1008 # that it's the first line that begins with a quote mark.
1009 # Note: this could be fooled by a multiline function
1010 # signature, where a continuation line begins with a quote
1011 # mark.
1012 if lineno is not None:
1013 if source_lines is None:
1014 return lineno+1
1015 pat = re.compile('(^|.*:)\s*\w*("|\')')
1016 for lineno in range(lineno, len(source_lines)):
1017 if pat.match(source_lines[lineno]):
1018 return lineno
1019
1020 # We couldn't find the line number.
1021 return None
1022
1023######################################################################
1024## 5. DocTest Runner
1025######################################################################
1026
1027class DocTestRunner:
1028 """
1029 A class used to run DocTest test cases, and accumulate statistics.
1030 The `run` method is used to process a single DocTest case. It
1031 returns a tuple `(f, t)`, where `t` is the number of test cases
1032 tried, and `f` is the number of test cases that failed.
1033
1034 >>> tests = DocTestFinder().find(_TestClass)
1035 >>> runner = DocTestRunner(verbose=False)
1036 >>> tests.sort(key = lambda test: test.name)
1037 >>> for test in tests:
1038 ... print test.name, '->', runner.run(test)
1039 _TestClass -> (0, 2)
1040 _TestClass.__init__ -> (0, 2)
1041 _TestClass.get -> (0, 2)
1042 _TestClass.square -> (0, 1)
1043
1044 The `summarize` method prints a summary of all the test cases that
1045 have been run by the runner, and returns an aggregated `(f, t)`
1046 tuple:
1047
1048 >>> runner.summarize(verbose=1)
1049 4 items passed all tests:
1050 2 tests in _TestClass
1051 2 tests in _TestClass.__init__
1052 2 tests in _TestClass.get
1053 1 tests in _TestClass.square
1054 7 tests in 4 items.
1055 7 passed and 0 failed.
1056 Test passed.
1057 (0, 7)
1058
1059 The aggregated number of tried examples and failed examples is
1060 also available via the `tries` and `failures` attributes:
1061
1062 >>> runner.tries
1063 7
1064 >>> runner.failures
1065 0
1066
1067 The comparison between expected outputs and actual outputs is done
1068 by an `OutputChecker`. This comparison may be customized with a
1069 number of option flags; see the documentation for `testmod` for
1070 more information. If the option flags are insufficient, then the
1071 comparison may also be customized by passing a subclass of
1072 `OutputChecker` to the constructor.
1073
1074 The test runner's display output can be controlled in two ways.
1075 First, an output function (`out) can be passed to
1076 `TestRunner.run`; this function will be called with strings that
1077 should be displayed. It defaults to `sys.stdout.write`. If
1078 capturing the output is not sufficient, then the display output
1079 can be also customized by subclassing DocTestRunner, and
1080 overriding the methods `report_start`, `report_success`,
1081 `report_unexpected_exception`, and `report_failure`.
1082 """
1083 # This divider string is used to separate failure messages, and to
1084 # separate sections of the summary.
1085 DIVIDER = "*" * 70
1086
1087 def __init__(self, checker=None, verbose=None, optionflags=0):
1088 """
1089 Create a new test runner.
1090
1091 Optional keyword arg `checker` is the `OutputChecker` that
1092 should be used to compare the expected outputs and actual
1093 outputs of doctest examples.
1094
1095 Optional keyword arg 'verbose' prints lots of stuff if true,
1096 only failures if false; by default, it's true iff '-v' is in
1097 sys.argv.
1098
1099 Optional argument `optionflags` can be used to control how the
1100 test runner compares expected output to actual output, and how
1101 it displays failures. See the documentation for `testmod` for
1102 more information.
1103 """
1104 self._checker = checker or OutputChecker()
1105 if verbose is None:
1106 verbose = '-v' in sys.argv
1107 self._verbose = verbose
1108 self.optionflags = optionflags
1109 self.original_optionflags = optionflags
1110
1111 # Keep track of the examples we've run.
1112 self.tries = 0
1113 self.failures = 0
1114 self._name2ft = {}
1115
1116 # Create a fake output target for capturing doctest output.
1117 self._fakeout = _SpoofOut()
1118
1119 #/////////////////////////////////////////////////////////////////
1120 # Reporting methods
1121 #/////////////////////////////////////////////////////////////////
1122
1123 def report_start(self, out, test, example):
1124 """
1125 Report that the test runner is about to process the given
1126 example. (Only displays a message if verbose=True)
1127 """
1128 if self._verbose:
1129 if example.want:
1130 out('Trying:\n' + _indent(example.source) +
1131 'Expecting:\n' + _indent(example.want))
1132 else:
1133 out('Trying:\n' + _indent(example.source) +
1134 'Expecting nothing\n')
1135
1136 def report_success(self, out, test, example, got):
1137 """
1138 Report that the given example ran successfully. (Only
1139 displays a message if verbose=True)
1140 """
1141 if self._verbose:
1142 out("ok\n")
1143
1144 def report_failure(self, out, test, example, got):
1145 """
1146 Report that the given example failed.
1147 """
1148 out(self._failure_header(test, example) +
1149 self._checker.output_difference(example, got, self.optionflags))
1150
1151 def report_unexpected_exception(self, out, test, example, exc_info):
1152 """
1153 Report that the given example raised an unexpected exception.
1154 """
1155 out(self._failure_header(test, example) +
1156 'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
1157
1158 def _failure_header(self, test, example):
1159 out = [self.DIVIDER]
1160 if test.filename:
1161 if test.lineno is not None and example.lineno is not None:
1162 lineno = test.lineno + example.lineno + 1
1163 else:
1164 lineno = '?'
1165 out.append('File "%s", line %s, in %s' %
1166 (test.filename, lineno, test.name))
1167 else:
1168 out.append('Line %s, in %s' % (example.lineno+1, test.name))
1169 out.append('Failed example:')
1170 source = example.source
1171 out.append(_indent(source))
1172 return '\n'.join(out)
1173
1174 #/////////////////////////////////////////////////////////////////
1175 # DocTest Running
1176 #/////////////////////////////////////////////////////////////////
1177
1178 def __run(self, test, compileflags, out):
1179 """
1180 Run the examples in `test`. Write the outcome of each example
1181 with one of the `DocTestRunner.report_*` methods, using the
1182 writer function `out`. `compileflags` is the set of compiler
1183 flags that should be used to execute examples. Return a tuple
1184 `(f, t)`, where `t` is the number of examples tried, and `f`
1185 is the number of examples that failed. The examples are run
1186 in the namespace `test.globs`.
1187 """
1188 # Keep track of the number of failures and tries.
1189 failures = tries = 0
1190
1191 # Save the option flags (since option directives can be used
1192 # to modify them).
1193 original_optionflags = self.optionflags
1194
1195 SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
1196
1197 check = self._checker.check_output
1198
1199 # Process each example.
1200 for examplenum, example in enumerate(test.examples):
1201
1202 # If REPORT_ONLY_FIRST_FAILURE is set, then supress
1203 # reporting after the first failure.
1204 quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
1205 failures > 0)
1206
1207 # Merge in the example's options.
1208 self.optionflags = original_optionflags
1209 if example.options:
1210 for (optionflag, val) in example.options.items():
1211 if val:
1212 self.optionflags |= optionflag
1213 else:
1214 self.optionflags &= ~optionflag
1215
1216 # If 'SKIP' is set, then skip this example.
1217 if self.optionflags & SKIP:
1218 continue
1219
1220 # Record that we started this example.
1221 tries += 1
1222 if not quiet:
1223 self.report_start(out, test, example)
1224
1225 # Use a special filename for compile(), so we can retrieve
1226 # the source code during interactive debugging (see
1227 # __patched_linecache_getlines).
1228 filename = '<doctest %s[%d]>' % (test.name, examplenum)
1229
1230 # Run the example in the given context (globs), and record
1231 # any exception that gets raised. (But don't intercept
1232 # keyboard interrupts.)
1233 try:
1234 # Don't blink! This is where the user's code gets run.
1235 exec compile(example.source, filename, "single",
1236 compileflags, 1) in test.globs
1237 self.debugger.set_continue() # ==== Example Finished ====
1238 exception = None
1239 except KeyboardInterrupt:
1240 raise
1241 except:
1242 exception = sys.exc_info()
1243 self.debugger.set_continue() # ==== Example Finished ====
1244
1245 got = self._fakeout.getvalue() # the actual output
1246 self._fakeout.truncate(0)
1247 outcome = FAILURE # guilty until proved innocent or insane
1248
1249 # If the example executed without raising any exceptions,
1250 # verify its output.
1251 if exception is None:
1252 if check(example.want, got, self.optionflags):
1253 outcome = SUCCESS
1254
1255 # The example raised an exception: check if it was expected.
1256 else:
1257 exc_info = sys.exc_info()
1258 exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
1259 if not quiet:
1260 got += _exception_traceback(exc_info)
1261
1262 # If `example.exc_msg` is None, then we weren't expecting
1263 # an exception.
1264 if example.exc_msg is None:
1265 outcome = BOOM
1266
1267 # We expected an exception: see whether it matches.
1268 elif check(example.exc_msg, exc_msg, self.optionflags):
1269 outcome = SUCCESS
1270
1271 # Another chance if they didn't care about the detail.
1272 elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
1273 m1 = re.match(r'[^:]*:', example.exc_msg)
1274 m2 = re.match(r'[^:]*:', exc_msg)
1275 if m1 and m2 and check(m1.group(0), m2.group(0),
1276 self.optionflags):
1277 outcome = SUCCESS
1278
1279 # Report the outcome.
1280 if outcome is SUCCESS:
1281 if not quiet:
1282 self.report_success(out, test, example, got)
1283 elif outcome is FAILURE:
1284 if not quiet:
1285 self.report_failure(out, test, example, got)
1286 failures += 1
1287 elif outcome is BOOM:
1288 if not quiet:
1289 self.report_unexpected_exception(out, test, example,
1290 exc_info)
1291 failures += 1
1292 else:
1293 assert False, ("unknown outcome", outcome)
1294
1295 # Restore the option flags (in case they were modified)
1296 self.optionflags = original_optionflags
1297
1298 # Record and return the number of failures and tries.
1299 self.__record_outcome(test, failures, tries)
1300 return failures, tries
1301
1302 def __record_outcome(self, test, f, t):
1303 """
1304 Record the fact that the given DocTest (`test`) generated `f`
1305 failures out of `t` tried examples.
1306 """
1307 f2, t2 = self._name2ft.get(test.name, (0,0))
1308 self._name2ft[test.name] = (f+f2, t+t2)
1309 self.failures += f
1310 self.tries += t
1311
1312 __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
1313 r'(?P<name>[\w\.]+)'
1314 r'\[(?P<examplenum>\d+)\]>$')
1315 def __patched_linecache_getlines(self, filename, module_globals=None):
1316 m = self.__LINECACHE_FILENAME_RE.match(filename)
1317 if m and m.group('name') == self.test.name:
1318 example = self.test.examples[int(m.group('examplenum'))]
1319 return example.source.splitlines(True)
1320 else:
1321 return self.save_linecache_getlines(filename, module_globals)
1322
1323 def run(self, test, compileflags=None, out=None, clear_globs=True):
1324 """
1325 Run the examples in `test`, and display the results using the
1326 writer function `out`.
1327
1328 The examples are run in the namespace `test.globs`. If
1329 `clear_globs` is true (the default), then this namespace will
1330 be cleared after the test runs, to help with garbage
1331 collection. If you would like to examine the namespace after
1332 the test completes, then use `clear_globs=False`.
1333
1334 `compileflags` gives the set of flags that should be used by
1335 the Python compiler when running the examples. If not
1336 specified, then it will default to the set of future-import
1337 flags that apply to `globs`.
1338
1339 The output of each example is checked using
1340 `DocTestRunner.check_output`, and the results are formatted by
1341 the `DocTestRunner.report_*` methods.
1342 """
1343 self.test = test
1344
1345 if compileflags is None:
1346 compileflags = _extract_future_flags(test.globs)
1347
1348 save_stdout = sys.stdout
1349 if out is None:
1350 out = save_stdout.write
1351 sys.stdout = self._fakeout
1352
1353 # Patch pdb.set_trace to restore sys.stdout during interactive
1354 # debugging (so it's not still redirected to self._fakeout).
1355 # Note that the interactive output will go to *our*
1356 # save_stdout, even if that's not the real sys.stdout; this
1357 # allows us to write test cases for the set_trace behavior.
1358 save_set_trace = pdb.set_trace
1359 self.debugger = _OutputRedirectingPdb(save_stdout)
1360 self.debugger.reset()
1361 pdb.set_trace = self.debugger.set_trace
1362
1363 # Patch linecache.getlines, so we can see the example's source
1364 # when we're inside the debugger.
1365 self.save_linecache_getlines = linecache.getlines
1366 linecache.getlines = self.__patched_linecache_getlines
1367
1368 try:
1369 return self.__run(test, compileflags, out)
1370 finally:
1371 sys.stdout = save_stdout
1372 pdb.set_trace = save_set_trace
1373 linecache.getlines = self.save_linecache_getlines
1374 if clear_globs:
1375 test.globs.clear()
1376
1377 #/////////////////////////////////////////////////////////////////
1378 # Summarization
1379 #/////////////////////////////////////////////////////////////////
1380 def summarize(self, verbose=None):
1381 """
1382 Print a summary of all the test cases that have been run by
1383 this DocTestRunner, and return a tuple `(f, t)`, where `f` is
1384 the total number of failed examples, and `t` is the total
1385 number of tried examples.
1386
1387 The optional `verbose` argument controls how detailed the
1388 summary is. If the verbosity is not specified, then the
1389 DocTestRunner's verbosity is used.
1390 """
1391 if verbose is None:
1392 verbose = self._verbose
1393 notests = []
1394 passed = []
1395 failed = []
1396 totalt = totalf = 0
1397 for x in self._name2ft.items():
1398 name, (f, t) = x
1399 assert f <= t
1400 totalt += t
1401 totalf += f
1402 if t == 0:
1403 notests.append(name)
1404 elif f == 0:
1405 passed.append( (name, t) )
1406 else:
1407 failed.append(x)
1408 if verbose:
1409 if notests:
1410 print len(notests), "items had no tests:"
1411 notests.sort()
1412 for thing in notests:
1413 print " ", thing
1414 if passed:
1415 print len(passed), "items passed all tests:"
1416 passed.sort()
1417 for thing, count in passed:
1418 print " %3d tests in %s" % (count, thing)
1419 if failed:
1420 print self.DIVIDER
1421 print len(failed), "items had failures:"
1422 failed.sort()
1423 for thing, (f, t) in failed:
1424 print " %3d of %3d in %s" % (f, t, thing)
1425 if verbose:
1426 print totalt, "tests in", len(self._name2ft), "items."
1427 print totalt - totalf, "passed and", totalf, "failed."
1428 if totalf:
1429 print "***Test Failed***", totalf, "failures."
1430 elif verbose:
1431 print "Test passed."
1432 return totalf, totalt
1433
1434 #/////////////////////////////////////////////////////////////////
1435 # Backward compatibility cruft to maintain doctest.master.
1436 #/////////////////////////////////////////////////////////////////
1437 def merge(self, other):
1438 d = self._name2ft
1439 for name, (f, t) in other._name2ft.items():
1440 if name in d:
1441 print "*** DocTestRunner.merge: '" + name + "' in both" \
1442 " testers; summing outcomes."
1443 f2, t2 = d[name]
1444 f = f + f2
1445 t = t + t2
1446 d[name] = f, t
1447
1448class OutputChecker:
1449 """
1450 A class used to check the whether the actual output from a doctest
1451 example matches the expected output. `OutputChecker` defines two
1452 methods: `check_output`, which compares a given pair of outputs,
1453 and returns true if they match; and `output_difference`, which
1454 returns a string describing the differences between two outputs.
1455 """
1456 def check_output(self, want, got, optionflags):
1457 """
1458 Return True iff the actual output from an example (`got`)
1459 matches the expected output (`want`). These strings are
1460 always considered to match if they are identical; but
1461 depending on what option flags the test runner is using,
1462 several non-exact match types are also possible. See the
1463 documentation for `TestRunner` for more information about
1464 option flags.
1465 """
1466 # Handle the common case first, for efficiency:
1467 # if they're string-identical, always return true.
1468 if got == want:
1469 return True
1470
1471 # The values True and False replaced 1 and 0 as the return
1472 # value for boolean comparisons in Python 2.3.
1473 if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
1474 if (got,want) == ("True\n", "1\n"):
1475 return True
1476 if (got,want) == ("False\n", "0\n"):
1477 return True
1478
1479 # <BLANKLINE> can be used as a special sequence to signify a
1480 # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
1481 if not (optionflags & DONT_ACCEPT_BLANKLINE):
1482 # Replace <BLANKLINE> in want with a blank line.
1483 want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
1484 '', want)
1485 # If a line in got contains only spaces, then remove the
1486 # spaces.
1487 got = re.sub('(?m)^\s*?$', '', got)
1488 if got == want:
1489 return True
1490
1491 # This flag causes doctest to ignore any differences in the
1492 # contents of whitespace strings. Note that this can be used
1493 # in conjunction with the ELLIPSIS flag.
1494 if optionflags & NORMALIZE_WHITESPACE:
1495 got = ' '.join(got.split())
1496 want = ' '.join(want.split())
1497 if got == want:
1498 return True
1499
1500 # The ELLIPSIS flag says to let the sequence "..." in `want`
1501 # match any substring in `got`.
1502 if optionflags & ELLIPSIS:
1503 if _ellipsis_match(want, got):
1504 return True
1505
1506 # We didn't find any match; return false.
1507 return False
1508
1509 # Should we do a fancy diff?
1510 def _do_a_fancy_diff(self, want, got, optionflags):
1511 # Not unless they asked for a fancy diff.
1512 if not optionflags & (REPORT_UDIFF |
1513 REPORT_CDIFF |
1514 REPORT_NDIFF):
1515 return False
1516
1517 # If expected output uses ellipsis, a meaningful fancy diff is
1518 # too hard ... or maybe not. In two real-life failures Tim saw,
1519 # a diff was a major help anyway, so this is commented out.
1520 # [todo] _ellipsis_match() knows which pieces do and don't match,
1521 # and could be the basis for a kick-ass diff in this case.
1522 ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
1523 ## return False
1524
1525 # ndiff does intraline difference marking, so can be useful even
1526 # for 1-line differences.
1527 if optionflags & REPORT_NDIFF:
1528 return True
1529
1530 # The other diff types need at least a few lines to be helpful.
1531 return want.count('\n') > 2 and got.count('\n') > 2
1532
1533 def output_difference(self, example, got, optionflags):
1534 """
1535 Return a string describing the differences between the
1536 expected output for a given example (`example`) and the actual
1537 output (`got`). `optionflags` is the set of option flags used
1538 to compare `want` and `got`.
1539 """
1540 want = example.want
1541 # If <BLANKLINE>s are being used, then replace blank lines
1542 # with <BLANKLINE> in the actual output string.
1543 if not (optionflags & DONT_ACCEPT_BLANKLINE):
1544 got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
1545
1546 # Check if we should use diff.
1547 if self._do_a_fancy_diff(want, got, optionflags):
1548 # Split want & got into lines.
1549 want_lines = want.splitlines(True) # True == keep line ends
1550 got_lines = got.splitlines(True)
1551 # Use difflib to find their differences.
1552 if optionflags & REPORT_UDIFF:
1553 diff = difflib.unified_diff(want_lines, got_lines, n=2)
1554 diff = list(diff)[2:] # strip the diff header
1555 kind = 'unified diff with -expected +actual'
1556 elif optionflags & REPORT_CDIFF:
1557 diff = difflib.context_diff(want_lines, got_lines, n=2)
1558 diff = list(diff)[2:] # strip the diff header
1559 kind = 'context diff with expected followed by actual'
1560 elif optionflags & REPORT_NDIFF:
1561 engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
1562 diff = list(engine.compare(want_lines, got_lines))
1563 kind = 'ndiff with -expected +actual'
1564 else:
1565 assert 0, 'Bad diff option'
1566 # Remove trailing whitespace on diff output.
1567 diff = [line.rstrip() + '\n' for line in diff]
1568 return 'Differences (%s):\n' % kind + _indent(''.join(diff))
1569
1570 # If we're not using diff, then simply list the expected
1571 # output followed by the actual output.
1572 if want and got:
1573 return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
1574 elif want:
1575 return 'Expected:\n%sGot nothing\n' % _indent(want)
1576 elif got:
1577 return 'Expected nothing\nGot:\n%s' % _indent(got)
1578 else:
1579 return 'Expected nothing\nGot nothing\n'
1580
1581class DocTestFailure(Exception):
1582 """A DocTest example has failed in debugging mode.
1583
1584 The exception instance has variables:
1585
1586 - test: the DocTest object being run
1587
1588 - example: the Example object that failed
1589
1590 - got: the actual output
1591 """
1592 def __init__(self, test, example, got):
1593 self.test = test
1594 self.example = example
1595 self.got = got
1596
1597 def __str__(self):
1598 return str(self.test)
1599
1600class UnexpectedException(Exception):
1601 """A DocTest example has encountered an unexpected exception
1602
1603 The exception instance has variables:
1604
1605 - test: the DocTest object being run
1606
1607 - example: the Example object that failed
1608
1609 - exc_info: the exception info
1610 """
1611 def __init__(self, test, example, exc_info):
1612 self.test = test
1613 self.example = example
1614 self.exc_info = exc_info
1615
1616 def __str__(self):
1617 return str(self.test)
1618
1619class DebugRunner(DocTestRunner):
1620 r"""Run doc tests but raise an exception as soon as there is a failure.
1621
1622 If an unexpected exception occurs, an UnexpectedException is raised.
1623 It contains the test, the example, and the original exception:
1624
1625 >>> runner = DebugRunner(verbose=False)
1626 >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
1627 ... {}, 'foo', 'foo.py', 0)
1628 >>> try:
1629 ... runner.run(test)
1630 ... except UnexpectedException, failure:
1631 ... pass
1632
1633 >>> failure.test is test
1634 True
1635
1636 >>> failure.example.want
1637 '42\n'
1638
1639 >>> exc_info = failure.exc_info
1640 >>> raise exc_info[0], exc_info[1], exc_info[2]
1641 Traceback (most recent call last):
1642 ...
1643 KeyError
1644
1645 We wrap the original exception to give the calling application
1646 access to the test and example information.
1647
1648 If the output doesn't match, then a DocTestFailure is raised:
1649
1650 >>> test = DocTestParser().get_doctest('''
1651 ... >>> x = 1
1652 ... >>> x
1653 ... 2
1654 ... ''', {}, 'foo', 'foo.py', 0)
1655
1656 >>> try:
1657 ... runner.run(test)
1658 ... except DocTestFailure, failure:
1659 ... pass
1660
1661 DocTestFailure objects provide access to the test:
1662
1663 >>> failure.test is test
1664 True
1665
1666 As well as to the example:
1667
1668 >>> failure.example.want
1669 '2\n'
1670
1671 and the actual output:
1672
1673 >>> failure.got
1674 '1\n'
1675
1676 If a failure or error occurs, the globals are left intact:
1677
1678 >>> if '__builtins__' in test.globs:
1679 ... del test.globs['__builtins__']
1680 >>> test.globs
1681 {'x': 1}
1682
1683 >>> test = DocTestParser().get_doctest('''
1684 ... >>> x = 2
1685 ... >>> raise KeyError
1686 ... ''', {}, 'foo', 'foo.py', 0)
1687
1688 >>> runner.run(test)
1689 Traceback (most recent call last):
1690 ...
1691 UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
1692
1693 >>> if '__builtins__' in test.globs:
1694 ... del test.globs['__builtins__']
1695 >>> test.globs
1696 {'x': 2}
1697
1698 But the globals are cleared if there is no error:
1699
1700 >>> test = DocTestParser().get_doctest('''
1701 ... >>> x = 2
1702 ... ''', {}, 'foo', 'foo.py', 0)
1703
1704 >>> runner.run(test)
1705 (0, 1)
1706
1707 >>> test.globs
1708 {}
1709
1710 """
1711
1712 def run(self, test, compileflags=None, out=None, clear_globs=True):
1713 r = DocTestRunner.run(self, test, compileflags, out, False)
1714 if clear_globs:
1715 test.globs.clear()
1716 return r
1717
1718 def report_unexpected_exception(self, out, test, example, exc_info):
1719 raise UnexpectedException(test, example, exc_info)
1720
1721 def report_failure(self, out, test, example, got):
1722 raise DocTestFailure(test, example, got)
1723
1724######################################################################
1725## 6. Test Functions
1726######################################################################
1727# These should be backwards compatible.
1728
1729# For backward compatibility, a global instance of a DocTestRunner
1730# class, updated by testmod.
1731master = None
1732
1733def testmod(m=None, name=None, globs=None, verbose=None,
1734 report=True, optionflags=0, extraglobs=None,
1735 raise_on_error=False, exclude_empty=False):
1736 """m=None, name=None, globs=None, verbose=None, report=True,
1737 optionflags=0, extraglobs=None, raise_on_error=False,
1738 exclude_empty=False
1739
1740 Test examples in docstrings in functions and classes reachable
1741 from module m (or the current module if m is not supplied), starting
1742 with m.__doc__.
1743
1744 Also test examples reachable from dict m.__test__ if it exists and is
1745 not None. m.__test__ maps names to functions, classes and strings;
1746 function and class docstrings are tested even if the name is private;
1747 strings are tested directly, as if they were docstrings.
1748
1749 Return (#failures, #tests).
1750
1751 See doctest.__doc__ for an overview.
1752
1753 Optional keyword arg "name" gives the name of the module; by default
1754 use m.__name__.
1755
1756 Optional keyword arg "globs" gives a dict to be used as the globals
1757 when executing examples; by default, use m.__dict__. A copy of this
1758 dict is actually used for each docstring, so that each docstring's
1759 examples start with a clean slate.
1760
1761 Optional keyword arg "extraglobs" gives a dictionary that should be
1762 merged into the globals that are used to execute examples. By
1763 default, no extra globals are used. This is new in 2.4.
1764
1765 Optional keyword arg "verbose" prints lots of stuff if true, prints
1766 only failures if false; by default, it's true iff "-v" is in sys.argv.
1767
1768 Optional keyword arg "report" prints a summary at the end when true,
1769 else prints nothing at the end. In verbose mode, the summary is
1770 detailed, else very brief (in fact, empty if all tests passed).
1771
1772 Optional keyword arg "optionflags" or's together module constants,
1773 and defaults to 0. This is new in 2.3. Possible values (see the
1774 docs for details):
1775
1776 DONT_ACCEPT_TRUE_FOR_1
1777 DONT_ACCEPT_BLANKLINE
1778 NORMALIZE_WHITESPACE
1779 ELLIPSIS
1780 SKIP
1781 IGNORE_EXCEPTION_DETAIL
1782 REPORT_UDIFF
1783 REPORT_CDIFF
1784 REPORT_NDIFF
1785 REPORT_ONLY_FIRST_FAILURE
1786
1787 Optional keyword arg "raise_on_error" raises an exception on the
1788 first unexpected exception or failure. This allows failures to be
1789 post-mortem debugged.
1790
1791 Advanced tomfoolery: testmod runs methods of a local instance of
1792 class doctest.Tester, then merges the results into (or creates)
1793 global Tester instance doctest.master. Methods of doctest.master
1794 can be called directly too, if you want to do something unusual.
1795 Passing report=0 to testmod is especially useful then, to delay
1796 displaying a summary. Invoke doctest.master.summarize(verbose)
1797 when you're done fiddling.
1798 """
1799 global master
1800
1801 # If no module was given, then use __main__.
1802 if m is None:
1803 # DWA - m will still be None if this wasn't invoked from the command
1804 # line, in which case the following TypeError is about as good an error
1805 # as we should expect
1806 m = sys.modules.get('__main__')
1807
1808 # Check that we were actually given a module.
1809 if not inspect.ismodule(m):
1810 raise TypeError("testmod: module required; %r" % (m,))
1811
1812 # If no name was given, then use the module's name.
1813 if name is None:
1814 name = m.__name__
1815
1816 # Find, parse, and run all tests in the given module.
1817 finder = DocTestFinder(exclude_empty=exclude_empty)
1818
1819 if raise_on_error:
1820 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
1821 else:
1822 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
1823
1824 for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
1825 runner.run(test)
1826
1827 if report:
1828 runner.summarize()
1829
1830 if master is None:
1831 master = runner
1832 else:
1833 master.merge(runner)
1834
1835 return runner.failures, runner.tries
1836
1837def testfile(filename, module_relative=True, name=None, package=None,
1838 globs=None, verbose=None, report=True, optionflags=0,
1839 extraglobs=None, raise_on_error=False, parser=DocTestParser(),
1840 encoding=None):
1841 """
1842 Test examples in the given file. Return (#failures, #tests).
1843
1844 Optional keyword arg "module_relative" specifies how filenames
1845 should be interpreted:
1846
1847 - If "module_relative" is True (the default), then "filename"
1848 specifies a module-relative path. By default, this path is
1849 relative to the calling module's directory; but if the
1850 "package" argument is specified, then it is relative to that
1851 package. To ensure os-independence, "filename" should use
1852 "/" characters to separate path segments, and should not
1853 be an absolute path (i.e., it may not begin with "/").
1854
1855 - If "module_relative" is False, then "filename" specifies an
1856 os-specific path. The path may be absolute or relative (to
1857 the current working directory).
1858
1859 Optional keyword arg "name" gives the name of the test; by default
1860 use the file's basename.
1861
1862 Optional keyword argument "package" is a Python package or the
1863 name of a Python package whose directory should be used as the
1864 base directory for a module relative filename. If no package is
1865 specified, then the calling module's directory is used as the base
1866 directory for module relative filenames. It is an error to
1867 specify "package" if "module_relative" is False.
1868
1869 Optional keyword arg "globs" gives a dict to be used as the globals
1870 when executing examples; by default, use {}. A copy of this dict
1871 is actually used for each docstring, so that each docstring's
1872 examples start with a clean slate.
1873
1874 Optional keyword arg "extraglobs" gives a dictionary that should be
1875 merged into the globals that are used to execute examples. By
1876 default, no extra globals are used.
1877
1878 Optional keyword arg "verbose" prints lots of stuff if true, prints
1879 only failures if false; by default, it's true iff "-v" is in sys.argv.
1880
1881 Optional keyword arg "report" prints a summary at the end when true,
1882 else prints nothing at the end. In verbose mode, the summary is
1883 detailed, else very brief (in fact, empty if all tests passed).
1884
1885 Optional keyword arg "optionflags" or's together module constants,
1886 and defaults to 0. Possible values (see the docs for details):
1887
1888 DONT_ACCEPT_TRUE_FOR_1
1889 DONT_ACCEPT_BLANKLINE
1890 NORMALIZE_WHITESPACE
1891 ELLIPSIS
1892 SKIP
1893 IGNORE_EXCEPTION_DETAIL
1894 REPORT_UDIFF
1895 REPORT_CDIFF
1896 REPORT_NDIFF
1897 REPORT_ONLY_FIRST_FAILURE
1898
1899 Optional keyword arg "raise_on_error" raises an exception on the
1900 first unexpected exception or failure. This allows failures to be
1901 post-mortem debugged.
1902
1903 Optional keyword arg "parser" specifies a DocTestParser (or
1904 subclass) that should be used to extract tests from the files.
1905
1906 Optional keyword arg "encoding" specifies an encoding that should
1907 be used to convert the file to unicode.
1908
1909 Advanced tomfoolery: testmod runs methods of a local instance of
1910 class doctest.Tester, then merges the results into (or creates)
1911 global Tester instance doctest.master. Methods of doctest.master
1912 can be called directly too, if you want to do something unusual.
1913 Passing report=0 to testmod is especially useful then, to delay
1914 displaying a summary. Invoke doctest.master.summarize(verbose)
1915 when you're done fiddling.
1916 """
1917 global master
1918
1919 if package and not module_relative:
1920 raise ValueError("Package may only be specified for module-"
1921 "relative paths.")
1922
1923 # Relativize the path
1924 text, filename = _load_testfile(filename, package, module_relative)
1925
1926 # If no name was given, then use the file's name.
1927 if name is None:
1928 name = os.path.basename(filename)
1929
1930 # Assemble the globals.
1931 if globs is None:
1932 globs = {}
1933 else:
1934 globs = globs.copy()
1935 if extraglobs is not None:
1936 globs.update(extraglobs)
1937
1938 if raise_on_error:
1939 runner = DebugRunner(verbose=verbose, optionflags=optionflags)
1940 else:
1941 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
1942
1943 if encoding is not None:
1944 text = text.decode(encoding)
1945
1946 # Read the file, convert it to a test, and run it.
1947 test = parser.get_doctest(text, globs, name, filename, 0)
1948 runner.run(test)
1949
1950 if report:
1951 runner.summarize()
1952
1953 if master is None:
1954 master = runner
1955 else:
1956 master.merge(runner)
1957
1958 return runner.failures, runner.tries
1959
1960def run_docstring_examples(f, globs, verbose=False, name="NoName",
1961 compileflags=None, optionflags=0):
1962 """
1963 Test examples in the given object's docstring (`f`), using `globs`
1964 as globals. Optional argument `name` is used in failure messages.
1965 If the optional argument `verbose` is true, then generate output
1966 even if there are no failures.
1967
1968 `compileflags` gives the set of flags that should be used by the
1969 Python compiler when running the examples. If not specified, then
1970 it will default to the set of future-import flags that apply to
1971 `globs`.
1972
1973 Optional keyword arg `optionflags` specifies options for the
1974 testing and output. See the documentation for `testmod` for more
1975 information.
1976 """
1977 # Find, parse, and run all tests in the given module.
1978 finder = DocTestFinder(verbose=verbose, recurse=False)
1979 runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
1980 for test in finder.find(f, name, globs=globs):
1981 runner.run(test, compileflags=compileflags)
1982
1983######################################################################
1984## 7. Tester
1985######################################################################
1986# This is provided only for backwards compatibility. It's not
1987# actually used in any way.
1988
1989class Tester:
1990 def __init__(self, mod=None, globs=None, verbose=None, optionflags=0):
1991
1992 warnings.warn("class Tester is deprecated; "
1993 "use class doctest.DocTestRunner instead",
1994 DeprecationWarning, stacklevel=2)
1995 if mod is None and globs is None:
1996 raise TypeError("Tester.__init__: must specify mod or globs")
1997 if mod is not None and not inspect.ismodule(mod):
1998 raise TypeError("Tester.__init__: mod must be a module; %r" %
1999 (mod,))
2000 if globs is None:
2001 globs = mod.__dict__
2002 self.globs = globs
2003
2004 self.verbose = verbose
2005 self.optionflags = optionflags
2006 self.testfinder = DocTestFinder()
2007 self.testrunner = DocTestRunner(verbose=verbose,
2008 optionflags=optionflags)
2009
2010 def runstring(self, s, name):
2011 test = DocTestParser().get_doctest(s, self.globs, name, None, None)
2012 if self.verbose:
2013 print "Running string", name
2014 (f,t) = self.testrunner.run(test)
2015 if self.verbose:
2016 print f, "of", t, "examples failed in string", name
2017 return (f,t)
2018
2019 def rundoc(self, object, name=None, module=None):
2020 f = t = 0
2021 tests = self.testfinder.find(object, name, module=module,
2022 globs=self.globs)
2023 for test in tests:
2024 (f2, t2) = self.testrunner.run(test)
2025 (f,t) = (f+f2, t+t2)
2026 return (f,t)
2027
2028 def rundict(self, d, name, module=None):
2029 import new
2030 m = new.module(name)
2031 m.__dict__.update(d)
2032 if module is None:
2033 module = False
2034 return self.rundoc(m, name, module)
2035
2036 def run__test__(self, d, name):
2037 import new
2038 m = new.module(name)
2039 m.__test__ = d
2040 return self.rundoc(m, name)
2041
2042 def summarize(self, verbose=None):
2043 return self.testrunner.summarize(verbose)
2044
2045 def merge(self, other):
2046 self.testrunner.merge(other.testrunner)
2047
2048######################################################################
2049## 8. Unittest Support
2050######################################################################
2051
2052_unittest_reportflags = 0
2053
2054def set_unittest_reportflags(flags):
2055 """Sets the unittest option flags.
2056
2057 The old flag is returned so that a runner could restore the old
2058 value if it wished to:
2059
2060 >>> import doctest
2061 >>> old = doctest._unittest_reportflags
2062 >>> doctest.set_unittest_reportflags(REPORT_NDIFF |
2063 ... REPORT_ONLY_FIRST_FAILURE) == old
2064 True
2065
2066 >>> doctest._unittest_reportflags == (REPORT_NDIFF |
2067 ... REPORT_ONLY_FIRST_FAILURE)
2068 True
2069
2070 Only reporting flags can be set:
2071
2072 >>> doctest.set_unittest_reportflags(ELLIPSIS)
2073 Traceback (most recent call last):
2074 ...
2075 ValueError: ('Only reporting flags allowed', 8)
2076
2077 >>> doctest.set_unittest_reportflags(old) == (REPORT_NDIFF |
2078 ... REPORT_ONLY_FIRST_FAILURE)
2079 True
2080 """
2081 global _unittest_reportflags
2082
2083 if (flags & REPORTING_FLAGS) != flags:
2084 raise ValueError("Only reporting flags allowed", flags)
2085 old = _unittest_reportflags
2086 _unittest_reportflags = flags
2087 return old
2088
2089
2090class DocTestCase(unittest.TestCase):
2091
2092 def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
2093 checker=None):
2094
2095 unittest.TestCase.__init__(self)
2096 self._dt_optionflags = optionflags
2097 self._dt_checker = checker
2098 self._dt_test = test
2099 self._dt_setUp = setUp
2100 self._dt_tearDown = tearDown
2101
2102 def setUp(self):
2103 test = self._dt_test
2104
2105 if self._dt_setUp is not None:
2106 self._dt_setUp(test)
2107
2108 def tearDown(self):
2109 test = self._dt_test
2110
2111 if self._dt_tearDown is not None:
2112 self._dt_tearDown(test)
2113
2114 test.globs.clear()
2115
2116 def runTest(self):
2117 test = self._dt_test
2118 old = sys.stdout
2119 new = StringIO()
2120 optionflags = self._dt_optionflags
2121
2122 if not (optionflags & REPORTING_FLAGS):
2123 # The option flags don't include any reporting flags,
2124 # so add the default reporting flags
2125 optionflags |= _unittest_reportflags
2126
2127 runner = DocTestRunner(optionflags=optionflags,
2128 checker=self._dt_checker, verbose=False)
2129
2130 try:
2131 runner.DIVIDER = "-"*70
2132 failures, tries = runner.run(
2133 test, out=new.write, clear_globs=False)
2134 finally:
2135 sys.stdout = old
2136
2137 if failures:
2138 raise self.failureException(self.format_failure(new.getvalue()))
2139
2140 def format_failure(self, err):
2141 test = self._dt_test
2142 if test.lineno is None:
2143 lineno = 'unknown line number'
2144 else:
2145 lineno = '%s' % test.lineno
2146 lname = '.'.join(test.name.split('.')[-1:])
2147 return ('Failed doctest test for %s\n'
2148 ' File "%s", line %s, in %s\n\n%s'
2149 % (test.name, test.filename, lineno, lname, err)
2150 )
2151
2152 def debug(self):
2153 r"""Run the test case without results and without catching exceptions
2154
2155 The unit test framework includes a debug method on test cases
2156 and test suites to support post-mortem debugging. The test code
2157 is run in such a way that errors are not caught. This way a
2158 caller can catch the errors and initiate post-mortem debugging.
2159
2160 The DocTestCase provides a debug method that raises
2161 UnexpectedException errors if there is an unexepcted
2162 exception:
2163
2164 >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
2165 ... {}, 'foo', 'foo.py', 0)
2166 >>> case = DocTestCase(test)
2167 >>> try:
2168 ... case.debug()
2169 ... except UnexpectedException, failure:
2170 ... pass
2171
2172 The UnexpectedException contains the test, the example, and
2173 the original exception:
2174
2175 >>> failure.test is test
2176 True
2177
2178 >>> failure.example.want
2179 '42\n'
2180
2181 >>> exc_info = failure.exc_info
2182 >>> raise exc_info[0], exc_info[1], exc_info[2]
2183 Traceback (most recent call last):
2184 ...
2185 KeyError
2186
2187 If the output doesn't match, then a DocTestFailure is raised:
2188
2189 >>> test = DocTestParser().get_doctest('''
2190 ... >>> x = 1
2191 ... >>> x
2192 ... 2
2193 ... ''', {}, 'foo', 'foo.py', 0)
2194 >>> case = DocTestCase(test)
2195
2196 >>> try:
2197 ... case.debug()
2198 ... except DocTestFailure, failure:
2199 ... pass
2200
2201 DocTestFailure objects provide access to the test:
2202
2203 >>> failure.test is test
2204 True
2205
2206 As well as to the example:
2207
2208 >>> failure.example.want
2209 '2\n'
2210
2211 and the actual output:
2212
2213 >>> failure.got
2214 '1\n'
2215
2216 """
2217
2218 self.setUp()
2219 runner = DebugRunner(optionflags=self._dt_optionflags,
2220 checker=self._dt_checker, verbose=False)
2221 runner.run(self._dt_test)
2222 self.tearDown()
2223
2224 def id(self):
2225 return self._dt_test.name
2226
2227 def __repr__(self):
2228 name = self._dt_test.name.split('.')
2229 return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
2230
2231 __str__ = __repr__
2232
2233 def shortDescription(self):
2234 return "Doctest: " + self._dt_test.name
2235
2236def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
2237 **options):
2238 """
2239 Convert doctest tests for a module to a unittest test suite.
2240
2241 This converts each documentation string in a module that
2242 contains doctest tests to a unittest test case. If any of the
2243 tests in a doc string fail, then the test case fails. An exception
2244 is raised showing the name of the file containing the test and a
2245 (sometimes approximate) line number.
2246
2247 The `module` argument provides the module to be tested. The argument
2248 can be either a module or a module name.
2249
2250 If no argument is given, the calling module is used.
2251
2252 A number of options may be provided as keyword arguments:
2253
2254 setUp
2255 A set-up function. This is called before running the
2256 tests in each file. The setUp function will be passed a DocTest
2257 object. The setUp function can access the test globals as the
2258 globs attribute of the test passed.
2259
2260 tearDown
2261 A tear-down function. This is called after running the
2262 tests in each file. The tearDown function will be passed a DocTest
2263 object. The tearDown function can access the test globals as the
2264 globs attribute of the test passed.
2265
2266 globs
2267 A dictionary containing initial global variables for the tests.
2268
2269 optionflags
2270 A set of doctest option flags expressed as an integer.
2271 """
2272
2273 if test_finder is None:
2274 test_finder = DocTestFinder()
2275
2276 module = _normalize_module(module)
2277 tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
2278 if globs is None:
2279 globs = module.__dict__
2280 if not tests:
2281 # Why do we want to do this? Because it reveals a bug that might
2282 # otherwise be hidden.
2283 raise ValueError(module, "has no tests")
2284
2285 tests.sort()
2286 suite = unittest.TestSuite()
2287 for test in tests:
2288 if len(test.examples) == 0:
2289 continue
2290 if not test.filename:
2291 filename = module.__file__
2292 if filename[-4:] in (".pyc", ".pyo"):
2293 filename = filename[:-1]
2294 elif filename.endswith('$py.class'):
2295 filename = '%s.py' % filename[:-9]
2296 test.filename = filename
2297 suite.addTest(DocTestCase(test, **options))
2298
2299 return suite
2300
2301class DocFileCase(DocTestCase):
2302
2303 def id(self):
2304 return '_'.join(self._dt_test.name.split('.'))
2305
2306 def __repr__(self):
2307 return self._dt_test.filename
2308 __str__ = __repr__
2309
2310 def format_failure(self, err):
2311 return ('Failed doctest test for %s\n File "%s", line 0\n\n%s'
2312 % (self._dt_test.name, self._dt_test.filename, err)
2313 )
2314
2315def DocFileTest(path, module_relative=True, package=None,
2316 globs=None, parser=DocTestParser(),
2317 encoding=None, **options):
2318 if globs is None:
2319 globs = {}
2320 else:
2321 globs = globs.copy()
2322
2323 if package and not module_relative:
2324 raise ValueError("Package may only be specified for module-"
2325 "relative paths.")
2326
2327 # Relativize the path.
2328 doc, path = _load_testfile(path, package, module_relative)
2329
2330 if "__file__" not in globs:
2331 globs["__file__"] = path
2332
2333 # Find the file and read it.
2334 name = os.path.basename(path)
2335
2336 # If an encoding is specified, use it to convert the file to unicode
2337 if encoding is not None:
2338 doc = doc.decode(encoding)
2339
2340 # Convert it to a test, and wrap it in a DocFileCase.
2341 test = parser.get_doctest(doc, globs, name, path, 0)
2342 return DocFileCase(test, **options)
2343
2344def DocFileSuite(*paths, **kw):
2345 """A unittest suite for one or more doctest files.
2346
2347 The path to each doctest file is given as a string; the
2348 interpretation of that string depends on the keyword argument
2349 "module_relative".
2350
2351 A number of options may be provided as keyword arguments:
2352
2353 module_relative
2354 If "module_relative" is True, then the given file paths are
2355 interpreted as os-independent module-relative paths. By
2356 default, these paths are relative to the calling module's
2357 directory; but if the "package" argument is specified, then
2358 they are relative to that package. To ensure os-independence,
2359 "filename" should use "/" characters to separate path
2360 segments, and may not be an absolute path (i.e., it may not
2361 begin with "/").
2362
2363 If "module_relative" is False, then the given file paths are
2364 interpreted as os-specific paths. These paths may be absolute
2365 or relative (to the current working directory).
2366
2367 package
2368 A Python package or the name of a Python package whose directory
2369 should be used as the base directory for module relative paths.
2370 If "package" is not specified, then the calling module's
2371 directory is used as the base directory for module relative
2372 filenames. It is an error to specify "package" if
2373 "module_relative" is False.
2374
2375 setUp
2376 A set-up function. This is called before running the
2377 tests in each file. The setUp function will be passed a DocTest
2378 object. The setUp function can access the test globals as the
2379 globs attribute of the test passed.
2380
2381 tearDown
2382 A tear-down function. This is called after running the
2383 tests in each file. The tearDown function will be passed a DocTest
2384 object. The tearDown function can access the test globals as the
2385 globs attribute of the test passed.
2386
2387 globs
2388 A dictionary containing initial global variables for the tests.
2389
2390 optionflags
2391 A set of doctest option flags expressed as an integer.
2392
2393 parser
2394 A DocTestParser (or subclass) that should be used to extract
2395 tests from the files.
2396
2397 encoding
2398 An encoding that will be used to convert the files to unicode.
2399 """
2400 suite = unittest.TestSuite()
2401
2402 # We do this here so that _normalize_module is called at the right
2403 # level. If it were called in DocFileTest, then this function
2404 # would be the caller and we might guess the package incorrectly.
2405 if kw.get('module_relative', True):
2406 kw['package'] = _normalize_module(kw.get('package'))
2407
2408 for path in paths:
2409 suite.addTest(DocFileTest(path, **kw))
2410
2411 return suite
2412
2413######################################################################
2414## 9. Debugging Support
2415######################################################################
2416
2417def script_from_examples(s):
2418 r"""Extract script from text with examples.
2419
2420 Converts text with examples to a Python script. Example input is
2421 converted to regular code. Example output and all other words
2422 are converted to comments:
2423
2424 >>> text = '''
2425 ... Here are examples of simple math.
2426 ...
2427 ... Python has super accurate integer addition
2428 ...
2429 ... >>> 2 + 2
2430 ... 5
2431 ...
2432 ... And very friendly error messages:
2433 ...
2434 ... >>> 1/0
2435 ... To Infinity
2436 ... And
2437 ... Beyond
2438 ...
2439 ... You can use logic if you want:
2440 ...
2441 ... >>> if 0:
2442 ... ... blah
2443 ... ... blah
2444 ... ...
2445 ...
2446 ... Ho hum
2447 ... '''
2448
2449 >>> print script_from_examples(text)
2450 # Here are examples of simple math.
2451 #
2452 # Python has super accurate integer addition
2453 #
2454 2 + 2
2455 # Expected:
2456 ## 5
2457 #
2458 # And very friendly error messages:
2459 #
2460 1/0
2461 # Expected:
2462 ## To Infinity
2463 ## And
2464 ## Beyond
2465 #
2466 # You can use logic if you want:
2467 #
2468 if 0:
2469 blah
2470 blah
2471 #
2472 # Ho hum
2473 <BLANKLINE>
2474 """
2475 output = []
2476 for piece in DocTestParser().parse(s):
2477 if isinstance(piece, Example):
2478 # Add the example's source code (strip trailing NL)
2479 output.append(piece.source[:-1])
2480 # Add the expected output:
2481 want = piece.want
2482 if want:
2483 output.append('# Expected:')
2484 output += ['## '+l for l in want.split('\n')[:-1]]
2485 else:
2486 # Add non-example text.
2487 output += [_comment_line(l)
2488 for l in piece.split('\n')[:-1]]
2489
2490 # Trim junk on both ends.
2491 while output and output[-1] == '#':
2492 output.pop()
2493 while output and output[0] == '#':
2494 output.pop(0)
2495 # Combine the output, and return it.
2496 # Add a courtesy newline to prevent exec from choking (see bug #1172785)
2497 return '\n'.join(output) + '\n'
2498
2499def testsource(module, name):
2500 """Extract the test sources from a doctest docstring as a script.
2501
2502 Provide the module (or dotted name of the module) containing the
2503 test to be debugged and the name (within the module) of the object
2504 with the doc string with tests to be debugged.
2505 """
2506 module = _normalize_module(module)
2507 tests = DocTestFinder().find(module)
2508 test = [t for t in tests if t.name == name]
2509 if not test:
2510 raise ValueError(name, "not found in tests")
2511 test = test[0]
2512 testsrc = script_from_examples(test.docstring)
2513 return testsrc
2514
2515def debug_src(src, pm=False, globs=None):
2516 """Debug a single doctest docstring, in argument `src`'"""
2517 testsrc = script_from_examples(src)
2518 debug_script(testsrc, pm, globs)
2519
2520def debug_script(src, pm=False, globs=None):
2521 "Debug a test script. `src` is the script, as a string."
2522 import pdb
2523
2524 # Note that tempfile.NameTemporaryFile() cannot be used. As the
2525 # docs say, a file so created cannot be opened by name a second time
2526 # on modern Windows boxes, and execfile() needs to open it.
2527 srcfilename = tempfile.mktemp(".py", "doctestdebug")
2528 f = open(srcfilename, 'w')
2529 f.write(src)
2530 f.close()
2531
2532 try:
2533 if globs:
2534 globs = globs.copy()
2535 else:
2536 globs = {}
2537
2538 if pm:
2539 try:
2540 execfile(srcfilename, globs, globs)
2541 except:
2542 print sys.exc_info()[1]
2543 pdb.post_mortem(sys.exc_info()[2])
2544 else:
2545 # Note that %r is vital here. '%s' instead can, e.g., cause
2546 # backslashes to get treated as metacharacters on Windows.
2547 pdb.run("execfile(%r)" % srcfilename, globs, globs)
2548
2549 finally:
2550 os.remove(srcfilename)
2551
2552def debug(module, name, pm=False):
2553 """Debug a single doctest docstring.
2554
2555 Provide the module (or dotted name of the module) containing the
2556 test to be debugged and the name (within the module) of the object
2557 with the docstring with tests to be debugged.
2558 """
2559 module = _normalize_module(module)
2560 testsrc = testsource(module, name)
2561 debug_script(testsrc, pm, module.__dict__)
2562
2563######################################################################
2564## 10. Example Usage
2565######################################################################
2566class _TestClass:
2567 """
2568 A pointless class, for sanity-checking of docstring testing.
2569
2570 Methods:
2571 square()
2572 get()
2573
2574 >>> _TestClass(13).get() + _TestClass(-12).get()
2575 1
2576 >>> hex(_TestClass(13).square().get())
2577 '0xa9'
2578 """
2579
2580 def __init__(self, val):
2581 """val -> _TestClass object with associated value val.
2582
2583 >>> t = _TestClass(123)
2584 >>> print t.get()
2585 123
2586 """
2587
2588 self.val = val
2589
2590 def square(self):
2591 """square() -> square TestClass's associated value
2592
2593 >>> _TestClass(13).square().get()
2594 169
2595 """
2596
2597 self.val = self.val ** 2
2598 return self
2599
2600 def get(self):
2601 """get() -> return TestClass's associated value.
2602
2603 >>> x = _TestClass(-42)
2604 >>> print x.get()
2605 -42
2606 """
2607
2608 return self.val
2609
2610__test__ = {"_TestClass": _TestClass,
2611 "string": r"""
2612 Example of a string object, searched as-is.
2613 >>> x = 1; y = 2
2614 >>> x + y, x * y
2615 (3, 2)
2616 """,
2617
2618 "bool-int equivalence": r"""
2619 In 2.2, boolean expressions displayed
2620 0 or 1. By default, we still accept
2621 them. This can be disabled by passing
2622 DONT_ACCEPT_TRUE_FOR_1 to the new
2623 optionflags argument.
2624 >>> 4 == 4
2625 1
2626 >>> 4 == 4
2627 True
2628 >>> 4 > 4
2629 0
2630 >>> 4 > 4
2631 False
2632 """,
2633
2634 "blank lines": r"""
2635 Blank lines can be marked with <BLANKLINE>:
2636 >>> print 'foo\n\nbar\n'
2637 foo
2638 <BLANKLINE>
2639 bar
2640 <BLANKLINE>
2641 """,
2642
2643 "ellipsis": r"""
2644 If the ellipsis flag is used, then '...' can be used to
2645 elide substrings in the desired output:
2646 >>> print range(1000) #doctest: +ELLIPSIS
2647 [0, 1, 2, ..., 999]
2648 """,
2649
2650 "whitespace normalization": r"""
2651 If the whitespace normalization flag is used, then
2652 differences in whitespace are ignored.
2653 >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
2654 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2655 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
2656 27, 28, 29]
2657 """,
2658 }
2659
2660def _test():
2661 r = unittest.TextTestRunner()
2662 r.run(DocTestSuite())
2663
2664if __name__ == "__main__":
2665 _test()