Index: pyyaml/trunk/tests/lib3/test_input_output.py
===================================================================
--- pyyaml/trunk/tests/lib/test_input_output.py	(revision 333)
+++ pyyaml/trunk/tests/lib3/test_input_output.py	(revision 334)
@@ -1,26 +1,22 @@
 
 import yaml
-import codecs, StringIO
-
-def _unicode_open(file, encoding, errors='strict'):
-    info = codecs.lookup(encoding)
-    srw = codecs.StreamReaderWriter(file, info.streamreader, info.streamwriter, errors)
-    srw.encoding = encoding
-    return srw
+import codecs, io
 
 def test_unicode_input(unicode_filename, verbose=False):
     data = open(unicode_filename, 'rb').read().decode('utf-8')
     value = ' '.join(data.split())
-    output = yaml.load(_unicode_open(StringIO.StringIO(data.encode('utf-8')), 'utf-8'))
+    output = yaml.load(data)
     assert output == value, (output, value)
-    for input in [data, data.encode('utf-8'),
+    output = yaml.load(io.StringIO(data))
+    assert output == value, (output, value)
+    for input in [data.encode('utf-8'),
                     codecs.BOM_UTF8+data.encode('utf-8'),
                     codecs.BOM_UTF16_BE+data.encode('utf-16-be'),
                     codecs.BOM_UTF16_LE+data.encode('utf-16-le')]:
         if verbose:
-            print "INPUT:", repr(input[:10]), "..."
+            print("INPUT:", repr(input[:10]), "...")
         output = yaml.load(input)
         assert output == value, (output, value)
-        output = yaml.load(StringIO.StringIO(input))
+        output = yaml.load(io.BytesIO(input))
         assert output == value, (output, value)
 
@@ -33,17 +29,17 @@
                     codecs.BOM_UTF8+data.encode('utf-16-be'),
                     codecs.BOM_UTF16_BE+data.encode('utf-16-le'),
-                    codecs.BOM_UTF16_LE+data.encode('utf-8')+'!']:
+                    codecs.BOM_UTF16_LE+data.encode('utf-8')+b'!']:
         try:
             yaml.load(input)
-        except yaml.YAMLError, exc:
+        except yaml.YAMLError as exc:
             if verbose:
-                print exc
+                print(exc)
         else:
             raise AssertionError("expected an exception")
         try:
-            yaml.load(StringIO.StringIO(input))
-        except yaml.YAMLError, exc:
+            yaml.load(io.BytesIO(input))
+        except yaml.YAMLError as exc:
             if verbose:
-                print exc
+                print(exc)
         else:
             raise AssertionError("expected an exception")
@@ -54,21 +50,37 @@
     data = open(unicode_filename, 'rb').read().decode('utf-8')
     value = ' '.join(data.split())
-    for encoding in [None, 'utf-8', 'utf-16-be', 'utf-16-le']:
-        for allow_unicode in [False, True]:
-            data1 = yaml.dump(value, allow_unicode=allow_unicode)
-            stream = StringIO.StringIO()
-            yaml.dump(value, _unicode_open(stream, 'utf-8'), encoding=encoding, allow_unicode=allow_unicode)
+    for allow_unicode in [False, True]:
+        data1 = yaml.dump(value, allow_unicode=allow_unicode)
+        for encoding in [None, 'utf-8', 'utf-16-be', 'utf-16-le']:
+            stream = io.StringIO()
+            yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode)
             data2 = stream.getvalue()
             data3 = yaml.dump(value, encoding=encoding, allow_unicode=allow_unicode)
-            stream = StringIO.StringIO()
-            yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode)
-            data4 = stream.getvalue()
+            stream = io.BytesIO()
+            if encoding is None:
+                try:
+                    yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode)
+                except TypeError as exc:
+                    if verbose:
+                        print(exc)
+                    data4 = None
+                else:
+                    raise AssertionError("expected an exception")
+            else:
+                yaml.dump(value, stream, encoding=encoding, allow_unicode=allow_unicode)
+                data4 = stream.getvalue()
+                if verbose:
+                    print("BYTES:", data4[:50])
+                data4 = data4.decode(encoding)
             for copy in [data1, data2, data3, data4]:
+                if copy is None:
+                    continue
+                assert isinstance(copy, str)
                 if allow_unicode:
                     try:
                         copy[4:].encode('ascii')
-                    except (UnicodeDecodeError, UnicodeEncodeError), exc:
+                    except UnicodeEncodeError as exc:
                         if verbose:
-                            print exc
+                            print(exc)
                     else:
                         raise AssertionError("expected an exception")
@@ -76,15 +88,5 @@
                     copy[4:].encode('ascii')
             assert isinstance(data1, str), (type(data1), encoding)
-            data1.decode('utf-8')
             assert isinstance(data2, str), (type(data2), encoding)
-            data2.decode('utf-8')
-            if encoding is None:
-                assert isinstance(data3, unicode), (type(data3), encoding)
-                assert isinstance(data4, unicode), (type(data4), encoding)
-            else:
-                assert isinstance(data3, str), (type(data3), encoding)
-                data3.decode(encoding)
-                assert isinstance(data4, str), (type(data4), encoding)
-                data4.decode(encoding)
 
 test_unicode_output.unittest = ['.unicode']
@@ -95,17 +97,18 @@
         input = data
         if encoding is not None:
-            input = (u'\ufeff'+input).encode(encoding)
+            input = ('\ufeff'+input).encode(encoding)
         output1 = yaml.emit(yaml.parse(input), allow_unicode=True)
-        stream = StringIO.StringIO()
-        yaml.emit(yaml.parse(input), _unicode_open(stream, 'utf-8'),
-                            allow_unicode=True)
+        if encoding is None:
+            stream = io.StringIO()
+        else:
+            stream = io.BytesIO()
+        yaml.emit(yaml.parse(input), stream, allow_unicode=True)
         output2 = stream.getvalue()
+        assert isinstance(output1, str), (type(output1), encoding)
         if encoding is None:
-            assert isinstance(output1, unicode), (type(output1), encoding)
+            assert isinstance(output2, str), (type(output1), encoding)
         else:
-            assert isinstance(output1, str), (type(output1), encoding)
-            output1.decode(encoding)
-        assert isinstance(output2, str), (type(output2), encoding)
-        output2.decode('utf-8')
+            assert isinstance(output2, bytes), (type(output1), encoding)
+            output2.decode(encoding)
 
 test_unicode_transfer.unittest = ['.unicode']
