diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/DocutilsTestSupport.py | 2 | ||||
-rw-r--r-- | test/test_error_reporting.py | 4 | ||||
-rwxr-xr-x | test/test_io.py | 106 |
3 files changed, 103 insertions, 9 deletions
diff --git a/test/DocutilsTestSupport.py b/test/DocutilsTestSupport.py index 82c3391b4..dae25ccc3 100644 --- a/test/DocutilsTestSupport.py +++ b/test/DocutilsTestSupport.py @@ -881,7 +881,7 @@ def _format_str(*args): return_tuple = [] for i in args: r = repr(i) - if ( (isinstance(i, str) or isinstance(i, unicode)) + if ( (isinstance(i, bytes) or isinstance(i, unicode)) and '\n' in i): stripped = '' if isinstance(i, unicode) and r.startswith('u'): diff --git a/test/test_error_reporting.py b/test/test_error_reporting.py index fd13356c0..989d04518 100644 --- a/test/test_error_reporting.py +++ b/test/test_error_reporting.py @@ -158,14 +158,14 @@ class ErrorStringTests(unittest.TestCase): # ----------------- # Stub: Buffer with 'strict' auto-conversion of input to byte string: -class BBuf(BytesIO, object): +class BBuf(BytesIO, object): # super class object required by Python <= 2.5 def write(self, data): if isinstance(data, unicode): data.encode('ascii', 'strict') super(BBuf, self).write(data) # Stub: Buffer expecting unicode string: -class UBuf(StringIO, object): +class UBuf(StringIO, object): # super class object required by Python <= 2.5 def write(self, data): # emulate Python 3 handling of stdout, stderr if isinstance(data, bytes): diff --git a/test/test_io.py b/test/test_io.py index fa77c749e..1d213ce7a 100755 --- a/test/test_io.py +++ b/test/test_io.py @@ -13,12 +13,45 @@ import DocutilsTestSupport # must be imported before docutils from docutils import io from docutils._compat import b, bytes from docutils.error_reporting import locale_encoding +from test_error_reporting import BBuf, UBuf -class InputTests(unittest.TestCase): +# python 2.3 +if not hasattr(unittest.TestCase, "assertTrue"): + assertTrue = unittest.TestCase.failUnless + +class mock_stdout(UBuf): + encoding = 'utf8' + + def __init__(self): + self.buffer = BBuf() + UBuf.__init__(self) + +class HelperTests(unittest.TestCase): + + def test_check_encoding_true(self): + """Return `True` if lookup returns the same codec""" + self.assertEqual(io.check_encoding(mock_stdout, 'utf8'), True) + self.assertEqual(io.check_encoding(mock_stdout, 'utf-8'), True) + self.assertEqual(io.check_encoding(mock_stdout, 'UTF-8'), True) - # python 2.3 - if not hasattr(unittest.TestCase, "assertTrue"): - assertTrue = unittest.TestCase.failUnless + def test_check_encoding_false(self): + """Return `False` if lookup returns different codecs""" + self.assertEqual(io.check_encoding(mock_stdout, 'ascii'), False) + self.assertEqual(io.check_encoding(mock_stdout, 'latin-1'), False) + + def test_check_encoding_none(self): + """Cases where the comparison fails.""" + # stream.encoding is None: + self.assertEqual(io.check_encoding(io.FileInput(), 'ascii'), None) + # stream.encoding does not exist: + self.assertEqual(io.check_encoding(BBuf, 'ascii'), None) + # encoding is None: + self.assertEqual(io.check_encoding(mock_stdout, None), None) + # encoding is invalid + self.assertEqual(io.check_encoding(mock_stdout, 'UTF-9'), None) + + +class InputTests(unittest.TestCase): def test_bom(self): input = io.StringInput(source=b('\xef\xbb\xbf foo \xef\xbb\xbf bar'), @@ -75,13 +108,13 @@ print "hello world" # if no encoding is given, try decoding with utf8: input = io.FileInput(source_path='functional/input/cyrillic.txt') data = input.read() - if sys.version_info < (3,0): + if sys.version_info < (3,0): # in Py3k, the locale encoding is used without --input-encoding # skipping the heuristic self.assertEqual(input.successful_encoding, 'utf-8') def test_heuristics_no_utf8(self): - # if no encoding is given and decoding with utf8 fails, + # if no encoding is given and decoding with utf8 fails, # use either the locale encoding (if specified) or latin1: input = io.FileInput(source_path='data/latin1.txt') data = input.read() @@ -91,5 +124,66 @@ print "hello world" self.assertEqual(data, u'Gr\xfc\xdfe\n') +class OutputTests(unittest.TestCase): + + bdata = b('\xfc') + udata = u'\xfc' + + def setUp(self): + self.bdrain = BBuf() + """Buffer accepting binary strings (bytes)""" + self.udrain = UBuf() + """Buffer accepting unicode strings""" + self.mock_stdout = mock_stdout() + """Stub of sys.stdout under Python 3""" + + def test_write_unicode(self): + fo = io.FileOutput(destination=self.udrain, encoding='unicode', + autoclose=False) + fo.write(self.udata) + self.assertEqual(self.udrain.getvalue(), self.udata) + + def test_write_utf8(self): + if sys.version_info >= (3,0): + fo = io.FileOutput(destination=self.udrain, encoding='utf8', + autoclose=False) + fo.write(self.udata) + self.assertEqual(self.udrain.getvalue(), self.udata) + else: + fo = io.FileOutput(destination=self.bdrain, encoding='utf8', + autoclose=False) + fo.write(self.udata) + self.assertEqual(self.bdrain.getvalue(), self.udata.encode('utf8')) + + # With destination in binary mode, data must be binary string + # and is written as-is: + def test_write_bytes(self): + fo = io.FileOutput(destination=self.bdrain, encoding='utf8', + mode='wb', autoclose=False) + fo.write(self.bdata) + self.assertEqual(self.bdrain.getvalue(), self.bdata) + + # Test for Python 3 features: + if sys.version_info >= (3,0): + def test_write_bytes_to_stdout(self): + # binary data is written to destination.buffer, if the + # destination is sys.stdout or sys.stdin + backup = sys.stdout + sys.stdout = self.mock_stdout + fo = io.FileOutput(destination=sys.stdout, mode='wb', + autoclose=False) + fo.write(self.bdata) + self.assertEqual(self.mock_stdout.buffer.getvalue(), + self.bdata) + sys.stdout = backup + + def test_encoding_clash(self): + # Raise error, if given and destination encodings differ + # TODO: try the `write to .buffer` scheme instead? + self.assertRaises(ValueError, + io.FileOutput, destination=self.mock_stdout, + encoding='latin1') + + if __name__ == '__main__': unittest.main() |