diff options
Diffstat (limited to 'Lib/test/test_bytes.py')
-rw-r--r-- | Lib/test/test_bytes.py | 303 |
1 files changed, 197 insertions, 106 deletions
diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 520459d039c..89e22740fc6 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -13,7 +13,7 @@ import functools import pickle import tempfile import unittest -import test.test_support +import test.support import test.string_tests import test.buffer_tests @@ -22,7 +22,7 @@ if sys.flags.bytes_warning: def check_bytes_warnings(func): @functools.wraps(func) def wrapper(*args, **kw): - with test.test_support.check_warnings(('', BytesWarning)): + with test.support.check_warnings(('', BytesWarning)): return func(*args, **kw) return wrapper else: @@ -45,19 +45,26 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(type(b), self.type2test) self.assertEqual(b.__class__, self.type2test) + def test_copy(self): + a = self.type2test(b"abcd") + for copy_method in (copy.copy, copy.deepcopy): + b = copy_method(a) + self.assertEqual(a, b) + self.assertEqual(type(a), type(b)) + def test_empty_sequence(self): b = self.type2test() self.assertEqual(len(b), 0) self.assertRaises(IndexError, lambda: b[0]) self.assertRaises(IndexError, lambda: b[1]) - self.assertRaises(IndexError, lambda: b[sys.maxint]) - self.assertRaises(IndexError, lambda: b[sys.maxint+1]) + self.assertRaises(IndexError, lambda: b[sys.maxsize]) + self.assertRaises(IndexError, lambda: b[sys.maxsize+1]) self.assertRaises(IndexError, lambda: b[10**100]) self.assertRaises(IndexError, lambda: b[-1]) self.assertRaises(IndexError, lambda: b[-2]) - self.assertRaises(IndexError, lambda: b[-sys.maxint]) - self.assertRaises(IndexError, lambda: b[-sys.maxint-1]) - self.assertRaises(IndexError, lambda: b[-sys.maxint-2]) + self.assertRaises(IndexError, lambda: b[-sys.maxsize]) + self.assertRaises(IndexError, lambda: b[-sys.maxsize-1]) + self.assertRaises(IndexError, lambda: b[-sys.maxsize-2]) self.assertRaises(IndexError, lambda: b[-10**100]) def test_from_list(self): @@ -87,22 +94,21 @@ class BaseBytesTest(unittest.TestCase): self.assertRaises(TypeError, self.type2test, 0.0) class C: pass - # allowed in 2.x - #self.assertRaises(TypeError, self.type2test, ["0"]) + self.assertRaises(TypeError, self.type2test, ["0"]) self.assertRaises(TypeError, self.type2test, [0.0]) self.assertRaises(TypeError, self.type2test, [None]) self.assertRaises(TypeError, self.type2test, [C()]) def test_constructor_value_errors(self): self.assertRaises(ValueError, self.type2test, [-1]) - self.assertRaises(ValueError, self.type2test, [-sys.maxint]) - self.assertRaises(ValueError, self.type2test, [-sys.maxint-1]) - self.assertRaises(ValueError, self.type2test, [-sys.maxint-2]) + self.assertRaises(ValueError, self.type2test, [-sys.maxsize]) + self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1]) + self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2]) self.assertRaises(ValueError, self.type2test, [-10**100]) self.assertRaises(ValueError, self.type2test, [256]) self.assertRaises(ValueError, self.type2test, [257]) - self.assertRaises(ValueError, self.type2test, [sys.maxint]) - self.assertRaises(ValueError, self.type2test, [sys.maxint+1]) + self.assertRaises(ValueError, self.type2test, [sys.maxsize]) + self.assertRaises(ValueError, self.type2test, [sys.maxsize+1]) self.assertRaises(ValueError, self.type2test, [10**100]) def test_compare(self): @@ -131,13 +137,16 @@ class BaseBytesTest(unittest.TestCase): @check_bytes_warnings def test_compare_to_str(self): # Byte comparisons with unicode should always fail! - # Test this for all expected byte orders and Unicode character sizes - self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False) - self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False) - self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False) - self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False) - self.assertEqual(self.type2test() == unicode(), False) - self.assertEqual(self.type2test() != unicode(), True) + # Test this for all expected byte orders and Unicode character + # sizes. + self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False) + self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", + False) + self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False) + self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", + False) + self.assertEqual(self.type2test() == str(), False) + self.assertEqual(self.type2test() != str(), True) def test_reversed(self): input = list(map(ord, "Hello")) @@ -178,20 +187,20 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step])) def test_encoding(self): - sample = u"Hello world\n\u1234\u5678\u9abc\udef0" + sample = "Hello world\n\u1234\u5678\u9abc" for enc in ("utf8", "utf16"): b = self.type2test(sample, enc) self.assertEqual(b, self.type2test(sample.encode(enc))) self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1") b = self.type2test(sample, "latin1", "ignore") - self.assertEqual(b, self.type2test(sample[:-4], "utf-8")) + self.assertEqual(b, self.type2test(sample[:-3], "utf-8")) def test_decode(self): - sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0" + sample = "Hello world\n\u1234\u5678\u9abc\def0\def0" for enc in ("utf8", "utf16"): b = self.type2test(sample, enc) self.assertEqual(b.decode(enc), sample) - sample = u"Hello world\n\x80\x81\xfe\xff" + sample = "Hello world\n\x80\x81\xfe\xff" b = self.type2test(sample, "latin1") self.assertRaises(UnicodeDecodeError, b.decode, "utf8") self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n") @@ -212,8 +221,8 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(b1 + b2, b"abcdef") self.assertEqual(b1 + bytes(b"def"), b"abcdef") self.assertEqual(bytes(b"def") + b1, b"defabc") - self.assertRaises(TypeError, lambda: b1 + u"def") - self.assertRaises(TypeError, lambda: u"abc" + b2) + self.assertRaises(TypeError, lambda: b1 + "def") + self.assertRaises(TypeError, lambda: "abc" + b2) def test_repeat(self): for b in b"abc", self.type2test(b"abc"): @@ -223,8 +232,10 @@ class BaseBytesTest(unittest.TestCase): self.assertRaises(TypeError, lambda: b * 3.14) self.assertRaises(TypeError, lambda: 3.14 * b) # XXX Shouldn't bytes and bytearray agree on what to raise? - self.assertRaises((OverflowError, MemoryError), - lambda: b * sys.maxsize) + with self.assertRaises((OverflowError, MemoryError)): + c = b * sys.maxsize + with self.assertRaises((OverflowError, MemoryError)): + b *= sys.maxsize def test_repeat_1char(self): self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100)) @@ -238,7 +249,7 @@ class BaseBytesTest(unittest.TestCase): self.assertRaises(ValueError, lambda: -1 in b) self.assertRaises(TypeError, lambda: None in b) self.assertRaises(TypeError, lambda: float(ord('a')) in b) - self.assertRaises(TypeError, lambda: u"a" in b) + self.assertRaises(TypeError, lambda: "a" in b) for f in bytes, bytearray: self.assertIn(f(b""), b) self.assertIn(f(b"a"), b) @@ -255,16 +266,17 @@ class BaseBytesTest(unittest.TestCase): def test_fromhex(self): self.assertRaises(TypeError, self.type2test.fromhex) self.assertRaises(TypeError, self.type2test.fromhex, 1) - self.assertEqual(self.type2test.fromhex(u''), self.type2test()) + self.assertEqual(self.type2test.fromhex(''), self.type2test()) b = bytearray([0x1a, 0x2b, 0x30]) - self.assertEqual(self.type2test.fromhex(u'1a2B30'), b) - self.assertEqual(self.type2test.fromhex(u' 1A 2B 30 '), b) - self.assertEqual(self.type2test.fromhex(u'0000'), b'\0\0') - self.assertRaises(ValueError, self.type2test.fromhex, u'a') - self.assertRaises(ValueError, self.type2test.fromhex, u'rt') - self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd') - self.assertRaises(ValueError, self.type2test.fromhex, u'\x00') - self.assertRaises(ValueError, self.type2test.fromhex, u'12 \x00 34') + self.assertEqual(self.type2test.fromhex('1a2B30'), b) + self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b) + self.assertEqual(self.type2test.fromhex('0000'), b'\0\0') + self.assertRaises(TypeError, self.type2test.fromhex, b'1B') + self.assertRaises(ValueError, self.type2test.fromhex, 'a') + self.assertRaises(ValueError, self.type2test.fromhex, 'rt') + self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd') + self.assertRaises(ValueError, self.type2test.fromhex, '\x00') + self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34') def test_join(self): self.assertEqual(self.type2test(b"").join([]), b"") @@ -291,6 +303,11 @@ class BaseBytesTest(unittest.TestCase): self.assertTrue(b.startswith(b"h")) self.assertFalse(b.startswith(b"hellow")) self.assertFalse(b.startswith(b"ha")) + with self.assertRaises(TypeError) as cm: + b.startswith([b'h']) + exc = str(cm.exception) + self.assertIn('bytes', exc) + self.assertIn('tuple', exc) def test_endswith(self): b = self.type2test(b'hello') @@ -300,6 +317,11 @@ class BaseBytesTest(unittest.TestCase): self.assertTrue(b.endswith(b"o")) self.assertFalse(b.endswith(b"whello")) self.assertFalse(b.endswith(b"no")) + with self.assertRaises(TypeError) as cm: + b.endswith([b'o']) + exc = str(cm.exception) + self.assertIn('bytes', exc) + self.assertIn('tuple', exc) def test_find(self): b = self.type2test(b'mississippi') @@ -360,7 +382,7 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c']) def test_split_string_error(self): - self.assertRaises(TypeError, self.type2test(b'a b').split, u' ') + self.assertRaises(TypeError, self.type2test(b'a b').split, ' ') def test_split_unicodewhitespace(self): b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") @@ -385,7 +407,7 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c']) def test_rsplit_string_error(self): - self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ') + self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ') def test_rsplit_unicodewhitespace(self): b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") @@ -447,15 +469,23 @@ class BaseBytesTest(unittest.TestCase): self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab') def test_strip_string_error(self): - self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b') - self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b') - self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b') + self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b') + self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b') + self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b') def test_ord(self): b = self.type2test(b'\0A\x7f\x80\xff') self.assertEqual([ord(b[i:i+1]) for i in range(len(b))], [0, 65, 127, 128, 255]) + def test_maketrans(self): + transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377' + self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable) + transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz' + self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable) + self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq') + self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def') + def test_none_arguments(self): # issue 11828 b = self.type2test(b'hello') @@ -503,22 +533,64 @@ class BaseBytesTest(unittest.TestCase): # issue 11828 b = self.type2test(b'hello') x = self.type2test(b'x') - self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find, + self.assertRaisesRegex(TypeError, r'\bfind\b', b.find, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind, + self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index, + self.assertRaisesRegex(TypeError, r'\bindex\b', b.index, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex, + self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count, + self.assertRaisesRegex(TypeError, r'\bcount\b', b.count, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith, + self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith, x, None, None, None) - self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith, + self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith, x, None, None, None) +class BytesTest(BaseBytesTest): + type2test = bytes + + def test_buffer_is_readonly(self): + fd = os.dup(sys.stdin.fileno()) + with open(fd, "rb", buffering=0) as f: + self.assertRaises(TypeError, f.readinto, b"") + + def test_custom(self): + class A: + def __bytes__(self): + return b'abc' + self.assertEqual(bytes(A()), b'abc') + class A: pass + self.assertRaises(TypeError, bytes, A()) + class A: + def __bytes__(self): + return None + self.assertRaises(TypeError, bytes, A()) + + # Test PyBytes_FromFormat() + def test_from_format(self): + test.support.import_module('ctypes') + from ctypes import pythonapi, py_object, c_int, c_char_p + PyBytes_FromFormat = pythonapi.PyBytes_FromFormat + PyBytes_FromFormat.restype = py_object + + self.assertEqual(PyBytes_FromFormat(b'format'), + b'format') + + self.assertEqual(PyBytes_FromFormat(b'%'), b'%') + self.assertEqual(PyBytes_FromFormat(b'%%'), b'%') + self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s') + self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]') + self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_') + + self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)), + b'c:\xff') + self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')), + b's:cstr') + + class ByteArrayTest(BaseBytesTest): type2test = bytearray @@ -538,9 +610,7 @@ class ByteArrayTest(BaseBytesTest): b = bytearray(20) n = f.readinto(b) self.assertEqual(n, len(short_sample)) - # Python 2.x - b_sample = (ord(s) for s in sample) - self.assertEqual(list(b), list(b_sample)) + self.assertEqual(list(b), list(sample)) # Test writing in binary mode with open(tfn, "wb") as f: f.write(b) @@ -568,7 +638,7 @@ class ByteArrayTest(BaseBytesTest): def by(s): return bytearray(map(ord, s)) b = by("Hello, world") - self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")]) + self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")]) def test_setitem(self): b = bytearray([1, 2, 3]) @@ -644,10 +714,8 @@ class ByteArrayTest(BaseBytesTest): b[3:4] = [] self.assertEqual(b, bytearray([102, 111, 111, 111, 111])) - b[1:] = list(b'uuuu') # this works only on Python2 - self.assertEqual(b, bytearray([102, 117, 117, 117, 117])) - - for elem in [5, -5, 0, long(10e20), u'str', 2.3, [u'a', u'b'], [[]]]: + for elem in [5, -5, 0, int(10e20), 'str', 2.3, + ['a', 'b'], [b'a', b'b'], [[]]]: with self.assertRaises(TypeError): b[3:4] = elem @@ -692,7 +760,7 @@ class ByteArrayTest(BaseBytesTest): b += b"xyz" self.assertEqual(b, b"abcdefxyz") try: - b += u"" + b += "" except TypeError: pass else: @@ -734,16 +802,16 @@ class ByteArrayTest(BaseBytesTest): self.assertEqual(a[5:], orig) a = bytearray(b'') # Test iterators that don't have a __length_hint__ - a.extend(map(ord, orig * 25)) - a.extend(ord(x) for x in orig * 25) + a.extend(map(int, orig * 25)) + a.extend(int(x) for x in orig * 25) self.assertEqual(a, orig * 50) self.assertEqual(a[-5:], orig) a = bytearray(b'') - a.extend(iter(map(ord, orig * 50))) + a.extend(iter(map(int, orig * 50))) self.assertEqual(a, orig * 50) self.assertEqual(a[-5:], orig) a = bytearray(b'') - a.extend(list(map(ord, orig * 50))) + a.extend(list(map(int, orig * 50))) self.assertEqual(a, orig * 50) self.assertEqual(a[-5:], orig) a = bytearray(b'') @@ -762,12 +830,12 @@ class ByteArrayTest(BaseBytesTest): self.assertEqual(b, b'heo') self.assertRaises(ValueError, lambda: b.remove(ord('l'))) self.assertRaises(ValueError, lambda: b.remove(400)) - self.assertRaises(TypeError, lambda: b.remove(u'e')) + self.assertRaises(TypeError, lambda: b.remove('e')) # remove first and last b.remove(ord('o')) b.remove(ord('h')) self.assertEqual(b, b'e') - self.assertRaises(TypeError, lambda: b.remove(u'e')) + self.assertRaises(TypeError, lambda: b.remove(b'e')) b.remove(Indexable(ord('e'))) self.assertEqual(b, b'') @@ -792,7 +860,7 @@ class ByteArrayTest(BaseBytesTest): b = bytearray() b.append(ord('A')) self.assertEqual(len(b), 1) - self.assertRaises(TypeError, lambda: b.append(u'o')) + self.assertRaises(TypeError, lambda: b.append(b'o')) b = bytearray() b.append(Indexable(ord('A'))) self.assertEqual(b, b'A') @@ -804,8 +872,7 @@ class ByteArrayTest(BaseBytesTest): b.insert(-2, ord('i')) b.insert(1000, ord('i')) self.assertEqual(b, b'mississippi') - # allowed in 2.x - #self.assertRaises(TypeError, lambda: b.insert(0, b'1')) + self.assertRaises(TypeError, lambda: b.insert(0, b'1')) b = bytearray() b.insert(0, Indexable(ord('A'))) self.assertEqual(b, b'A') @@ -873,12 +940,6 @@ class ByteArrayTest(BaseBytesTest): self.assertRaises(BufferError, delslice) self.assertEqual(b, orig) - def test_empty_bytearray(self): - # Issue #7561: operations on empty bytearrays could crash in many - # situations, due to a fragile implementation of the - # PyByteArray_AS_STRING() C macro. - self.assertRaises(ValueError, int, bytearray(b'')) - class AssortedBytesTest(unittest.TestCase): # @@ -983,6 +1044,26 @@ class AssortedBytesTest(unittest.TestCase): def test_rsplit_bytearray(self): self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b']) + def test_return_self(self): + # bytearray.replace must always return a new bytearray + b = bytearray() + self.assertFalse(b.replace(b'', b'') is b) + + def test_compare(self): + if sys.flags.bytes_warning: + def bytes_warning(): + return test.support.check_warnings(('', BytesWarning)) + with bytes_warning(): + b'' == '' + with bytes_warning(): + b'' != '' + with bytes_warning(): + bytearray(b'') == '' + with bytes_warning(): + bytearray(b'') != '' + else: + self.skipTest("BytesWarning is needed for this test: use -bb option") + # Optimizations: # __iter__? (optimization) # __reversed__? (optimization) @@ -1014,8 +1095,8 @@ class BytearrayPEP3137Test(unittest.TestCase, self.assertTrue(val is not newval, methname+' returned self on a mutable object') for expr in ('val.split()[0]', 'val.rsplit()[0]', - 'val.partition(".")[0]', 'val.rpartition(".")[2]', - 'val.splitlines()[0]', 'val.replace("", "")'): + 'val.partition(b".")[0]', 'val.rpartition(b".")[2]', + 'val.splitlines()[0]', 'val.replace(b"", b"")'): newval = eval(expr) self.assertEqual(val, newval) self.assertTrue(val is not newval, @@ -1026,7 +1107,7 @@ class FixedStringTest(test.string_tests.BaseTest): def fixtype(self, obj): if isinstance(obj, str): return obj.encode("utf-8") - return super(FixedStringTest, self).fixtype(obj) + return super().fixtype(obj) # Currently the bytes containment testing uses a single integer # value. This may not be the final design, but until then the @@ -1039,26 +1120,22 @@ class FixedStringTest(test.string_tests.BaseTest): pass def test_lower(self): pass - def test_hash(self): - # XXX check this out - pass - class ByteArrayAsStringTest(FixedStringTest): type2test = bytearray +class BytesAsStringTest(FixedStringTest): + type2test = bytes -class ByteArraySubclass(bytearray): - pass -class ByteArraySubclassTest(unittest.TestCase): +class SubclassTest(unittest.TestCase): def test_basic(self): - self.assertTrue(issubclass(ByteArraySubclass, bytearray)) - self.assertIsInstance(ByteArraySubclass(), bytearray) + self.assertTrue(issubclass(self.subclass2test, self.type2test)) + self.assertIsInstance(self.subclass2test(), self.type2test) a, b = b"abcd", b"efgh" - _a, _b = ByteArraySubclass(a), ByteArraySubclass(b) + _a, _b = self.subclass2test(a), self.subclass2test(b) # test comparison operators with subclass instances self.assertTrue(_a == _a) @@ -1081,19 +1158,19 @@ class ByteArraySubclassTest(unittest.TestCase): # Make sure join returns a NEW object for single item sequences # involving a subclass. # Make sure that it is of the appropriate type. - s1 = ByteArraySubclass(b"abcd") - s2 = bytearray().join([s1]) + s1 = self.subclass2test(b"abcd") + s2 = self.type2test().join([s1]) self.assertTrue(s1 is not s2) - self.assertTrue(type(s2) is bytearray, type(s2)) + self.assertTrue(type(s2) is self.type2test, type(s2)) # Test reverse, calling join on subclass s3 = s1.join([b"abcd"]) - self.assertTrue(type(s3) is bytearray) + self.assertTrue(type(s3) is self.type2test) def test_pickle(self): - a = ByteArraySubclass(b"abcd") + a = self.subclass2test(b"abcd") a.x = 10 - a.y = ByteArraySubclass(b"efgh") + a.y = self.subclass2test(b"efgh") for proto in range(pickle.HIGHEST_PROTOCOL + 1): b = pickle.loads(pickle.dumps(a, proto)) self.assertNotEqual(id(a), id(b)) @@ -1104,9 +1181,9 @@ class ByteArraySubclassTest(unittest.TestCase): self.assertEqual(type(a.y), type(b.y)) def test_copy(self): - a = ByteArraySubclass(b"abcd") + a = self.subclass2test(b"abcd") a.x = 10 - a.y = ByteArraySubclass(b"efgh") + a.y = self.subclass2test(b"efgh") for copy_method in (copy.copy, copy.deepcopy): b = copy_method(a) self.assertNotEqual(id(a), id(b)) @@ -1116,24 +1193,38 @@ class ByteArraySubclassTest(unittest.TestCase): self.assertEqual(type(a), type(b)) self.assertEqual(type(a.y), type(b.y)) + +class ByteArraySubclass(bytearray): + pass + +class BytesSubclass(bytes): + pass + +class ByteArraySubclassTest(SubclassTest): + type2test = bytearray + subclass2test = ByteArraySubclass + def test_init_override(self): class subclass(bytearray): - def __init__(self, newarg=1, *args, **kwargs): - bytearray.__init__(self, *args, **kwargs) + def __init__(me, newarg=1, *args, **kwargs): + bytearray.__init__(me, *args, **kwargs) + x = subclass(4, b"abcd") x = subclass(4, source=b"abcd") self.assertEqual(x, b"abcd") x = subclass(newarg=4, source=b"abcd") self.assertEqual(x, b"abcd") + +class BytesSubclassTest(SubclassTest): + type2test = bytes + subclass2test = BytesSubclass + + def test_main(): - #test.test_support.run_unittest(BytesTest) - #test.test_support.run_unittest(AssortedBytesTest) - #test.test_support.run_unittest(BytesAsStringTest) - test.test_support.run_unittest( - ByteArrayTest, - ByteArrayAsStringTest, - ByteArraySubclassTest, - BytearrayPEP3137Test) + test.support.run_unittest( + BytesTest, AssortedBytesTest, BytesAsStringTest, + ByteArrayTest, ByteArrayAsStringTest, BytesSubclassTest, + ByteArraySubclassTest, BytearrayPEP3137Test) if __name__ == "__main__": test_main() |