blob: 3062f632e96a463dbd5c1ede93722f7d659706ac [file] [log] [blame]
Eric S. Raymond630e69c2001-02-09 08:33:43 +00001# Module doctest version 0.9.7
Tim Peters8a7d2d52001-01-16 07:10:57 +00002# Released to the public domain 16-Jan-2001,
3# by Tim Peters (tim.one@home.com).
4
5# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
6
7"""Module doctest -- a framework for running examples in docstrings.
8
9NORMAL USAGE
10
11In normal use, end each module M with:
12
13def _test():
14 import doctest, M # replace M with your module's name
15 return doctest.testmod(M) # ditto
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=1" to testmod, or prohibit
38it by passing "verbose=0". In either of those cases, sys.argv is not
39examined by testmod.
40
41In any case, testmod returns a 2-tuple of ints (f, t), where f is the
42number of docstring examples that failed and t is the total number of
43docstring examples attempted.
44
45
46WHICH DOCSTRINGS ARE EXAMINED?
47
48+ M.__doc__.
49
50+ f.__doc__ for all functions f in M.__dict__.values(), except those
51 with private names.
52
53+ C.__doc__ for all classes C in M.__dict__.values(), except those with
54 private names.
55
56+ If M.__test__ exists and "is true", it must be a dict, and
57 each entry maps a (string) name to a function object, class object, or
58 string. Function and class object docstrings found from M.__test__
59 are searched even if the name is private, and strings are searched
60 directly as if they were docstrings. In output, a key K in M.__test__
61 appears with name
62 <name of M>.__test__.K
63
64Any classes found are recursively searched similarly, to test docstrings in
65their contained methods and nested classes. Private names reached from M's
66globals are skipped, but all names reached from M.__test__ are searched.
67
68By default, a name is considered to be private if it begins with an
69underscore (like "_my_func") but doesn't both begin and end with (at least)
70two underscores (like "__init__"). You can change the default by passing
71your own "isprivate" function to testmod.
72
73If you want to test docstrings in objects with private names too, stuff
74them into an M.__test__ dict, or see ADVANCED USAGE below (e.g., pass your
75own isprivate function to Tester's constructor, or call the rundoc method
76of a Tester instance).
77
78Warning: imports can cause trouble; e.g., if you do
79
80from XYZ import XYZclass
81
82then XYZclass is a name in M.__dict__ too, and doctest has no way to know
83that XYZclass wasn't *defined* in M. So it may try to execute the examples
84in XYZclass's docstring, and those in turn may require a different set of
85globals to work correctly. I prefer to do "import *"- friendly imports,
86a la
87
88import XYY
89_XYZclass = XYZ.XYZclass
90del XYZ
91
92or (Python 2.0)
93
94from XYZ import XYZclass as _XYZclass
95
96and then the leading underscore stops testmod from going nuts. You may
97prefer the method in the next section.
98
99
100WHAT'S THE EXECUTION CONTEXT?
101
102By default, each time testmod finds a docstring to test, it uses a *copy*
103of M's globals (so that running tests on a module doesn't change the
104module's real globals, and so that one test in M can't leave behind crumbs
105that accidentally allow another test to work). This means examples can
106freely use any names defined at top-level in M. It also means that sloppy
107imports (see above) can cause examples in external docstrings to use
108globals inappropriate for them.
109
110You can force use of your own dict as the execution context by passing
111"globs=your_dict" to testmod instead. Presumably this would be a copy of
112M.__dict__ merged with the globals from other imported modules.
113
114
115WHAT IF I WANT TO TEST A WHOLE PACKAGE?
116
117Piece o' cake, provided the modules do their testing from docstrings.
118Here's the test.py I use for the world's most elaborate Rational/
119floating-base-conversion pkg (which I'll distribute some day):
120
121from Rational import Cvt
122from Rational import Format
123from Rational import machprec
124from Rational import Rat
125from Rational import Round
126from Rational import utils
127
128modules = (Cvt,
129 Format,
130 machprec,
131 Rat,
132 Round,
133 utils)
134
135def _test():
136 import doctest
137 import sys
138 verbose = "-v" in sys.argv
139 for mod in modules:
140 doctest.testmod(mod, verbose=verbose, report=0)
141 doctest.master.summarize()
142
143if __name__ == "__main__":
144 _test()
145
146IOW, it just runs testmod on all the pkg modules. testmod remembers the
147names and outcomes (# of failures, # of tries) for each item it's seen, and
148passing "report=0" prevents it from printing a summary in verbose mode.
149Instead, the summary is delayed until all modules have been tested, and
150then "doctest.master.summarize()" forces the summary at the end.
151
152So this is very nice in practice: each module can be tested individually
153with almost no work beyond writing up docstring examples, and collections
154of modules can be tested too as a unit with no more work than the above.
155
156
157WHAT ABOUT EXCEPTIONS?
158
159No problem, as long as the only output generated by the example is the
160traceback itself. For example:
161
Tim Peters60e23f42001-02-14 00:43:21 +0000162 >>> [1, 2, 3].remove(42)
Tim Petersea4f9312001-02-13 20:54:42 +0000163 Traceback (most recent call last):
Tim Peters8a7d2d52001-01-16 07:10:57 +0000164 File "<stdin>", line 1, in ?
Tim Peters60e23f42001-02-14 00:43:21 +0000165 ValueError: list.remove(x): x not in list
Tim Peters8a7d2d52001-01-16 07:10:57 +0000166 >>>
167
168Note that only the exception type and value are compared (specifically,
169only the last line in the traceback).
170
171
172ADVANCED USAGE
173
174doctest.testmod() captures the testing policy I find most useful most
175often. You may want other policies.
176
177testmod() actually creates a local instance of class doctest.Tester, runs
178appropriate methods of that class, and merges the results into global
179Tester instance doctest.master.
180
181You can create your own instances of doctest.Tester, and so build your own
182policies, or even run methods of doctest.master directly. See
183doctest.Tester.__doc__ for details.
184
185
186SO WHAT DOES A DOCSTRING EXAMPLE LOOK LIKE ALREADY!?
187
188Oh ya. It's easy! In most cases a copy-and-paste of an interactive
189console session works fine -- just make sure the leading whitespace is
190rigidly consistent (you can mix tabs and spaces if you're too lazy to do it
191right, but doctest is not in the business of guessing what you think a tab
192means).
193
194 >>> # comments are ignored
195 >>> x = 12
196 >>> x
197 12
198 >>> if x == 13:
199 ... print "yes"
200 ... else:
201 ... print "no"
202 ... print "NO"
203 ... print "NO!!!"
204 ...
205 no
206 NO
207 NO!!!
208 >>>
209
210Any expected output must immediately follow the final ">>>" or "..." line
211containing the code, and the expected output (if any) extends to the next
212">>>" or all-whitespace line. That's it.
213
214Bummers:
215
216+ Expected output cannot contain an all-whitespace line, since such a line
217 is taken to signal the end of expected output.
218
219+ Output to stdout is captured, but not output to stderr (exception
220 tracebacks are captured via a different means).
221
222+ If you continue a line via backslashing in an interactive session, or for
223 any other reason use a backslash, you need to double the backslash in the
224 docstring version. This is simply because you're in a string, and so the
225 backslash must be escaped for it to survive intact. Like:
226
227>>> if "yes" == \\
228... "y" + \\
229... "es": # in the source code you'll see the doubled backslashes
230... print 'yes'
231yes
232
233The starting column doesn't matter:
234
235>>> assert "Easy!"
236 >>> import math
237 >>> math.floor(1.9)
238 1.0
239
240and as many leading whitespace characters are stripped from the expected
241output as appeared in the initial ">>>" line that triggered it.
242
243If you execute this very file, the examples above will be found and
244executed, leading to this output in verbose mode:
245
246Running doctest.__doc__
Tim Peters60e23f42001-02-14 00:43:21 +0000247Trying: [1, 2, 3].remove(42)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000248Expecting:
Tim Petersea4f9312001-02-13 20:54:42 +0000249Traceback (most recent call last):
Tim Peters8a7d2d52001-01-16 07:10:57 +0000250 File "<stdin>", line 1, in ?
Tim Peters60e23f42001-02-14 00:43:21 +0000251ValueError: list.remove(x): x not in list
Tim Peters8a7d2d52001-01-16 07:10:57 +0000252ok
253Trying: x = 12
254Expecting: nothing
255ok
256Trying: x
257Expecting: 12
258ok
259Trying:
260if x == 13:
261 print "yes"
262else:
263 print "no"
264 print "NO"
265 print "NO!!!"
266Expecting:
267no
268NO
269NO!!!
270ok
271... and a bunch more like that, with this summary at the end:
272
2735 items had no tests:
274 doctest.Tester.__init__
275 doctest.Tester.run__test__
276 doctest.Tester.summarize
277 doctest.run_docstring_examples
278 doctest.testmod
27912 items passed all tests:
280 8 tests in doctest
281 6 tests in doctest.Tester
282 10 tests in doctest.Tester.merge
283 7 tests in doctest.Tester.rundict
284 3 tests in doctest.Tester.rundoc
285 3 tests in doctest.Tester.runstring
286 2 tests in doctest.__test__._TestClass
287 2 tests in doctest.__test__._TestClass.__init__
288 2 tests in doctest.__test__._TestClass.get
289 1 tests in doctest.__test__._TestClass.square
290 2 tests in doctest.__test__.string
291 7 tests in doctest.is_private
29253 tests in 17 items.
29353 passed and 0 failed.
294Test passed.
295"""
296
297# 0,0,1 06-Mar-1999
298# initial version posted
299# 0,0,2 06-Mar-1999
300# loosened parsing:
301# cater to stinkin' tabs
302# don't insist on a blank after PS2 prefix
303# so trailing "... " line from a compound stmt no longer
304# breaks if the file gets whitespace-trimmed
305# better error msgs for inconsistent leading whitespace
306# 0,9,1 08-Mar-1999
307# exposed the Tester class and added client methods
308# plus docstring examples of their use (eww - head-twisting!)
309# fixed logic error in reporting total # of tests & failures
310# added __test__ support to testmod (a pale reflection of Christian
311# Tismer's vision ...)
312# removed the "deep" argument; fiddle __test__ instead
313# simplified endcase logic for extracting tests, and running them.
314# before, if no output was expected but some was produced
315# anyway via an eval'ed result, the discrepancy wasn't caught
316# made TestClass private and used __test__ to get at it
317# many doc updates
318# speed _SpoofOut for long expected outputs
319# 0,9,2 09-Mar-1999
320# throw out comments from examples, enabling use of the much simpler
321# exec compile(... "single") ...
322# for simulating the runtime; that barfs on comment-only lines
323# used the traceback module to do a much better job of reporting
324# exceptions
325# run __doc__ values thru str(), "just in case"
326# privateness of names now determined by an overridable "isprivate"
327# function
328# by default a name now considered to be private iff it begins with
329# an underscore but doesn't both begin & end with two of 'em; so
330# e.g. Class.__init__ etc are searched now -- as they always
331# should have been
332# 0,9,3 18-Mar-1999
333# added .flush stub to _SpoofOut (JPython buglet diagnosed by
334# Hugh Emberson)
335# repaired ridiculous docs about backslashes in examples
336# minor internal changes
337# changed source to Unix line-end conventions
338# moved __test__ logic into new Tester.run__test__ method
339# 0,9,4 27-Mar-1999
340# report item name and line # in failing examples
341# 0,9,5 29-Jun-1999
342# allow straightforward exceptions in examples - thanks to Mark Hammond!
343# 0,9,6 16-Jan-2001
344# fiddling for changes in Python 2.0: some of the embedded docstring
345# examples no longer worked *exactly* as advertised, due to minor
346# language changes, and running doctest on itself pointed that out.
347# Hard to think of a better example of why this is useful <wink>.
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000348# 0,9,7 9-Feb-2001
349# string method conversion
Tim Peters8a7d2d52001-01-16 07:10:57 +0000350
Tim Peters03813392001-07-16 18:39:58 +0000351# XXX Until generators are part of the language, examples in doctest'ed
352# modules will inherit doctest's __future__ settings (see PEP 236 for
353# more on that). In the absence of a better working idea, the std
354# test suite needs generators, while the set of doctest'ed modules that
355# don't use "yield" in a generator context may well be empty. So
356# enable generators here. This can go away when generators are no
357# longer optional.
Tim Petersfe2127d2001-07-16 05:37:24 +0000358from __future__ import generators
359
Tim Petersecb6fb92001-02-10 01:24:50 +0000360__version__ = 0, 9, 7
Tim Peters8a7d2d52001-01-16 07:10:57 +0000361
362import types
363_FunctionType = types.FunctionType
364_ClassType = types.ClassType
365_ModuleType = types.ModuleType
366_StringType = types.StringType
367del types
368
Tim Peters8a7d2d52001-01-16 07:10:57 +0000369import re
370PS1 = ">>>"
371PS2 = "..."
372_isPS1 = re.compile(r"(\s*)" + re.escape(PS1)).match
373_isPS2 = re.compile(r"(\s*)" + re.escape(PS2)).match
374_isEmpty = re.compile(r"\s*$").match
375_isComment = re.compile(r"\s*#").match
376del re
377
Skip Montanaroeccd02a2001-01-20 23:34:12 +0000378__all__ = []
379
Tim Peters8a7d2d52001-01-16 07:10:57 +0000380# Extract interactive examples from a string. Return a list of triples,
381# (source, outcome, lineno). "source" is the source code, and ends
382# with a newline iff the source spans more than one line. "outcome" is
383# the expected output if any, else an empty string. When not empty,
384# outcome always ends with a newline. "lineno" is the line number,
385# 0-based wrt the start of the string, of the first source line.
386
387def _extract_examples(s):
388 isPS1, isPS2 = _isPS1, _isPS2
389 isEmpty, isComment = _isEmpty, _isComment
390 examples = []
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000391 lines = s.split("\n")
Tim Peters8a7d2d52001-01-16 07:10:57 +0000392 i, n = 0, len(lines)
393 while i < n:
394 line = lines[i]
395 i = i + 1
396 m = isPS1(line)
397 if m is None:
398 continue
399 j = m.end(0) # beyond the prompt
400 if isEmpty(line, j) or isComment(line, j):
401 # a bare prompt or comment -- not interesting
402 continue
403 lineno = i - 1
404 if line[j] != " ":
405 raise ValueError("line " + `lineno` + " of docstring lacks "
406 "blank after " + PS1 + ": " + line)
407 j = j + 1
408 blanks = m.group(1)
409 nblanks = len(blanks)
410 # suck up this and following PS2 lines
411 source = []
412 while 1:
413 source.append(line[j:])
414 line = lines[i]
415 m = isPS2(line)
416 if m:
417 if m.group(1) != blanks:
418 raise ValueError("inconsistent leading whitespace "
419 "in line " + `i` + " of docstring: " + line)
420 i = i + 1
421 else:
422 break
423 if len(source) == 1:
424 source = source[0]
425 else:
426 # get rid of useless null line from trailing empty "..."
427 if source[-1] == "":
428 del source[-1]
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000429 source = "\n".join(source) + "\n"
Tim Peters8a7d2d52001-01-16 07:10:57 +0000430 # suck up response
431 if isPS1(line) or isEmpty(line):
432 expect = ""
433 else:
434 expect = []
435 while 1:
436 if line[:nblanks] != blanks:
437 raise ValueError("inconsistent leading whitespace "
438 "in line " + `i` + " of docstring: " + line)
439 expect.append(line[nblanks:])
440 i = i + 1
441 line = lines[i]
442 if isPS1(line) or isEmpty(line):
443 break
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000444 expect = "\n".join(expect) + "\n"
Tim Peters8a7d2d52001-01-16 07:10:57 +0000445 examples.append( (source, expect, lineno) )
446 return examples
447
448# Capture stdout when running examples.
449
450class _SpoofOut:
451 def __init__(self):
452 self.clear()
453 def write(self, s):
454 self.buf.append(s)
455 def get(self):
Tim Petersf9bb4962001-02-14 06:35:35 +0000456 guts = "".join(self.buf)
457 # If anything at all was written, make sure there's a trailing
458 # newline. There's no way for the expected output to indicate
459 # that a trailing newline is missing.
460 if guts and not guts.endswith("\n"):
461 guts = guts + "\n"
462 return guts
Tim Peters8a7d2d52001-01-16 07:10:57 +0000463 def clear(self):
464 self.buf = []
465 def flush(self):
466 # JPython calls flush
467 pass
468
469# Display some tag-and-msg pairs nicely, keeping the tag and its msg
470# on the same line when that makes sense.
471
472def _tag_out(printer, *tag_msg_pairs):
473 for tag, msg in tag_msg_pairs:
474 printer(tag + ":")
475 msg_has_nl = msg[-1:] == "\n"
476 msg_has_two_nl = msg_has_nl and \
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000477 msg.find("\n") < len(msg) - 1
Tim Peters8a7d2d52001-01-16 07:10:57 +0000478 if len(tag) + len(msg) < 76 and not msg_has_two_nl:
479 printer(" ")
480 else:
481 printer("\n")
482 printer(msg)
483 if not msg_has_nl:
484 printer("\n")
485
486# Run list of examples, in context globs. "out" can be used to display
487# stuff to "the real" stdout, and fakeout is an instance of _SpoofOut
488# that captures the examples' std output. Return (#failures, #tries).
489
490def _run_examples_inner(out, fakeout, examples, globs, verbose, name):
491 import sys, traceback
492 OK, BOOM, FAIL = range(3)
493 NADA = "nothing"
494 stderr = _SpoofOut()
495 failures = 0
496 for source, want, lineno in examples:
497 if verbose:
498 _tag_out(out, ("Trying", source),
499 ("Expecting", want or NADA))
500 fakeout.clear()
501 try:
502 exec compile(source, "<string>", "single") in globs
503 got = fakeout.get()
504 state = OK
505 except:
506 # See whether the exception was expected.
Tim Petersea4f9312001-02-13 20:54:42 +0000507 if want.find("Traceback (innermost last):\n") == 0 or \
508 want.find("Traceback (most recent call last):\n") == 0:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000509 # Only compare exception type and value - the rest of
510 # the traceback isn't necessary.
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000511 want = want.split('\n')[-2] + '\n'
Tim Peters77f2d502001-06-24 18:59:01 +0000512 exc_type, exc_val = sys.exc_info()[:2]
Tim Peters08bba952001-06-24 06:46:58 +0000513 got = traceback.format_exception_only(exc_type, exc_val)[-1]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000514 state = OK
515 else:
516 # unexpected exception
517 stderr.clear()
518 traceback.print_exc(file=stderr)
519 state = BOOM
520
521 if state == OK:
522 if got == want:
523 if verbose:
524 out("ok\n")
525 continue
526 state = FAIL
527
528 assert state in (FAIL, BOOM)
529 failures = failures + 1
530 out("*" * 65 + "\n")
531 _tag_out(out, ("Failure in example", source))
532 out("from line #" + `lineno` + " of " + name + "\n")
533 if state == FAIL:
534 _tag_out(out, ("Expected", want or NADA), ("Got", got))
535 else:
536 assert state == BOOM
537 _tag_out(out, ("Exception raised", stderr.get()))
538
539 return failures, len(examples)
540
Tim Petersd4ad59e2001-06-24 20:02:47 +0000541# Run list of examples, in a shallow copy of context (dict) globs.
542# Return (#failures, #tries).
Tim Peters8a7d2d52001-01-16 07:10:57 +0000543
544def _run_examples(examples, globs, verbose, name):
545 import sys
546 saveout = sys.stdout
Tim Petersd4ad59e2001-06-24 20:02:47 +0000547 globs = globs.copy()
Tim Peters8a7d2d52001-01-16 07:10:57 +0000548 try:
549 sys.stdout = fakeout = _SpoofOut()
550 x = _run_examples_inner(saveout.write, fakeout, examples,
551 globs, verbose, name)
552 finally:
553 sys.stdout = saveout
Tim Petersd4ad59e2001-06-24 20:02:47 +0000554 # While Python gc can clean up most cycles on its own, it doesn't
555 # chase frame objects. This is especially irksome when running
556 # generator tests that raise exceptions, because a named generator-
557 # iterator gets an entry in globs, and the generator-iterator
558 # object's frame's traceback info points back to globs. This is
Tim Petersfee69d02001-06-24 20:24:16 +0000559 # easy to break just by clearing the namespace. This can also
560 # help to break other kinds of cycles, and even for cycles that
561 # gc can break itself it's better to break them ASAP.
Tim Petersd4ad59e2001-06-24 20:02:47 +0000562 globs.clear()
Tim Peters8a7d2d52001-01-16 07:10:57 +0000563 return x
564
565def run_docstring_examples(f, globs, verbose=0, name="NoName"):
566 """f, globs, verbose=0, name="NoName" -> run examples from f.__doc__.
567
Tim Petersd4ad59e2001-06-24 20:02:47 +0000568 Use (a shallow copy of) dict globs as the globals for execution.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000569 Return (#failures, #tries).
570
571 If optional arg verbose is true, print stuff even if there are no
572 failures.
573 Use string name in failure msgs.
574 """
575
576 try:
577 doc = f.__doc__
578 if not doc:
579 # docstring empty or None
580 return 0, 0
581 # just in case CT invents a doc object that has to be forced
582 # to look like a string <0.9 wink>
583 doc = str(doc)
584 except:
585 return 0, 0
586
587 e = _extract_examples(doc)
588 if not e:
589 return 0, 0
590 return _run_examples(e, globs, verbose, name)
591
592def is_private(prefix, base):
593 """prefix, base -> true iff name prefix + "." + base is "private".
594
595 Prefix may be an empty string, and base does not contain a period.
596 Prefix is ignored (although functions you write conforming to this
597 protocol may make use of it).
598 Return true iff base begins with an (at least one) underscore, but
599 does not both begin and end with (at least) two underscores.
600
601 >>> is_private("a.b", "my_func")
602 0
603 >>> is_private("____", "_my_func")
604 1
605 >>> is_private("someclass", "__init__")
606 0
607 >>> is_private("sometypo", "__init_")
608 1
609 >>> is_private("x.y.z", "_")
610 1
611 >>> is_private("_x.y.z", "__")
612 0
613 >>> is_private("", "") # senseless but consistent
614 0
615 """
616
617 return base[:1] == "_" and not base[:2] == "__" == base[-2:]
618
619class Tester:
620 """Class Tester -- runs docstring examples and accumulates stats.
621
622In normal use, function doctest.testmod() hides all this from you,
623so use that if you can. Create your own instances of Tester to do
624fancier things.
625
626Methods:
627 runstring(s, name)
628 Search string s for examples to run; use name for logging.
629 Return (#failures, #tries).
630
631 rundoc(object, name=None)
632 Search object.__doc__ for examples to run; use name (or
633 object.__name__) for logging. Return (#failures, #tries).
634
635 rundict(d, name)
636 Search for examples in docstrings in all of d.values(); use name
637 for logging. Return (#failures, #tries).
638
639 run__test__(d, name)
640 Treat dict d like module.__test__. Return (#failures, #tries).
641
642 summarize(verbose=None)
643 Display summary of testing results, to stdout. Return
644 (#failures, #tries).
645
646 merge(other)
647 Merge in the test results from Tester instance "other".
648
649>>> from doctest import Tester
650>>> t = Tester(globs={'x': 42}, verbose=0)
651>>> t.runstring(r'''
652... >>> x = x * 2
653... >>> print x
654... 42
655... ''', 'XYZ')
656*****************************************************************
657Failure in example: print x
658from line #2 of XYZ
659Expected: 42
660Got: 84
661(1, 2)
662>>> t.runstring(">>> x = x * 2\\n>>> print x\\n84\\n", 'example2')
663(0, 2)
664>>> t.summarize()
Guido van Rossum261d91a2001-03-18 17:05:58 +0000665*****************************************************************
Tim Peters8a7d2d52001-01-16 07:10:57 +00006661 items had failures:
667 1 of 2 in XYZ
668***Test Failed*** 1 failures.
669(1, 4)
670>>> t.summarize(verbose=1)
6711 items passed all tests:
672 2 tests in example2
Guido van Rossum261d91a2001-03-18 17:05:58 +0000673*****************************************************************
Tim Peters8a7d2d52001-01-16 07:10:57 +00006741 items had failures:
675 1 of 2 in XYZ
6764 tests in 2 items.
6773 passed and 1 failed.
678***Test Failed*** 1 failures.
679(1, 4)
680>>>
681"""
682
683 def __init__(self, mod=None, globs=None, verbose=None,
684 isprivate=None):
685 """mod=None, globs=None, verbose=None, isprivate=None
686
687See doctest.__doc__ for an overview.
688
689Optional keyword arg "mod" is a module, whose globals are used for
690executing examples. If not specified, globs must be specified.
691
692Optional keyword arg "globs" gives a dict to be used as the globals
693when executing examples; if not specified, use the globals from
694module mod.
695
696In either case, a copy of the dict is used for each docstring
697examined.
698
699Optional keyword arg "verbose" prints lots of stuff if true, only
700failures if false; by default, it's true iff "-v" is in sys.argv.
701
702Optional keyword arg "isprivate" specifies a function used to determine
703whether a name is private. The default function is doctest.is_private;
704see its docs for details.
705"""
706
707 if mod is None and globs is None:
708 raise TypeError("Tester.__init__: must specify mod or globs")
709 if mod is not None and type(mod) is not _ModuleType:
710 raise TypeError("Tester.__init__: mod must be a module; " +
711 `mod`)
712 if globs is None:
713 globs = mod.__dict__
714 self.globs = globs
715
716 if verbose is None:
717 import sys
718 verbose = "-v" in sys.argv
719 self.verbose = verbose
720
721 if isprivate is None:
722 isprivate = is_private
723 self.isprivate = isprivate
724
725 self.name2ft = {} # map name to (#failures, #trials) pair
726
727 def runstring(self, s, name):
728 """
729 s, name -> search string s for examples to run, logging as name.
730
731 Use string name as the key for logging the outcome.
732 Return (#failures, #examples).
733
734 >>> t = Tester(globs={}, verbose=1)
735 >>> test = r'''
736 ... # just an example
737 ... >>> x = 1 + 2
738 ... >>> x
739 ... 3
740 ... '''
741 >>> t.runstring(test, "Example")
742 Running string Example
743 Trying: x = 1 + 2
744 Expecting: nothing
745 ok
746 Trying: x
747 Expecting: 3
748 ok
749 0 of 2 examples failed in string Example
750 (0, 2)
751 """
752
753 if self.verbose:
754 print "Running string", name
755 f = t = 0
756 e = _extract_examples(s)
757 if e:
Tim Petersd4ad59e2001-06-24 20:02:47 +0000758 f, t = _run_examples(e, self.globs, self.verbose, name)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000759 if self.verbose:
760 print f, "of", t, "examples failed in string", name
761 self.__record_outcome(name, f, t)
762 return f, t
763
764 def rundoc(self, object, name=None):
765 """
766 object, name=None -> search object.__doc__ for examples to run.
767
768 Use optional string name as the key for logging the outcome;
769 by default use object.__name__.
770 Return (#failures, #examples).
771 If object is a class object, search recursively for method
772 docstrings too.
773 object.__doc__ is examined regardless of name, but if object is
774 a class, whether private names reached from object are searched
775 depends on the constructor's "isprivate" argument.
776
777 >>> t = Tester(globs={}, verbose=0)
778 >>> def _f():
779 ... '''Trivial docstring example.
780 ... >>> assert 2 == 2
781 ... '''
782 ... return 32
783 ...
784 >>> t.rundoc(_f) # expect 0 failures in 1 example
785 (0, 1)
786 """
787
788 if name is None:
789 try:
790 name = object.__name__
791 except AttributeError:
792 raise ValueError("Tester.rundoc: name must be given "
793 "when object.__name__ doesn't exist; " + `object`)
794 if self.verbose:
795 print "Running", name + ".__doc__"
Tim Petersd4ad59e2001-06-24 20:02:47 +0000796 f, t = run_docstring_examples(object, self.globs, self.verbose, name)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000797 if self.verbose:
798 print f, "of", t, "examples failed in", name + ".__doc__"
799 self.__record_outcome(name, f, t)
800 if type(object) is _ClassType:
801 f2, t2 = self.rundict(object.__dict__, name)
802 f = f + f2
803 t = t + t2
804 return f, t
805
806 def rundict(self, d, name):
807 """
808 d. name -> search for docstring examples in all of d.values().
809
810 For k, v in d.items() such that v is a function or class,
811 do self.rundoc(v, name + "." + k). Whether this includes
812 objects with private names depends on the constructor's
813 "isprivate" argument.
814 Return aggregate (#failures, #examples).
815
816 >>> def _f():
817 ... '''>>> assert 1 == 1
818 ... '''
819 >>> def g():
820 ... '''>>> assert 2 != 1
821 ... '''
822 >>> d = {"_f": _f, "g": g}
823 >>> t = Tester(globs={}, verbose=0)
824 >>> t.rundict(d, "rundict_test") # _f is skipped
825 (0, 1)
826 >>> t = Tester(globs={}, verbose=0, isprivate=lambda x,y: 0)
827 >>> t.rundict(d, "rundict_test_pvt") # both are searched
828 (0, 2)
829 """
830
831 if not hasattr(d, "items"):
832 raise TypeError("Tester.rundict: d must support .items(); " +
833 `d`)
834 f = t = 0
Tim Peters24a41912001-03-21 23:07:59 +0000835 # Run the tests by alpha order of names, for consistency in
836 # verbose-mode output.
837 names = d.keys()
838 names.sort()
839 for thisname in names:
840 value = d[thisname]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000841 if type(value) in (_FunctionType, _ClassType):
842 f2, t2 = self.__runone(value, name + "." + thisname)
843 f = f + f2
844 t = t + t2
845 return f, t
846
847 def run__test__(self, d, name):
848 """d, name -> Treat dict d like module.__test__.
849
850 Return (#failures, #tries).
851 See testmod.__doc__ for details.
852 """
853
854 failures = tries = 0
855 prefix = name + "."
856 savepvt = self.isprivate
857 try:
858 self.isprivate = lambda *args: 0
Tim Peters24a41912001-03-21 23:07:59 +0000859 # Run the tests by alpha order of names, for consistency in
860 # verbose-mode output.
861 keys = d.keys()
862 keys.sort()
863 for k in keys:
864 v = d[k]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000865 thisname = prefix + k
866 if type(v) is _StringType:
867 f, t = self.runstring(v, thisname)
868 elif type(v) in (_FunctionType, _ClassType):
869 f, t = self.rundoc(v, thisname)
870 else:
871 raise TypeError("Tester.run__test__: values in "
872 "dict must be strings, functions "
873 "or classes; " + `v`)
874 failures = failures + f
875 tries = tries + t
876 finally:
877 self.isprivate = savepvt
878 return failures, tries
879
880 def summarize(self, verbose=None):
881 """
882 verbose=None -> summarize results, return (#failures, #tests).
883
884 Print summary of test results to stdout.
885 Optional arg 'verbose' controls how wordy this is. By
886 default, use the verbose setting established by the
887 constructor.
888 """
889
890 if verbose is None:
891 verbose = self.verbose
892 notests = []
893 passed = []
894 failed = []
895 totalt = totalf = 0
896 for x in self.name2ft.items():
897 name, (f, t) = x
898 assert f <= t
899 totalt = totalt + t
900 totalf = totalf + f
901 if t == 0:
902 notests.append(name)
903 elif f == 0:
904 passed.append( (name, t) )
905 else:
906 failed.append(x)
907 if verbose:
908 if notests:
909 print len(notests), "items had no tests:"
910 notests.sort()
911 for thing in notests:
912 print " ", thing
913 if passed:
914 print len(passed), "items passed all tests:"
915 passed.sort()
916 for thing, count in passed:
917 print " %3d tests in %s" % (count, thing)
918 if failed:
Guido van Rossumaf00a462001-03-18 16:58:44 +0000919 print "*" * 65
Tim Peters8a7d2d52001-01-16 07:10:57 +0000920 print len(failed), "items had failures:"
921 failed.sort()
922 for thing, (f, t) in failed:
923 print " %3d of %3d in %s" % (f, t, thing)
924 if verbose:
925 print totalt, "tests in", len(self.name2ft), "items."
926 print totalt - totalf, "passed and", totalf, "failed."
927 if totalf:
928 print "***Test Failed***", totalf, "failures."
929 elif verbose:
930 print "Test passed."
931 return totalf, totalt
932
933 def merge(self, other):
934 """
935 other -> merge in test results from the other Tester instance.
936
937 If self and other both have a test result for something
938 with the same name, the (#failures, #tests) results are
939 summed, and a warning is printed to stdout.
940
941 >>> from doctest import Tester
942 >>> t1 = Tester(globs={}, verbose=0)
943 >>> t1.runstring('''
944 ... >>> x = 12
945 ... >>> print x
946 ... 12
947 ... ''', "t1example")
948 (0, 2)
949 >>>
950 >>> t2 = Tester(globs={}, verbose=0)
951 >>> t2.runstring('''
952 ... >>> x = 13
953 ... >>> print x
954 ... 13
955 ... ''', "t2example")
956 (0, 2)
957 >>> common = ">>> assert 1 + 2 == 3\\n"
958 >>> t1.runstring(common, "common")
959 (0, 1)
960 >>> t2.runstring(common, "common")
961 (0, 1)
962 >>> t1.merge(t2)
963 *** Tester.merge: 'common' in both testers; summing outcomes.
964 >>> t1.summarize(1)
965 3 items passed all tests:
966 2 tests in common
967 2 tests in t1example
968 2 tests in t2example
969 6 tests in 3 items.
970 6 passed and 0 failed.
971 Test passed.
972 (0, 6)
973 >>>
974 """
975
976 d = self.name2ft
977 for name, (f, t) in other.name2ft.items():
978 if d.has_key(name):
979 print "*** Tester.merge: '" + name + "' in both" \
980 " testers; summing outcomes."
981 f2, t2 = d[name]
982 f = f + f2
983 t = t + t2
984 d[name] = f, t
985
986 def __record_outcome(self, name, f, t):
987 if self.name2ft.has_key(name):
988 print "*** Warning: '" + name + "' was tested before;", \
989 "summing outcomes."
990 f2, t2 = self.name2ft[name]
991 f = f + f2
992 t = t + t2
993 self.name2ft[name] = f, t
994
995 def __runone(self, target, name):
996 if "." in name:
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000997 i = name.rindex(".")
Tim Peters8a7d2d52001-01-16 07:10:57 +0000998 prefix, base = name[:i], name[i+1:]
999 else:
1000 prefix, base = "", base
1001 if self.isprivate(prefix, base):
1002 return 0, 0
1003 return self.rundoc(target, name)
1004
1005master = None
1006
1007def testmod(m, name=None, globs=None, verbose=None, isprivate=None,
1008 report=1):
1009 """m, name=None, globs=None, verbose=None, isprivate=None, report=1
1010
1011 Test examples in docstrings in functions and classes reachable from
1012 module m, starting with m.__doc__. Private names are skipped.
1013
1014 Also test examples reachable from dict m.__test__ if it exists and is
1015 not None. m.__dict__ maps names to functions, classes and strings;
1016 function and class docstrings are tested even if the name is private;
1017 strings are tested directly, as if they were docstrings.
1018
1019 Return (#failures, #tests).
1020
1021 See doctest.__doc__ for an overview.
1022
1023 Optional keyword arg "name" gives the name of the module; by default
1024 use m.__name__.
1025
1026 Optional keyword arg "globs" gives a dict to be used as the globals
1027 when executing examples; by default, use m.__dict__. A copy of this
1028 dict is actually used for each docstring, so that each docstring's
1029 examples start with a clean slate.
1030
1031 Optional keyword arg "verbose" prints lots of stuff if true, prints
1032 only failures if false; by default, it's true iff "-v" is in sys.argv.
1033
1034 Optional keyword arg "isprivate" specifies a function used to
1035 determine whether a name is private. The default function is
1036 doctest.is_private; see its docs for details.
1037
1038 Optional keyword arg "report" prints a summary at the end when true,
1039 else prints nothing at the end. In verbose mode, the summary is
1040 detailed, else very brief (in fact, empty if all tests passed).
1041
1042 Advanced tomfoolery: testmod runs methods of a local instance of
1043 class doctest.Tester, then merges the results into (or creates)
1044 global Tester instance doctest.master. Methods of doctest.master
1045 can be called directly too, if you want to do something unusual.
1046 Passing report=0 to testmod is especially useful then, to delay
1047 displaying a summary. Invoke doctest.master.summarize(verbose)
1048 when you're done fiddling.
1049 """
1050
1051 global master
1052
1053 if type(m) is not _ModuleType:
1054 raise TypeError("testmod: module required; " + `m`)
1055 if name is None:
1056 name = m.__name__
1057 tester = Tester(m, globs=globs, verbose=verbose, isprivate=isprivate)
1058 failures, tries = tester.rundoc(m, name)
1059 f, t = tester.rundict(m.__dict__, name)
1060 failures = failures + f
1061 tries = tries + t
1062 if hasattr(m, "__test__"):
1063 testdict = m.__test__
1064 if testdict:
1065 if not hasattr(testdict, "items"):
1066 raise TypeError("testmod: module.__test__ must support "
1067 ".items(); " + `testdict`)
1068 f, t = tester.run__test__(testdict, name + ".__test__")
1069 failures = failures + f
1070 tries = tries + t
1071 if report:
1072 tester.summarize()
1073 if master is None:
1074 master = tester
1075 else:
1076 master.merge(tester)
1077 return failures, tries
1078
1079class _TestClass:
1080 """
1081 A pointless class, for sanity-checking of docstring testing.
1082
1083 Methods:
1084 square()
1085 get()
1086
1087 >>> _TestClass(13).get() + _TestClass(-12).get()
1088 1
1089 >>> hex(_TestClass(13).square().get())
1090 '0xa9'
1091 """
1092
1093 def __init__(self, val):
1094 """val -> _TestClass object with associated value val.
1095
1096 >>> t = _TestClass(123)
1097 >>> print t.get()
1098 123
1099 """
1100
1101 self.val = val
1102
1103 def square(self):
1104 """square() -> square TestClass's associated value
1105
1106 >>> _TestClass(13).square().get()
1107 169
1108 """
1109
1110 self.val = self.val ** 2
1111 return self
1112
1113 def get(self):
1114 """get() -> return TestClass's associated value.
1115
1116 >>> x = _TestClass(-42)
1117 >>> print x.get()
1118 -42
1119 """
1120
1121 return self.val
1122
1123__test__ = {"_TestClass": _TestClass,
1124 "string": r"""
1125 Example of a string object, searched as-is.
1126 >>> x = 1; y = 2
1127 >>> x + y, x * y
1128 (3, 2)
1129 """
1130 }
1131
1132def _test():
1133 import doctest
1134 return doctest.testmod(doctest)
1135
1136if __name__ == "__main__":
1137 _test()