11a6387e68300b6f554f4f4f044491b7034733442Christian Heimes"""Unit tests for the bytes and bytearray types.
21a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
386e0d5761177ef3fe7b50f7e9f235c70960d7834Martin PanterXXX This is a mess.  Common tests should be unified with string_tests.py (and
486e0d5761177ef3fe7b50f7e9f235c70960d7834Martin Panterthe latter should be modernized).
51a6387e68300b6f554f4f4f044491b7034733442Christian Heimes"""
61a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
71a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport os
81a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport re
91a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport sys
101a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport copy
119b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xiclunaimport functools
121a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport pickle
131a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport tempfile
141a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport unittest
151a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport test.test_support
161a6387e68300b6f554f4f4f044491b7034733442Christian Heimesimport test.string_tests
171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
189b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna
199b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xiclunaif sys.flags.bytes_warning:
209b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    def check_bytes_warnings(func):
219b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna        @functools.wraps(func)
229b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna        def wrapper(*args, **kw):
239b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna            with test.test_support.check_warnings(('', BytesWarning)):
249b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna                return func(*args, **kw)
259b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna        return wrapper
269b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xiclunaelse:
279b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    # no-op
289b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    def check_bytes_warnings(func):
299b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna        return func
309b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna
319b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna
323e483f643de3d38125a7ca04bb424323cf736762Georg Brandlclass Indexable:
333e483f643de3d38125a7ca04bb424323cf736762Georg Brandl    def __init__(self, value=0):
343e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        self.value = value
353e483f643de3d38125a7ca04bb424323cf736762Georg Brandl    def __index__(self):
363e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        return self.value
373e483f643de3d38125a7ca04bb424323cf736762Georg Brandl
381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
391a6387e68300b6f554f4f4f044491b7034733442Christian Heimesclass BaseBytesTest(unittest.TestCase):
401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
411a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_basics(self):
421a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test()
431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(type(b), self.type2test)
441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.__class__, self.type2test)
451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_empty_sequence(self):
471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test()
481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(len(b), 0)
491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[0])
501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[1])
511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[sys.maxint])
521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[sys.maxint+1])
531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[10**100])
541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-1])
551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-2])
561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-sys.maxint])
571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b[-10**100])
601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_from_list(self):
621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        ints = list(range(256))
631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(i for i in ints)
641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(len(b), 256)
651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(list(b), ints)
661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_from_index(self):
683e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b = self.type2test([Indexable(), Indexable(1), Indexable(254),
693e483f643de3d38125a7ca04bb424323cf736762Georg Brandl                            Indexable(255)])
701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(list(b), [0, 1, 254, 255])
7106f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
7206f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertRaises(ValueError, self.type2test, [Indexable(256)])
731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_from_ssize(self):
7506f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertEqual(self.type2test(0), b'')
7606f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertEqual(self.type2test(1), b'\x00')
775c4e292c14b71bfecb45e39f501329a71254b2ccBenjamin Peterson        self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
7806f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertRaises(ValueError, self.type2test, -1)
791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8006f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertEqual(self.type2test('0', 'ascii'), b'0')
8106f06a0b2fb871a8acad8576816eda5f05160856Benjamin Peterson        self.assertEqual(self.type2test(b'0'), b'0')
82821a8ea39fb93095cc06c0cd9ef4ce498af73ab3Benjamin Peterson        self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_constructor_type_errors(self):
851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test, 0.0)
861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        class C:
871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
88efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        # allowed in 2.x
890a34baf1fc10ffd61f4e9a8d053008dd57930fffGeorg Brandl        #self.assertRaises(TypeError, self.type2test, ["0"])
901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test, [0.0])
911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test, [None])
921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test, [C()])
931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_constructor_value_errors(self):
951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [-1])
961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [-sys.maxint])
971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [-sys.maxint-1])
981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [-sys.maxint-2])
991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [-10**100])
1001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [256])
1011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [257])
1021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [sys.maxint])
1031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [sys.maxint+1])
1041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test, [10**100])
1051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_compare(self):
1071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b1 = self.type2test([1, 2, 3])
1081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b2 = self.type2test([1, 2, 3])
1091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b3 = self.type2test([1, 3])
1101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b1, b2)
1125c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b2 != b3)
1135c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b1 <= b2)
1145c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b1 <= b3)
1155c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b1 <  b3)
1165c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b1 >= b2)
1175c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b3 >= b2)
1185c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b3 >  b2)
1195c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson
1205c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b1 != b2)
1215c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b2 == b3)
1225c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b1 >  b2)
1235c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b1 >  b3)
1245c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b1 >= b3)
1255c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b1 <  b2)
1265c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b3 <  b2)
1275c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(b3 <= b2)
1281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1299b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    @check_bytes_warnings
1301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_compare_to_str(self):
1311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Byte comparisons with unicode should always fail!
1321a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Test this for all expected byte orders and Unicode character sizes
1331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False)
1341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False)
1351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False)
1361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False)
1371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test() == unicode(), False)
1381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test() != unicode(), True)
1391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_reversed(self):
1411a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        input = list(map(ord, "Hello"))
1421a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(input)
1431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        output = list(reversed(b))
1441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        input.reverse()
1451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(output, input)
1461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_getslice(self):
1481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        def by(s):
1491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            return self.type2test(map(ord, s))
1501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = by("Hello, world")
1511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[:5], by("Hello"))
1531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[1:5], by("ello"))
1541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[5:7], by(", "))
1551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[7:], by("world"))
1561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[7:12], by("world"))
1571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[7:100], by("world"))
1581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[:-7], by("Hello"))
1601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-11:-7], by("ello"))
1611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-7:-5], by(", "))
1621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-5:], by("world"))
1631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-5:12], by("world"))
1641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-5:100], by("world"))
1651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b[-100:5], by("Hello"))
1661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_extended_getslice(self):
1681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Test extended slicing by comparing with list slicing.
1691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        L = list(range(255))
1701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(L)
1711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
1721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for start in indices:
1731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            for stop in indices:
1741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                # Skip step 0 (invalid)
1751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                for step in indices[1:]:
1761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
1771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_encoding(self):
1791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
1801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for enc in ("utf8", "utf16"):
1811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b = self.type2test(sample, enc)
1821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b, self.type2test(sample.encode(enc)))
1831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
1841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(sample, "latin1", "ignore")
1851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
1861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_decode(self):
1881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
1891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for enc in ("utf8", "utf16"):
1901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b = self.type2test(sample, enc)
1911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b.decode(enc), sample)
1921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        sample = u"Hello world\n\x80\x81\xfe\xff"
1931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(sample, "latin1")
1941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
1951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
196dc782b55f2c7ede13c8c2bbc76662e8a9784d20cBenjamin Peterson        self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
197dc782b55f2c7ede13c8c2bbc76662e8a9784d20cBenjamin Peterson                         "Hello world\n")
1981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
1991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_from_int(self):
2001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(0)
2011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, self.type2test())
2021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(10)
2031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, self.type2test([0]*10))
2041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(10000)
2051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, self.type2test([0]*10000))
2061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_concat(self):
2081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b1 = self.type2test(b"abc")
2091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b2 = self.type2test(b"def")
2101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b1 + b2, b"abcdef")
2111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b1 + bytes(b"def"), b"abcdef")
2121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"def") + b1, b"defabc")
2131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: b1 + u"def")
2141a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: u"abc" + b2)
2151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_repeat(self):
2171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for b in b"abc", self.type2test(b"abc"):
2181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b * 3, b"abcabcabc")
2191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b * 0, b"")
2201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b * -1, b"")
2211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertRaises(TypeError, lambda: b * 3.14)
2221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertRaises(TypeError, lambda: 3.14 * b)
2231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # XXX Shouldn't bytes and bytearray agree on what to raise?
2241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertRaises((OverflowError, MemoryError),
22569ed5240451b5e9642ddc87bb6b0ca2d2e47d784Mark Hammond                              lambda: b * sys.maxsize)
2261a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2271a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_repeat_1char(self):
2281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
2291a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_contains(self):
2311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b"abc")
232aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(ord('a'), b)
233aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(int(ord('a')), b)
234aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(200, b)
2351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, lambda: 300 in b)
2361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, lambda: -1 in b)
2371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: None in b)
2381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: float(ord('a')) in b)
2391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: u"a" in b)
2401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for f in bytes, bytearray:
241aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b""), b)
242aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"a"), b)
243aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"b"), b)
244aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"c"), b)
245aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"ab"), b)
246aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"bc"), b)
247aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(f(b"abc"), b)
248aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertNotIn(f(b"ac"), b)
249aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertNotIn(f(b"d"), b)
250aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertNotIn(f(b"dab"), b)
251aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertNotIn(f(b"abd"), b)
2521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_fromhex(self):
2541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test.fromhex)
2551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test.fromhex, 1)
2562623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(self.type2test.fromhex(u''), self.type2test())
2571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray([0x1a, 0x2b, 0x30])
2582623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(self.type2test.fromhex(u'1a2B30'), b)
2592623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(self.type2test.fromhex(u'  1A 2B  30   '), b)
2602623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(self.type2test.fromhex(u'0000'), b'\0\0')
2611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test.fromhex, u'a')
2621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test.fromhex, u'rt')
2631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd')
2641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test.fromhex, u'\x00')
2651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, self.type2test.fromhex, u'12   \x00   34')
2661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_join(self):
2681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"").join([]), b"")
2691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b"").join([b""]), b"")
2701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
2711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            lst = list(map(self.type2test, lst))
2721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(self.type2test(b"").join(lst), b"abc")
2731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
2741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
2751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
2761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # XXX more...
2771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_count(self):
2791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
2801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.count(b'i'), 4)
2811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.count(b'ss'), 2)
2821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.count(b'w'), 0)
2831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_startswith(self):
2851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'hello')
2861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(self.type2test().startswith(b"anything"))
2871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.startswith(b"hello"))
2881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.startswith(b"hel"))
2891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.startswith(b"h"))
2901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(b.startswith(b"hellow"))
2911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(b.startswith(b"ha"))
2921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
2931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_endswith(self):
2941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'hello')
2951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(bytearray().endswith(b"anything"))
2961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.endswith(b"hello"))
2971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.endswith(b"llo"))
2981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertTrue(b.endswith(b"o"))
2991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(b.endswith(b"whello"))
3001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(b.endswith(b"no"))
3011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_find(self):
3031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
3041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'ss'), 2)
3051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'ss', 3), 5)
3061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'ss', 1, 7), 2)
3071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'ss', 1, 3), -1)
3081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'w'), -1)
3091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.find(b'mississippian'), -1)
3101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rfind(self):
3121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
3131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rfind(b'ss'), 5)
3141a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rfind(b'ss', 3), 5)
3151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rfind(b'ss', 0, 6), 2)
3161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rfind(b'w'), -1)
3171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rfind(b'mississippian'), -1)
3181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_index(self):
3201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'world')
3211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.index(b'w'), 0)
3221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.index(b'orl'), 1)
3231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, b.index, b'worm')
3241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, b.index, b'ldo')
3251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3261a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rindex(self):
3271a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # XXX could be more rigorous
3281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'world')
3291a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rindex(b'w'), 0)
3301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rindex(b'orl'), 1)
3311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, b.rindex, b'worm')
3321a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, b.rindex, b'ldo')
3331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_replace(self):
3351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
3361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
3371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
3381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_split_string_error(self):
3401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test(b'a b').split, u' ')
3411a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
342efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou    def test_split_unicodewhitespace(self):
343f1669a390d262bf138cd8dc954443fb0e3c8c85eMartin Panter        for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
344f1669a390d262bf138cd8dc954443fb0e3c8c85eMartin Panter            b = self.type2test(b)
345f1669a390d262bf138cd8dc954443fb0e3c8c85eMartin Panter            self.assertEqual(b.split(), [b])
346efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
347efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
348efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou
3491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rsplit_string_error(self):
3501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ')
3511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rsplit_unicodewhitespace(self):
3531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
3541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
3551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_partition(self):
3571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
3581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
359efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
3601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rpartition(self):
3621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'mississippi')
3631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
3641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
365efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
3661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_pickling(self):
368592c2755677d77061ceb99607c10fa7d70e5c2ddHirokazu Yamamoto        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
3701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                b = self.type2test(b)
3711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                ps = pickle.dumps(b, proto)
3721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                q = pickle.loads(ps)
3731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                self.assertEqual(b, q)
3741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
375efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou    def test_strip_bytearray(self):
3761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
3771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
3781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
3791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_strip_string_error(self):
3811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b')
3821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b')
3831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b')
3841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
3851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_ord(self):
3861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = self.type2test(b'\0A\x7f\x80\xff')
3871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
3881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                         [0, 65, 127, 128, 255])
3891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
39044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea    def test_none_arguments(self):
39144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        # issue 11828
39244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        b = self.type2test(b'hello')
39344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        l = self.type2test(b'l')
39444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        h = self.type2test(b'h')
39544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        x = self.type2test(b'x')
39644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        o = self.type2test(b'o')
39744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
39844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.find(l, None))
39944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.find(l, -2, None))
40044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.find(l, None, -2))
40144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(0, b.find(h, None, None))
40244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
40344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.rfind(l, None))
40444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.rfind(l, -2, None))
40544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.rfind(l, None, -2))
40644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(0, b.rfind(h, None, None))
40744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
40844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.index(l, None))
40944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.index(l, -2, None))
41044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.index(l, None, -2))
41144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(0, b.index(h, None, None))
41244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
41344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.rindex(l, None))
41444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(3, b.rindex(l, -2, None))
41544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.rindex(l, None, -2))
41644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(0, b.rindex(h, None, None))
41744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
41844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(2, b.count(l, None))
41944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(1, b.count(l, -2, None))
42044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(1, b.count(l, None, -2))
42144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(0, b.count(x, None, None))
42244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
42344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.endswith(o, None))
42444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.endswith(o, -2, None))
42544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.endswith(l, None, -2))
42644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(False, b.endswith(x, None, None))
42744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
42844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.startswith(h, None))
42944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.startswith(l, -2, None))
43044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(True, b.startswith(h, None, -2))
43144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertEqual(False, b.startswith(x, None, None))
43244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
43344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea    def test_find_etc_raise_correct_error_messages(self):
43444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        # issue 11828
43544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        b = self.type2test(b'hello')
43644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        x = self.type2test(b'x')
43744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find,
43844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
43944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind,
44044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
44144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index,
44244e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
44344e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex,
44444e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
44544e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count,
44644e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
44744e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith,
44844e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
44944e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea        self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith,
45044e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea                                x, None, None, None)
45144e81687a22b5890e9fddc80de6afaeb1757aa6dJesus Cea
45214a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka    def test_free_after_iterating(self):
45314a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka        test.test_support.check_free_after_iterating(self, iter, self.type2test)
45414a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka        test.test_support.check_free_after_iterating(self, reversed, self.type2test)
45514a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka
4561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
4571a6387e68300b6f554f4f4f044491b7034733442Christian Heimesclass ByteArrayTest(BaseBytesTest):
4581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    type2test = bytearray
4591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
4601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_nohash(self):
4611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, hash, bytearray())
4621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
4631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_bytearray_api(self):
4641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        short_sample = b"Hello world\n"
4651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        sample = short_sample + b"\0"*(20 - len(short_sample))
4661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        tfn = tempfile.mktemp()
4671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
4681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # Prepare
4691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            with open(tfn, "wb") as f:
4701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                f.write(short_sample)
4711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # Test readinto
4721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            with open(tfn, "rb") as f:
4731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                b = bytearray(20)
4741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                n = f.readinto(b)
4751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(n, len(short_sample))
4761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # Python 2.x
4771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b_sample = (ord(s) for s in sample)
4781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(list(b), list(b_sample))
4791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # Test writing in binary mode
4801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            with open(tfn, "wb") as f:
4811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                f.write(b)
4821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            with open(tfn, "rb") as f:
4831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                self.assertEqual(f.read(), sample)
4841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            # Text mode is ambiguous; don't test
4851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        finally:
4861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            try:
4871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                os.remove(tfn)
4881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            except os.error:
4891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                pass
4901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
4911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_reverse(self):
4921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'hello')
4931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.reverse(), None)
4941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'olleh')
4951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'hello1') # test even number of items
4961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.reverse()
4971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'1olleh')
4981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray()
4991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.reverse()
5001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertFalse(b)
5011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_regexps(self):
5031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        def by(s):
5041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            return bytearray(map(ord, s))
5051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = by("Hello, world")
5061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
5071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_setitem(self):
5091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray([1, 2, 3])
5101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[1] = 100
5111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([1, 100, 3]))
5121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[-1] = 200
5131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([1, 100, 200]))
5143e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b[0] = Indexable(10)
5151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([10, 100, 200]))
5161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
5171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b[3] = 0
5181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("Didn't raise IndexError")
5191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except IndexError:
5201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
5211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
5221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b[-10] = 0
5231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("Didn't raise IndexError")
5241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except IndexError:
5251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
5261a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
5271a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b[0] = 256
5281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("Didn't raise ValueError")
5291a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except ValueError:
5301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
5311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
5323e483f643de3d38125a7ca04bb424323cf736762Georg Brandl            b[0] = Indexable(-1)
5331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("Didn't raise ValueError")
5341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except ValueError:
5351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
5361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
5371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b[0] = None
5381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("Didn't raise TypeError")
5391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except TypeError:
5401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
5411a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5421a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_delitem(self):
5431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(range(10))
5441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        del b[0]
5451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(range(1, 10)))
5461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        del b[-1]
5471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(range(1, 9)))
5481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        del b[4]
5491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
5501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_setslice(self):
5521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(range(10))
5531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(list(b), list(range(10)))
5541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[0:5] = bytearray([1, 1, 1, 1, 1])
5561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
5571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        del b[0:-5]
5591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
5601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[0:0] = bytearray([0, 1, 2, 3, 4])
5621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(range(10)))
5631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[-7:-3] = bytearray([100, 101])
5651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
5661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[3:5] = [3, 4, 5, 6]
5681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(range(10)))
5691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
5701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[3:0] = [42, 42, 42]
5711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
5721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
57367dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        b[3:] = b'foo'
57467dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
57567dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
57667dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        b[:3] = memoryview(b'foo')
57767dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
57867dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
57967dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        b[3:4] = []
58067dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
58167dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
58267dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        b[1:] = list(b'uuuu')  # this works only on Python2
58367dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        self.assertEqual(b, bytearray([102, 117, 117, 117, 117]))
58467dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
58567dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        for elem in [5, -5, 0, long(10e20), u'str', 2.3, [u'a', u'b'], [[]]]:
58667dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti            with self.assertRaises(TypeError):
58767dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti                b[3:4] = elem
58867dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
58967dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti        for elem in [[254, 255, 256], [-256, 9000]]:
59067dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti            with self.assertRaises(ValueError):
59167dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti                b[3:4] = elem
59267dc4a87fccb7ec52323ba26d536654698ae8cbaEzio Melotti
5931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_extended_set_del_slice(self):
59436ecd676eac6c9d7ace41a1ff35124912371e91dMark Dickinson        indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
5951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for start in indices:
5961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            for stop in indices:
5971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                # Skip invalid step 0
5981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                for step in indices[1:]:
5991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    L = list(range(255))
6001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    b = bytearray(L)
6011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    # Make sure we have a slice of exactly the right length,
6021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    # but with different data.
6031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    data = L[start:stop:step]
6041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    data.reverse()
6051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    L[start:stop:step] = data
6061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    b[start:stop:step] = data
6072623a37852153363335956afab010cb0beb7e74eEzio Melotti                    self.assertEqual(b, bytearray(L))
6081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    del L[start:stop:step]
6101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                    del b[start:stop:step]
6112623a37852153363335956afab010cb0beb7e74eEzio Melotti                    self.assertEqual(b, bytearray(L))
6121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_setslice_trap(self):
6141a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # This test verifies that we correctly handle assigning self
6151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # to a slice of self (the old Lambert Meertens trap).
6161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(range(256))
6171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b[8:] = b
6181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
6191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_iconcat(self):
6211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b"abc")
6221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b1 = b
6231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b += b"def"
6241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"abcdef")
6251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b1)
6265c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b is b1)
6271a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b += b"xyz"
6281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"abcdefxyz")
6291a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        try:
6301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b += u""
6311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        except TypeError:
6321a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            pass
6331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        else:
6341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.fail("bytes += unicode didn't raise TypeError")
6351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_irepeat(self):
6371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b"abc")
6381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b1 = b
6391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b *= 3
6401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"abcabcabc")
6411a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b1)
6425c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b is b1)
6431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_irepeat_1char(self):
6451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b"x")
6461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b1 = b
6471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b *= 100
6481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"x"*100)
6491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b1)
6505c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b is b1)
6511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
6521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_alloc(self):
6531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray()
6541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        alloc = b.__alloc__()
6555c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(alloc >= 0)
6561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        seq = [alloc]
6571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for i in range(100):
6581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b += b"x"
6591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            alloc = b.__alloc__()
660ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka            self.assertGreater(alloc, len(b))  # including trailing null byte
6611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            if alloc not in seq:
6621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                seq.append(alloc)
6631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
664ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka    def test_init_alloc(self):
665ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        b = bytearray()
666ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        def g():
667ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka            for i in range(1, 100):
668ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                yield i
669ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                a = list(b)
670ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                self.assertEqual(a, list(range(1, len(a)+1)))
671ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                self.assertEqual(len(b), len(a))
672ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                self.assertLessEqual(len(b), i)
673ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                alloc = b.__alloc__()
674ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka                self.assertGreater(alloc, len(b))  # including trailing null byte
675ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        b.__init__(g())
676ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        self.assertEqual(list(b), list(range(1, 100)))
677ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        self.assertEqual(len(b), 99)
678ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        alloc = b.__alloc__()
679ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka        self.assertGreater(alloc, len(b))
680ab766350b665ff2cafb92191a7cd720a1ebf6fe7Serhiy Storchaka
6811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_extend(self):
6821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        orig = b'hello'
6831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = bytearray(orig)
6841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.extend(a)
6851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a, orig + orig)
6861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a[5:], orig)
6871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = bytearray(b'')
6881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Test iterators that don't have a __length_hint__
6891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.extend(map(ord, orig * 25))
6901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.extend(ord(x) for x in orig * 25)
6911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a, orig * 50)
6921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a[-5:], orig)
6931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = bytearray(b'')
6941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.extend(iter(map(ord, orig * 50)))
6951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a, orig * 50)
6961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a[-5:], orig)
6971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = bytearray(b'')
6981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.extend(list(map(ord, orig * 50)))
6991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a, orig * 50)
7001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a[-5:], orig)
7011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = bytearray(b'')
7021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
7031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
7041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(len(a), 0)
7053e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        a = bytearray(b'')
7063e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        a.extend([Indexable(ord('a'))])
7073e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        self.assertEqual(a, b'a')
7081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
7091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_remove(self):
7101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'hello')
7111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.remove(ord('l'))
7121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'helo')
7131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.remove(ord('l'))
7141a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'heo')
7151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, lambda: b.remove(ord('l')))
7161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(ValueError, lambda: b.remove(400))
7171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: b.remove(u'e'))
7181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # remove first and last
7191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.remove(ord('o'))
7201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.remove(ord('h'))
7211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'e')
7221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: b.remove(u'e'))
7233e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b.remove(Indexable(ord('e')))
7243e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        self.assertEqual(b, b'')
7251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
726c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        # test values outside of the ascii range: (0, 127)
727c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        c = bytearray([126, 127, 128, 129])
728c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        c.remove(127)
729c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        self.assertEqual(c, bytearray([126, 128, 129]))
730c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        c.remove(129)
731c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka        self.assertEqual(c, bytearray([126, 128]))
732c742dff16a8dd6979a7857948f63f99f391bb369Serhiy Storchaka
7331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_pop(self):
7341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'world')
7351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.pop(), ord('d'))
7361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.pop(0), ord('w'))
7371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.pop(-2), ord('r'))
7381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(IndexError, lambda: b.pop(10))
739680e6eb54f01610f44843ed3f0a1ea8dd69b9603Eli Bendersky        self.assertRaises(IndexError, lambda: bytearray().pop())
740c8a7c7c3b9c28dd2c0f9b81d807f8c7f60cb0924Mark Dickinson        # test for issue #6846
741c8a7c7c3b9c28dd2c0f9b81d807f8c7f60cb0924Mark Dickinson        self.assertEqual(bytearray(b'\xff').pop(), 0xff)
7421a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
7431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_nosort(self):
7441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(AttributeError, lambda: bytearray().sort())
7451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
7461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_append(self):
7471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'hell')
7481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.append(ord('o'))
7491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'hello')
7501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b.append(100), None)
7511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray()
7521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.append(ord('A'))
7531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(len(b), 1)
7541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertRaises(TypeError, lambda: b.append(u'o'))
7553e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b = bytearray()
7563e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b.append(Indexable(ord('A')))
7573e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        self.assertEqual(b, b'A')
7581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
7591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_insert(self):
7601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(b'msssspp')
7611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.insert(1, ord('i'))
7621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.insert(4, ord('i'))
7631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.insert(-2, ord('i'))
7641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b.insert(1000, ord('i'))
7651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'mississippi')
766efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou        # allowed in 2.x
7673e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        #self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
7683e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b = bytearray()
7693e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        b.insert(0, Indexable(ord('A')))
7703e483f643de3d38125a7ca04bb424323cf736762Georg Brandl        self.assertEqual(b, b'A')
7711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
77246cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson    def test_copied(self):
77346cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        # Issue 4348.  Make sure that operations that don't mutate the array
77446cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        # copy the bytes.
77546cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        b = bytearray(b'abc')
776d3b5a7985d81fd28fe970ab5d7429fa57e723e2cBenjamin Peterson        self.assertFalse(b is b.replace(b'abc', b'cde', 0))
77746cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson
77846cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        t = bytearray([i for i in range(256)])
77946cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        x = bytearray(b'')
78046cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson        self.assertFalse(x is x.translate(t))
78146cc6d11020d0bfa7b245b18679a613e9bc2b325Benjamin Peterson
7821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_partition_bytearray_doesnt_share_nullstring(self):
7831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a, b, c = bytearray(b"x").partition(b"y")
7841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"")
7851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
7865c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b is not c)
7871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b += b"!"
7881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
7891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a, b, c = bytearray(b"x").partition(b"y")
7901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"")
7911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
7921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Same for rpartition
7931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b, c, a = bytearray(b"x").rpartition(b"y")
7941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"")
7951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
7965c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b is not c)
7971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b += b"!"
7981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
7991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        c, b, a = bytearray(b"x").rpartition(b"y")
8001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b"")
8011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b"")
8021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
803efa45f35b529a61aceb4e1266ded7a0b268b0c17Antoine Pitrou    def test_resize_forbidden(self):
804ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # #4509: can't resize a bytearray when there are buffer exports, even
805ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # if it wouldn't reallocate the underlying buffer.
806ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # Furthermore, no destructive changes to the buffer may be applied
807ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # before raising the error.
808ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        b = bytearray(range(10))
809ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        v = memoryview(b)
810ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        def resize(n):
811ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou            b[1:-1] = range(n + 1, 2*n - 1)
812ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        resize(10)
813ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        orig = b[:]
814ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, resize, 11)
8152623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
816ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, resize, 9)
8172623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
818ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, resize, 0)
8192623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
820ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # Other operations implying resize
821ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, b.pop, 0)
8222623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
823ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, b.remove, b[1])
8242623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
825ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        def delitem():
826ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou            del b[1]
827ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, delitem)
8282623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
829ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        # deleting a non-contiguous slice
830ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        def delslice():
831ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou            b[1:-1:2] = b""
832ae5beceb35384da8eed64940e5632d62c4907576Antoine Pitrou        self.assertRaises(BufferError, delslice)
8332623a37852153363335956afab010cb0beb7e74eEzio Melotti        self.assertEqual(b, orig)
8341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
835e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou    def test_empty_bytearray(self):
836e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou        # Issue #7561: operations on empty bytearrays could crash in many
837e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou        # situations, due to a fragile implementation of the
838e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou        # PyByteArray_AS_STRING() C macro.
839e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou        self.assertRaises(ValueError, int, bytearray(b''))
840e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou
8410ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka    def test_exhausted_iterator(self):
8420ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        a = self.type2test([1, 2, 3])
8430ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        exhit = iter(a)
8440ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        empit = iter(a)
8450ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        for x in exhit:  # exhaust the iterator
8460ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka            next(empit)  # not exhausted
8470ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        a.append(9)
8480ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        self.assertEqual(list(exhit), [])
8490ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        self.assertEqual(list(empit), [9])
8500ed3891915425b1af26e26c4c5d350e85e7ea4cfSerhiy Storchaka        self.assertEqual(a, self.type2test([1, 2, 3, 9]))
851e80a6a4ead1da87d2a4149bfcbb95c1a3320dbc2Antoine Pitrou
8521a6387e68300b6f554f4f4f044491b7034733442Christian Heimesclass AssortedBytesTest(unittest.TestCase):
8531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    #
8541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # Test various combinations of bytes and bytearray
8551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    #
8561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8579b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    @check_bytes_warnings
8581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_repr_str(self):
8591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for f in str, repr:
8601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(bytearray()), "bytearray(b'')")
8611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
8621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(bytearray([0, 1, 254, 255])),
8631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                             "bytearray(b'\\x00\\x01\\xfe\\xff')")
8641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(b"abc"), "b'abc'")
8651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(b"'"), '''b"'"''') # '''
8661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
8671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_compare_bytes_to_bytearray(self):
8691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" == bytes(b"abc"), True)
8701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" != bytes(b"abc"), True)
8711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" <= bytes(b"abc"), True)
8721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" < bytes(b"abc"), True)
8731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" >= bytes(b"ab"), True)
8741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" > bytes(b"ab"), True)
8751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" != bytes(b"abc"), False)
8771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" == bytes(b"abc"), False)
8781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" > bytes(b"abc"), False)
8791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"ab" >= bytes(b"abc"), False)
8801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" < bytes(b"ab"), False)
8811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b"abc" <= bytes(b"ab"), False)
8821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") == b"abc", True)
8841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") != b"abc", True)
8851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") <= b"abc", True)
8861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") < b"abc", True)
8871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") >= b"ab", True)
8881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") > b"ab", True)
8891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") != b"abc", False)
8911a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") == b"abc", False)
8921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") > b"abc", False)
8931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"ab") >= b"abc", False)
8941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") < b"ab", False)
8951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(bytes(b"abc") <= b"ab", False)
8961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
8974216aa1e52380ecc17566d0c60cac51834cfb22cStefan Krah    @test.test_support.requires_docstrings
8981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_doc(self):
899bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        self.assertIsNotNone(bytearray.__doc__)
9005c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
901bc27c6a5aa75a8f52304ecd311fbadef4ec621ceFlorent Xicluna        self.assertIsNotNone(bytes.__doc__)
9025c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
9031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_from_bytearray(self):
9051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
9061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        buf = memoryview(sample)
9071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = bytearray(buf)
9081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, bytearray(sample))
9091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9109b90cd1f7b7fa658a48389ca599cd6ffde922e34Florent Xicluna    @check_bytes_warnings
9111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_to_str(self):
9121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(b''), "b''")
9131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(b'x'), "b'x'")
9141a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(b'\x80'), "b'\\x80'")
9151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
9161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
9171a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
9181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_literal(self):
9201a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        tests =  [
9211a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            (b"Wonderful spam", "Wonderful spam"),
9221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            (br"Wonderful spam too", "Wonderful spam too"),
9231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
9241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
9251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        ]
9261a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for b, s in tests:
9271a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(b, bytearray(s, 'latin-1'))
9281a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for c in range(128, 256):
9291a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertRaises(SyntaxError, eval,
9301a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                              'b"%s"' % chr(c))
9311a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9321a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_translate(self):
9331a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        b = b'hello'
9346425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        ba = bytearray(b)
9351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        rosetta = bytearray(range(0, 256))
9361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        rosetta[ord('o')] = ord('e')
9371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        c = b.translate(rosetta, b'l')
9381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b, b'hello')
9391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(c, b'hee')
9406425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        c = ba.translate(rosetta, b'l')
9416425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertEqual(ba, b'hello')
9426425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertEqual(c, b'hee')
9436425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        c = b.translate(None, b'e')
9446425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertEqual(c, b'hllo')
9456425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        c = ba.translate(None, b'e')
9466425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertEqual(c, b'hllo')
9476425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertRaises(TypeError, b.translate, None, None)
9486425a2fa8f354e755f876f2dea708697e42cc9fdGeorg Brandl        self.assertRaises(TypeError, ba.translate, None, None)
9491a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9501a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_split_bytearray(self):
9511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
9521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_rsplit_bytearray(self):
9541a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
9551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # Optimizations:
9571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # __iter__? (optimization)
9581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # __reversed__? (optimization)
9591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9601a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # XXX More string methods?  (Those that don't use character properties)
9611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # There are tests in string_tests.py that are more
963f1669a390d262bf138cd8dc954443fb0e3c8c85eMartin Panter    # comprehensive for things like partition, etc.
9641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # Unfortunately they are all bundled with tests that
9651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # are not appropriate for bytes
9661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # I've started porting some of those into bytearray_tests.py, we should port
9681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # the rest that make sense (the code can be cleaned up to use modern
9691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # unittest methods at the same time).
9701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
97186e0d5761177ef3fe7b50f7e9f235c70960d7834Martin Panterclass BytearrayPEP3137Test(unittest.TestCase):
9721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def marshal(self, x):
9731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        return bytearray(x)
9741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_returns_new_copy(self):
9761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        val = self.marshal(b'1234')
9771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # On immutable types these MAY return a reference to themselves
9781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # but on mutable types like bytearray they MUST return a new copy.
9791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for methname in ('zfill', 'rjust', 'ljust', 'center'):
9801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            method = getattr(val, methname)
9811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            newval = method(3)
9821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(val, newval)
9831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertTrue(val is not newval,
9841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                            methname+' returned self on a mutable object')
9855f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou        for expr in ('val.split()[0]', 'val.rsplit()[0]',
9865f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou                     'val.partition(".")[0]', 'val.rpartition(".")[2]',
9875f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou                     'val.splitlines()[0]', 'val.replace("", "")'):
9885f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou            newval = eval(expr)
9895f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou            self.assertEqual(val, newval)
9905f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou            self.assertTrue(val is not newval,
9915f76d132a56a92f1911e16afb59443d5b44f8d32Antoine Pitrou                            expr+' returned val on a mutable object')
9921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
99486e0d5761177ef3fe7b50f7e9f235c70960d7834Martin Panterclass ByteArrayAsStringTest(test.string_tests.CommonTest,
99586e0d5761177ef3fe7b50f7e9f235c70960d7834Martin Panter        test.string_tests.NonStringModuleTest):
99686e0d5761177ef3fe7b50f7e9f235c70960d7834Martin Panter    type2test = bytearray
9971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
9981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # Currently the bytes containment testing uses a single integer
9991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # value. This may not be the final design, but until then the
10001a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    # bytes section with in a bytes containment not valid
10011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_contains(self):
10021a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        pass
10031a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_expandtabs(self):
10041a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        pass
10051a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_upper(self):
10061a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        pass
10071a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_lower(self):
10081a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        pass
10091a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_hash(self):
10101a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # XXX check this out
10111a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        pass
10121a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10131a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10141a6387e68300b6f554f4f4f044491b7034733442Christian Heimesclass ByteArraySubclass(bytearray):
10151a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    pass
10161a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10171a6387e68300b6f554f4f4f044491b7034733442Christian Heimesclass ByteArraySubclassTest(unittest.TestCase):
10181a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10191a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_basic(self):
10205c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(issubclass(ByteArraySubclass, bytearray))
1021b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti        self.assertIsInstance(ByteArraySubclass(), bytearray)
10221a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10231a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a, b = b"abcd", b"efgh"
10241a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
10251a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10261a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # test comparison operators with subclass instances
10275c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_a == _a)
10285c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_a != _b)
10295c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_a < _b)
10305c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_a <= _b)
10315c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_b >= _a)
10325c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_b > _a)
10335c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(_a is not a)
10341a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10351a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # test concat of subclass instances
10361a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a + b, _a + _b)
10371a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a + b, a + _b)
10381a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(a + b, _a + b)
10391a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10401a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # test repeat
10415c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a*5 == _a*5)
10421a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10431a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_join(self):
10441a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Make sure join returns a NEW object for single item sequences
10451a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # involving a subclass.
10461a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Make sure that it is of the appropriate type.
10471a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        s1 = ByteArraySubclass(b"abcd")
10481a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        s2 = bytearray().join([s1])
10495c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(s1 is not s2)
10505c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(type(s2) is bytearray, type(s2))
10511a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10521a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        # Test reverse, calling join on subclass
10531a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        s3 = s1.join([b"abcd"])
10545c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(type(s3) is bytearray)
10551a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10561a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_pickle(self):
10571a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = ByteArraySubclass(b"abcd")
10581a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.x = 10
10591a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.y = ByteArraySubclass(b"efgh")
1060592c2755677d77061ceb99607c10fa7d70e5c2ddHirokazu Yamamoto        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
10611a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b = pickle.loads(pickle.dumps(a, proto))
10621a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertNotEqual(id(a), id(b))
10631a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a, b)
10641a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a.x, b.x)
10651a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a.y, b.y)
10661a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(type(a), type(b))
10671a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(type(a.y), type(b.y))
10681a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10691a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_copy(self):
10701a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a = ByteArraySubclass(b"abcd")
10711a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.x = 10
10721a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        a.y = ByteArraySubclass(b"efgh")
10731a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        for copy_method in (copy.copy, copy.deepcopy):
10741a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            b = copy_method(a)
10751a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertNotEqual(id(a), id(b))
10761a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a, b)
10771a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a.x, b.x)
10781a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(a.y, b.y)
10791a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(type(a), type(b))
10801a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            self.assertEqual(type(a.y), type(b.y))
10811a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10821a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    def test_init_override(self):
10831a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        class subclass(bytearray):
10841a6387e68300b6f554f4f4f044491b7034733442Christian Heimes            def __init__(self, newarg=1, *args, **kwargs):
10851a6387e68300b6f554f4f4f044491b7034733442Christian Heimes                bytearray.__init__(self, *args, **kwargs)
10861a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        x = subclass(4, source=b"abcd")
10871a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(x, b"abcd")
10881a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        x = subclass(newarg=4, source=b"abcd")
10891a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        self.assertEqual(x, b"abcd")
10901a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
10911a6387e68300b6f554f4f4f044491b7034733442Christian Heimesdef test_main():
10921a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    #test.test_support.run_unittest(BytesTest)
10931a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    #test.test_support.run_unittest(AssortedBytesTest)
10941a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    test.test_support.run_unittest(
10951a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        ByteArrayTest,
10961a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        ByteArrayAsStringTest,
10971a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        ByteArraySubclassTest,
10981a6387e68300b6f554f4f4f044491b7034733442Christian Heimes        BytearrayPEP3137Test)
10991a6387e68300b6f554f4f4f044491b7034733442Christian Heimes
11001a6387e68300b6f554f4f4f044491b7034733442Christian Heimesif __name__ == "__main__":
11011a6387e68300b6f554f4f4f044491b7034733442Christian Heimes    test_main()
1102