14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Unit tests for the bytes and bytearray types.
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoXXX This is a mess.  Common tests should be moved to buffer_tests.py,
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaowhich itself ought to be unified with string_tests.py (and the latter
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoshould be modernized).
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport re
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport copy
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport functools
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport pickle
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport tempfile
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport test.test_support
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport test.string_tests
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport test.buffer_tests
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif sys.flags.bytes_warning:
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def check_bytes_warnings(func):
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        @functools.wraps(func)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def wrapper(*args, **kw):
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with test.test_support.check_warnings(('', BytesWarning)):
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return func(*args, **kw)
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return wrapper
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoelse:
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # no-op
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def check_bytes_warnings(func):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return func
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Indexable:
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, value=0):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.value = value
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __index__(self):
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.value
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BaseBytesTest(unittest.TestCase):
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_basics(self):
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test()
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(b), self.type2test)
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.__class__, self.type2test)
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_empty_sequence(self):
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test()
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(b), 0)
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[0])
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[1])
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[sys.maxint])
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[sys.maxint+1])
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[10**100])
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-1])
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-2])
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-sys.maxint])
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b[-10**100])
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_list(self):
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ints = list(range(256))
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(i for i in ints)
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(b), 256)
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(b), ints)
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_index(self):
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test([Indexable(), Indexable(1), Indexable(254),
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            Indexable(255)])
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(b), [0, 1, 254, 255])
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [Indexable(256)])
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_ssize(self):
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(0), b'')
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(1), b'\x00')
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, -1)
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test('0', 'ascii'), b'0')
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'0'), b'0')
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constructor_type_errors(self):
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test, 0.0)
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C:
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # allowed in 2.x
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertRaises(TypeError, self.type2test, ["0"])
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test, [0.0])
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test, [None])
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test, [C()])
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constructor_value_errors(self):
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [-1])
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [-sys.maxint])
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [-sys.maxint-1])
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [-sys.maxint-2])
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [-10**100])
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [256])
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [257])
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [sys.maxint])
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [sys.maxint+1])
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test, [10**100])
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_compare(self):
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b1 = self.type2test([1, 2, 3])
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b2 = self.type2test([1, 2, 3])
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b3 = self.type2test([1, 3])
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b1, b2)
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b2 != b3)
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b1 <= b2)
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b1 <= b3)
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b1 <  b3)
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b1 >= b2)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b3 >= b2)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b3 >  b2)
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b1 != b2)
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b2 == b3)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b1 >  b2)
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b1 >  b3)
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b1 >= b3)
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b1 <  b2)
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b3 <  b2)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b3 <= b2)
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @check_bytes_warnings
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_compare_to_str(self):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Byte comparisons with unicode should always fail!
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test this for all expected byte orders and Unicode character sizes
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False)
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False)
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False)
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test() == unicode(), False)
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test() != unicode(), True)
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_reversed(self):
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        input = list(map(ord, "Hello"))
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(input)
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        output = list(reversed(b))
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        input.reverse()
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(output, input)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_getslice(self):
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def by(s):
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.type2test(map(ord, s))
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = by("Hello, world")
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[:5], by("Hello"))
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[1:5], by("ello"))
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[5:7], by(", "))
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[7:], by("world"))
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[7:12], by("world"))
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[7:100], by("world"))
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[:-7], by("Hello"))
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-11:-7], by("ello"))
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-7:-5], by(", "))
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-5:], by("world"))
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-5:12], by("world"))
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-5:100], by("world"))
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b[-100:5], by("Hello"))
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_extended_getslice(self):
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test extended slicing by comparing with list slicing.
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        L = list(range(255))
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(L)
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for start in indices:
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for stop in indices:
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Skip step 0 (invalid)
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for step in indices[1:]:
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_encoding(self):
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for enc in ("utf8", "utf16"):
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.type2test(sample, enc)
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b, self.type2test(sample.encode(enc)))
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(sample, "latin1", "ignore")
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_decode(self):
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for enc in ("utf8", "utf16"):
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.type2test(sample, enc)
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.decode(enc), sample)
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample = u"Hello world\n\x80\x81\xfe\xff"
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(sample, "latin1")
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "Hello world\n")
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_int(self):
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(0)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, self.type2test())
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(10)
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, self.type2test([0]*10))
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(10000)
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, self.type2test([0]*10000))
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_concat(self):
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b1 = self.type2test(b"abc")
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b2 = self.type2test(b"def")
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b1 + b2, b"abcdef")
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b1 + bytes(b"def"), b"abcdef")
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"def") + b1, b"defabc")
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: b1 + u"def")
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: u"abc" + b2)
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_repeat(self):
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for b in b"abc", self.type2test(b"abc"):
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b * 3, b"abcabcabc")
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b * 0, b"")
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b * -1, b"")
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, lambda: b * 3.14)
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, lambda: 3.14 * b)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # XXX Shouldn't bytes and bytearray agree on what to raise?
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises((OverflowError, MemoryError),
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              lambda: b * sys.maxsize)
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_repeat_1char(self):
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_contains(self):
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b"abc")
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn(ord('a'), b)
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn(int(ord('a')), b)
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(200, b)
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, lambda: 300 in b)
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, lambda: -1 in b)
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: None in b)
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: float(ord('a')) in b)
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: u"a" in b)
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in bytes, bytearray:
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b""), b)
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"a"), b)
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"b"), b)
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"c"), b)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"ab"), b)
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"bc"), b)
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(f(b"abc"), b)
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotIn(f(b"ac"), b)
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotIn(f(b"d"), b)
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotIn(f(b"dab"), b)
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotIn(f(b"abd"), b)
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_fromhex(self):
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test.fromhex)
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test.fromhex, 1)
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test.fromhex(u''), self.type2test())
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray([0x1a, 0x2b, 0x30])
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test.fromhex(u'1a2B30'), b)
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test.fromhex(u'  1A 2B  30   '), b)
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test.fromhex(u'0000'), b'\0\0')
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test.fromhex, u'a')
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test.fromhex, u'rt')
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd')
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test.fromhex, u'\x00')
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, self.type2test.fromhex, u'12   \x00   34')
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_join(self):
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"").join([]), b"")
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b"").join([b""]), b"")
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            lst = list(map(self.type2test, lst))
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(self.type2test(b"").join(lst), b"abc")
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX more...
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_count(self):
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.count(b'i'), 4)
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.count(b'ss'), 2)
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.count(b'w'), 0)
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_startswith(self):
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'hello')
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(self.type2test().startswith(b"anything"))
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.startswith(b"hello"))
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.startswith(b"hel"))
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.startswith(b"h"))
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b.startswith(b"hellow"))
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b.startswith(b"ha"))
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_endswith(self):
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'hello')
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(bytearray().endswith(b"anything"))
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.endswith(b"hello"))
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.endswith(b"llo"))
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b.endswith(b"o"))
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b.endswith(b"whello"))
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b.endswith(b"no"))
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_find(self):
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'ss'), 2)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'ss', 3), 5)
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'ss', 1, 7), 2)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'ss', 1, 3), -1)
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'w'), -1)
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.find(b'mississippian'), -1)
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rfind(self):
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rfind(b'ss'), 5)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rfind(b'ss', 3), 5)
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rfind(b'ss', 0, 6), 2)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rfind(b'w'), -1)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rfind(b'mississippian'), -1)
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_index(self):
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'world')
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.index(b'w'), 0)
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.index(b'orl'), 1)
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, b.index, b'worm')
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, b.index, b'ldo')
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rindex(self):
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX could be more rigorous
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'world')
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rindex(b'w'), 0)
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rindex(b'orl'), 1)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, b.rindex, b'worm')
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, b.rindex, b'ldo')
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_replace(self):
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split(self):
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.split(b'w'), [b])
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split_whitespace(self):
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for b in (b'  arf  barf  ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  b'arf\fbarf', b'arf\vbarf'):
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.type2test(b)
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.split(), [b'arf', b'barf'])
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.split(None), [b'arf', b'barf'])
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.type2test(b)
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.split(), [b])
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').split(None, 0), [b'a  bb  c  '])
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').split(None, 1), [b'a', b'bb  c  '])
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').split(None, 2), [b'a', b'bb', b'c  '])
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').split(None, 3), [b'a', b'bb', b'c'])
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split_string_error(self):
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test(b'a b').split, u' ')
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split_unicodewhitespace(self):
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rsplit(self):
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rsplit(b'w'), [b])
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rsplit_whitespace(self):
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for b in (b'  arf  barf  ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  b'arf\fbarf', b'arf\vbarf'):
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = self.type2test(b)
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.rsplit(), [b'arf', b'barf'])
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').rsplit(None, 0), [b'  a  bb  c'])
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').rsplit(None, 1), [b'  a  bb', b'c'])
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').rsplit(None, 2), [b'  a', b'bb', b'c'])
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'  a  bb  c  ').rsplit(None, 3), [b'a', b'bb', b'c'])
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rsplit_string_error(self):
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ')
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rsplit_unicodewhitespace(self):
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_partition(self):
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rpartition(self):
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pickling(self):
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b = self.type2test(b)
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ps = pickle.dumps(b, proto)
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                q = pickle.loads(ps)
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(b, q)
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_strip(self):
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b'i'), b'mississipp')
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b'm'), b'ississippi')
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b'pi'), b'mississ')
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b'im'), b'ssissipp')
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b'pim'), b'ssiss')
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(b), b'')
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_lstrip(self):
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(b'i'), b'mississippi')
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(b'm'), b'ississippi')
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(b'pi'), b'mississippi')
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(b'im'), b'ssissippi')
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rstrip(self):
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'mississippi')
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(b'i'), b'mississipp')
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(b'm'), b'mississippi')
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(b'pi'), b'mississ')
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(b'im'), b'mississipp')
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(b'pim'), b'mississ')
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_strip_whitespace(self):
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.strip(), b'abc')
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_strip_bytearray(self):
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_strip_string_error(self):
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b')
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b')
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b')
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ord(self):
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'\0A\x7f\x80\xff')
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         [0, 65, 127, 128, 255])
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_none_arguments(self):
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # issue 11828
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'hello')
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        l = self.type2test(b'l')
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = self.type2test(b'h')
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = self.type2test(b'x')
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        o = self.type2test(b'o')
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.find(l, None))
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.find(l, -2, None))
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.find(l, None, -2))
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(0, b.find(h, None, None))
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.rfind(l, None))
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.rfind(l, -2, None))
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.rfind(l, None, -2))
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(0, b.rfind(h, None, None))
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.index(l, None))
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.index(l, -2, None))
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.index(l, None, -2))
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(0, b.index(h, None, None))
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.rindex(l, None))
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(3, b.rindex(l, -2, None))
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.rindex(l, None, -2))
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(0, b.rindex(h, None, None))
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(2, b.count(l, None))
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1, b.count(l, -2, None))
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(1, b.count(l, None, -2))
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(0, b.count(x, None, None))
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.endswith(o, None))
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.endswith(o, -2, None))
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.endswith(l, None, -2))
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(False, b.endswith(x, None, None))
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.startswith(h, None))
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.startswith(l, -2, None))
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(True, b.startswith(h, None, -2))
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(False, b.startswith(x, None, None))
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_find_etc_raise_correct_error_messages(self):
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # issue 11828
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = self.type2test(b'hello')
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = self.type2test(b'x')
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find,
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind,
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index,
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex,
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count,
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith,
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith,
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                x, None, None, None)
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ByteArrayTest(BaseBytesTest):
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = bytearray
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nohash(self):
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, hash, bytearray())
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bytearray_api(self):
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        short_sample = b"Hello world\n"
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample = short_sample + b"\0"*(20 - len(short_sample))
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tfn = tempfile.mktemp()
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Prepare
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with open(tfn, "wb") as f:
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                f.write(short_sample)
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Test readinto
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with open(tfn, "rb") as f:
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b = bytearray(20)
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                n = f.readinto(b)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(n, len(short_sample))
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Python 2.x
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b_sample = (ord(s) for s in sample)
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(list(b), list(b_sample))
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Test writing in binary mode
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with open(tfn, "wb") as f:
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                f.write(b)
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with open(tfn, "rb") as f:
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(f.read(), sample)
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Text mode is ambiguous; don't test
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                os.remove(tfn)
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except os.error:
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_reverse(self):
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'hello')
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.reverse(), None)
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'olleh')
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'hello1') # test even number of items
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.reverse()
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'1olleh')
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray()
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.reverse()
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b)
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_regexps(self):
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def by(s):
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return bytearray(map(ord, s))
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = by("Hello, world")
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setitem(self):
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray([1, 2, 3])
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[1] = 100
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([1, 100, 3]))
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[-1] = 200
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([1, 100, 200]))
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[0] = Indexable(10)
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([10, 100, 200]))
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[3] = 0
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise IndexError")
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IndexError:
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[-10] = 0
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise IndexError")
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IndexError:
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[0] = 256
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise ValueError")
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[0] = Indexable(-1)
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise ValueError")
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[0] = None
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Didn't raise TypeError")
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except TypeError:
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_delitem(self):
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(range(10))
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del b[0]
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(range(1, 10)))
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del b[-1]
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(range(1, 9)))
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del b[4]
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setslice(self):
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(range(10))
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(b), list(range(10)))
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[0:5] = bytearray([1, 1, 1, 1, 1])
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del b[0:-5]
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[0:0] = bytearray([0, 1, 2, 3, 4])
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(range(10)))
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[-7:-3] = bytearray([100, 101])
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[3:5] = [3, 4, 5, 6]
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(range(10)))
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[3:0] = [42, 42, 42]
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[3:] = b'foo'
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[:3] = memoryview(b'foo')
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[3:4] = []
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[1:] = list(b'uuuu')  # this works only on Python2
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray([102, 117, 117, 117, 117]))
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for elem in [5, -5, 0, long(10e20), u'str', 2.3, [u'a', u'b'], [[]]]:
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.assertRaises(TypeError):
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b[3:4] = elem
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for elem in [[254, 255, 256], [-256, 9000]]:
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with self.assertRaises(ValueError):
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b[3:4] = elem
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_extended_set_del_slice(self):
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for start in indices:
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for stop in indices:
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Skip invalid step 0
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for step in indices[1:]:
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    L = list(range(255))
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    b = bytearray(L)
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # Make sure we have a slice of exactly the right length,
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # but with different data.
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    data = L[start:stop:step]
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    data.reverse()
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    L[start:stop:step] = data
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    b[start:stop:step] = data
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(b, bytearray(L))
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    del L[start:stop:step]
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    del b[start:stop:step]
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(b, bytearray(L))
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setslice_trap(self):
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This test verifies that we correctly handle assigning self
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to a slice of self (the old Lambert Meertens trap).
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(range(256))
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b[8:] = b
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_iconcat(self):
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b"abc")
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b1 = b
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b += b"def"
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"abcdef")
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b1)
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b is b1)
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b += b"xyz"
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"abcdefxyz")
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b += u""
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except TypeError:
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("bytes += unicode didn't raise TypeError")
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_irepeat(self):
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b"abc")
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b1 = b
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b *= 3
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"abcabcabc")
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b1)
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b is b1)
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_irepeat_1char(self):
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b"x")
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b1 = b
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b *= 100
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"x"*100)
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b1)
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b is b1)
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_alloc(self):
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray()
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        alloc = b.__alloc__()
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(alloc >= 0)
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        seq = [alloc]
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(100):
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b += b"x"
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            alloc = b.__alloc__()
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(alloc >= len(b))
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if alloc not in seq:
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                seq.append(alloc)
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_extend(self):
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        orig = b'hello'
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(orig)
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend(a)
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a, orig + orig)
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[5:], orig)
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(b'')
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test iterators that don't have a __length_hint__
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend(map(ord, orig * 25))
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend(ord(x) for x in orig * 25)
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a, orig * 50)
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[-5:], orig)
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(b'')
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend(iter(map(ord, orig * 50)))
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a, orig * 50)
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[-5:], orig)
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(b'')
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend(list(map(ord, orig * 50)))
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a, orig * 50)
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a[-5:], orig)
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(b'')
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(a), 0)
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = bytearray(b'')
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.extend([Indexable(ord('a'))])
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a, b'a')
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_remove(self):
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'hello')
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.remove(ord('l'))
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'helo')
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.remove(ord('l'))
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'heo')
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, lambda: b.remove(ord('l')))
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, lambda: b.remove(400))
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: b.remove(u'e'))
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # remove first and last
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.remove(ord('o'))
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.remove(ord('h'))
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'e')
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: b.remove(u'e'))
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.remove(Indexable(ord('e')))
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'')
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pop(self):
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'world')
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.pop(), ord('d'))
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.pop(0), ord('w'))
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.pop(-2), ord('r'))
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: b.pop(10))
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(IndexError, lambda: bytearray().pop())
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test for issue #6846
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytearray(b'\xff').pop(), 0xff)
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_nosort(self):
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(AttributeError, lambda: bytearray().sort())
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_append(self):
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'hell')
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.append(ord('o'))
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'hello')
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b.append(100), None)
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray()
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.append(ord('A'))
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(b), 1)
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, lambda: b.append(u'o'))
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray()
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.append(Indexable(ord('A')))
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'A')
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_insert(self):
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'msssspp')
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.insert(1, ord('i'))
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.insert(4, ord('i'))
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.insert(-2, ord('i'))
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.insert(1000, ord('i'))
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'mississippi')
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # allowed in 2.x
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray()
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b.insert(0, Indexable(ord('A')))
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'A')
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_copied(self):
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Issue 4348.  Make sure that operations that don't mutate the array
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # copy the bytes.
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(b'abc')
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(b is b.replace(b'abc', b'cde', 0))
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = bytearray([i for i in range(256)])
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = bytearray(b'')
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertFalse(x is x.translate(t))
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_partition_bytearray_doesnt_share_nullstring(self):
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a, b, c = bytearray(b"x").partition(b"y")
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"")
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b is not c)
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b += b"!"
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a, b, c = bytearray(b"x").partition(b"y")
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"")
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Same for rpartition
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b, c, a = bytearray(b"x").rpartition(b"y")
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"")
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(b is not c)
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b += b"!"
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c, b, a = bytearray(b"x").rpartition(b"y")
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b"")
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b"")
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_resize_forbidden(self):
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # #4509: can't resize a bytearray when there are buffer exports, even
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if it wouldn't reallocate the underlying buffer.
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Furthermore, no destructive changes to the buffer may be applied
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # before raising the error.
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(range(10))
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        v = memoryview(b)
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def resize(n):
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[1:-1] = range(n + 1, 2*n - 1)
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        resize(10)
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        orig = b[:]
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, resize, 11)
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, resize, 9)
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, resize, 0)
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Other operations implying resize
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, b.pop, 0)
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, b.remove, b[1])
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def delitem():
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del b[1]
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, delitem)
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # deleting a non-contiguous slice
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def delslice():
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b[1:-1:2] = b""
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(BufferError, delslice)
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, orig)
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_empty_bytearray(self):
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Issue #7561: operations on empty bytearrays could crash in many
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # situations, due to a fragile implementation of the
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # PyByteArray_AS_STRING() C macro.
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, int, bytearray(b''))
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass AssortedBytesTest(unittest.TestCase):
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Test various combinations of bytes and bytearray
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @check_bytes_warnings
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_repr_str(self):
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in str, repr:
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(bytearray()), "bytearray(b'')")
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(bytearray([0, 1, 254, 255])),
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             "bytearray(b'\\x00\\x01\\xfe\\xff')")
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(b"abc"), "b'abc'")
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(b"'"), '''b"'"''') # '''
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_compare_bytes_to_bytearray(self):
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" == bytes(b"abc"), True)
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" != bytes(b"abc"), True)
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" <= bytes(b"abc"), True)
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" < bytes(b"abc"), True)
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" >= bytes(b"ab"), True)
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" > bytes(b"ab"), True)
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" != bytes(b"abc"), False)
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" == bytes(b"abc"), False)
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" > bytes(b"abc"), False)
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"ab" >= bytes(b"abc"), False)
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" < bytes(b"ab"), False)
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b"abc" <= bytes(b"ab"), False)
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") == b"abc", True)
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") != b"abc", True)
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") <= b"abc", True)
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") < b"abc", True)
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") >= b"ab", True)
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") > b"ab", True)
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") != b"abc", False)
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") == b"abc", False)
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") > b"abc", False)
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"ab") >= b"abc", False)
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") < b"ab", False)
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(bytes(b"abc") <= b"ab", False)
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @test.test_support.requires_docstrings
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_doc(self):
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNotNone(bytearray.__doc__)
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsNotNone(bytes.__doc__)
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_from_bytearray(self):
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        buf = memoryview(sample)
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = bytearray(buf)
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, bytearray(sample))
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @check_bytes_warnings
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_to_str(self):
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(b''), "b''")
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(b'x'), "b'x'")
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(b'\x80'), "b'\\x80'")
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_literal(self):
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tests =  [
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (b"Wonderful spam", "Wonderful spam"),
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (br"Wonderful spam too", "Wonderful spam too"),
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for b, s in tests:
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(b, bytearray(s, 'latin-1'))
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for c in range(128, 256):
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(SyntaxError, eval,
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              'b"%s"' % chr(c))
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_translate(self):
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        b = b'hello'
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ba = bytearray(b)
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rosetta = bytearray(range(0, 256))
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        rosetta[ord('o')] = ord('e')
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = b.translate(rosetta, b'l')
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b, b'hello')
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b'hee')
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = ba.translate(rosetta, b'l')
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ba, b'hello')
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b'hee')
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = b.translate(None, b'e')
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b'hllo')
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = ba.translate(None, b'e')
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c, b'hllo')
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, b.translate, None, None)
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, ba.translate, None, None)
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split_bytearray(self):
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rsplit_bytearray(self):
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Optimizations:
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # __iter__? (optimization)
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # __reversed__? (optimization)
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # XXX More string methods?  (Those that don't use character properties)
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # There are tests in string_tests.py that are more
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # comprehensive for things like split, partition, etc.
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Unfortunately they are all bundled with tests that
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # are not appropriate for bytes
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # I've started porting some of those into bytearray_tests.py, we should port
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the rest that make sense (the code can be cleaned up to use modern
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # unittest methods at the same time).
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BytearrayPEP3137Test(unittest.TestCase,
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       test.buffer_tests.MixinBytesBufferCommonTests):
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def marshal(self, x):
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return bytearray(x)
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_returns_new_copy(self):
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        val = self.marshal(b'1234')
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # On immutable types these MAY return a reference to themselves
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # but on mutable types like bytearray they MUST return a new copy.
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for methname in ('zfill', 'rjust', 'ljust', 'center'):
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            method = getattr(val, methname)
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            newval = method(3)
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(val, newval)
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(val is not newval,
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            methname+' returned self on a mutable object')
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for expr in ('val.split()[0]', 'val.rsplit()[0]',
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     'val.partition(".")[0]', 'val.rpartition(".")[2]',
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     'val.splitlines()[0]', 'val.replace("", "")'):
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            newval = eval(expr)
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(val, newval)
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(val is not newval,
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            expr+' returned val on a mutable object')
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass FixedStringTest(test.string_tests.BaseTest):
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fixtype(self, obj):
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if isinstance(obj, str):
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return obj.encode("utf-8")
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return super(FixedStringTest, self).fixtype(obj)
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Currently the bytes containment testing uses a single integer
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # value. This may not be the final design, but until then the
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # bytes section with in a bytes containment not valid
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_contains(self):
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_expandtabs(self):
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_upper(self):
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_lower(self):
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_hash(self):
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX check this out
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pass
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ByteArrayAsStringTest(FixedStringTest):
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = bytearray
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ByteArraySubclass(bytearray):
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ByteArraySubclassTest(unittest.TestCase):
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_basic(self):
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(issubclass(ByteArraySubclass, bytearray))
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(ByteArraySubclass(), bytearray)
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a, b = b"abcd", b"efgh"
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test comparison operators with subclass instances
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_a == _a)
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_a != _b)
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_a < _b)
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_a <= _b)
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_b >= _a)
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_b > _a)
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(_a is not a)
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test concat of subclass instances
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a + b, _a + _b)
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a + b, a + _b)
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a + b, _a + b)
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test repeat
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a*5 == _a*5)
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_join(self):
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure join returns a NEW object for single item sequences
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # involving a subclass.
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure that it is of the appropriate type.
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s1 = ByteArraySubclass(b"abcd")
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s2 = bytearray().join([s1])
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(s1 is not s2)
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(type(s2) is bytearray, type(s2))
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test reverse, calling join on subclass
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s3 = s1.join([b"abcd"])
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(type(s3) is bytearray)
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pickle(self):
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = ByteArraySubclass(b"abcd")
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.x = 10
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.y = ByteArraySubclass(b"efgh")
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = pickle.loads(pickle.dumps(a, proto))
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotEqual(id(a), id(b))
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a, b)
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a.x, b.x)
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a.y, b.y)
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(type(a), type(b))
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(type(a.y), type(b.y))
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_copy(self):
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = ByteArraySubclass(b"abcd")
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.x = 10
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a.y = ByteArraySubclass(b"efgh")
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for copy_method in (copy.copy, copy.deepcopy):
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            b = copy_method(a)
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotEqual(id(a), id(b))
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a, b)
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a.x, b.x)
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(a.y, b.y)
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(type(a), type(b))
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(type(a.y), type(b.y))
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_init_override(self):
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class subclass(bytearray):
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, newarg=1, *args, **kwargs):
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bytearray.__init__(self, *args, **kwargs)
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = subclass(4, source=b"abcd")
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x, b"abcd")
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = subclass(newarg=4, source=b"abcd")
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(x, b"abcd")
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #test.test_support.run_unittest(BytesTest)
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #test.test_support.run_unittest(AssortedBytesTest)
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #test.test_support.run_unittest(BytesAsStringTest)
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test.test_support.run_unittest(
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ByteArrayTest,
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ByteArrayAsStringTest,
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ByteArraySubclassTest,
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BytearrayPEP3137Test)
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
1141