1# -*- coding: utf-8 -*-
2"""
3Test script for doctest.
4"""
5
6import sys
7from test import test_support
8import doctest
9
10# NOTE: There are some additional tests relating to interaction with
11#       zipimport in the test_zipimport_support test module.
12
13######################################################################
14## Sample Objects (used by test cases)
15######################################################################
16
17def sample_func(v):
18    """
19    Blah blah
20
21    >>> print sample_func(22)
22    44
23
24    Yee ha!
25    """
26    return v+v
27
28class SampleClass:
29    """
30    >>> print 1
31    1
32
33    >>> # comments get ignored.  so are empty PS1 and PS2 prompts:
34    >>>
35    ...
36
37    Multiline example:
38    >>> sc = SampleClass(3)
39    >>> for i in range(10):
40    ...     sc = sc.double()
41    ...     print sc.get(),
42    6 12 24 48 96 192 384 768 1536 3072
43    """
44    def __init__(self, val):
45        """
46        >>> print SampleClass(12).get()
47        12
48        """
49        self.val = val
50
51    def double(self):
52        """
53        >>> print SampleClass(12).double().get()
54        24
55        """
56        return SampleClass(self.val + self.val)
57
58    def get(self):
59        """
60        >>> print SampleClass(-5).get()
61        -5
62        """
63        return self.val
64
65    def a_staticmethod(v):
66        """
67        >>> print SampleClass.a_staticmethod(10)
68        11
69        """
70        return v+1
71    a_staticmethod = staticmethod(a_staticmethod)
72
73    def a_classmethod(cls, v):
74        """
75        >>> print SampleClass.a_classmethod(10)
76        12
77        >>> print SampleClass(0).a_classmethod(10)
78        12
79        """
80        return v+2
81    a_classmethod = classmethod(a_classmethod)
82
83    a_property = property(get, doc="""
84        >>> print SampleClass(22).a_property
85        22
86        """)
87
88    class NestedClass:
89        """
90        >>> x = SampleClass.NestedClass(5)
91        >>> y = x.square()
92        >>> print y.get()
93        25
94        """
95        def __init__(self, val=0):
96            """
97            >>> print SampleClass.NestedClass().get()
98            0
99            """
100            self.val = val
101        def square(self):
102            return SampleClass.NestedClass(self.val*self.val)
103        def get(self):
104            return self.val
105
106class SampleNewStyleClass(object):
107    r"""
108    >>> print '1\n2\n3'
109    1
110    2
111    3
112    """
113    def __init__(self, val):
114        """
115        >>> print SampleNewStyleClass(12).get()
116        12
117        """
118        self.val = val
119
120    def double(self):
121        """
122        >>> print SampleNewStyleClass(12).double().get()
123        24
124        """
125        return SampleNewStyleClass(self.val + self.val)
126
127    def get(self):
128        """
129        >>> print SampleNewStyleClass(-5).get()
130        -5
131        """
132        return self.val
133
134######################################################################
135## Fake stdin (for testing interactive debugging)
136######################################################################
137
138class _FakeInput:
139    """
140    A fake input stream for pdb's interactive debugger.  Whenever a
141    line is read, print it (to simulate the user typing it), and then
142    return it.  The set of lines to return is specified in the
143    constructor; they should not have trailing newlines.
144    """
145    def __init__(self, lines):
146        self.lines = lines
147
148    def readline(self):
149        line = self.lines.pop(0)
150        print line
151        return line+'\n'
152
153######################################################################
154## Test Cases
155######################################################################
156
157def test_Example(): r"""
158Unit tests for the `Example` class.
159
160Example is a simple container class that holds:
161  - `source`: A source string.
162  - `want`: An expected output string.
163  - `exc_msg`: An expected exception message string (or None if no
164    exception is expected).
165  - `lineno`: A line number (within the docstring).
166  - `indent`: The example's indentation in the input string.
167  - `options`: An option dictionary, mapping option flags to True or
168    False.
169
170These attributes are set by the constructor.  `source` and `want` are
171required; the other attributes all have default values:
172
173    >>> example = doctest.Example('print 1', '1\n')
174    >>> (example.source, example.want, example.exc_msg,
175    ...  example.lineno, example.indent, example.options)
176    ('print 1\n', '1\n', None, 0, 0, {})
177
178The first three attributes (`source`, `want`, and `exc_msg`) may be
179specified positionally; the remaining arguments should be specified as
180keyword arguments:
181
182    >>> exc_msg = 'IndexError: pop from an empty list'
183    >>> example = doctest.Example('[].pop()', '', exc_msg,
184    ...                           lineno=5, indent=4,
185    ...                           options={doctest.ELLIPSIS: True})
186    >>> (example.source, example.want, example.exc_msg,
187    ...  example.lineno, example.indent, example.options)
188    ('[].pop()\n', '', 'IndexError: pop from an empty list\n', 5, 4, {8: True})
189
190The constructor normalizes the `source` string to end in a newline:
191
192    Source spans a single line: no terminating newline.
193    >>> e = doctest.Example('print 1', '1\n')
194    >>> e.source, e.want
195    ('print 1\n', '1\n')
196
197    >>> e = doctest.Example('print 1\n', '1\n')
198    >>> e.source, e.want
199    ('print 1\n', '1\n')
200
201    Source spans multiple lines: require terminating newline.
202    >>> e = doctest.Example('print 1;\nprint 2\n', '1\n2\n')
203    >>> e.source, e.want
204    ('print 1;\nprint 2\n', '1\n2\n')
205
206    >>> e = doctest.Example('print 1;\nprint 2', '1\n2\n')
207    >>> e.source, e.want
208    ('print 1;\nprint 2\n', '1\n2\n')
209
210    Empty source string (which should never appear in real examples)
211    >>> e = doctest.Example('', '')
212    >>> e.source, e.want
213    ('\n', '')
214
215The constructor normalizes the `want` string to end in a newline,
216unless it's the empty string:
217
218    >>> e = doctest.Example('print 1', '1\n')
219    >>> e.source, e.want
220    ('print 1\n', '1\n')
221
222    >>> e = doctest.Example('print 1', '1')
223    >>> e.source, e.want
224    ('print 1\n', '1\n')
225
226    >>> e = doctest.Example('print', '')
227    >>> e.source, e.want
228    ('print\n', '')
229
230The constructor normalizes the `exc_msg` string to end in a newline,
231unless it's `None`:
232
233    Message spans one line
234    >>> exc_msg = 'IndexError: pop from an empty list'
235    >>> e = doctest.Example('[].pop()', '', exc_msg)
236    >>> e.exc_msg
237    'IndexError: pop from an empty list\n'
238
239    >>> exc_msg = 'IndexError: pop from an empty list\n'
240    >>> e = doctest.Example('[].pop()', '', exc_msg)
241    >>> e.exc_msg
242    'IndexError: pop from an empty list\n'
243
244    Message spans multiple lines
245    >>> exc_msg = 'ValueError: 1\n  2'
246    >>> e = doctest.Example('raise ValueError("1\n  2")', '', exc_msg)
247    >>> e.exc_msg
248    'ValueError: 1\n  2\n'
249
250    >>> exc_msg = 'ValueError: 1\n  2\n'
251    >>> e = doctest.Example('raise ValueError("1\n  2")', '', exc_msg)
252    >>> e.exc_msg
253    'ValueError: 1\n  2\n'
254
255    Empty (but non-None) exception message (which should never appear
256    in real examples)
257    >>> exc_msg = ''
258    >>> e = doctest.Example('raise X()', '', exc_msg)
259    >>> e.exc_msg
260    '\n'
261
262Compare `Example`:
263    >>> example = doctest.Example('print 1', '1\n')
264    >>> same_example = doctest.Example('print 1', '1\n')
265    >>> other_example = doctest.Example('print 42', '42\n')
266    >>> example == same_example
267    True
268    >>> example != same_example
269    False
270    >>> hash(example) == hash(same_example)
271    True
272    >>> example == other_example
273    False
274    >>> example != other_example
275    True
276"""
277
278def test_DocTest(): r"""
279Unit tests for the `DocTest` class.
280
281DocTest is a collection of examples, extracted from a docstring, along
282with information about where the docstring comes from (a name,
283filename, and line number).  The docstring is parsed by the `DocTest`
284constructor:
285
286    >>> docstring = '''
287    ...     >>> print 12
288    ...     12
289    ...
290    ... Non-example text.
291    ...
292    ...     >>> print 'another\example'
293    ...     another
294    ...     example
295    ... '''
296    >>> globs = {} # globals to run the test in.
297    >>> parser = doctest.DocTestParser()
298    >>> test = parser.get_doctest(docstring, globs, 'some_test',
299    ...                           'some_file', 20)
300    >>> print test
301    <DocTest some_test from some_file:20 (2 examples)>
302    >>> len(test.examples)
303    2
304    >>> e1, e2 = test.examples
305    >>> (e1.source, e1.want, e1.lineno)
306    ('print 12\n', '12\n', 1)
307    >>> (e2.source, e2.want, e2.lineno)
308    ("print 'another\\example'\n", 'another\nexample\n', 6)
309
310Source information (name, filename, and line number) is available as
311attributes on the doctest object:
312
313    >>> (test.name, test.filename, test.lineno)
314    ('some_test', 'some_file', 20)
315
316The line number of an example within its containing file is found by
317adding the line number of the example and the line number of its
318containing test:
319
320    >>> test.lineno + e1.lineno
321    21
322    >>> test.lineno + e2.lineno
323    26
324
325If the docstring contains inconsistent leading whitespace in the
326expected output of an example, then `DocTest` will raise a ValueError:
327
328    >>> docstring = r'''
329    ...       >>> print 'bad\nindentation'
330    ...       bad
331    ...     indentation
332    ...     '''
333    >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
334    Traceback (most recent call last):
335    ValueError: line 4 of the docstring for some_test has inconsistent leading whitespace: 'indentation'
336
337If the docstring contains inconsistent leading whitespace on
338continuation lines, then `DocTest` will raise a ValueError:
339
340    >>> docstring = r'''
341    ...       >>> print ('bad indentation',
342    ...     ...          2)
343    ...       ('bad', 'indentation')
344    ...     '''
345    >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
346    Traceback (most recent call last):
347    ValueError: line 2 of the docstring for some_test has inconsistent leading whitespace: '...          2)'
348
349If there's no blank space after a PS1 prompt ('>>>'), then `DocTest`
350will raise a ValueError:
351
352    >>> docstring = '>>>print 1\n1'
353    >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
354    Traceback (most recent call last):
355    ValueError: line 1 of the docstring for some_test lacks blank after >>>: '>>>print 1'
356
357If there's no blank space after a PS2 prompt ('...'), then `DocTest`
358will raise a ValueError:
359
360    >>> docstring = '>>> if 1:\n...print 1\n1'
361    >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0)
362    Traceback (most recent call last):
363    ValueError: line 2 of the docstring for some_test lacks blank after ...: '...print 1'
364
365Compare `DocTest`:
366
367    >>> docstring = '''
368    ...     >>> print 12
369    ...     12
370    ... '''
371    >>> test = parser.get_doctest(docstring, globs, 'some_test',
372    ...                           'some_test', 20)
373    >>> same_test = parser.get_doctest(docstring, globs, 'some_test',
374    ...                                'some_test', 20)
375    >>> test == same_test
376    True
377    >>> test != same_test
378    False
379    >>> hash(test) == hash(same_test)
380    True
381    >>> docstring = '''
382    ...     >>> print 42
383    ...     42
384    ... '''
385    >>> other_test = parser.get_doctest(docstring, globs, 'other_test',
386    ...                                 'other_file', 10)
387    >>> test == other_test
388    False
389    >>> test != other_test
390    True
391
392Compare `DocTestCase`:
393
394    >>> DocTestCase = doctest.DocTestCase
395    >>> test_case = DocTestCase(test)
396    >>> same_test_case = DocTestCase(same_test)
397    >>> other_test_case = DocTestCase(other_test)
398    >>> test_case == same_test_case
399    True
400    >>> test_case != same_test_case
401    False
402    >>> hash(test_case) == hash(same_test_case)
403    True
404    >>> test == other_test_case
405    False
406    >>> test != other_test_case
407    True
408
409"""
410
411def test_DocTestFinder(): r"""
412Unit tests for the `DocTestFinder` class.
413
414DocTestFinder is used to extract DocTests from an object's docstring
415and the docstrings of its contained objects.  It can be used with
416modules, functions, classes, methods, staticmethods, classmethods, and
417properties.
418
419Finding Tests in Functions
420~~~~~~~~~~~~~~~~~~~~~~~~~~
421For a function whose docstring contains examples, DocTestFinder.find()
422will return a single test (for that function's docstring):
423
424    >>> finder = doctest.DocTestFinder()
425
426We'll simulate a __file__ attr that ends in pyc:
427
428    >>> import test.test_doctest
429    >>> old = test.test_doctest.__file__
430    >>> test.test_doctest.__file__ = 'test_doctest.pyc'
431
432    >>> tests = finder.find(sample_func)
433
434    >>> print tests  # doctest: +ELLIPSIS
435    [<DocTest sample_func from ...:17 (1 example)>]
436
437The exact name depends on how test_doctest was invoked, so allow for
438leading path components.
439
440    >>> tests[0].filename # doctest: +ELLIPSIS
441    '...test_doctest.py'
442
443    >>> test.test_doctest.__file__ = old
444
445
446    >>> e = tests[0].examples[0]
447    >>> (e.source, e.want, e.lineno)
448    ('print sample_func(22)\n', '44\n', 3)
449
450By default, tests are created for objects with no docstring:
451
452    >>> def no_docstring(v):
453    ...     pass
454    >>> finder.find(no_docstring)
455    []
456
457However, the optional argument `exclude_empty` to the DocTestFinder
458constructor can be used to exclude tests for objects with empty
459docstrings:
460
461    >>> def no_docstring(v):
462    ...     pass
463    >>> excl_empty_finder = doctest.DocTestFinder(exclude_empty=True)
464    >>> excl_empty_finder.find(no_docstring)
465    []
466
467If the function has a docstring with no examples, then a test with no
468examples is returned.  (This lets `DocTestRunner` collect statistics
469about which functions have no tests -- but is that useful?  And should
470an empty test also be created when there's no docstring?)
471
472    >>> def no_examples(v):
473    ...     ''' no doctest examples '''
474    >>> finder.find(no_examples) # doctest: +ELLIPSIS
475    [<DocTest no_examples from ...:1 (no examples)>]
476
477Finding Tests in Classes
478~~~~~~~~~~~~~~~~~~~~~~~~
479For a class, DocTestFinder will create a test for the class's
480docstring, and will recursively explore its contents, including
481methods, classmethods, staticmethods, properties, and nested classes.
482
483    >>> finder = doctest.DocTestFinder()
484    >>> tests = finder.find(SampleClass)
485    >>> for t in tests:
486    ...     print '%2s  %s' % (len(t.examples), t.name)
487     3  SampleClass
488     3  SampleClass.NestedClass
489     1  SampleClass.NestedClass.__init__
490     1  SampleClass.__init__
491     2  SampleClass.a_classmethod
492     1  SampleClass.a_property
493     1  SampleClass.a_staticmethod
494     1  SampleClass.double
495     1  SampleClass.get
496
497New-style classes are also supported:
498
499    >>> tests = finder.find(SampleNewStyleClass)
500    >>> for t in tests:
501    ...     print '%2s  %s' % (len(t.examples), t.name)
502     1  SampleNewStyleClass
503     1  SampleNewStyleClass.__init__
504     1  SampleNewStyleClass.double
505     1  SampleNewStyleClass.get
506
507Finding Tests in Modules
508~~~~~~~~~~~~~~~~~~~~~~~~
509For a module, DocTestFinder will create a test for the class's
510docstring, and will recursively explore its contents, including
511functions, classes, and the `__test__` dictionary, if it exists:
512
513    >>> # A module
514    >>> import types
515    >>> m = types.ModuleType('some_module')
516    >>> def triple(val):
517    ...     '''
518    ...     >>> print triple(11)
519    ...     33
520    ...     '''
521    ...     return val*3
522    >>> m.__dict__.update({
523    ...     'sample_func': sample_func,
524    ...     'SampleClass': SampleClass,
525    ...     '__doc__': '''
526    ...         Module docstring.
527    ...             >>> print 'module'
528    ...             module
529    ...         ''',
530    ...     '__test__': {
531    ...         'd': '>>> print 6\n6\n>>> print 7\n7\n',
532    ...         'c': triple}})
533
534    >>> finder = doctest.DocTestFinder()
535    >>> # Use module=test.test_doctest, to prevent doctest from
536    >>> # ignoring the objects since they weren't defined in m.
537    >>> import test.test_doctest
538    >>> tests = finder.find(m, module=test.test_doctest)
539    >>> for t in tests:
540    ...     print '%2s  %s' % (len(t.examples), t.name)
541     1  some_module
542     3  some_module.SampleClass
543     3  some_module.SampleClass.NestedClass
544     1  some_module.SampleClass.NestedClass.__init__
545     1  some_module.SampleClass.__init__
546     2  some_module.SampleClass.a_classmethod
547     1  some_module.SampleClass.a_property
548     1  some_module.SampleClass.a_staticmethod
549     1  some_module.SampleClass.double
550     1  some_module.SampleClass.get
551     1  some_module.__test__.c
552     2  some_module.__test__.d
553     1  some_module.sample_func
554
555Duplicate Removal
556~~~~~~~~~~~~~~~~~
557If a single object is listed twice (under different names), then tests
558will only be generated for it once:
559
560    >>> from test import doctest_aliases
561    >>> assert doctest_aliases.TwoNames.f
562    >>> assert doctest_aliases.TwoNames.g
563    >>> tests = excl_empty_finder.find(doctest_aliases)
564    >>> print len(tests)
565    2
566    >>> print tests[0].name
567    test.doctest_aliases.TwoNames
568
569    TwoNames.f and TwoNames.g are bound to the same object.
570    We can't guess which will be found in doctest's traversal of
571    TwoNames.__dict__ first, so we have to allow for either.
572
573    >>> tests[1].name.split('.')[-1] in ['f', 'g']
574    True
575
576Empty Tests
577~~~~~~~~~~~
578By default, an object with no doctests doesn't create any tests:
579
580    >>> tests = doctest.DocTestFinder().find(SampleClass)
581    >>> for t in tests:
582    ...     print '%2s  %s' % (len(t.examples), t.name)
583     3  SampleClass
584     3  SampleClass.NestedClass
585     1  SampleClass.NestedClass.__init__
586     1  SampleClass.__init__
587     2  SampleClass.a_classmethod
588     1  SampleClass.a_property
589     1  SampleClass.a_staticmethod
590     1  SampleClass.double
591     1  SampleClass.get
592
593By default, that excluded objects with no doctests.  exclude_empty=False
594tells it to include (empty) tests for objects with no doctests.  This feature
595is really to support backward compatibility in what doctest.master.summarize()
596displays.
597
598    >>> tests = doctest.DocTestFinder(exclude_empty=False).find(SampleClass)
599    >>> for t in tests:
600    ...     print '%2s  %s' % (len(t.examples), t.name)
601     3  SampleClass
602     3  SampleClass.NestedClass
603     1  SampleClass.NestedClass.__init__
604     0  SampleClass.NestedClass.get
605     0  SampleClass.NestedClass.square
606     1  SampleClass.__init__
607     2  SampleClass.a_classmethod
608     1  SampleClass.a_property
609     1  SampleClass.a_staticmethod
610     1  SampleClass.double
611     1  SampleClass.get
612
613Turning off Recursion
614~~~~~~~~~~~~~~~~~~~~~
615DocTestFinder can be told not to look for tests in contained objects
616using the `recurse` flag:
617
618    >>> tests = doctest.DocTestFinder(recurse=False).find(SampleClass)
619    >>> for t in tests:
620    ...     print '%2s  %s' % (len(t.examples), t.name)
621     3  SampleClass
622
623Line numbers
624~~~~~~~~~~~~
625DocTestFinder finds the line number of each example:
626
627    >>> def f(x):
628    ...     '''
629    ...     >>> x = 12
630    ...
631    ...     some text
632    ...
633    ...     >>> # examples are not created for comments & bare prompts.
634    ...     >>>
635    ...     ...
636    ...
637    ...     >>> for x in range(10):
638    ...     ...     print x,
639    ...     0 1 2 3 4 5 6 7 8 9
640    ...     >>> x//2
641    ...     6
642    ...     '''
643    >>> test = doctest.DocTestFinder().find(f)[0]
644    >>> [e.lineno for e in test.examples]
645    [1, 9, 12]
646"""
647
648def test_DocTestParser(): r"""
649Unit tests for the `DocTestParser` class.
650
651DocTestParser is used to parse docstrings containing doctest examples.
652
653The `parse` method divides a docstring into examples and intervening
654text:
655
656    >>> s = '''
657    ...     >>> x, y = 2, 3  # no output expected
658    ...     >>> if 1:
659    ...     ...     print x
660    ...     ...     print y
661    ...     2
662    ...     3
663    ...
664    ...     Some text.
665    ...     >>> x+y
666    ...     5
667    ...     '''
668    >>> parser = doctest.DocTestParser()
669    >>> for piece in parser.parse(s):
670    ...     if isinstance(piece, doctest.Example):
671    ...         print 'Example:', (piece.source, piece.want, piece.lineno)
672    ...     else:
673    ...         print '   Text:', `piece`
674       Text: '\n'
675    Example: ('x, y = 2, 3  # no output expected\n', '', 1)
676       Text: ''
677    Example: ('if 1:\n    print x\n    print y\n', '2\n3\n', 2)
678       Text: '\nSome text.\n'
679    Example: ('x+y\n', '5\n', 9)
680       Text: ''
681
682The `get_examples` method returns just the examples:
683
684    >>> for piece in parser.get_examples(s):
685    ...     print (piece.source, piece.want, piece.lineno)
686    ('x, y = 2, 3  # no output expected\n', '', 1)
687    ('if 1:\n    print x\n    print y\n', '2\n3\n', 2)
688    ('x+y\n', '5\n', 9)
689
690The `get_doctest` method creates a Test from the examples, along with the
691given arguments:
692
693    >>> test = parser.get_doctest(s, {}, 'name', 'filename', lineno=5)
694    >>> (test.name, test.filename, test.lineno)
695    ('name', 'filename', 5)
696    >>> for piece in test.examples:
697    ...     print (piece.source, piece.want, piece.lineno)
698    ('x, y = 2, 3  # no output expected\n', '', 1)
699    ('if 1:\n    print x\n    print y\n', '2\n3\n', 2)
700    ('x+y\n', '5\n', 9)
701"""
702
703class test_DocTestRunner:
704    def basics(): r"""
705Unit tests for the `DocTestRunner` class.
706
707DocTestRunner is used to run DocTest test cases, and to accumulate
708statistics.  Here's a simple DocTest case we can use:
709
710    >>> def f(x):
711    ...     '''
712    ...     >>> x = 12
713    ...     >>> print x
714    ...     12
715    ...     >>> x//2
716    ...     6
717    ...     '''
718    >>> test = doctest.DocTestFinder().find(f)[0]
719
720The main DocTestRunner interface is the `run` method, which runs a
721given DocTest case in a given namespace (globs).  It returns a tuple
722`(f,t)`, where `f` is the number of failed tests and `t` is the number
723of tried tests.
724
725    >>> doctest.DocTestRunner(verbose=False).run(test)
726    TestResults(failed=0, attempted=3)
727
728If any example produces incorrect output, then the test runner reports
729the failure and proceeds to the next example:
730
731    >>> def f(x):
732    ...     '''
733    ...     >>> x = 12
734    ...     >>> print x
735    ...     14
736    ...     >>> x//2
737    ...     6
738    ...     '''
739    >>> test = doctest.DocTestFinder().find(f)[0]
740    >>> doctest.DocTestRunner(verbose=True).run(test)
741    ... # doctest: +ELLIPSIS
742    Trying:
743        x = 12
744    Expecting nothing
745    ok
746    Trying:
747        print x
748    Expecting:
749        14
750    **********************************************************************
751    File ..., line 4, in f
752    Failed example:
753        print x
754    Expected:
755        14
756    Got:
757        12
758    Trying:
759        x//2
760    Expecting:
761        6
762    ok
763    TestResults(failed=1, attempted=3)
764"""
765    def verbose_flag(): r"""
766The `verbose` flag makes the test runner generate more detailed
767output:
768
769    >>> def f(x):
770    ...     '''
771    ...     >>> x = 12
772    ...     >>> print x
773    ...     12
774    ...     >>> x//2
775    ...     6
776    ...     '''
777    >>> test = doctest.DocTestFinder().find(f)[0]
778
779    >>> doctest.DocTestRunner(verbose=True).run(test)
780    Trying:
781        x = 12
782    Expecting nothing
783    ok
784    Trying:
785        print x
786    Expecting:
787        12
788    ok
789    Trying:
790        x//2
791    Expecting:
792        6
793    ok
794    TestResults(failed=0, attempted=3)
795
796If the `verbose` flag is unspecified, then the output will be verbose
797iff `-v` appears in sys.argv:
798
799    >>> # Save the real sys.argv list.
800    >>> old_argv = sys.argv
801
802    >>> # If -v does not appear in sys.argv, then output isn't verbose.
803    >>> sys.argv = ['test']
804    >>> doctest.DocTestRunner().run(test)
805    TestResults(failed=0, attempted=3)
806
807    >>> # If -v does appear in sys.argv, then output is verbose.
808    >>> sys.argv = ['test', '-v']
809    >>> doctest.DocTestRunner().run(test)
810    Trying:
811        x = 12
812    Expecting nothing
813    ok
814    Trying:
815        print x
816    Expecting:
817        12
818    ok
819    Trying:
820        x//2
821    Expecting:
822        6
823    ok
824    TestResults(failed=0, attempted=3)
825
826    >>> # Restore sys.argv
827    >>> sys.argv = old_argv
828
829In the remaining examples, the test runner's verbosity will be
830explicitly set, to ensure that the test behavior is consistent.
831    """
832    def exceptions(): r"""
833Tests of `DocTestRunner`'s exception handling.
834
835An expected exception is specified with a traceback message.  The
836lines between the first line and the type/value may be omitted or
837replaced with any other string:
838
839    >>> def f(x):
840    ...     '''
841    ...     >>> x = 12
842    ...     >>> print x//0
843    ...     Traceback (most recent call last):
844    ...     ZeroDivisionError: integer division or modulo by zero
845    ...     '''
846    >>> test = doctest.DocTestFinder().find(f)[0]
847    >>> doctest.DocTestRunner(verbose=False).run(test)
848    TestResults(failed=0, attempted=2)
849
850An example may not generate output before it raises an exception; if
851it does, then the traceback message will not be recognized as
852signaling an expected exception, so the example will be reported as an
853unexpected exception:
854
855    >>> def f(x):
856    ...     '''
857    ...     >>> x = 12
858    ...     >>> print 'pre-exception output', x//0
859    ...     pre-exception output
860    ...     Traceback (most recent call last):
861    ...     ZeroDivisionError: integer division or modulo by zero
862    ...     '''
863    >>> test = doctest.DocTestFinder().find(f)[0]
864    >>> doctest.DocTestRunner(verbose=False).run(test)
865    ... # doctest: +ELLIPSIS
866    **********************************************************************
867    File ..., line 4, in f
868    Failed example:
869        print 'pre-exception output', x//0
870    Exception raised:
871        ...
872        ZeroDivisionError: integer division or modulo by zero
873    TestResults(failed=1, attempted=2)
874
875Exception messages may contain newlines:
876
877    >>> def f(x):
878    ...     r'''
879    ...     >>> raise ValueError, 'multi\nline\nmessage'
880    ...     Traceback (most recent call last):
881    ...     ValueError: multi
882    ...     line
883    ...     message
884    ...     '''
885    >>> test = doctest.DocTestFinder().find(f)[0]
886    >>> doctest.DocTestRunner(verbose=False).run(test)
887    TestResults(failed=0, attempted=1)
888
889If an exception is expected, but an exception with the wrong type or
890message is raised, then it is reported as a failure:
891
892    >>> def f(x):
893    ...     r'''
894    ...     >>> raise ValueError, 'message'
895    ...     Traceback (most recent call last):
896    ...     ValueError: wrong message
897    ...     '''
898    >>> test = doctest.DocTestFinder().find(f)[0]
899    >>> doctest.DocTestRunner(verbose=False).run(test)
900    ... # doctest: +ELLIPSIS
901    **********************************************************************
902    File ..., line 3, in f
903    Failed example:
904        raise ValueError, 'message'
905    Expected:
906        Traceback (most recent call last):
907        ValueError: wrong message
908    Got:
909        Traceback (most recent call last):
910        ...
911        ValueError: message
912    TestResults(failed=1, attempted=1)
913
914However, IGNORE_EXCEPTION_DETAIL can be used to allow a mismatch in the
915detail:
916
917    >>> def f(x):
918    ...     r'''
919    ...     >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
920    ...     Traceback (most recent call last):
921    ...     ValueError: wrong message
922    ...     '''
923    >>> test = doctest.DocTestFinder().find(f)[0]
924    >>> doctest.DocTestRunner(verbose=False).run(test)
925    TestResults(failed=0, attempted=1)
926
927IGNORE_EXCEPTION_DETAIL also ignores difference in exception formatting
928between Python versions. For example, in Python 3.x, the module path of
929the exception is in the output, but this will fail under Python 2:
930
931    >>> def f(x):
932    ...     r'''
933    ...     >>> from httplib import HTTPException
934    ...     >>> raise HTTPException('message')
935    ...     Traceback (most recent call last):
936    ...     httplib.HTTPException: message
937    ...     '''
938    >>> test = doctest.DocTestFinder().find(f)[0]
939    >>> doctest.DocTestRunner(verbose=False).run(test)
940    ... # doctest: +ELLIPSIS
941    **********************************************************************
942    File ..., line 4, in f
943    Failed example:
944        raise HTTPException('message')
945    Expected:
946        Traceback (most recent call last):
947        httplib.HTTPException: message
948    Got:
949        Traceback (most recent call last):
950        ...
951        HTTPException: message
952    TestResults(failed=1, attempted=2)
953
954But in Python 2 the module path is not included, and therefore a test must look
955like the following test to succeed in Python 2. But that test will fail under
956Python 3.
957
958    >>> def f(x):
959    ...     r'''
960    ...     >>> from httplib import HTTPException
961    ...     >>> raise HTTPException('message')
962    ...     Traceback (most recent call last):
963    ...     HTTPException: message
964    ...     '''
965    >>> test = doctest.DocTestFinder().find(f)[0]
966    >>> doctest.DocTestRunner(verbose=False).run(test)
967    TestResults(failed=0, attempted=2)
968
969However, with IGNORE_EXCEPTION_DETAIL, the module name of the exception
970(if any) will be ignored:
971
972    >>> def f(x):
973    ...     r'''
974    ...     >>> from httplib import HTTPException
975    ...     >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL
976    ...     Traceback (most recent call last):
977    ...     HTTPException: message
978    ...     '''
979    >>> test = doctest.DocTestFinder().find(f)[0]
980    >>> doctest.DocTestRunner(verbose=False).run(test)
981    TestResults(failed=0, attempted=2)
982
983The module path will be completely ignored, so two different module paths will
984still pass if IGNORE_EXCEPTION_DETAIL is given. This is intentional, so it can
985be used when exceptions have changed module.
986
987    >>> def f(x):
988    ...     r'''
989    ...     >>> from httplib import HTTPException
990    ...     >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL
991    ...     Traceback (most recent call last):
992    ...     foo.bar.HTTPException: message
993    ...     '''
994    >>> test = doctest.DocTestFinder().find(f)[0]
995    >>> doctest.DocTestRunner(verbose=False).run(test)
996    TestResults(failed=0, attempted=2)
997
998But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type:
999
1000    >>> def f(x):
1001    ...     r'''
1002    ...     >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
1003    ...     Traceback (most recent call last):
1004    ...     TypeError: wrong type
1005    ...     '''
1006    >>> test = doctest.DocTestFinder().find(f)[0]
1007    >>> doctest.DocTestRunner(verbose=False).run(test)
1008    ... # doctest: +ELLIPSIS
1009    **********************************************************************
1010    File ..., line 3, in f
1011    Failed example:
1012        raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL
1013    Expected:
1014        Traceback (most recent call last):
1015        TypeError: wrong type
1016    Got:
1017        Traceback (most recent call last):
1018        ...
1019        ValueError: message
1020    TestResults(failed=1, attempted=1)
1021
1022If the exception does not have a message, you can still use
1023IGNORE_EXCEPTION_DETAIL to normalize the modules between Python 2 and 3:
1024
1025    >>> def f(x):
1026    ...     r'''
1027    ...     >>> from Queue import Empty
1028    ...     >>> raise Empty() #doctest: +IGNORE_EXCEPTION_DETAIL
1029    ...     Traceback (most recent call last):
1030    ...     foo.bar.Empty
1031    ...     '''
1032    >>> test = doctest.DocTestFinder().find(f)[0]
1033    >>> doctest.DocTestRunner(verbose=False).run(test)
1034    TestResults(failed=0, attempted=2)
1035
1036Note that a trailing colon doesn't matter either:
1037
1038    >>> def f(x):
1039    ...     r'''
1040    ...     >>> from Queue import Empty
1041    ...     >>> raise Empty() #doctest: +IGNORE_EXCEPTION_DETAIL
1042    ...     Traceback (most recent call last):
1043    ...     foo.bar.Empty:
1044    ...     '''
1045    >>> test = doctest.DocTestFinder().find(f)[0]
1046    >>> doctest.DocTestRunner(verbose=False).run(test)
1047    TestResults(failed=0, attempted=2)
1048
1049If an exception is raised but not expected, then it is reported as an
1050unexpected exception:
1051
1052    >>> def f(x):
1053    ...     r'''
1054    ...     >>> 1//0
1055    ...     0
1056    ...     '''
1057    >>> test = doctest.DocTestFinder().find(f)[0]
1058    >>> doctest.DocTestRunner(verbose=False).run(test)
1059    ... # doctest: +ELLIPSIS
1060    **********************************************************************
1061    File ..., line 3, in f
1062    Failed example:
1063        1//0
1064    Exception raised:
1065        Traceback (most recent call last):
1066        ...
1067        ZeroDivisionError: integer division or modulo by zero
1068    TestResults(failed=1, attempted=1)
1069"""
1070    def displayhook(): r"""
1071Test that changing sys.displayhook doesn't matter for doctest.
1072
1073    >>> import sys
1074    >>> orig_displayhook = sys.displayhook
1075    >>> def my_displayhook(x):
1076    ...     print('hi!')
1077    >>> sys.displayhook = my_displayhook
1078    >>> def f():
1079    ...     '''
1080    ...     >>> 3
1081    ...     3
1082    ...     '''
1083    >>> test = doctest.DocTestFinder().find(f)[0]
1084    >>> r = doctest.DocTestRunner(verbose=False).run(test)
1085    >>> post_displayhook = sys.displayhook
1086
1087    We need to restore sys.displayhook now, so that we'll be able to test
1088    results.
1089
1090    >>> sys.displayhook = orig_displayhook
1091
1092    Ok, now we can check that everything is ok.
1093
1094    >>> r
1095    TestResults(failed=0, attempted=1)
1096    >>> post_displayhook is my_displayhook
1097    True
1098"""
1099    def optionflags(): r"""
1100Tests of `DocTestRunner`'s option flag handling.
1101
1102Several option flags can be used to customize the behavior of the test
1103runner.  These are defined as module constants in doctest, and passed
1104to the DocTestRunner constructor (multiple constants should be ORed
1105together).
1106
1107The DONT_ACCEPT_TRUE_FOR_1 flag disables matches between True/False
1108and 1/0:
1109
1110    >>> def f(x):
1111    ...     '>>> True\n1\n'
1112
1113    >>> # Without the flag:
1114    >>> test = doctest.DocTestFinder().find(f)[0]
1115    >>> doctest.DocTestRunner(verbose=False).run(test)
1116    TestResults(failed=0, attempted=1)
1117
1118    >>> # With the flag:
1119    >>> test = doctest.DocTestFinder().find(f)[0]
1120    >>> flags = doctest.DONT_ACCEPT_TRUE_FOR_1
1121    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1122    ... # doctest: +ELLIPSIS
1123    **********************************************************************
1124    File ..., line 2, in f
1125    Failed example:
1126        True
1127    Expected:
1128        1
1129    Got:
1130        True
1131    TestResults(failed=1, attempted=1)
1132
1133The DONT_ACCEPT_BLANKLINE flag disables the match between blank lines
1134and the '<BLANKLINE>' marker:
1135
1136    >>> def f(x):
1137    ...     '>>> print "a\\n\\nb"\na\n<BLANKLINE>\nb\n'
1138
1139    >>> # Without the flag:
1140    >>> test = doctest.DocTestFinder().find(f)[0]
1141    >>> doctest.DocTestRunner(verbose=False).run(test)
1142    TestResults(failed=0, attempted=1)
1143
1144    >>> # With the flag:
1145    >>> test = doctest.DocTestFinder().find(f)[0]
1146    >>> flags = doctest.DONT_ACCEPT_BLANKLINE
1147    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1148    ... # doctest: +ELLIPSIS
1149    **********************************************************************
1150    File ..., line 2, in f
1151    Failed example:
1152        print "a\n\nb"
1153    Expected:
1154        a
1155        <BLANKLINE>
1156        b
1157    Got:
1158        a
1159    <BLANKLINE>
1160        b
1161    TestResults(failed=1, attempted=1)
1162
1163The NORMALIZE_WHITESPACE flag causes all sequences of whitespace to be
1164treated as equal:
1165
1166    >>> def f(x):
1167    ...     '>>> print 1, 2, 3\n  1   2\n 3'
1168
1169    >>> # Without the flag:
1170    >>> test = doctest.DocTestFinder().find(f)[0]
1171    >>> doctest.DocTestRunner(verbose=False).run(test)
1172    ... # doctest: +ELLIPSIS
1173    **********************************************************************
1174    File ..., line 2, in f
1175    Failed example:
1176        print 1, 2, 3
1177    Expected:
1178          1   2
1179         3
1180    Got:
1181        1 2 3
1182    TestResults(failed=1, attempted=1)
1183
1184    >>> # With the flag:
1185    >>> test = doctest.DocTestFinder().find(f)[0]
1186    >>> flags = doctest.NORMALIZE_WHITESPACE
1187    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1188    TestResults(failed=0, attempted=1)
1189
1190    An example from the docs:
1191    >>> print range(20) #doctest: +NORMALIZE_WHITESPACE
1192    [0,   1,  2,  3,  4,  5,  6,  7,  8,  9,
1193    10,  11, 12, 13, 14, 15, 16, 17, 18, 19]
1194
1195The ELLIPSIS flag causes ellipsis marker ("...") in the expected
1196output to match any substring in the actual output:
1197
1198    >>> def f(x):
1199    ...     '>>> print range(15)\n[0, 1, 2, ..., 14]\n'
1200
1201    >>> # Without the flag:
1202    >>> test = doctest.DocTestFinder().find(f)[0]
1203    >>> doctest.DocTestRunner(verbose=False).run(test)
1204    ... # doctest: +ELLIPSIS
1205    **********************************************************************
1206    File ..., line 2, in f
1207    Failed example:
1208        print range(15)
1209    Expected:
1210        [0, 1, 2, ..., 14]
1211    Got:
1212        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
1213    TestResults(failed=1, attempted=1)
1214
1215    >>> # With the flag:
1216    >>> test = doctest.DocTestFinder().find(f)[0]
1217    >>> flags = doctest.ELLIPSIS
1218    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1219    TestResults(failed=0, attempted=1)
1220
1221    ... also matches nothing:
1222
1223    >>> for i in range(100):
1224    ...     print i**2, #doctest: +ELLIPSIS
1225    0 1...4...9 16 ... 36 49 64 ... 9801
1226
1227    ... can be surprising; e.g., this test passes:
1228
1229    >>> for i in range(21): #doctest: +ELLIPSIS
1230    ...     print i,
1231    0 1 2 ...1...2...0
1232
1233    Examples from the docs:
1234
1235    >>> print range(20) # doctest:+ELLIPSIS
1236    [0, 1, ..., 18, 19]
1237
1238    >>> print range(20) # doctest: +ELLIPSIS
1239    ...                 # doctest: +NORMALIZE_WHITESPACE
1240    [0,    1, ...,   18,    19]
1241
1242The SKIP flag causes an example to be skipped entirely.  I.e., the
1243example is not run.  It can be useful in contexts where doctest
1244examples serve as both documentation and test cases, and an example
1245should be included for documentation purposes, but should not be
1246checked (e.g., because its output is random, or depends on resources
1247which would be unavailable.)  The SKIP flag can also be used for
1248'commenting out' broken examples.
1249
1250    >>> import unavailable_resource           # doctest: +SKIP
1251    >>> unavailable_resource.do_something()   # doctest: +SKIP
1252    >>> unavailable_resource.blow_up()        # doctest: +SKIP
1253    Traceback (most recent call last):
1254        ...
1255    UncheckedBlowUpError:  Nobody checks me.
1256
1257    >>> import random
1258    >>> print random.random() # doctest: +SKIP
1259    0.721216923889
1260
1261The REPORT_UDIFF flag causes failures that involve multi-line expected
1262and actual outputs to be displayed using a unified diff:
1263
1264    >>> def f(x):
1265    ...     r'''
1266    ...     >>> print '\n'.join('abcdefg')
1267    ...     a
1268    ...     B
1269    ...     c
1270    ...     d
1271    ...     f
1272    ...     g
1273    ...     h
1274    ...     '''
1275
1276    >>> # Without the flag:
1277    >>> test = doctest.DocTestFinder().find(f)[0]
1278    >>> doctest.DocTestRunner(verbose=False).run(test)
1279    ... # doctest: +ELLIPSIS
1280    **********************************************************************
1281    File ..., line 3, in f
1282    Failed example:
1283        print '\n'.join('abcdefg')
1284    Expected:
1285        a
1286        B
1287        c
1288        d
1289        f
1290        g
1291        h
1292    Got:
1293        a
1294        b
1295        c
1296        d
1297        e
1298        f
1299        g
1300    TestResults(failed=1, attempted=1)
1301
1302    >>> # With the flag:
1303    >>> test = doctest.DocTestFinder().find(f)[0]
1304    >>> flags = doctest.REPORT_UDIFF
1305    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1306    ... # doctest: +ELLIPSIS
1307    **********************************************************************
1308    File ..., line 3, in f
1309    Failed example:
1310        print '\n'.join('abcdefg')
1311    Differences (unified diff with -expected +actual):
1312        @@ -1,7 +1,7 @@
1313         a
1314        -B
1315        +b
1316         c
1317         d
1318        +e
1319         f
1320         g
1321        -h
1322    TestResults(failed=1, attempted=1)
1323
1324The REPORT_CDIFF flag causes failures that involve multi-line expected
1325and actual outputs to be displayed using a context diff:
1326
1327    >>> # Reuse f() from the REPORT_UDIFF example, above.
1328    >>> test = doctest.DocTestFinder().find(f)[0]
1329    >>> flags = doctest.REPORT_CDIFF
1330    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1331    ... # doctest: +ELLIPSIS
1332    **********************************************************************
1333    File ..., line 3, in f
1334    Failed example:
1335        print '\n'.join('abcdefg')
1336    Differences (context diff with expected followed by actual):
1337        ***************
1338        *** 1,7 ****
1339          a
1340        ! B
1341          c
1342          d
1343          f
1344          g
1345        - h
1346        --- 1,7 ----
1347          a
1348        ! b
1349          c
1350          d
1351        + e
1352          f
1353          g
1354    TestResults(failed=1, attempted=1)
1355
1356
1357The REPORT_NDIFF flag causes failures to use the difflib.Differ algorithm
1358used by the popular ndiff.py utility.  This does intraline difference
1359marking, as well as interline differences.
1360
1361    >>> def f(x):
1362    ...     r'''
1363    ...     >>> print "a b  c d e f g h i   j k l m"
1364    ...     a b c d e f g h i j k 1 m
1365    ...     '''
1366    >>> test = doctest.DocTestFinder().find(f)[0]
1367    >>> flags = doctest.REPORT_NDIFF
1368    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1369    ... # doctest: +ELLIPSIS
1370    **********************************************************************
1371    File ..., line 3, in f
1372    Failed example:
1373        print "a b  c d e f g h i   j k l m"
1374    Differences (ndiff with -expected +actual):
1375        - a b c d e f g h i j k 1 m
1376        ?                       ^
1377        + a b  c d e f g h i   j k l m
1378        ?     +              ++    ^
1379    TestResults(failed=1, attempted=1)
1380
1381The REPORT_ONLY_FIRST_FAILURE suppresses result output after the first
1382failing example:
1383
1384    >>> def f(x):
1385    ...     r'''
1386    ...     >>> print 1 # first success
1387    ...     1
1388    ...     >>> print 2 # first failure
1389    ...     200
1390    ...     >>> print 3 # second failure
1391    ...     300
1392    ...     >>> print 4 # second success
1393    ...     4
1394    ...     >>> print 5 # third failure
1395    ...     500
1396    ...     '''
1397    >>> test = doctest.DocTestFinder().find(f)[0]
1398    >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE
1399    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1400    ... # doctest: +ELLIPSIS
1401    **********************************************************************
1402    File ..., line 5, in f
1403    Failed example:
1404        print 2 # first failure
1405    Expected:
1406        200
1407    Got:
1408        2
1409    TestResults(failed=3, attempted=5)
1410
1411However, output from `report_start` is not suppressed:
1412
1413    >>> doctest.DocTestRunner(verbose=True, optionflags=flags).run(test)
1414    ... # doctest: +ELLIPSIS
1415    Trying:
1416        print 1 # first success
1417    Expecting:
1418        1
1419    ok
1420    Trying:
1421        print 2 # first failure
1422    Expecting:
1423        200
1424    **********************************************************************
1425    File ..., line 5, in f
1426    Failed example:
1427        print 2 # first failure
1428    Expected:
1429        200
1430    Got:
1431        2
1432    TestResults(failed=3, attempted=5)
1433
1434For the purposes of REPORT_ONLY_FIRST_FAILURE, unexpected exceptions
1435count as failures:
1436
1437    >>> def f(x):
1438    ...     r'''
1439    ...     >>> print 1 # first success
1440    ...     1
1441    ...     >>> raise ValueError(2) # first failure
1442    ...     200
1443    ...     >>> print 3 # second failure
1444    ...     300
1445    ...     >>> print 4 # second success
1446    ...     4
1447    ...     >>> print 5 # third failure
1448    ...     500
1449    ...     '''
1450    >>> test = doctest.DocTestFinder().find(f)[0]
1451    >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE
1452    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
1453    ... # doctest: +ELLIPSIS
1454    **********************************************************************
1455    File ..., line 5, in f
1456    Failed example:
1457        raise ValueError(2) # first failure
1458    Exception raised:
1459        ...
1460        ValueError: 2
1461    TestResults(failed=3, attempted=5)
1462
1463New option flags can also be registered, via register_optionflag().  Here
1464we reach into doctest's internals a bit.
1465
1466    >>> unlikely = "UNLIKELY_OPTION_NAME"
1467    >>> unlikely in doctest.OPTIONFLAGS_BY_NAME
1468    False
1469    >>> new_flag_value = doctest.register_optionflag(unlikely)
1470    >>> unlikely in doctest.OPTIONFLAGS_BY_NAME
1471    True
1472
1473Before 2.4.4/2.5, registering a name more than once erroneously created
1474more than one flag value.  Here we verify that's fixed:
1475
1476    >>> redundant_flag_value = doctest.register_optionflag(unlikely)
1477    >>> redundant_flag_value == new_flag_value
1478    True
1479
1480Clean up.
1481    >>> del doctest.OPTIONFLAGS_BY_NAME[unlikely]
1482
1483    """
1484
1485    def option_directives(): r"""
1486Tests of `DocTestRunner`'s option directive mechanism.
1487
1488Option directives can be used to turn option flags on or off for a
1489single example.  To turn an option on for an example, follow that
1490example with a comment of the form ``# doctest: +OPTION``:
1491
1492    >>> def f(x): r'''
1493    ...     >>> print range(10)       # should fail: no ellipsis
1494    ...     [0, 1, ..., 9]
1495    ...
1496    ...     >>> print range(10)       # doctest: +ELLIPSIS
1497    ...     [0, 1, ..., 9]
1498    ...     '''
1499    >>> test = doctest.DocTestFinder().find(f)[0]
1500    >>> doctest.DocTestRunner(verbose=False).run(test)
1501    ... # doctest: +ELLIPSIS
1502    **********************************************************************
1503    File ..., line 2, in f
1504    Failed example:
1505        print range(10)       # should fail: no ellipsis
1506    Expected:
1507        [0, 1, ..., 9]
1508    Got:
1509        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1510    TestResults(failed=1, attempted=2)
1511
1512To turn an option off for an example, follow that example with a
1513comment of the form ``# doctest: -OPTION``:
1514
1515    >>> def f(x): r'''
1516    ...     >>> print range(10)
1517    ...     [0, 1, ..., 9]
1518    ...
1519    ...     >>> # should fail: no ellipsis
1520    ...     >>> print range(10)       # doctest: -ELLIPSIS
1521    ...     [0, 1, ..., 9]
1522    ...     '''
1523    >>> test = doctest.DocTestFinder().find(f)[0]
1524    >>> doctest.DocTestRunner(verbose=False,
1525    ...                       optionflags=doctest.ELLIPSIS).run(test)
1526    ... # doctest: +ELLIPSIS
1527    **********************************************************************
1528    File ..., line 6, in f
1529    Failed example:
1530        print range(10)       # doctest: -ELLIPSIS
1531    Expected:
1532        [0, 1, ..., 9]
1533    Got:
1534        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1535    TestResults(failed=1, attempted=2)
1536
1537Option directives affect only the example that they appear with; they
1538do not change the options for surrounding examples:
1539
1540    >>> def f(x): r'''
1541    ...     >>> print range(10)       # Should fail: no ellipsis
1542    ...     [0, 1, ..., 9]
1543    ...
1544    ...     >>> print range(10)       # doctest: +ELLIPSIS
1545    ...     [0, 1, ..., 9]
1546    ...
1547    ...     >>> print range(10)       # Should fail: no ellipsis
1548    ...     [0, 1, ..., 9]
1549    ...     '''
1550    >>> test = doctest.DocTestFinder().find(f)[0]
1551    >>> doctest.DocTestRunner(verbose=False).run(test)
1552    ... # doctest: +ELLIPSIS
1553    **********************************************************************
1554    File ..., line 2, in f
1555    Failed example:
1556        print range(10)       # Should fail: no ellipsis
1557    Expected:
1558        [0, 1, ..., 9]
1559    Got:
1560        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1561    **********************************************************************
1562    File ..., line 8, in f
1563    Failed example:
1564        print range(10)       # Should fail: no ellipsis
1565    Expected:
1566        [0, 1, ..., 9]
1567    Got:
1568        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1569    TestResults(failed=2, attempted=3)
1570
1571Multiple options may be modified by a single option directive.  They
1572may be separated by whitespace, commas, or both:
1573
1574    >>> def f(x): r'''
1575    ...     >>> print range(10)       # Should fail
1576    ...     [0, 1,  ...,   9]
1577    ...     >>> print range(10)       # Should succeed
1578    ...     ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
1579    ...     [0, 1,  ...,   9]
1580    ...     '''
1581    >>> test = doctest.DocTestFinder().find(f)[0]
1582    >>> doctest.DocTestRunner(verbose=False).run(test)
1583    ... # doctest: +ELLIPSIS
1584    **********************************************************************
1585    File ..., line 2, in f
1586    Failed example:
1587        print range(10)       # Should fail
1588    Expected:
1589        [0, 1,  ...,   9]
1590    Got:
1591        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1592    TestResults(failed=1, attempted=2)
1593
1594    >>> def f(x): r'''
1595    ...     >>> print range(10)       # Should fail
1596    ...     [0, 1,  ...,   9]
1597    ...     >>> print range(10)       # Should succeed
1598    ...     ... # doctest: +ELLIPSIS,+NORMALIZE_WHITESPACE
1599    ...     [0, 1,  ...,   9]
1600    ...     '''
1601    >>> test = doctest.DocTestFinder().find(f)[0]
1602    >>> doctest.DocTestRunner(verbose=False).run(test)
1603    ... # doctest: +ELLIPSIS
1604    **********************************************************************
1605    File ..., line 2, in f
1606    Failed example:
1607        print range(10)       # Should fail
1608    Expected:
1609        [0, 1,  ...,   9]
1610    Got:
1611        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1612    TestResults(failed=1, attempted=2)
1613
1614    >>> def f(x): r'''
1615    ...     >>> print range(10)       # Should fail
1616    ...     [0, 1,  ...,   9]
1617    ...     >>> print range(10)       # Should succeed
1618    ...     ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
1619    ...     [0, 1,  ...,   9]
1620    ...     '''
1621    >>> test = doctest.DocTestFinder().find(f)[0]
1622    >>> doctest.DocTestRunner(verbose=False).run(test)
1623    ... # doctest: +ELLIPSIS
1624    **********************************************************************
1625    File ..., line 2, in f
1626    Failed example:
1627        print range(10)       # Should fail
1628    Expected:
1629        [0, 1,  ...,   9]
1630    Got:
1631        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1632    TestResults(failed=1, attempted=2)
1633
1634The option directive may be put on the line following the source, as
1635long as a continuation prompt is used:
1636
1637    >>> def f(x): r'''
1638    ...     >>> print range(10)
1639    ...     ... # doctest: +ELLIPSIS
1640    ...     [0, 1, ..., 9]
1641    ...     '''
1642    >>> test = doctest.DocTestFinder().find(f)[0]
1643    >>> doctest.DocTestRunner(verbose=False).run(test)
1644    TestResults(failed=0, attempted=1)
1645
1646For examples with multi-line source, the option directive may appear
1647at the end of any line:
1648
1649    >>> def f(x): r'''
1650    ...     >>> for x in range(10): # doctest: +ELLIPSIS
1651    ...     ...     print x,
1652    ...     0 1 2 ... 9
1653    ...
1654    ...     >>> for x in range(10):
1655    ...     ...     print x,        # doctest: +ELLIPSIS
1656    ...     0 1 2 ... 9
1657    ...     '''
1658    >>> test = doctest.DocTestFinder().find(f)[0]
1659    >>> doctest.DocTestRunner(verbose=False).run(test)
1660    TestResults(failed=0, attempted=2)
1661
1662If more than one line of an example with multi-line source has an
1663option directive, then they are combined:
1664
1665    >>> def f(x): r'''
1666    ...     Should fail (option directive not on the last line):
1667    ...         >>> for x in range(10): # doctest: +ELLIPSIS
1668    ...         ...     print x,        # doctest: +NORMALIZE_WHITESPACE
1669    ...         0  1    2...9
1670    ...     '''
1671    >>> test = doctest.DocTestFinder().find(f)[0]
1672    >>> doctest.DocTestRunner(verbose=False).run(test)
1673    TestResults(failed=0, attempted=1)
1674
1675It is an error to have a comment of the form ``# doctest:`` that is
1676*not* followed by words of the form ``+OPTION`` or ``-OPTION``, where
1677``OPTION`` is an option that has been registered with
1678`register_option`:
1679
1680    >>> # Error: Option not registered
1681    >>> s = '>>> print 12   #doctest: +BADOPTION'
1682    >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1683    Traceback (most recent call last):
1684    ValueError: line 1 of the doctest for s has an invalid option: '+BADOPTION'
1685
1686    >>> # Error: No + or - prefix
1687    >>> s = '>>> print 12   #doctest: ELLIPSIS'
1688    >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1689    Traceback (most recent call last):
1690    ValueError: line 1 of the doctest for s has an invalid option: 'ELLIPSIS'
1691
1692It is an error to use an option directive on a line that contains no
1693source:
1694
1695    >>> s = '>>> # doctest: +ELLIPSIS'
1696    >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
1697    Traceback (most recent call last):
1698    ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS'
1699
1700    """
1701
1702    def test_unicode_output(self): r"""
1703
1704Check that unicode output works:
1705
1706    >>> u'\xe9'
1707    u'\xe9'
1708
1709If we return unicode, SpoofOut's buf variable becomes automagically
1710converted to unicode. This means all subsequent output becomes converted
1711to unicode, and if the output contains non-ascii characters that failed.
1712It used to be that this state change carried on between tests, meaning
1713tests would fail if unicode has been output previously in the testrun.
1714This test tests that this is no longer so:
1715
1716    >>> print u'abc'
1717    abc
1718
1719And then return a string with non-ascii characters:
1720
1721    >>> print u'\xe9'.encode('utf-8')
1722    é
1723
1724    """
1725
1726
1727def test_testsource(): r"""
1728Unit tests for `testsource()`.
1729
1730The testsource() function takes a module and a name, finds the (first)
1731test with that name in that module, and converts it to a script. The
1732example code is converted to regular Python code.  The surrounding
1733words and expected output are converted to comments:
1734
1735    >>> import test.test_doctest
1736    >>> name = 'test.test_doctest.sample_func'
1737    >>> print doctest.testsource(test.test_doctest, name)
1738    # Blah blah
1739    #
1740    print sample_func(22)
1741    # Expected:
1742    ## 44
1743    #
1744    # Yee ha!
1745    <BLANKLINE>
1746
1747    >>> name = 'test.test_doctest.SampleNewStyleClass'
1748    >>> print doctest.testsource(test.test_doctest, name)
1749    print '1\n2\n3'
1750    # Expected:
1751    ## 1
1752    ## 2
1753    ## 3
1754    <BLANKLINE>
1755
1756    >>> name = 'test.test_doctest.SampleClass.a_classmethod'
1757    >>> print doctest.testsource(test.test_doctest, name)
1758    print SampleClass.a_classmethod(10)
1759    # Expected:
1760    ## 12
1761    print SampleClass(0).a_classmethod(10)
1762    # Expected:
1763    ## 12
1764    <BLANKLINE>
1765"""
1766
1767def test_debug(): r"""
1768
1769Create a docstring that we want to debug:
1770
1771    >>> s = '''
1772    ...     >>> x = 12
1773    ...     >>> print x
1774    ...     12
1775    ...     '''
1776
1777Create some fake stdin input, to feed to the debugger:
1778
1779    >>> import tempfile
1780    >>> real_stdin = sys.stdin
1781    >>> sys.stdin = _FakeInput(['next', 'print x', 'continue'])
1782
1783Run the debugger on the docstring, and then restore sys.stdin.
1784
1785    >>> try: doctest.debug_src(s)
1786    ... finally: sys.stdin = real_stdin
1787    > <string>(1)<module>()
1788    (Pdb) next
1789    12
1790    --Return--
1791    > <string>(1)<module>()->None
1792    (Pdb) print x
1793    12
1794    (Pdb) continue
1795
1796"""
1797
1798def test_pdb_set_trace():
1799    """Using pdb.set_trace from a doctest.
1800
1801    You can use pdb.set_trace from a doctest.  To do so, you must
1802    retrieve the set_trace function from the pdb module at the time
1803    you use it.  The doctest module changes sys.stdout so that it can
1804    capture program output.  It also temporarily replaces pdb.set_trace
1805    with a version that restores stdout.  This is necessary for you to
1806    see debugger output.
1807
1808      >>> doc = '''
1809      ... >>> x = 42
1810      ... >>> raise Exception('clé')
1811      ... Traceback (most recent call last):
1812      ... Exception: clé
1813      ... >>> import pdb; pdb.set_trace()
1814      ... '''
1815      >>> parser = doctest.DocTestParser()
1816      >>> test = parser.get_doctest(doc, {}, "foo-bär@baz", "foo-bär@baz.py", 0)
1817      >>> runner = doctest.DocTestRunner(verbose=False)
1818
1819    To demonstrate this, we'll create a fake standard input that
1820    captures our debugger input:
1821
1822      >>> import tempfile
1823      >>> real_stdin = sys.stdin
1824      >>> sys.stdin = _FakeInput([
1825      ...    'print x',  # print data defined by the example
1826      ...    'continue', # stop debugging
1827      ...    ''])
1828
1829      >>> try: runner.run(test)
1830      ... finally: sys.stdin = real_stdin
1831      --Return--
1832      > <doctest foo-bär@baz[2]>(1)<module>()->None
1833      -> import pdb; pdb.set_trace()
1834      (Pdb) print x
1835      42
1836      (Pdb) continue
1837      TestResults(failed=0, attempted=3)
1838
1839      You can also put pdb.set_trace in a function called from a test:
1840
1841      >>> def calls_set_trace():
1842      ...    y=2
1843      ...    import pdb; pdb.set_trace()
1844
1845      >>> doc = '''
1846      ... >>> x=1
1847      ... >>> calls_set_trace()
1848      ... '''
1849      >>> test = parser.get_doctest(doc, globals(), "foo-bär@baz", "foo-bär@baz.py", 0)
1850      >>> real_stdin = sys.stdin
1851      >>> sys.stdin = _FakeInput([
1852      ...    'print y',  # print data defined in the function
1853      ...    'up',       # out of function
1854      ...    'print x',  # print data defined by the example
1855      ...    'continue', # stop debugging
1856      ...    ''])
1857
1858      >>> try:
1859      ...     runner.run(test)
1860      ... finally:
1861      ...     sys.stdin = real_stdin
1862      --Return--
1863      > <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None
1864      -> import pdb; pdb.set_trace()
1865      (Pdb) print y
1866      2
1867      (Pdb) up
1868      > <doctest foo-bär@baz[1]>(1)<module>()
1869      -> calls_set_trace()
1870      (Pdb) print x
1871      1
1872      (Pdb) continue
1873      TestResults(failed=0, attempted=2)
1874
1875    During interactive debugging, source code is shown, even for
1876    doctest examples:
1877
1878      >>> doc = '''
1879      ... >>> def f(x):
1880      ... ...     g(x*2)
1881      ... >>> def g(x):
1882      ... ...     print x+3
1883      ... ...     import pdb; pdb.set_trace()
1884      ... >>> f(3)
1885      ... '''
1886      >>> test = parser.get_doctest(doc, globals(), "foo-bär@baz", "foo-bär@baz.py", 0)
1887      >>> real_stdin = sys.stdin
1888      >>> sys.stdin = _FakeInput([
1889      ...    'list',     # list source from example 2
1890      ...    'next',     # return from g()
1891      ...    'list',     # list source from example 1
1892      ...    'next',     # return from f()
1893      ...    'list',     # list source from example 3
1894      ...    'continue', # stop debugging
1895      ...    ''])
1896      >>> try: runner.run(test)
1897      ... finally: sys.stdin = real_stdin
1898      ... # doctest: +NORMALIZE_WHITESPACE
1899      --Return--
1900      > <doctest foo-bär@baz[1]>(3)g()->None
1901      -> import pdb; pdb.set_trace()
1902      (Pdb) list
1903        1     def g(x):
1904        2         print x+3
1905        3  ->     import pdb; pdb.set_trace()
1906      [EOF]
1907      (Pdb) next
1908      --Return--
1909      > <doctest foo-bär@baz[0]>(2)f()->None
1910      -> g(x*2)
1911      (Pdb) list
1912        1     def f(x):
1913        2  ->     g(x*2)
1914      [EOF]
1915      (Pdb) next
1916      --Return--
1917      > <doctest foo-bär@baz[2]>(1)<module>()->None
1918      -> f(3)
1919      (Pdb) list
1920        1  -> f(3)
1921      [EOF]
1922      (Pdb) continue
1923      **********************************************************************
1924      File "foo-bär@baz.py", line 7, in foo-bär@baz
1925      Failed example:
1926          f(3)
1927      Expected nothing
1928      Got:
1929          9
1930      TestResults(failed=1, attempted=3)
1931      """
1932
1933def test_pdb_set_trace_nested():
1934    """This illustrates more-demanding use of set_trace with nested functions.
1935
1936    >>> class C(object):
1937    ...     def calls_set_trace(self):
1938    ...         y = 1
1939    ...         import pdb; pdb.set_trace()
1940    ...         self.f1()
1941    ...         y = 2
1942    ...     def f1(self):
1943    ...         x = 1
1944    ...         self.f2()
1945    ...         x = 2
1946    ...     def f2(self):
1947    ...         z = 1
1948    ...         z = 2
1949
1950    >>> calls_set_trace = C().calls_set_trace
1951
1952    >>> doc = '''
1953    ... >>> a = 1
1954    ... >>> calls_set_trace()
1955    ... '''
1956    >>> parser = doctest.DocTestParser()
1957    >>> runner = doctest.DocTestRunner(verbose=False)
1958    >>> test = parser.get_doctest(doc, globals(), "foo-bär@baz", "foo-bär@baz.py", 0)
1959    >>> real_stdin = sys.stdin
1960    >>> sys.stdin = _FakeInput([
1961    ...    'print y',  # print data defined in the function
1962    ...    'step', 'step', 'step', 'step', 'step', 'step', 'print z',
1963    ...    'up', 'print x',
1964    ...    'up', 'print y',
1965    ...    'up', 'print foo',
1966    ...    'continue', # stop debugging
1967    ...    ''])
1968
1969    >>> try:
1970    ...     runner.run(test)
1971    ... finally:
1972    ...     sys.stdin = real_stdin
1973    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
1974    -> self.f1()
1975    (Pdb) print y
1976    1
1977    (Pdb) step
1978    --Call--
1979    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1()
1980    -> def f1(self):
1981    (Pdb) step
1982    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1()
1983    -> x = 1
1984    (Pdb) step
1985    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
1986    -> self.f2()
1987    (Pdb) step
1988    --Call--
1989    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2()
1990    -> def f2(self):
1991    (Pdb) step
1992    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2()
1993    -> z = 1
1994    (Pdb) step
1995    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2()
1996    -> z = 2
1997    (Pdb) print z
1998    1
1999    (Pdb) up
2000    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1()
2001    -> self.f2()
2002    (Pdb) print x
2003    1
2004    (Pdb) up
2005    > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace()
2006    -> self.f1()
2007    (Pdb) print y
2008    1
2009    (Pdb) up
2010    > <doctest foo-bär@baz[1]>(1)<module>()
2011    -> calls_set_trace()
2012    (Pdb) print foo
2013    *** NameError: name 'foo' is not defined
2014    (Pdb) continue
2015    TestResults(failed=0, attempted=2)
2016"""
2017
2018def test_DocTestSuite():
2019    """DocTestSuite creates a unittest test suite from a doctest.
2020
2021       We create a Suite by providing a module.  A module can be provided
2022       by passing a module object:
2023
2024         >>> import unittest
2025         >>> import test.sample_doctest
2026         >>> suite = doctest.DocTestSuite(test.sample_doctest)
2027         >>> suite.run(unittest.TestResult())
2028         <unittest.result.TestResult run=9 errors=0 failures=4>
2029
2030       We can also supply the module by name:
2031
2032         >>> suite = doctest.DocTestSuite('test.sample_doctest')
2033         >>> suite.run(unittest.TestResult())
2034         <unittest.result.TestResult run=9 errors=0 failures=4>
2035
2036       The module need not contain any doctest examples:
2037
2038         >>> suite = doctest.DocTestSuite('test.sample_doctest_no_doctests')
2039         >>> suite.run(unittest.TestResult())
2040         <unittest.result.TestResult run=0 errors=0 failures=0>
2041
2042       However, if DocTestSuite finds no docstrings, it raises an error:
2043
2044         >>> try:
2045         ...     doctest.DocTestSuite('test.sample_doctest_no_docstrings')
2046         ... except ValueError as e:
2047         ...     error = e
2048
2049         >>> print(error.args[1])
2050         has no docstrings
2051
2052       You can prevent this error by passing a DocTestFinder instance with
2053       the `exclude_empty` keyword argument set to False:
2054
2055         >>> finder = doctest.DocTestFinder(exclude_empty=False)
2056         >>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings',
2057         ...                              test_finder=finder)
2058         >>> suite.run(unittest.TestResult())
2059         <unittest.result.TestResult run=0 errors=0 failures=0>
2060
2061       We can use the current module:
2062
2063         >>> suite = test.sample_doctest.test_suite()
2064         >>> suite.run(unittest.TestResult())
2065         <unittest.result.TestResult run=9 errors=0 failures=4>
2066
2067       We can supply global variables.  If we pass globs, they will be
2068       used instead of the module globals.  Here we'll pass an empty
2069       globals, triggering an extra error:
2070
2071         >>> suite = doctest.DocTestSuite('test.sample_doctest', globs={})
2072         >>> suite.run(unittest.TestResult())
2073         <unittest.result.TestResult run=9 errors=0 failures=5>
2074
2075       Alternatively, we can provide extra globals.  Here we'll make an
2076       error go away by providing an extra global variable:
2077
2078         >>> suite = doctest.DocTestSuite('test.sample_doctest',
2079         ...                              extraglobs={'y': 1})
2080         >>> suite.run(unittest.TestResult())
2081         <unittest.result.TestResult run=9 errors=0 failures=3>
2082
2083       You can pass option flags.  Here we'll cause an extra error
2084       by disabling the blank-line feature:
2085
2086         >>> suite = doctest.DocTestSuite('test.sample_doctest',
2087         ...                      optionflags=doctest.DONT_ACCEPT_BLANKLINE)
2088         >>> suite.run(unittest.TestResult())
2089         <unittest.result.TestResult run=9 errors=0 failures=5>
2090
2091       You can supply setUp and tearDown functions:
2092
2093         >>> def setUp(t):
2094         ...     import test.test_doctest
2095         ...     test.test_doctest.sillySetup = True
2096
2097         >>> def tearDown(t):
2098         ...     import test.test_doctest
2099         ...     del test.test_doctest.sillySetup
2100
2101       Here, we installed a silly variable that the test expects:
2102
2103         >>> suite = doctest.DocTestSuite('test.sample_doctest',
2104         ...      setUp=setUp, tearDown=tearDown)
2105         >>> suite.run(unittest.TestResult())
2106         <unittest.result.TestResult run=9 errors=0 failures=3>
2107
2108       But the tearDown restores sanity:
2109
2110         >>> import test.test_doctest
2111         >>> test.test_doctest.sillySetup
2112         Traceback (most recent call last):
2113         ...
2114         AttributeError: 'module' object has no attribute 'sillySetup'
2115
2116       The setUp and tearDown functions are passed test objects. Here
2117       we'll use the setUp function to supply the missing variable y:
2118
2119         >>> def setUp(test):
2120         ...     test.globs['y'] = 1
2121
2122         >>> suite = doctest.DocTestSuite('test.sample_doctest', setUp=setUp)
2123         >>> suite.run(unittest.TestResult())
2124         <unittest.result.TestResult run=9 errors=0 failures=3>
2125
2126       Here, we didn't need to use a tearDown function because we
2127       modified the test globals, which are a copy of the
2128       sample_doctest module dictionary.  The test globals are
2129       automatically cleared for us after a test.
2130       """
2131
2132def test_DocFileSuite():
2133    """We can test tests found in text files using a DocFileSuite.
2134
2135       We create a suite by providing the names of one or more text
2136       files that include examples:
2137
2138         >>> import unittest
2139         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2140         ...                              'test_doctest2.txt',
2141         ...                              'test_doctest4.txt')
2142         >>> suite.run(unittest.TestResult())
2143         <unittest.result.TestResult run=3 errors=0 failures=3>
2144
2145       The test files are looked for in the directory containing the
2146       calling module.  A package keyword argument can be provided to
2147       specify a different relative location.
2148
2149         >>> import unittest
2150         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2151         ...                              'test_doctest2.txt',
2152         ...                              'test_doctest4.txt',
2153         ...                              package='test')
2154         >>> suite.run(unittest.TestResult())
2155         <unittest.result.TestResult run=3 errors=0 failures=3>
2156
2157       Support for using a package's __loader__.get_data() is also
2158       provided.
2159
2160         >>> import unittest, pkgutil, test
2161         >>> added_loader = False
2162         >>> if not hasattr(test, '__loader__'):
2163         ...     test.__loader__ = pkgutil.get_loader(test)
2164         ...     added_loader = True
2165         >>> try:
2166         ...     suite = doctest.DocFileSuite('test_doctest.txt',
2167         ...                                  'test_doctest2.txt',
2168         ...                                  'test_doctest4.txt',
2169         ...                                  package='test')
2170         ...     suite.run(unittest.TestResult())
2171         ... finally:
2172         ...     if added_loader:
2173         ...         del test.__loader__
2174         <unittest.result.TestResult run=3 errors=0 failures=3>
2175
2176       '/' should be used as a path separator.  It will be converted
2177       to a native separator at run time:
2178
2179         >>> suite = doctest.DocFileSuite('../test/test_doctest.txt')
2180         >>> suite.run(unittest.TestResult())
2181         <unittest.result.TestResult run=1 errors=0 failures=1>
2182
2183       If DocFileSuite is used from an interactive session, then files
2184       are resolved relative to the directory of sys.argv[0]:
2185
2186         >>> import types, os.path, test.test_doctest
2187         >>> save_argv = sys.argv
2188         >>> sys.argv = [test.test_doctest.__file__]
2189         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2190         ...                              package=types.ModuleType('__main__'))
2191         >>> sys.argv = save_argv
2192
2193       By setting `module_relative=False`, os-specific paths may be
2194       used (including absolute paths and paths relative to the
2195       working directory):
2196
2197         >>> # Get the absolute path of the test package.
2198         >>> test_doctest_path = os.path.abspath(test.test_doctest.__file__)
2199         >>> test_pkg_path = os.path.split(test_doctest_path)[0]
2200
2201         >>> # Use it to find the absolute path of test_doctest.txt.
2202         >>> test_file = os.path.join(test_pkg_path, 'test_doctest.txt')
2203
2204         >>> suite = doctest.DocFileSuite(test_file, module_relative=False)
2205         >>> suite.run(unittest.TestResult())
2206         <unittest.result.TestResult run=1 errors=0 failures=1>
2207
2208       It is an error to specify `package` when `module_relative=False`:
2209
2210         >>> suite = doctest.DocFileSuite(test_file, module_relative=False,
2211         ...                              package='test')
2212         Traceback (most recent call last):
2213         ValueError: Package may only be specified for module-relative paths.
2214
2215       You can specify initial global variables:
2216
2217         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2218         ...                              'test_doctest2.txt',
2219         ...                              'test_doctest4.txt',
2220         ...                              globs={'favorite_color': 'blue'})
2221         >>> suite.run(unittest.TestResult())
2222         <unittest.result.TestResult run=3 errors=0 failures=2>
2223
2224       In this case, we supplied a missing favorite color. You can
2225       provide doctest options:
2226
2227         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2228         ...                              'test_doctest2.txt',
2229         ...                              'test_doctest4.txt',
2230         ...                         optionflags=doctest.DONT_ACCEPT_BLANKLINE,
2231         ...                              globs={'favorite_color': 'blue'})
2232         >>> suite.run(unittest.TestResult())
2233         <unittest.result.TestResult run=3 errors=0 failures=3>
2234
2235       And, you can provide setUp and tearDown functions:
2236
2237         >>> def setUp(t):
2238         ...     import test.test_doctest
2239         ...     test.test_doctest.sillySetup = True
2240
2241         >>> def tearDown(t):
2242         ...     import test.test_doctest
2243         ...     del test.test_doctest.sillySetup
2244
2245       Here, we installed a silly variable that the test expects:
2246
2247         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2248         ...                              'test_doctest2.txt',
2249         ...                              'test_doctest4.txt',
2250         ...                              setUp=setUp, tearDown=tearDown)
2251         >>> suite.run(unittest.TestResult())
2252         <unittest.result.TestResult run=3 errors=0 failures=2>
2253
2254       But the tearDown restores sanity:
2255
2256         >>> import test.test_doctest
2257         >>> test.test_doctest.sillySetup
2258         Traceback (most recent call last):
2259         ...
2260         AttributeError: 'module' object has no attribute 'sillySetup'
2261
2262       The setUp and tearDown functions are passed test objects.
2263       Here, we'll use a setUp function to set the favorite color in
2264       test_doctest.txt:
2265
2266         >>> def setUp(test):
2267         ...     test.globs['favorite_color'] = 'blue'
2268
2269         >>> suite = doctest.DocFileSuite('test_doctest.txt', setUp=setUp)
2270         >>> suite.run(unittest.TestResult())
2271         <unittest.result.TestResult run=1 errors=0 failures=0>
2272
2273       Here, we didn't need to use a tearDown function because we
2274       modified the test globals.  The test globals are
2275       automatically cleared for us after a test.
2276
2277       Tests in a file run using `DocFileSuite` can also access the
2278       `__file__` global, which is set to the name of the file
2279       containing the tests:
2280
2281         >>> suite = doctest.DocFileSuite('test_doctest3.txt')
2282         >>> suite.run(unittest.TestResult())
2283         <unittest.result.TestResult run=1 errors=0 failures=0>
2284
2285       If the tests contain non-ASCII characters, we have to specify which
2286       encoding the file is encoded with. We do so by using the `encoding`
2287       parameter:
2288
2289         >>> suite = doctest.DocFileSuite('test_doctest.txt',
2290         ...                              'test_doctest2.txt',
2291         ...                              'test_doctest4.txt',
2292         ...                              encoding='utf-8')
2293         >>> suite.run(unittest.TestResult())
2294         <unittest.result.TestResult run=3 errors=0 failures=2>
2295
2296       """
2297
2298def test_trailing_space_in_test():
2299    """
2300    Trailing spaces in expected output are significant:
2301
2302      >>> x, y = 'foo', ''
2303      >>> print x, y
2304      foo \n
2305    """
2306
2307
2308def test_unittest_reportflags():
2309    """Default unittest reporting flags can be set to control reporting
2310
2311    Here, we'll set the REPORT_ONLY_FIRST_FAILURE option so we see
2312    only the first failure of each test.  First, we'll look at the
2313    output without the flag.  The file test_doctest.txt file has two
2314    tests. They both fail if blank lines are disabled:
2315
2316      >>> suite = doctest.DocFileSuite('test_doctest.txt',
2317      ...                          optionflags=doctest.DONT_ACCEPT_BLANKLINE)
2318      >>> import unittest
2319      >>> result = suite.run(unittest.TestResult())
2320      >>> print result.failures[0][1] # doctest: +ELLIPSIS
2321      Traceback ...
2322      Failed example:
2323          favorite_color
2324      ...
2325      Failed example:
2326          if 1:
2327      ...
2328
2329    Note that we see both failures displayed.
2330
2331      >>> old = doctest.set_unittest_reportflags(
2332      ...    doctest.REPORT_ONLY_FIRST_FAILURE)
2333
2334    Now, when we run the test:
2335
2336      >>> result = suite.run(unittest.TestResult())
2337      >>> print result.failures[0][1] # doctest: +ELLIPSIS
2338      Traceback ...
2339      Failed example:
2340          favorite_color
2341      Exception raised:
2342          ...
2343          NameError: name 'favorite_color' is not defined
2344      <BLANKLINE>
2345      <BLANKLINE>
2346
2347    We get only the first failure.
2348
2349    If we give any reporting options when we set up the tests,
2350    however:
2351
2352      >>> suite = doctest.DocFileSuite('test_doctest.txt',
2353      ...     optionflags=doctest.DONT_ACCEPT_BLANKLINE | doctest.REPORT_NDIFF)
2354
2355    Then the default eporting options are ignored:
2356
2357      >>> result = suite.run(unittest.TestResult())
2358
2359    *NOTE*: These doctest are intentionally not placed in raw string to depict
2360    the trailing whitespace using `\x20` in the diff below.
2361
2362      >>> print(result.failures[0][1]) # doctest: +ELLIPSIS
2363      Traceback ...
2364      Failed example:
2365          favorite_color
2366      ...
2367      Failed example:
2368          if 1:
2369             print 'a'
2370             print
2371             print 'b'
2372      Differences (ndiff with -expected +actual):
2373            a
2374          - <BLANKLINE>
2375          +\x20
2376            b
2377      <BLANKLINE>
2378      <BLANKLINE>
2379
2380
2381    Test runners can restore the formatting flags after they run:
2382
2383      >>> ignored = doctest.set_unittest_reportflags(old)
2384
2385    """
2386
2387def test_testfile(): r"""
2388Tests for the `testfile()` function.  This function runs all the
2389doctest examples in a given file.  In its simple invokation, it is
2390called with the name of a file, which is taken to be relative to the
2391calling module.  The return value is (#failures, #tests).
2392
2393We don't want `-v` in sys.argv for these tests.
2394
2395    >>> save_argv = sys.argv
2396    >>> if '-v' in sys.argv:
2397    ...     sys.argv = [arg for arg in save_argv if arg != '-v']
2398
2399
2400    >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS
2401    **********************************************************************
2402    File "...", line 6, in test_doctest.txt
2403    Failed example:
2404        favorite_color
2405    Exception raised:
2406        ...
2407        NameError: name 'favorite_color' is not defined
2408    **********************************************************************
2409    1 items had failures:
2410       1 of   2 in test_doctest.txt
2411    ***Test Failed*** 1 failures.
2412    TestResults(failed=1, attempted=2)
2413    >>> doctest.master = None  # Reset master.
2414
2415(Note: we'll be clearing doctest.master after each call to
2416`doctest.testfile`, to suppress warnings about multiple tests with the
2417same name.)
2418
2419Globals may be specified with the `globs` and `extraglobs` parameters:
2420
2421    >>> globs = {'favorite_color': 'blue'}
2422    >>> doctest.testfile('test_doctest.txt', globs=globs)
2423    TestResults(failed=0, attempted=2)
2424    >>> doctest.master = None  # Reset master.
2425
2426    >>> extraglobs = {'favorite_color': 'red'}
2427    >>> doctest.testfile('test_doctest.txt', globs=globs,
2428    ...                  extraglobs=extraglobs) # doctest: +ELLIPSIS
2429    **********************************************************************
2430    File "...", line 6, in test_doctest.txt
2431    Failed example:
2432        favorite_color
2433    Expected:
2434        'blue'
2435    Got:
2436        'red'
2437    **********************************************************************
2438    1 items had failures:
2439       1 of   2 in test_doctest.txt
2440    ***Test Failed*** 1 failures.
2441    TestResults(failed=1, attempted=2)
2442    >>> doctest.master = None  # Reset master.
2443
2444The file may be made relative to a given module or package, using the
2445optional `module_relative` parameter:
2446
2447    >>> doctest.testfile('test_doctest.txt', globs=globs,
2448    ...                  module_relative='test')
2449    TestResults(failed=0, attempted=2)
2450    >>> doctest.master = None  # Reset master.
2451
2452Verbosity can be increased with the optional `verbose` parameter:
2453
2454    >>> doctest.testfile('test_doctest.txt', globs=globs, verbose=True)
2455    Trying:
2456        favorite_color
2457    Expecting:
2458        'blue'
2459    ok
2460    Trying:
2461        if 1:
2462           print 'a'
2463           print
2464           print 'b'
2465    Expecting:
2466        a
2467        <BLANKLINE>
2468        b
2469    ok
2470    1 items passed all tests:
2471       2 tests in test_doctest.txt
2472    2 tests in 1 items.
2473    2 passed and 0 failed.
2474    Test passed.
2475    TestResults(failed=0, attempted=2)
2476    >>> doctest.master = None  # Reset master.
2477
2478The name of the test may be specified with the optional `name`
2479parameter:
2480
2481    >>> doctest.testfile('test_doctest.txt', name='newname')
2482    ... # doctest: +ELLIPSIS
2483    **********************************************************************
2484    File "...", line 6, in newname
2485    ...
2486    TestResults(failed=1, attempted=2)
2487    >>> doctest.master = None  # Reset master.
2488
2489The summary report may be suppressed with the optional `report`
2490parameter:
2491
2492    >>> doctest.testfile('test_doctest.txt', report=False)
2493    ... # doctest: +ELLIPSIS
2494    **********************************************************************
2495    File "...", line 6, in test_doctest.txt
2496    Failed example:
2497        favorite_color
2498    Exception raised:
2499        ...
2500        NameError: name 'favorite_color' is not defined
2501    TestResults(failed=1, attempted=2)
2502    >>> doctest.master = None  # Reset master.
2503
2504The optional keyword argument `raise_on_error` can be used to raise an
2505exception on the first error (which may be useful for postmortem
2506debugging):
2507
2508    >>> doctest.testfile('test_doctest.txt', raise_on_error=True)
2509    ... # doctest: +ELLIPSIS
2510    Traceback (most recent call last):
2511    UnexpectedException: ...
2512    >>> doctest.master = None  # Reset master.
2513
2514If the tests contain non-ASCII characters, the tests might fail, since
2515it's unknown which encoding is used. The encoding can be specified
2516using the optional keyword argument `encoding`:
2517
2518    >>> doctest.testfile('test_doctest4.txt') # doctest: +ELLIPSIS
2519    **********************************************************************
2520    File "...", line 7, in test_doctest4.txt
2521    Failed example:
2522        u'...'
2523    Expected:
2524        u'f\xf6\xf6'
2525    Got:
2526        u'f\xc3\xb6\xc3\xb6'
2527    **********************************************************************
2528    ...
2529    **********************************************************************
2530    1 items had failures:
2531       2 of   4 in test_doctest4.txt
2532    ***Test Failed*** 2 failures.
2533    TestResults(failed=2, attempted=4)
2534    >>> doctest.master = None  # Reset master.
2535
2536    >>> doctest.testfile('test_doctest4.txt', encoding='utf-8')
2537    TestResults(failed=0, attempted=4)
2538    >>> doctest.master = None  # Reset master.
2539
2540Switch the module encoding to 'utf-8' to test the verbose output without
2541bothering with the current sys.stdout encoding.
2542
2543    >>> doctest._encoding, saved_encoding = 'utf-8', doctest._encoding
2544    >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True)
2545    Trying:
2546        u'föö'
2547    Expecting:
2548        u'f\xf6\xf6'
2549    ok
2550    Trying:
2551        u'bąr'
2552    Expecting:
2553        u'b\u0105r'
2554    ok
2555    Trying:
2556        'föö'
2557    Expecting:
2558        'f\xc3\xb6\xc3\xb6'
2559    ok
2560    Trying:
2561        'bąr'
2562    Expecting:
2563        'b\xc4\x85r'
2564    ok
2565    1 items passed all tests:
2566       4 tests in test_doctest4.txt
2567    4 tests in 1 items.
2568    4 passed and 0 failed.
2569    Test passed.
2570    TestResults(failed=0, attempted=4)
2571    >>> doctest._encoding = saved_encoding
2572    >>> doctest.master = None  # Reset master.
2573    >>> sys.argv = save_argv
2574"""
2575
2576def test_lineendings(): r"""
2577*nix systems use \n line endings, while Windows systems use \r\n.  Python
2578handles this using universal newline mode for reading files.  Let's make
2579sure doctest does so (issue 8473) by creating temporary test files using each
2580of the two line disciplines.  One of the two will be the "wrong" one for the
2581platform the test is run on.
2582
2583Windows line endings first:
2584
2585    >>> import tempfile, os
2586    >>> fn = tempfile.mktemp()
2587    >>> with open(fn, 'wb') as f:
2588    ...     f.write('Test:\r\n\r\n  >>> x = 1 + 1\r\n\r\nDone.\r\n')
2589    >>> doctest.testfile(fn, module_relative=False, verbose=False)
2590    TestResults(failed=0, attempted=1)
2591    >>> os.remove(fn)
2592
2593And now *nix line endings:
2594
2595    >>> fn = tempfile.mktemp()
2596    >>> with open(fn, 'wb') as f:
2597    ...     f.write('Test:\n\n  >>> x = 1 + 1\n\nDone.\n')
2598    >>> doctest.testfile(fn, module_relative=False, verbose=False)
2599    TestResults(failed=0, attempted=1)
2600    >>> os.remove(fn)
2601
2602"""
2603
2604# old_test1, ... used to live in doctest.py, but cluttered it.  Note
2605# that these use the deprecated doctest.Tester, so should go away (or
2606# be rewritten) someday.
2607
2608def old_test1(): r"""
2609>>> from doctest import Tester
2610>>> t = Tester(globs={'x': 42}, verbose=0)
2611>>> t.runstring(r'''
2612...      >>> x = x * 2
2613...      >>> print x
2614...      42
2615... ''', 'XYZ')
2616**********************************************************************
2617Line 3, in XYZ
2618Failed example:
2619    print x
2620Expected:
2621    42
2622Got:
2623    84
2624TestResults(failed=1, attempted=2)
2625>>> t.runstring(">>> x = x * 2\n>>> print x\n84\n", 'example2')
2626TestResults(failed=0, attempted=2)
2627>>> t.summarize()
2628**********************************************************************
26291 items had failures:
2630   1 of   2 in XYZ
2631***Test Failed*** 1 failures.
2632TestResults(failed=1, attempted=4)
2633>>> t.summarize(verbose=1)
26341 items passed all tests:
2635   2 tests in example2
2636**********************************************************************
26371 items had failures:
2638   1 of   2 in XYZ
26394 tests in 2 items.
26403 passed and 1 failed.
2641***Test Failed*** 1 failures.
2642TestResults(failed=1, attempted=4)
2643"""
2644
2645def old_test2(): r"""
2646        >>> from doctest import Tester
2647        >>> t = Tester(globs={}, verbose=1)
2648        >>> test = r'''
2649        ...    # just an example
2650        ...    >>> x = 1 + 2
2651        ...    >>> x
2652        ...    3
2653        ... '''
2654        >>> t.runstring(test, "Example")
2655        Running string Example
2656        Trying:
2657            x = 1 + 2
2658        Expecting nothing
2659        ok
2660        Trying:
2661            x
2662        Expecting:
2663            3
2664        ok
2665        0 of 2 examples failed in string Example
2666        TestResults(failed=0, attempted=2)
2667"""
2668
2669def old_test3(): r"""
2670        >>> from doctest import Tester
2671        >>> t = Tester(globs={}, verbose=0)
2672        >>> def _f():
2673        ...     '''Trivial docstring example.
2674        ...     >>> assert 2 == 2
2675        ...     '''
2676        ...     return 32
2677        ...
2678        >>> t.rundoc(_f)  # expect 0 failures in 1 example
2679        TestResults(failed=0, attempted=1)
2680"""
2681
2682def old_test4(): """
2683        >>> import types
2684        >>> m1 = types.ModuleType('_m1')
2685        >>> m2 = types.ModuleType('_m2')
2686        >>> test_data = \"""
2687        ... def _f():
2688        ...     '''>>> assert 1 == 1
2689        ...     '''
2690        ... def g():
2691        ...    '''>>> assert 2 != 1
2692        ...    '''
2693        ... class H:
2694        ...    '''>>> assert 2 > 1
2695        ...    '''
2696        ...    def bar(self):
2697        ...        '''>>> assert 1 < 2
2698        ...        '''
2699        ... \"""
2700        >>> exec test_data in m1.__dict__
2701        >>> exec test_data in m2.__dict__
2702        >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H})
2703
2704        Tests that objects outside m1 are excluded:
2705
2706        >>> from doctest import Tester
2707        >>> t = Tester(globs={}, verbose=0)
2708        >>> t.rundict(m1.__dict__, "rundict_test", m1)  # f2 and g2 and h2 skipped
2709        TestResults(failed=0, attempted=4)
2710
2711        Once more, not excluding stuff outside m1:
2712
2713        >>> t = Tester(globs={}, verbose=0)
2714        >>> t.rundict(m1.__dict__, "rundict_test_pvt")  # None are skipped.
2715        TestResults(failed=0, attempted=8)
2716
2717        The exclusion of objects from outside the designated module is
2718        meant to be invoked automagically by testmod.
2719
2720        >>> doctest.testmod(m1, verbose=False)
2721        TestResults(failed=0, attempted=4)
2722"""
2723
2724def test_no_trailing_whitespace_stripping():
2725    r"""
2726    The fancy reports had a bug for a long time where any trailing whitespace on
2727    the reported diff lines was stripped, making it impossible to see the
2728    differences in line reported as different that differed only in the amount of
2729    trailing whitespace.  The whitespace still isn't particularly visible unless
2730    you use NDIFF, but at least it is now there to be found.
2731
2732    *NOTE*: This snippet was intentionally put inside a raw string to get rid of
2733    leading whitespace error in executing the example below
2734
2735    >>> def f(x):
2736    ...     r'''
2737    ...     >>> print('\n'.join(['a    ', 'b']))
2738    ...     a
2739    ...     b
2740    ...     '''
2741    """
2742    """
2743    *NOTE*: These doctest are not placed in raw string to depict the trailing whitespace
2744    using `\x20`
2745
2746    >>> test = doctest.DocTestFinder().find(f)[0]
2747    >>> flags = doctest.REPORT_NDIFF
2748    >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
2749    ... # doctest: +ELLIPSIS
2750    **********************************************************************
2751    File ..., line 3, in f
2752    Failed example:
2753        print('\n'.join(['a    ', 'b']))
2754    Differences (ndiff with -expected +actual):
2755        - a
2756        + a
2757          b
2758    TestResults(failed=1, attempted=1)
2759
2760    *NOTE*: `\x20` is for checking the trailing whitespace on the +a line above.
2761    We cannot use actual spaces there, as a commit hook prevents from committing
2762    patches that contain trailing whitespace. More info on Issue 24746.
2763    """
2764
2765######################################################################
2766## Main
2767######################################################################
2768
2769def test_main():
2770    # Check the doctest cases in doctest itself:
2771    test_support.run_doctest(doctest, verbosity=True)
2772
2773    from test import test_doctest
2774
2775    # Ignore all warnings about the use of class Tester in this module.
2776    deprecations = []
2777    if __debug__:
2778        deprecations.append(("class Tester is deprecated", DeprecationWarning))
2779    if sys.py3kwarning:
2780        deprecations += [("backquote not supported", SyntaxWarning),
2781                         ("execfile.. not supported", DeprecationWarning)]
2782    with test_support.check_warnings(*deprecations):
2783        # Check the doctest cases defined here:
2784        test_support.run_doctest(test_doctest, verbosity=True)
2785
2786import sys
2787def test_coverage(coverdir):
2788    trace = test_support.import_module('trace')
2789    tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
2790                         trace=0, count=1)
2791    tracer.run('reload(doctest); test_main()')
2792    r = tracer.results()
2793    print 'Writing coverage results...'
2794    r.write_results(show_missing=True, summary=True,
2795                    coverdir=coverdir)
2796
2797if __name__ == '__main__':
2798    if '-c' in sys.argv:
2799        test_coverage('/tmp/doctest.cover')
2800    else:
2801        test_main()
2802