diff options
author | Florent Xicluna <florent.xicluna@gmail.com> | 2010-02-27 13:31:23 (GMT) |
---|---|---|
committer | Florent Xicluna <florent.xicluna@gmail.com> | 2010-02-27 13:31:23 (GMT) |
commit | 2a903b26e93c34cfc18fc9b5e491ca183e01eecf (patch) | |
tree | 0940bb0de0518764a587fc8c36ed37f392ffc8f9 | |
parent | 0263da547e0053865fe5ad868057a89a1de2fd2e (diff) | |
download | cpython-2a903b26e93c34cfc18fc9b5e491ca183e01eecf.zip cpython-2a903b26e93c34cfc18fc9b5e491ca183e01eecf.tar.gz cpython-2a903b26e93c34cfc18fc9b5e491ca183e01eecf.tar.bz2 |
Issue #1729305: Fix doctest to handle encode error with "backslashreplace". It fixes #7667 too.
-rw-r--r-- | Lib/doctest.py | 11 | ||||
-rw-r--r-- | Lib/test/test_doctest.py | 45 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 55 insertions, 3 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py index 41eccbe..726517e 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -218,11 +218,18 @@ def _load_testfile(filename, package, module_relative): return file_contents.replace(os.linesep, '\n'), filename return open(filename).read(), filename +# Use sys.stdout encoding for ouput. +_encoding = getattr(sys.__stdout__, 'encoding', None) or 'utf-8' + def _indent(s, indent=4): """ - Add the given number of space characters to the beginning every - non-blank line in `s`, and return the result. + Add the given number of space characters to the beginning of + every non-blank line in `s`, and return the result. + If the string `s` is Unicode, it is encoded using the stdout + encoding and the `backslashreplace` error handler. """ + if isinstance(s, unicode): + s = s.encode(_encoding, 'backslashreplace') # This regexp matches the start of non-blank lines: return re.sub('(?m)^(?!$)', indent*' ', s) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index fb10888..426b33f 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Test script for doctest. """ @@ -372,7 +373,7 @@ We'll simulate a __file__ attr that ends in pyc: >>> tests = finder.find(sample_func) >>> print tests # doctest: +ELLIPSIS - [<DocTest sample_func from ...:16 (1 example)>] + [<DocTest sample_func from ...:17 (1 example)>] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -2145,6 +2146,13 @@ doctest examples in a given file. In its simple invokation, it is called with the name of a file, which is taken to be relative to the calling module. The return value is (#failures, #tests). +We don't want `-v` in sys.argv for these tests. + + >>> save_argv = sys.argv + >>> if '-v' in sys.argv: + ... sys.argv = [arg for arg in save_argv if arg != '-v'] + + >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS ********************************************************************** File "...", line 6, in test_doctest.txt @@ -2284,6 +2292,41 @@ using the optional keyword argument `encoding`: >>> doctest.testfile('test_doctest4.txt', encoding='utf-8') TestResults(failed=0, attempted=4) >>> doctest.master = None # Reset master. + +Switch the module encoding to 'utf-8' to test the verbose output without +bothering with the current sys.stdout encoding. + + >>> doctest._encoding, saved_encoding = 'utf-8', doctest._encoding + >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True) + Trying: + u'föö' + Expecting: + u'f\xf6\xf6' + ok + Trying: + u'bąr' + Expecting: + u'b\u0105r' + ok + Trying: + 'föö' + Expecting: + 'f\xc3\xb6\xc3\xb6' + ok + Trying: + 'bąr' + Expecting: + 'b\xc4\x85r' + ok + 1 items passed all tests: + 4 tests in test_doctest4.txt + 4 tests in 1 items. + 4 passed and 0 failed. + Test passed. + TestResults(failed=0, attempted=4) + >>> doctest._encoding = saved_encoding + >>> doctest.master = None # Reset master. + >>> sys.argv = save_argv """ # old_test1, ... used to live in doctest.py, but cluttered it. Note @@ -35,6 +35,8 @@ Core and Builtins Library ------- +- Issue #1729305: Fix doctest to handle encode error with "backsplashreplace". + - Issue #691291: codecs.open() should not convert end of lines on reading and writing. |