summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/DocutilsTestSupport.py2
-rw-r--r--test/test_error_reporting.py4
-rwxr-xr-xtest/test_io.py106
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()