]> granicus.if.org Git - python/commitdiff
Make the StringIO test pass.
authorGuido van Rossum <guido@python.org>
Tue, 8 May 2007 23:08:31 +0000 (23:08 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 8 May 2007 23:08:31 +0000 (23:08 +0000)
The buffer object now special-cases Unicode when concatenating.  Sigh.

Lib/test/test_StringIO.py
Objects/bufferobject.c

index 9c3a83f0547ed7aaa48be5196d5e3684061bc5a5..2f4a2215bcac3a876d62d4504c6544859a927e67 100644 (file)
@@ -1,13 +1,13 @@
 # Tests StringIO and cStringIO
 
+import sys
 import unittest
 import StringIO
 import cStringIO
-import types
 from test import test_support
 
 
-class TestGenericStringIO(unittest.TestCase):
+class TestGenericStringIO:
     # use a class variable MODULE to define which module is being tested
 
     # Line of data to test as string
@@ -71,7 +71,7 @@ class TestGenericStringIO(unittest.TestCase):
         self.assertEqual(f.closed, False)
         f.close()
         self.assertEqual(f.closed, True)
-        f = self.MODULE.StringIO("abc")
+        f = self.MODULE.StringIO(self.constructor("abc"))
         self.assertEqual(f.closed, False)
         f.close()
         self.assertEqual(f.closed, True)
@@ -98,7 +98,7 @@ class TestGenericStringIO(unittest.TestCase):
         self._fp.close()
         self.assertRaises(ValueError, next, self._fp)
 
-class TestStringIO(TestGenericStringIO):
+class TestStringIO(TestGenericStringIO, unittest.TestCase):
     MODULE = StringIO
 
     def test_unicode(self):
@@ -116,10 +116,11 @@ class TestStringIO(TestGenericStringIO):
         f.write(str(self._line[52]))
         s = f.getvalue()
         self.assertEqual(s, str('abcuvwxyz!'))
-        self.assertEqual(type(s), types.UnicodeType)
+        self.assertEqual(type(s), str)
 
-class TestcStringIO(TestGenericStringIO):
+class TestcStringIO(TestGenericStringIO, unittest.TestCase):
     MODULE = cStringIO
+    constructor = str8
 
     def test_unicode(self):
 
@@ -133,36 +134,39 @@ class TestcStringIO(TestGenericStringIO):
         f.write(str(self._line[:5]))
         s = f.getvalue()
         self.assertEqual(s, 'abcde')
-        self.assertEqual(type(s), types.StringType)
+        self.assertEqual(type(s), str8)
 
         f = self.MODULE.StringIO(str(self._line[:5]))
         s = f.getvalue()
         self.assertEqual(s, 'abcde')
-        self.assertEqual(type(s), types.StringType)
-
-        self.assertRaises(UnicodeEncodeError, self.MODULE.StringIO,
-                          str('\xf4', 'latin-1'))
+        self.assertEqual(type(s), str8)
 
-import sys
-if sys.platform.startswith('java'):
-    # Jython doesn't have a buffer object, so we just do a useless
-    # fake of the buffer tests.
-    buffer = str
+        # XXX This no longer fails -- the default encoding is always UTF-8.
+        ##self.assertRaises(UnicodeDecodeError, self.MODULE.StringIO, '\xf4')
 
 class TestBufferStringIO(TestStringIO):
-    constructor = buffer
+
+    def constructor(self, s):
+        return buffer(str8(s))
 
 class TestBuffercStringIO(TestcStringIO):
-    constructor = buffer
+
+    def constructor(self, s):
+        return buffer(str8(s))
 
 
 def test_main():
-    test_support.run_unittest(
+    classes = [
         TestStringIO,
         TestcStringIO,
+        ]
+    if not sys.platform.startswith('java'):
+        classes.extend([
         TestBufferStringIO,
         TestBuffercStringIO
-    )
+        ])
+    test_support.run_unittest(*classes)
+
 
 if __name__ == '__main__':
-    test_main()
+    unittest.main()
index ddef8685193971d932b2ac80c6c2ef3c388256e5..f6359608cb83b7b1cdd067d225a82f9c4acc25a7 100644 (file)
@@ -424,15 +424,24 @@ buffer_concat(PyBufferObject *self, PyObject *other)
                return NULL;
  
        /* optimize special case */
+        /* XXX bad idea type-wise */
        if ( size == 0 )
        {
            Py_INCREF(other);
            return other;
        }
 
-       if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
-               return NULL;
+        if (PyUnicode_Check(other)) {
+               /* XXX HACK */
+               if ( (count = (*pb->bf_getcharbuffer)(other, 0, &ptr2)) < 0 )
+                       return NULL;
+       }
+       else {
+               if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
+                       return NULL;
+       }
 
+        /* XXX Should return a bytes object, really */
        ob = PyString_FromStringAndSize(NULL, size + count);
        if ( ob == NULL )
                return NULL;