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