]> granicus.if.org Git - python/commitdiff
Issue #1729305: Fix doctest to handle encode error with "backslashreplace". It fixes...
authorFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 27 Feb 2010 13:31:23 +0000 (13:31 +0000)
committerFlorent Xicluna <florent.xicluna@gmail.com>
Sat, 27 Feb 2010 13:31:23 +0000 (13:31 +0000)
Lib/doctest.py
Lib/test/test_doctest.py
Misc/NEWS

index 41eccbe76431e9e0ca4231c9fba3477f7b8ce5fb..726517e6ca128061caf9d96e7fc37a2c722f82bf 100644 (file)
@@ -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)
 
index fb108885e4ce74984c9d0e577962b72bbb25cb3d..426b33fbcfb1296a051e364fab8451b3ab1f3382 100644 (file)
@@ -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
index c55888b4bc0d6eb3f9adb1c010ab39ea6661c65a..f206f03f407257a1efb549dbbb309e6523beb894 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.