#8471: reset _SpoofOut.buf to an empty string when truncating; if Unicode had been output previously, it had been coerced to a Unicode string, potentially making subsequent prints behave differently or raise UnicodeErrors.

This commit is contained in:
Georg Brandl 2010-08-01 08:22:05 +00:00
parent 58f15b66ff
commit 1f05e2e9ba
3 changed files with 33 additions and 1 deletions

View File

@ -263,6 +263,9 @@ class _SpoofOut(StringIO):
StringIO.truncate(self, size)
if hasattr(self, "softspace"):
del self.softspace
if not self.buf:
# Reset it to an empty string, to make sure it's not unicode.
self.buf = ''
# Worst-case linear-time ellipsis matching.
def _ellipsis_match(want, got):

View File

@ -1581,7 +1581,33 @@ source:
>>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0)
Traceback (most recent call last):
ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS'
"""
"""
def test_unicode_output(self): r"""
Check that unicode output works:
>>> u'\xe9'
u'\xe9'
If we return unicode, SpoofOut's buf variable becomes automagically
converted to unicode. This means all subsequent output becomes converted
to unicode, and if the output contains non-ascii characters that failed.
It used to be that this state change carried on between tests, meaning
tests would fail if unicode has been output previously in the testrun.
This test tests that this is no longer so:
>>> print u'abc'
abc
And then return a string with non-ascii characters:
>>> print u'\xe9'.encode('utf-8')
é
"""
def test_testsource(): r"""
Unit tests for `testsource()`.

View File

@ -18,6 +18,9 @@ Core and Builtins
Library
-------
- Issue #8471: In doctest, properly reset the output stream to an empty
string when Unicode was previously output.
- Issue #8620: when a Cmd is fed input that reaches EOF without a final
newline, it no longer truncates the last character of the last command line.