--- ./tests/test_cmdline.py.orig 2019-01-17 21:11:36.245282362 +0100 +++ ./tests/test_cmdline.py 2019-01-17 21:44:28.090657851 +0100 @@ -28,10 +28,37 @@ ''' +class StrictStringOutput(StringIO): + log = sys.stderr + + def __init__(self): + StringIO.__init__(self) + self.__text_type = None + self.__text_sample = None + + def write(self, s): + return StringIO.write(self, self.__validate(s)) + + def writelines(self, iterable): + return StringIO.writelines(self.__validate(text) for text in iterable) + + def __validate(self, text): + if self.__text_type is None: + self.__text_type = text.__class__ + self.__text_sample = text + elif text.__class__ != self.__text_type: + self.log.write( + "Incompatible types %r (%s) and %r (%s)\n" % ( + self.__text_sample, self.__text_type, + text, text.__class__)) + return text + + def run_cmdline(*args, **kwds): saved_stdin = sys.stdin saved_stdout = sys.stdout saved_stderr = sys.stderr + print(sys.version_info) if sys.version_info > (3,): stdin_buffer = BytesIO() stdout_buffer = BytesIO() @@ -40,9 +67,9 @@ new_stdout = sys.stdout = io.TextIOWrapper(stdout_buffer, 'utf-8') new_stderr = sys.stderr = io.TextIOWrapper(stderr_buffer, 'utf-8') else: - stdin_buffer = new_stdin = sys.stdin = StringIO() - stdout_buffer = new_stdout = sys.stdout = StringIO() - stderr_buffer = new_stderr = sys.stderr = StringIO() + stdin_buffer = new_stdin = sys.stdin = StrictStringOutput() + stdout_buffer = new_stdout = sys.stdout = StrictStringOutput() + stderr_buffer = new_stderr = sys.stderr = StrictStringOutput() new_stdin.write(kwds.get('stdin', '')) new_stdin.seek(0, 0) try: @@ -53,8 +80,9 @@ sys.stderr = saved_stderr new_stdout.flush() new_stderr.flush() - out, err = stdout_buffer.getvalue().decode('utf-8'), \ - stderr_buffer.getvalue().decode('utf-8') + print(repr(stdout_buffer.buflist)) + out = stdout_buffer.getvalue().decode('utf-8') + err = stderr_buffer.getvalue().decode('utf-8') return (ret, out, err) --- ./tests/test_util.py.orig 2019-01-17 21:15:08.341082845 +0100 +++ ./tests/test_util.py 2019-01-17 21:32:47.646780336 +0100 @@ -10,7 +10,7 @@ import re import unittest -from pygments import util, console +from pygments import util, console, StringIO class FakeLexer(object): @@ -211,3 +211,24 @@ self.assertEqual(console.reset_color(), console.codes['reset']) self.assertEqual(console.colorize('blue', 'text'), console.codes['blue'] + 'text' + console.codes['reset']) + + +class StringIOTest(unittest.TestCase): + + def test_mix_default_unicode(self): + buf = StringIO() + buf.write('The Arduino\xc2\xae language style') + buf.write(u'unicode') + buf.getvalue() + + def test_mix_default_bytes(self): + buf = StringIO() + buf.write(u'The Arduino\xc2\xae language style') + buf.write(b'bytes') + buf.getvalue() + + def test_mix_unicode_bytes(self): + buf = StringIO() + buf.write('The Arduino\xc2\xae language style') + buf.write(b'bytes \xc2\xae') + buf.getvalue()