blob: fc826df50dda653d90698c97ab1e289ca8df2d3a [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 Petersfe2127d2001-07-16 05:37:24 +0000351from __future__ import generators
352
Tim Petersecb6fb92001-02-10 01:24:50 +0000353__version__ = 0, 9, 7
Tim Peters8a7d2d52001-01-16 07:10:57 +0000354
355import types
356_FunctionType = types.FunctionType
357_ClassType = types.ClassType
358_ModuleType = types.ModuleType
359_StringType = types.StringType
360del types
361
Tim Peters8a7d2d52001-01-16 07:10:57 +0000362import re
363PS1 = ">>>"
364PS2 = "..."
365_isPS1 = re.compile(r"(\s*)" + re.escape(PS1)).match
366_isPS2 = re.compile(r"(\s*)" + re.escape(PS2)).match
367_isEmpty = re.compile(r"\s*$").match
368_isComment = re.compile(r"\s*#").match
369del re
370
Skip Montanaroeccd02a2001-01-20 23:34:12 +0000371__all__ = []
372
Tim Peters8a7d2d52001-01-16 07:10:57 +0000373# Extract interactive examples from a string. Return a list of triples,
374# (source, outcome, lineno). "source" is the source code, and ends
375# with a newline iff the source spans more than one line. "outcome" is
376# the expected output if any, else an empty string. When not empty,
377# outcome always ends with a newline. "lineno" is the line number,
378# 0-based wrt the start of the string, of the first source line.
379
380def _extract_examples(s):
381 isPS1, isPS2 = _isPS1, _isPS2
382 isEmpty, isComment = _isEmpty, _isComment
383 examples = []
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000384 lines = s.split("\n")
Tim Peters8a7d2d52001-01-16 07:10:57 +0000385 i, n = 0, len(lines)
386 while i < n:
387 line = lines[i]
388 i = i + 1
389 m = isPS1(line)
390 if m is None:
391 continue
392 j = m.end(0) # beyond the prompt
393 if isEmpty(line, j) or isComment(line, j):
394 # a bare prompt or comment -- not interesting
395 continue
396 lineno = i - 1
397 if line[j] != " ":
398 raise ValueError("line " + `lineno` + " of docstring lacks "
399 "blank after " + PS1 + ": " + line)
400 j = j + 1
401 blanks = m.group(1)
402 nblanks = len(blanks)
403 # suck up this and following PS2 lines
404 source = []
405 while 1:
406 source.append(line[j:])
407 line = lines[i]
408 m = isPS2(line)
409 if m:
410 if m.group(1) != blanks:
411 raise ValueError("inconsistent leading whitespace "
412 "in line " + `i` + " of docstring: " + line)
413 i = i + 1
414 else:
415 break
416 if len(source) == 1:
417 source = source[0]
418 else:
419 # get rid of useless null line from trailing empty "..."
420 if source[-1] == "":
421 del source[-1]
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000422 source = "\n".join(source) + "\n"
Tim Peters8a7d2d52001-01-16 07:10:57 +0000423 # suck up response
424 if isPS1(line) or isEmpty(line):
425 expect = ""
426 else:
427 expect = []
428 while 1:
429 if line[:nblanks] != blanks:
430 raise ValueError("inconsistent leading whitespace "
431 "in line " + `i` + " of docstring: " + line)
432 expect.append(line[nblanks:])
433 i = i + 1
434 line = lines[i]
435 if isPS1(line) or isEmpty(line):
436 break
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000437 expect = "\n".join(expect) + "\n"
Tim Peters8a7d2d52001-01-16 07:10:57 +0000438 examples.append( (source, expect, lineno) )
439 return examples
440
441# Capture stdout when running examples.
442
443class _SpoofOut:
444 def __init__(self):
445 self.clear()
446 def write(self, s):
447 self.buf.append(s)
448 def get(self):
Tim Petersf9bb4962001-02-14 06:35:35 +0000449 guts = "".join(self.buf)
450 # If anything at all was written, make sure there's a trailing
451 # newline. There's no way for the expected output to indicate
452 # that a trailing newline is missing.
453 if guts and not guts.endswith("\n"):
454 guts = guts + "\n"
455 return guts
Tim Peters8a7d2d52001-01-16 07:10:57 +0000456 def clear(self):
457 self.buf = []
458 def flush(self):
459 # JPython calls flush
460 pass
461
462# Display some tag-and-msg pairs nicely, keeping the tag and its msg
463# on the same line when that makes sense.
464
465def _tag_out(printer, *tag_msg_pairs):
466 for tag, msg in tag_msg_pairs:
467 printer(tag + ":")
468 msg_has_nl = msg[-1:] == "\n"
469 msg_has_two_nl = msg_has_nl and \
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000470 msg.find("\n") < len(msg) - 1
Tim Peters8a7d2d52001-01-16 07:10:57 +0000471 if len(tag) + len(msg) < 76 and not msg_has_two_nl:
472 printer(" ")
473 else:
474 printer("\n")
475 printer(msg)
476 if not msg_has_nl:
477 printer("\n")
478
479# Run list of examples, in context globs. "out" can be used to display
480# stuff to "the real" stdout, and fakeout is an instance of _SpoofOut
481# that captures the examples' std output. Return (#failures, #tries).
482
483def _run_examples_inner(out, fakeout, examples, globs, verbose, name):
484 import sys, traceback
485 OK, BOOM, FAIL = range(3)
486 NADA = "nothing"
487 stderr = _SpoofOut()
488 failures = 0
489 for source, want, lineno in examples:
490 if verbose:
491 _tag_out(out, ("Trying", source),
492 ("Expecting", want or NADA))
493 fakeout.clear()
494 try:
495 exec compile(source, "<string>", "single") in globs
496 got = fakeout.get()
497 state = OK
498 except:
499 # See whether the exception was expected.
Tim Petersea4f9312001-02-13 20:54:42 +0000500 if want.find("Traceback (innermost last):\n") == 0 or \
501 want.find("Traceback (most recent call last):\n") == 0:
Tim Peters8a7d2d52001-01-16 07:10:57 +0000502 # Only compare exception type and value - the rest of
503 # the traceback isn't necessary.
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000504 want = want.split('\n')[-2] + '\n'
Tim Peters77f2d502001-06-24 18:59:01 +0000505 exc_type, exc_val = sys.exc_info()[:2]
Tim Peters08bba952001-06-24 06:46:58 +0000506 got = traceback.format_exception_only(exc_type, exc_val)[-1]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000507 state = OK
508 else:
509 # unexpected exception
510 stderr.clear()
511 traceback.print_exc(file=stderr)
512 state = BOOM
513
514 if state == OK:
515 if got == want:
516 if verbose:
517 out("ok\n")
518 continue
519 state = FAIL
520
521 assert state in (FAIL, BOOM)
522 failures = failures + 1
523 out("*" * 65 + "\n")
524 _tag_out(out, ("Failure in example", source))
525 out("from line #" + `lineno` + " of " + name + "\n")
526 if state == FAIL:
527 _tag_out(out, ("Expected", want or NADA), ("Got", got))
528 else:
529 assert state == BOOM
530 _tag_out(out, ("Exception raised", stderr.get()))
531
532 return failures, len(examples)
533
Tim Petersd4ad59e2001-06-24 20:02:47 +0000534# Run list of examples, in a shallow copy of context (dict) globs.
535# Return (#failures, #tries).
Tim Peters8a7d2d52001-01-16 07:10:57 +0000536
537def _run_examples(examples, globs, verbose, name):
538 import sys
539 saveout = sys.stdout
Tim Petersd4ad59e2001-06-24 20:02:47 +0000540 globs = globs.copy()
Tim Peters8a7d2d52001-01-16 07:10:57 +0000541 try:
542 sys.stdout = fakeout = _SpoofOut()
543 x = _run_examples_inner(saveout.write, fakeout, examples,
544 globs, verbose, name)
545 finally:
546 sys.stdout = saveout
Tim Petersd4ad59e2001-06-24 20:02:47 +0000547 # While Python gc can clean up most cycles on its own, it doesn't
548 # chase frame objects. This is especially irksome when running
549 # generator tests that raise exceptions, because a named generator-
550 # iterator gets an entry in globs, and the generator-iterator
551 # object's frame's traceback info points back to globs. This is
Tim Petersfee69d02001-06-24 20:24:16 +0000552 # easy to break just by clearing the namespace. This can also
553 # help to break other kinds of cycles, and even for cycles that
554 # gc can break itself it's better to break them ASAP.
Tim Petersd4ad59e2001-06-24 20:02:47 +0000555 globs.clear()
Tim Peters8a7d2d52001-01-16 07:10:57 +0000556 return x
557
558def run_docstring_examples(f, globs, verbose=0, name="NoName"):
559 """f, globs, verbose=0, name="NoName" -> run examples from f.__doc__.
560
Tim Petersd4ad59e2001-06-24 20:02:47 +0000561 Use (a shallow copy of) dict globs as the globals for execution.
Tim Peters8a7d2d52001-01-16 07:10:57 +0000562 Return (#failures, #tries).
563
564 If optional arg verbose is true, print stuff even if there are no
565 failures.
566 Use string name in failure msgs.
567 """
568
569 try:
570 doc = f.__doc__
571 if not doc:
572 # docstring empty or None
573 return 0, 0
574 # just in case CT invents a doc object that has to be forced
575 # to look like a string <0.9 wink>
576 doc = str(doc)
577 except:
578 return 0, 0
579
580 e = _extract_examples(doc)
581 if not e:
582 return 0, 0
583 return _run_examples(e, globs, verbose, name)
584
585def is_private(prefix, base):
586 """prefix, base -> true iff name prefix + "." + base is "private".
587
588 Prefix may be an empty string, and base does not contain a period.
589 Prefix is ignored (although functions you write conforming to this
590 protocol may make use of it).
591 Return true iff base begins with an (at least one) underscore, but
592 does not both begin and end with (at least) two underscores.
593
594 >>> is_private("a.b", "my_func")
595 0
596 >>> is_private("____", "_my_func")
597 1
598 >>> is_private("someclass", "__init__")
599 0
600 >>> is_private("sometypo", "__init_")
601 1
602 >>> is_private("x.y.z", "_")
603 1
604 >>> is_private("_x.y.z", "__")
605 0
606 >>> is_private("", "") # senseless but consistent
607 0
608 """
609
610 return base[:1] == "_" and not base[:2] == "__" == base[-2:]
611
612class Tester:
613 """Class Tester -- runs docstring examples and accumulates stats.
614
615In normal use, function doctest.testmod() hides all this from you,
616so use that if you can. Create your own instances of Tester to do
617fancier things.
618
619Methods:
620 runstring(s, name)
621 Search string s for examples to run; use name for logging.
622 Return (#failures, #tries).
623
624 rundoc(object, name=None)
625 Search object.__doc__ for examples to run; use name (or
626 object.__name__) for logging. Return (#failures, #tries).
627
628 rundict(d, name)
629 Search for examples in docstrings in all of d.values(); use name
630 for logging. Return (#failures, #tries).
631
632 run__test__(d, name)
633 Treat dict d like module.__test__. Return (#failures, #tries).
634
635 summarize(verbose=None)
636 Display summary of testing results, to stdout. Return
637 (#failures, #tries).
638
639 merge(other)
640 Merge in the test results from Tester instance "other".
641
642>>> from doctest import Tester
643>>> t = Tester(globs={'x': 42}, verbose=0)
644>>> t.runstring(r'''
645... >>> x = x * 2
646... >>> print x
647... 42
648... ''', 'XYZ')
649*****************************************************************
650Failure in example: print x
651from line #2 of XYZ
652Expected: 42
653Got: 84
654(1, 2)
655>>> t.runstring(">>> x = x * 2\\n>>> print x\\n84\\n", 'example2')
656(0, 2)
657>>> t.summarize()
Guido van Rossum261d91a2001-03-18 17:05:58 +0000658*****************************************************************
Tim Peters8a7d2d52001-01-16 07:10:57 +00006591 items had failures:
660 1 of 2 in XYZ
661***Test Failed*** 1 failures.
662(1, 4)
663>>> t.summarize(verbose=1)
6641 items passed all tests:
665 2 tests in example2
Guido van Rossum261d91a2001-03-18 17:05:58 +0000666*****************************************************************
Tim Peters8a7d2d52001-01-16 07:10:57 +00006671 items had failures:
668 1 of 2 in XYZ
6694 tests in 2 items.
6703 passed and 1 failed.
671***Test Failed*** 1 failures.
672(1, 4)
673>>>
674"""
675
676 def __init__(self, mod=None, globs=None, verbose=None,
677 isprivate=None):
678 """mod=None, globs=None, verbose=None, isprivate=None
679
680See doctest.__doc__ for an overview.
681
682Optional keyword arg "mod" is a module, whose globals are used for
683executing examples. If not specified, globs must be specified.
684
685Optional keyword arg "globs" gives a dict to be used as the globals
686when executing examples; if not specified, use the globals from
687module mod.
688
689In either case, a copy of the dict is used for each docstring
690examined.
691
692Optional keyword arg "verbose" prints lots of stuff if true, only
693failures if false; by default, it's true iff "-v" is in sys.argv.
694
695Optional keyword arg "isprivate" specifies a function used to determine
696whether a name is private. The default function is doctest.is_private;
697see its docs for details.
698"""
699
700 if mod is None and globs is None:
701 raise TypeError("Tester.__init__: must specify mod or globs")
702 if mod is not None and type(mod) is not _ModuleType:
703 raise TypeError("Tester.__init__: mod must be a module; " +
704 `mod`)
705 if globs is None:
706 globs = mod.__dict__
707 self.globs = globs
708
709 if verbose is None:
710 import sys
711 verbose = "-v" in sys.argv
712 self.verbose = verbose
713
714 if isprivate is None:
715 isprivate = is_private
716 self.isprivate = isprivate
717
718 self.name2ft = {} # map name to (#failures, #trials) pair
719
720 def runstring(self, s, name):
721 """
722 s, name -> search string s for examples to run, logging as name.
723
724 Use string name as the key for logging the outcome.
725 Return (#failures, #examples).
726
727 >>> t = Tester(globs={}, verbose=1)
728 >>> test = r'''
729 ... # just an example
730 ... >>> x = 1 + 2
731 ... >>> x
732 ... 3
733 ... '''
734 >>> t.runstring(test, "Example")
735 Running string Example
736 Trying: x = 1 + 2
737 Expecting: nothing
738 ok
739 Trying: x
740 Expecting: 3
741 ok
742 0 of 2 examples failed in string Example
743 (0, 2)
744 """
745
746 if self.verbose:
747 print "Running string", name
748 f = t = 0
749 e = _extract_examples(s)
750 if e:
Tim Petersd4ad59e2001-06-24 20:02:47 +0000751 f, t = _run_examples(e, self.globs, self.verbose, name)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000752 if self.verbose:
753 print f, "of", t, "examples failed in string", name
754 self.__record_outcome(name, f, t)
755 return f, t
756
757 def rundoc(self, object, name=None):
758 """
759 object, name=None -> search object.__doc__ for examples to run.
760
761 Use optional string name as the key for logging the outcome;
762 by default use object.__name__.
763 Return (#failures, #examples).
764 If object is a class object, search recursively for method
765 docstrings too.
766 object.__doc__ is examined regardless of name, but if object is
767 a class, whether private names reached from object are searched
768 depends on the constructor's "isprivate" argument.
769
770 >>> t = Tester(globs={}, verbose=0)
771 >>> def _f():
772 ... '''Trivial docstring example.
773 ... >>> assert 2 == 2
774 ... '''
775 ... return 32
776 ...
777 >>> t.rundoc(_f) # expect 0 failures in 1 example
778 (0, 1)
779 """
780
781 if name is None:
782 try:
783 name = object.__name__
784 except AttributeError:
785 raise ValueError("Tester.rundoc: name must be given "
786 "when object.__name__ doesn't exist; " + `object`)
787 if self.verbose:
788 print "Running", name + ".__doc__"
Tim Petersd4ad59e2001-06-24 20:02:47 +0000789 f, t = run_docstring_examples(object, self.globs, self.verbose, name)
Tim Peters8a7d2d52001-01-16 07:10:57 +0000790 if self.verbose:
791 print f, "of", t, "examples failed in", name + ".__doc__"
792 self.__record_outcome(name, f, t)
793 if type(object) is _ClassType:
794 f2, t2 = self.rundict(object.__dict__, name)
795 f = f + f2
796 t = t + t2
797 return f, t
798
799 def rundict(self, d, name):
800 """
801 d. name -> search for docstring examples in all of d.values().
802
803 For k, v in d.items() such that v is a function or class,
804 do self.rundoc(v, name + "." + k). Whether this includes
805 objects with private names depends on the constructor's
806 "isprivate" argument.
807 Return aggregate (#failures, #examples).
808
809 >>> def _f():
810 ... '''>>> assert 1 == 1
811 ... '''
812 >>> def g():
813 ... '''>>> assert 2 != 1
814 ... '''
815 >>> d = {"_f": _f, "g": g}
816 >>> t = Tester(globs={}, verbose=0)
817 >>> t.rundict(d, "rundict_test") # _f is skipped
818 (0, 1)
819 >>> t = Tester(globs={}, verbose=0, isprivate=lambda x,y: 0)
820 >>> t.rundict(d, "rundict_test_pvt") # both are searched
821 (0, 2)
822 """
823
824 if not hasattr(d, "items"):
825 raise TypeError("Tester.rundict: d must support .items(); " +
826 `d`)
827 f = t = 0
Tim Peters24a41912001-03-21 23:07:59 +0000828 # Run the tests by alpha order of names, for consistency in
829 # verbose-mode output.
830 names = d.keys()
831 names.sort()
832 for thisname in names:
833 value = d[thisname]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000834 if type(value) in (_FunctionType, _ClassType):
835 f2, t2 = self.__runone(value, name + "." + thisname)
836 f = f + f2
837 t = t + t2
838 return f, t
839
840 def run__test__(self, d, name):
841 """d, name -> Treat dict d like module.__test__.
842
843 Return (#failures, #tries).
844 See testmod.__doc__ for details.
845 """
846
847 failures = tries = 0
848 prefix = name + "."
849 savepvt = self.isprivate
850 try:
851 self.isprivate = lambda *args: 0
Tim Peters24a41912001-03-21 23:07:59 +0000852 # Run the tests by alpha order of names, for consistency in
853 # verbose-mode output.
854 keys = d.keys()
855 keys.sort()
856 for k in keys:
857 v = d[k]
Tim Peters8a7d2d52001-01-16 07:10:57 +0000858 thisname = prefix + k
859 if type(v) is _StringType:
860 f, t = self.runstring(v, thisname)
861 elif type(v) in (_FunctionType, _ClassType):
862 f, t = self.rundoc(v, thisname)
863 else:
864 raise TypeError("Tester.run__test__: values in "
865 "dict must be strings, functions "
866 "or classes; " + `v`)
867 failures = failures + f
868 tries = tries + t
869 finally:
870 self.isprivate = savepvt
871 return failures, tries
872
873 def summarize(self, verbose=None):
874 """
875 verbose=None -> summarize results, return (#failures, #tests).
876
877 Print summary of test results to stdout.
878 Optional arg 'verbose' controls how wordy this is. By
879 default, use the verbose setting established by the
880 constructor.
881 """
882
883 if verbose is None:
884 verbose = self.verbose
885 notests = []
886 passed = []
887 failed = []
888 totalt = totalf = 0
889 for x in self.name2ft.items():
890 name, (f, t) = x
891 assert f <= t
892 totalt = totalt + t
893 totalf = totalf + f
894 if t == 0:
895 notests.append(name)
896 elif f == 0:
897 passed.append( (name, t) )
898 else:
899 failed.append(x)
900 if verbose:
901 if notests:
902 print len(notests), "items had no tests:"
903 notests.sort()
904 for thing in notests:
905 print " ", thing
906 if passed:
907 print len(passed), "items passed all tests:"
908 passed.sort()
909 for thing, count in passed:
910 print " %3d tests in %s" % (count, thing)
911 if failed:
Guido van Rossumaf00a462001-03-18 16:58:44 +0000912 print "*" * 65
Tim Peters8a7d2d52001-01-16 07:10:57 +0000913 print len(failed), "items had failures:"
914 failed.sort()
915 for thing, (f, t) in failed:
916 print " %3d of %3d in %s" % (f, t, thing)
917 if verbose:
918 print totalt, "tests in", len(self.name2ft), "items."
919 print totalt - totalf, "passed and", totalf, "failed."
920 if totalf:
921 print "***Test Failed***", totalf, "failures."
922 elif verbose:
923 print "Test passed."
924 return totalf, totalt
925
926 def merge(self, other):
927 """
928 other -> merge in test results from the other Tester instance.
929
930 If self and other both have a test result for something
931 with the same name, the (#failures, #tests) results are
932 summed, and a warning is printed to stdout.
933
934 >>> from doctest import Tester
935 >>> t1 = Tester(globs={}, verbose=0)
936 >>> t1.runstring('''
937 ... >>> x = 12
938 ... >>> print x
939 ... 12
940 ... ''', "t1example")
941 (0, 2)
942 >>>
943 >>> t2 = Tester(globs={}, verbose=0)
944 >>> t2.runstring('''
945 ... >>> x = 13
946 ... >>> print x
947 ... 13
948 ... ''', "t2example")
949 (0, 2)
950 >>> common = ">>> assert 1 + 2 == 3\\n"
951 >>> t1.runstring(common, "common")
952 (0, 1)
953 >>> t2.runstring(common, "common")
954 (0, 1)
955 >>> t1.merge(t2)
956 *** Tester.merge: 'common' in both testers; summing outcomes.
957 >>> t1.summarize(1)
958 3 items passed all tests:
959 2 tests in common
960 2 tests in t1example
961 2 tests in t2example
962 6 tests in 3 items.
963 6 passed and 0 failed.
964 Test passed.
965 (0, 6)
966 >>>
967 """
968
969 d = self.name2ft
970 for name, (f, t) in other.name2ft.items():
971 if d.has_key(name):
972 print "*** Tester.merge: '" + name + "' in both" \
973 " testers; summing outcomes."
974 f2, t2 = d[name]
975 f = f + f2
976 t = t + t2
977 d[name] = f, t
978
979 def __record_outcome(self, name, f, t):
980 if self.name2ft.has_key(name):
981 print "*** Warning: '" + name + "' was tested before;", \
982 "summing outcomes."
983 f2, t2 = self.name2ft[name]
984 f = f + f2
985 t = t + t2
986 self.name2ft[name] = f, t
987
988 def __runone(self, target, name):
989 if "." in name:
Eric S. Raymond630e69c2001-02-09 08:33:43 +0000990 i = name.rindex(".")
Tim Peters8a7d2d52001-01-16 07:10:57 +0000991 prefix, base = name[:i], name[i+1:]
992 else:
993 prefix, base = "", base
994 if self.isprivate(prefix, base):
995 return 0, 0
996 return self.rundoc(target, name)
997
998master = None
999
1000def testmod(m, name=None, globs=None, verbose=None, isprivate=None,
1001 report=1):
1002 """m, name=None, globs=None, verbose=None, isprivate=None, report=1
1003
1004 Test examples in docstrings in functions and classes reachable from
1005 module m, starting with m.__doc__. Private names are skipped.
1006
1007 Also test examples reachable from dict m.__test__ if it exists and is
1008 not None. m.__dict__ maps names to functions, classes and strings;
1009 function and class docstrings are tested even if the name is private;
1010 strings are tested directly, as if they were docstrings.
1011
1012 Return (#failures, #tests).
1013
1014 See doctest.__doc__ for an overview.
1015
1016 Optional keyword arg "name" gives the name of the module; by default
1017 use m.__name__.
1018
1019 Optional keyword arg "globs" gives a dict to be used as the globals
1020 when executing examples; by default, use m.__dict__. A copy of this
1021 dict is actually used for each docstring, so that each docstring's
1022 examples start with a clean slate.
1023
1024 Optional keyword arg "verbose" prints lots of stuff if true, prints
1025 only failures if false; by default, it's true iff "-v" is in sys.argv.
1026
1027 Optional keyword arg "isprivate" specifies a function used to
1028 determine whether a name is private. The default function is
1029 doctest.is_private; see its docs for details.
1030
1031 Optional keyword arg "report" prints a summary at the end when true,
1032 else prints nothing at the end. In verbose mode, the summary is
1033 detailed, else very brief (in fact, empty if all tests passed).
1034
1035 Advanced tomfoolery: testmod runs methods of a local instance of
1036 class doctest.Tester, then merges the results into (or creates)
1037 global Tester instance doctest.master. Methods of doctest.master
1038 can be called directly too, if you want to do something unusual.
1039 Passing report=0 to testmod is especially useful then, to delay
1040 displaying a summary. Invoke doctest.master.summarize(verbose)
1041 when you're done fiddling.
1042 """
1043
1044 global master
1045
1046 if type(m) is not _ModuleType:
1047 raise TypeError("testmod: module required; " + `m`)
1048 if name is None:
1049 name = m.__name__
1050 tester = Tester(m, globs=globs, verbose=verbose, isprivate=isprivate)
1051 failures, tries = tester.rundoc(m, name)
1052 f, t = tester.rundict(m.__dict__, name)
1053 failures = failures + f
1054 tries = tries + t
1055 if hasattr(m, "__test__"):
1056 testdict = m.__test__
1057 if testdict:
1058 if not hasattr(testdict, "items"):
1059 raise TypeError("testmod: module.__test__ must support "
1060 ".items(); " + `testdict`)
1061 f, t = tester.run__test__(testdict, name + ".__test__")
1062 failures = failures + f
1063 tries = tries + t
1064 if report:
1065 tester.summarize()
1066 if master is None:
1067 master = tester
1068 else:
1069 master.merge(tester)
1070 return failures, tries
1071
1072class _TestClass:
1073 """
1074 A pointless class, for sanity-checking of docstring testing.
1075
1076 Methods:
1077 square()
1078 get()
1079
1080 >>> _TestClass(13).get() + _TestClass(-12).get()
1081 1
1082 >>> hex(_TestClass(13).square().get())
1083 '0xa9'
1084 """
1085
1086 def __init__(self, val):
1087 """val -> _TestClass object with associated value val.
1088
1089 >>> t = _TestClass(123)
1090 >>> print t.get()
1091 123
1092 """
1093
1094 self.val = val
1095
1096 def square(self):
1097 """square() -> square TestClass's associated value
1098
1099 >>> _TestClass(13).square().get()
1100 169
1101 """
1102
1103 self.val = self.val ** 2
1104 return self
1105
1106 def get(self):
1107 """get() -> return TestClass's associated value.
1108
1109 >>> x = _TestClass(-42)
1110 >>> print x.get()
1111 -42
1112 """
1113
1114 return self.val
1115
1116__test__ = {"_TestClass": _TestClass,
1117 "string": r"""
1118 Example of a string object, searched as-is.
1119 >>> x = 1; y = 2
1120 >>> x + y, x * y
1121 (3, 2)
1122 """
1123 }
1124
1125def _test():
1126 import doctest
1127 return doctest.testmod(doctest)
1128
1129if __name__ == "__main__":
1130 _test()