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