17db96d56Sopenharmony_ci"""Unit tests for the bytes and bytearray types. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciXXX This is a mess. Common tests should be unified with string_tests.py (and 47db96d56Sopenharmony_cithe latter should be modernized). 57db96d56Sopenharmony_ci""" 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciimport array 87db96d56Sopenharmony_ciimport os 97db96d56Sopenharmony_ciimport re 107db96d56Sopenharmony_ciimport sys 117db96d56Sopenharmony_ciimport copy 127db96d56Sopenharmony_ciimport functools 137db96d56Sopenharmony_ciimport pickle 147db96d56Sopenharmony_ciimport tempfile 157db96d56Sopenharmony_ciimport textwrap 167db96d56Sopenharmony_ciimport unittest 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ciimport test.support 197db96d56Sopenharmony_cifrom test.support import import_helper 207db96d56Sopenharmony_cifrom test.support import warnings_helper 217db96d56Sopenharmony_ciimport test.string_tests 227db96d56Sopenharmony_ciimport test.list_tests 237db96d56Sopenharmony_cifrom test.support import bigaddrspacetest, MAX_Py_ssize_t 247db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_failure 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciif sys.flags.bytes_warning: 287db96d56Sopenharmony_ci def check_bytes_warnings(func): 297db96d56Sopenharmony_ci @functools.wraps(func) 307db96d56Sopenharmony_ci def wrapper(*args, **kw): 317db96d56Sopenharmony_ci with warnings_helper.check_warnings(('', BytesWarning)): 327db96d56Sopenharmony_ci return func(*args, **kw) 337db96d56Sopenharmony_ci return wrapper 347db96d56Sopenharmony_cielse: 357db96d56Sopenharmony_ci # no-op 367db96d56Sopenharmony_ci def check_bytes_warnings(func): 377db96d56Sopenharmony_ci return func 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ciclass Indexable: 417db96d56Sopenharmony_ci def __init__(self, value=0): 427db96d56Sopenharmony_ci self.value = value 437db96d56Sopenharmony_ci def __index__(self): 447db96d56Sopenharmony_ci return self.value 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ciclass BaseBytesTest: 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci def test_basics(self): 507db96d56Sopenharmony_ci b = self.type2test() 517db96d56Sopenharmony_ci self.assertEqual(type(b), self.type2test) 527db96d56Sopenharmony_ci self.assertEqual(b.__class__, self.type2test) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def test_copy(self): 557db96d56Sopenharmony_ci a = self.type2test(b"abcd") 567db96d56Sopenharmony_ci for copy_method in (copy.copy, copy.deepcopy): 577db96d56Sopenharmony_ci b = copy_method(a) 587db96d56Sopenharmony_ci self.assertEqual(a, b) 597db96d56Sopenharmony_ci self.assertEqual(type(a), type(b)) 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci def test_empty_sequence(self): 627db96d56Sopenharmony_ci b = self.type2test() 637db96d56Sopenharmony_ci self.assertEqual(len(b), 0) 647db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[0]) 657db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[1]) 667db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[sys.maxsize]) 677db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[sys.maxsize+1]) 687db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[10**100]) 697db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-1]) 707db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-2]) 717db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-sys.maxsize]) 727db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-sys.maxsize-1]) 737db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-sys.maxsize-2]) 747db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b[-10**100]) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci def test_from_iterable(self): 777db96d56Sopenharmony_ci b = self.type2test(range(256)) 787db96d56Sopenharmony_ci self.assertEqual(len(b), 256) 797db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(256))) 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci # Non-sequence iterable. 827db96d56Sopenharmony_ci b = self.type2test({42}) 837db96d56Sopenharmony_ci self.assertEqual(b, b"*") 847db96d56Sopenharmony_ci b = self.type2test({43, 45}) 857db96d56Sopenharmony_ci self.assertIn(tuple(b), {(43, 45), (45, 43)}) 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci # Iterator that has a __length_hint__. 887db96d56Sopenharmony_ci b = self.type2test(iter(range(256))) 897db96d56Sopenharmony_ci self.assertEqual(len(b), 256) 907db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(256))) 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci # Iterator that doesn't have a __length_hint__. 937db96d56Sopenharmony_ci b = self.type2test(i for i in range(256) if i % 2) 947db96d56Sopenharmony_ci self.assertEqual(len(b), 128) 957db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(256))[1::2]) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci # Sequence without __iter__. 987db96d56Sopenharmony_ci class S: 997db96d56Sopenharmony_ci def __getitem__(self, i): 1007db96d56Sopenharmony_ci return (1, 2, 3)[i] 1017db96d56Sopenharmony_ci b = self.type2test(S()) 1027db96d56Sopenharmony_ci self.assertEqual(b, b"\x01\x02\x03") 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci def test_from_tuple(self): 1057db96d56Sopenharmony_ci # There is a special case for tuples. 1067db96d56Sopenharmony_ci b = self.type2test(tuple(range(256))) 1077db96d56Sopenharmony_ci self.assertEqual(len(b), 256) 1087db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(256))) 1097db96d56Sopenharmony_ci b = self.type2test((1, 2, 3)) 1107db96d56Sopenharmony_ci self.assertEqual(b, b"\x01\x02\x03") 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def test_from_list(self): 1137db96d56Sopenharmony_ci # There is a special case for lists. 1147db96d56Sopenharmony_ci b = self.type2test(list(range(256))) 1157db96d56Sopenharmony_ci self.assertEqual(len(b), 256) 1167db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(256))) 1177db96d56Sopenharmony_ci b = self.type2test([1, 2, 3]) 1187db96d56Sopenharmony_ci self.assertEqual(b, b"\x01\x02\x03") 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci def test_from_mutating_list(self): 1217db96d56Sopenharmony_ci # Issue #34973: Crash in bytes constructor with mutating list. 1227db96d56Sopenharmony_ci class X: 1237db96d56Sopenharmony_ci def __index__(self): 1247db96d56Sopenharmony_ci a.clear() 1257db96d56Sopenharmony_ci return 42 1267db96d56Sopenharmony_ci a = [X(), X()] 1277db96d56Sopenharmony_ci self.assertEqual(bytes(a), b'*') 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci class Y: 1307db96d56Sopenharmony_ci def __index__(self): 1317db96d56Sopenharmony_ci if len(a) < 1000: 1327db96d56Sopenharmony_ci a.append(self) 1337db96d56Sopenharmony_ci return 42 1347db96d56Sopenharmony_ci a = [Y()] 1357db96d56Sopenharmony_ci self.assertEqual(bytes(a), b'*' * 1000) # should not crash 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci def test_from_index(self): 1387db96d56Sopenharmony_ci b = self.type2test([Indexable(), Indexable(1), Indexable(254), 1397db96d56Sopenharmony_ci Indexable(255)]) 1407db96d56Sopenharmony_ci self.assertEqual(list(b), [0, 1, 254, 255]) 1417db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [Indexable(-1)]) 1427db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [Indexable(256)]) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci def test_from_buffer(self): 1457db96d56Sopenharmony_ci a = self.type2test(array.array('B', [1, 2, 3])) 1467db96d56Sopenharmony_ci self.assertEqual(a, b"\x01\x02\x03") 1477db96d56Sopenharmony_ci a = self.type2test(b"\x01\x02\x03") 1487db96d56Sopenharmony_ci self.assertEqual(a, b"\x01\x02\x03") 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci # Issues #29159 and #34974. 1517db96d56Sopenharmony_ci # Fallback when __index__ raises a TypeError 1527db96d56Sopenharmony_ci class B(bytes): 1537db96d56Sopenharmony_ci def __index__(self): 1547db96d56Sopenharmony_ci raise TypeError 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci self.assertEqual(self.type2test(B(b"foobar")), b"foobar") 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci def test_from_ssize(self): 1597db96d56Sopenharmony_ci self.assertEqual(self.type2test(0), b'') 1607db96d56Sopenharmony_ci self.assertEqual(self.type2test(1), b'\x00') 1617db96d56Sopenharmony_ci self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00') 1627db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, -1) 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci self.assertEqual(self.type2test('0', 'ascii'), b'0') 1657db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'0'), b'0') 1667db96d56Sopenharmony_ci self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1) 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def test_constructor_type_errors(self): 1697db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, 0.0) 1707db96d56Sopenharmony_ci class C: 1717db96d56Sopenharmony_ci pass 1727db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, ["0"]) 1737db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, [0.0]) 1747db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, [None]) 1757db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, [C()]) 1767db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, encoding='ascii') 1777db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, errors='ignore') 1787db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, 0, 'ascii') 1797db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, b'', 'ascii') 1807db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, 0, errors='ignore') 1817db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, b'', errors='ignore') 1827db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, '') 1837db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, '', errors='ignore') 1847db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, '', b'ascii') 1857db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore') 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci def test_constructor_value_errors(self): 1887db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [-1]) 1897db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [-sys.maxsize]) 1907db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1]) 1917db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2]) 1927db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [-10**100]) 1937db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [256]) 1947db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [257]) 1957db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [sys.maxsize]) 1967db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [sys.maxsize+1]) 1977db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test, [10**100]) 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci @bigaddrspacetest 2007db96d56Sopenharmony_ci def test_constructor_overflow(self): 2017db96d56Sopenharmony_ci size = MAX_Py_ssize_t 2027db96d56Sopenharmony_ci self.assertRaises((OverflowError, MemoryError), self.type2test, size) 2037db96d56Sopenharmony_ci try: 2047db96d56Sopenharmony_ci # Should either pass or raise an error (e.g. on debug builds with 2057db96d56Sopenharmony_ci # additional malloc() overhead), but shouldn't crash. 2067db96d56Sopenharmony_ci bytearray(size - 4) 2077db96d56Sopenharmony_ci except (OverflowError, MemoryError): 2087db96d56Sopenharmony_ci pass 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci def test_constructor_exceptions(self): 2117db96d56Sopenharmony_ci # Issue #34974: bytes and bytearray constructors replace unexpected 2127db96d56Sopenharmony_ci # exceptions. 2137db96d56Sopenharmony_ci class BadInt: 2147db96d56Sopenharmony_ci def __index__(self): 2157db96d56Sopenharmony_ci 1/0 2167db96d56Sopenharmony_ci self.assertRaises(ZeroDivisionError, self.type2test, BadInt()) 2177db96d56Sopenharmony_ci self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()]) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci class BadIterable: 2207db96d56Sopenharmony_ci def __iter__(self): 2217db96d56Sopenharmony_ci 1/0 2227db96d56Sopenharmony_ci self.assertRaises(ZeroDivisionError, self.type2test, BadIterable()) 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci def test_compare(self): 2257db96d56Sopenharmony_ci b1 = self.type2test([1, 2, 3]) 2267db96d56Sopenharmony_ci b2 = self.type2test([1, 2, 3]) 2277db96d56Sopenharmony_ci b3 = self.type2test([1, 3]) 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci self.assertEqual(b1, b2) 2307db96d56Sopenharmony_ci self.assertTrue(b2 != b3) 2317db96d56Sopenharmony_ci self.assertTrue(b1 <= b2) 2327db96d56Sopenharmony_ci self.assertTrue(b1 <= b3) 2337db96d56Sopenharmony_ci self.assertTrue(b1 < b3) 2347db96d56Sopenharmony_ci self.assertTrue(b1 >= b2) 2357db96d56Sopenharmony_ci self.assertTrue(b3 >= b2) 2367db96d56Sopenharmony_ci self.assertTrue(b3 > b2) 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci self.assertFalse(b1 != b2) 2397db96d56Sopenharmony_ci self.assertFalse(b2 == b3) 2407db96d56Sopenharmony_ci self.assertFalse(b1 > b2) 2417db96d56Sopenharmony_ci self.assertFalse(b1 > b3) 2427db96d56Sopenharmony_ci self.assertFalse(b1 >= b3) 2437db96d56Sopenharmony_ci self.assertFalse(b1 < b2) 2447db96d56Sopenharmony_ci self.assertFalse(b3 < b2) 2457db96d56Sopenharmony_ci self.assertFalse(b3 <= b2) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci @check_bytes_warnings 2487db96d56Sopenharmony_ci def test_compare_to_str(self): 2497db96d56Sopenharmony_ci # Byte comparisons with unicode should always fail! 2507db96d56Sopenharmony_ci # Test this for all expected byte orders and Unicode character 2517db96d56Sopenharmony_ci # sizes. 2527db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False) 2537db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", 2547db96d56Sopenharmony_ci False) 2557db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False) 2567db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", 2577db96d56Sopenharmony_ci False) 2587db96d56Sopenharmony_ci self.assertEqual(self.type2test() == str(), False) 2597db96d56Sopenharmony_ci self.assertEqual(self.type2test() != str(), True) 2607db96d56Sopenharmony_ci 2617db96d56Sopenharmony_ci def test_reversed(self): 2627db96d56Sopenharmony_ci input = list(map(ord, "Hello")) 2637db96d56Sopenharmony_ci b = self.type2test(input) 2647db96d56Sopenharmony_ci output = list(reversed(b)) 2657db96d56Sopenharmony_ci input.reverse() 2667db96d56Sopenharmony_ci self.assertEqual(output, input) 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci def test_getslice(self): 2697db96d56Sopenharmony_ci def by(s): 2707db96d56Sopenharmony_ci return self.type2test(map(ord, s)) 2717db96d56Sopenharmony_ci b = by("Hello, world") 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci self.assertEqual(b[:5], by("Hello")) 2747db96d56Sopenharmony_ci self.assertEqual(b[1:5], by("ello")) 2757db96d56Sopenharmony_ci self.assertEqual(b[5:7], by(", ")) 2767db96d56Sopenharmony_ci self.assertEqual(b[7:], by("world")) 2777db96d56Sopenharmony_ci self.assertEqual(b[7:12], by("world")) 2787db96d56Sopenharmony_ci self.assertEqual(b[7:100], by("world")) 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci self.assertEqual(b[:-7], by("Hello")) 2817db96d56Sopenharmony_ci self.assertEqual(b[-11:-7], by("ello")) 2827db96d56Sopenharmony_ci self.assertEqual(b[-7:-5], by(", ")) 2837db96d56Sopenharmony_ci self.assertEqual(b[-5:], by("world")) 2847db96d56Sopenharmony_ci self.assertEqual(b[-5:12], by("world")) 2857db96d56Sopenharmony_ci self.assertEqual(b[-5:100], by("world")) 2867db96d56Sopenharmony_ci self.assertEqual(b[-100:5], by("Hello")) 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci def test_extended_getslice(self): 2897db96d56Sopenharmony_ci # Test extended slicing by comparing with list slicing. 2907db96d56Sopenharmony_ci L = list(range(255)) 2917db96d56Sopenharmony_ci b = self.type2test(L) 2927db96d56Sopenharmony_ci indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100) 2937db96d56Sopenharmony_ci for start in indices: 2947db96d56Sopenharmony_ci for stop in indices: 2957db96d56Sopenharmony_ci # Skip step 0 (invalid) 2967db96d56Sopenharmony_ci for step in indices[1:]: 2977db96d56Sopenharmony_ci self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step])) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci def test_encoding(self): 3007db96d56Sopenharmony_ci sample = "Hello world\n\u1234\u5678\u9abc" 3017db96d56Sopenharmony_ci for enc in ("utf-8", "utf-16"): 3027db96d56Sopenharmony_ci b = self.type2test(sample, enc) 3037db96d56Sopenharmony_ci self.assertEqual(b, self.type2test(sample.encode(enc))) 3047db96d56Sopenharmony_ci self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1") 3057db96d56Sopenharmony_ci b = self.type2test(sample, "latin-1", "ignore") 3067db96d56Sopenharmony_ci self.assertEqual(b, self.type2test(sample[:-3], "utf-8")) 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci def test_decode(self): 3097db96d56Sopenharmony_ci sample = "Hello world\n\u1234\u5678\u9abc" 3107db96d56Sopenharmony_ci for enc in ("utf-8", "utf-16"): 3117db96d56Sopenharmony_ci b = self.type2test(sample, enc) 3127db96d56Sopenharmony_ci self.assertEqual(b.decode(enc), sample) 3137db96d56Sopenharmony_ci sample = "Hello world\n\x80\x81\xfe\xff" 3147db96d56Sopenharmony_ci b = self.type2test(sample, "latin-1") 3157db96d56Sopenharmony_ci self.assertRaises(UnicodeDecodeError, b.decode, "utf-8") 3167db96d56Sopenharmony_ci self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n") 3177db96d56Sopenharmony_ci self.assertEqual(b.decode(errors="ignore", encoding="utf-8"), 3187db96d56Sopenharmony_ci "Hello world\n") 3197db96d56Sopenharmony_ci # Default encoding is utf-8 3207db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603') 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci def test_check_encoding_errors(self): 3237db96d56Sopenharmony_ci # bpo-37388: bytes(str) and bytes.encode() must check encoding 3247db96d56Sopenharmony_ci # and errors arguments in dev mode 3257db96d56Sopenharmony_ci invalid = 'Boom, Shaka Laka, Boom!' 3267db96d56Sopenharmony_ci encodings = ('ascii', 'utf8', 'latin1') 3277db96d56Sopenharmony_ci code = textwrap.dedent(f''' 3287db96d56Sopenharmony_ci import sys 3297db96d56Sopenharmony_ci type2test = {self.type2test.__name__} 3307db96d56Sopenharmony_ci encodings = {encodings!r} 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci for data in ('', 'short string'): 3337db96d56Sopenharmony_ci try: 3347db96d56Sopenharmony_ci type2test(data, encoding={invalid!r}) 3357db96d56Sopenharmony_ci except LookupError: 3367db96d56Sopenharmony_ci pass 3377db96d56Sopenharmony_ci else: 3387db96d56Sopenharmony_ci sys.exit(21) 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci for encoding in encodings: 3417db96d56Sopenharmony_ci try: 3427db96d56Sopenharmony_ci type2test(data, encoding=encoding, errors={invalid!r}) 3437db96d56Sopenharmony_ci except LookupError: 3447db96d56Sopenharmony_ci pass 3457db96d56Sopenharmony_ci else: 3467db96d56Sopenharmony_ci sys.exit(22) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci for data in (b'', b'short string'): 3497db96d56Sopenharmony_ci data = type2test(data) 3507db96d56Sopenharmony_ci print(repr(data)) 3517db96d56Sopenharmony_ci try: 3527db96d56Sopenharmony_ci data.decode(encoding={invalid!r}) 3537db96d56Sopenharmony_ci except LookupError: 3547db96d56Sopenharmony_ci sys.exit(10) 3557db96d56Sopenharmony_ci else: 3567db96d56Sopenharmony_ci sys.exit(23) 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci try: 3597db96d56Sopenharmony_ci data.decode(errors={invalid!r}) 3607db96d56Sopenharmony_ci except LookupError: 3617db96d56Sopenharmony_ci pass 3627db96d56Sopenharmony_ci else: 3637db96d56Sopenharmony_ci sys.exit(24) 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci for encoding in encodings: 3667db96d56Sopenharmony_ci try: 3677db96d56Sopenharmony_ci data.decode(encoding=encoding, errors={invalid!r}) 3687db96d56Sopenharmony_ci except LookupError: 3697db96d56Sopenharmony_ci pass 3707db96d56Sopenharmony_ci else: 3717db96d56Sopenharmony_ci sys.exit(25) 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_ci sys.exit(10) 3747db96d56Sopenharmony_ci ''') 3757db96d56Sopenharmony_ci proc = assert_python_failure('-X', 'dev', '-c', code) 3767db96d56Sopenharmony_ci self.assertEqual(proc.rc, 10, proc) 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci def test_from_int(self): 3797db96d56Sopenharmony_ci b = self.type2test(0) 3807db96d56Sopenharmony_ci self.assertEqual(b, self.type2test()) 3817db96d56Sopenharmony_ci b = self.type2test(10) 3827db96d56Sopenharmony_ci self.assertEqual(b, self.type2test([0]*10)) 3837db96d56Sopenharmony_ci b = self.type2test(10000) 3847db96d56Sopenharmony_ci self.assertEqual(b, self.type2test([0]*10000)) 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci def test_concat(self): 3877db96d56Sopenharmony_ci b1 = self.type2test(b"abc") 3887db96d56Sopenharmony_ci b2 = self.type2test(b"def") 3897db96d56Sopenharmony_ci self.assertEqual(b1 + b2, b"abcdef") 3907db96d56Sopenharmony_ci self.assertEqual(b1 + bytes(b"def"), b"abcdef") 3917db96d56Sopenharmony_ci self.assertEqual(bytes(b"def") + b1, b"defabc") 3927db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b1 + "def") 3937db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: "abc" + b2) 3947db96d56Sopenharmony_ci 3957db96d56Sopenharmony_ci def test_repeat(self): 3967db96d56Sopenharmony_ci for b in b"abc", self.type2test(b"abc"): 3977db96d56Sopenharmony_ci self.assertEqual(b * 3, b"abcabcabc") 3987db96d56Sopenharmony_ci self.assertEqual(b * 0, b"") 3997db96d56Sopenharmony_ci self.assertEqual(b * -1, b"") 4007db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b * 3.14) 4017db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: 3.14 * b) 4027db96d56Sopenharmony_ci # XXX Shouldn't bytes and bytearray agree on what to raise? 4037db96d56Sopenharmony_ci with self.assertRaises((OverflowError, MemoryError)): 4047db96d56Sopenharmony_ci c = b * sys.maxsize 4057db96d56Sopenharmony_ci with self.assertRaises((OverflowError, MemoryError)): 4067db96d56Sopenharmony_ci b *= sys.maxsize 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci def test_repeat_1char(self): 4097db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100)) 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def test_contains(self): 4127db96d56Sopenharmony_ci b = self.type2test(b"abc") 4137db96d56Sopenharmony_ci self.assertIn(ord('a'), b) 4147db96d56Sopenharmony_ci self.assertIn(int(ord('a')), b) 4157db96d56Sopenharmony_ci self.assertNotIn(200, b) 4167db96d56Sopenharmony_ci self.assertRaises(ValueError, lambda: 300 in b) 4177db96d56Sopenharmony_ci self.assertRaises(ValueError, lambda: -1 in b) 4187db96d56Sopenharmony_ci self.assertRaises(ValueError, lambda: sys.maxsize+1 in b) 4197db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: None in b) 4207db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: float(ord('a')) in b) 4217db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: "a" in b) 4227db96d56Sopenharmony_ci for f in bytes, bytearray: 4237db96d56Sopenharmony_ci self.assertIn(f(b""), b) 4247db96d56Sopenharmony_ci self.assertIn(f(b"a"), b) 4257db96d56Sopenharmony_ci self.assertIn(f(b"b"), b) 4267db96d56Sopenharmony_ci self.assertIn(f(b"c"), b) 4277db96d56Sopenharmony_ci self.assertIn(f(b"ab"), b) 4287db96d56Sopenharmony_ci self.assertIn(f(b"bc"), b) 4297db96d56Sopenharmony_ci self.assertIn(f(b"abc"), b) 4307db96d56Sopenharmony_ci self.assertNotIn(f(b"ac"), b) 4317db96d56Sopenharmony_ci self.assertNotIn(f(b"d"), b) 4327db96d56Sopenharmony_ci self.assertNotIn(f(b"dab"), b) 4337db96d56Sopenharmony_ci self.assertNotIn(f(b"abd"), b) 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ci def test_fromhex(self): 4367db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.fromhex) 4377db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.fromhex, 1) 4387db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex(''), self.type2test()) 4397db96d56Sopenharmony_ci b = bytearray([0x1a, 0x2b, 0x30]) 4407db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex('1a2B30'), b) 4417db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b) 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci # check that ASCII whitespace is ignored 4447db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b) 4457db96d56Sopenharmony_ci for c in "\x09\x0A\x0B\x0C\x0D\x20": 4467db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex(c), self.type2test()) 4477db96d56Sopenharmony_ci for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028": 4487db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, c) 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci self.assertEqual(self.type2test.fromhex('0000'), b'\0\0') 4517db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.fromhex, b'1B') 4527db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, 'a') 4537db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, 'rt') 4547db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd') 4557db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, '\x00') 4567db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34') 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci for data, pos in ( 4597db96d56Sopenharmony_ci # invalid first hexadecimal character 4607db96d56Sopenharmony_ci ('12 x4 56', 3), 4617db96d56Sopenharmony_ci # invalid second hexadecimal character 4627db96d56Sopenharmony_ci ('12 3x 56', 4), 4637db96d56Sopenharmony_ci # two invalid hexadecimal characters 4647db96d56Sopenharmony_ci ('12 xy 56', 3), 4657db96d56Sopenharmony_ci # test non-ASCII string 4667db96d56Sopenharmony_ci ('12 3\xff 56', 4), 4677db96d56Sopenharmony_ci ): 4687db96d56Sopenharmony_ci with self.assertRaises(ValueError) as cm: 4697db96d56Sopenharmony_ci self.type2test.fromhex(data) 4707db96d56Sopenharmony_ci self.assertIn('at position %s' % pos, str(cm.exception)) 4717db96d56Sopenharmony_ci 4727db96d56Sopenharmony_ci def test_hex(self): 4737db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.hex) 4747db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.hex, 1) 4757db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").hex(), "") 4767db96d56Sopenharmony_ci self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30') 4777db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30') 4787db96d56Sopenharmony_ci self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30') 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci def test_hex_separator_basics(self): 4817db96d56Sopenharmony_ci three_bytes = self.type2test(b'\xb9\x01\xef') 4827db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(), 'b901ef') 4837db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4847db96d56Sopenharmony_ci three_bytes.hex('') 4857db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4867db96d56Sopenharmony_ci three_bytes.hex('xx') 4877db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 0), 'b901ef') 4887db96d56Sopenharmony_ci with self.assertRaises(TypeError): 4897db96d56Sopenharmony_ci three_bytes.hex(None, 0) 4907db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4917db96d56Sopenharmony_ci three_bytes.hex('\xff') 4927db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4937db96d56Sopenharmony_ci three_bytes.hex(b'\xff') 4947db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4957db96d56Sopenharmony_ci three_bytes.hex(b'\x80') 4967db96d56Sopenharmony_ci with self.assertRaises(ValueError): 4977db96d56Sopenharmony_ci three_bytes.hex(chr(0x100)) 4987db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 0), 'b901ef') 4997db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef') 5007db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef') 5017db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef') 5027db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef') 5037db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 3), 'b901ef') 5047db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 4), 'b901ef') 5057db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', -4), 'b901ef') 5067db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':'), 'b9:01:ef') 5077db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef') 5087db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef') 5097db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef') 5107db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef') 5117db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef') 5127db96d56Sopenharmony_ci self.assertEqual(three_bytes.hex('*', -2), 'b901*ef') 5137db96d56Sopenharmony_ci 5147db96d56Sopenharmony_ci value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000' 5157db96d56Sopenharmony_ci self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030') 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci def test_hex_separator_five_bytes(self): 5187db96d56Sopenharmony_ci five_bytes = self.type2test(range(90,95)) 5197db96d56Sopenharmony_ci self.assertEqual(five_bytes.hex(), '5a5b5c5d5e') 5207db96d56Sopenharmony_ci 5217db96d56Sopenharmony_ci def test_hex_separator_six_bytes(self): 5227db96d56Sopenharmony_ci six_bytes = self.type2test(x*3 for x in range(1, 7)) 5237db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(), '0306090c0f12') 5247db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12') 5257db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12') 5267db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12') 5277db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12') 5287db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12') 5297db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12') 5307db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12') 5317db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12') 5327db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12') 5337db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f@12') 5347db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12') 5357db96d56Sopenharmony_ci self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12') 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ci def test_join(self): 5387db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join([]), b"") 5397db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join([b""]), b"") 5407db96d56Sopenharmony_ci for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]: 5417db96d56Sopenharmony_ci lst = list(map(self.type2test, lst)) 5427db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join(lst), b"abc") 5437db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc") 5447db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc") 5457db96d56Sopenharmony_ci dot_join = self.type2test(b".:").join 5467db96d56Sopenharmony_ci self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd") 5477db96d56Sopenharmony_ci self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd") 5487db96d56Sopenharmony_ci self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd") 5497db96d56Sopenharmony_ci self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") 5507db96d56Sopenharmony_ci self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") 5517db96d56Sopenharmony_ci # Stress it with many items 5527db96d56Sopenharmony_ci seq = [b"abc"] * 100000 5537db96d56Sopenharmony_ci expected = b"abc" + b".:abc" * 99999 5547db96d56Sopenharmony_ci self.assertEqual(dot_join(seq), expected) 5557db96d56Sopenharmony_ci # Stress test with empty separator 5567db96d56Sopenharmony_ci seq = [b"abc"] * 100000 5577db96d56Sopenharmony_ci expected = b"abc" * 100000 5587db96d56Sopenharmony_ci self.assertEqual(self.type2test(b"").join(seq), expected) 5597db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b" ").join, None) 5607db96d56Sopenharmony_ci # Error handling and cleanup when some item in the middle of the 5617db96d56Sopenharmony_ci # sequence has the wrong type. 5627db96d56Sopenharmony_ci with self.assertRaises(TypeError): 5637db96d56Sopenharmony_ci dot_join([bytearray(b"ab"), "cd", b"ef"]) 5647db96d56Sopenharmony_ci with self.assertRaises(TypeError): 5657db96d56Sopenharmony_ci dot_join([memoryview(b"ab"), "cd", b"ef"]) 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci def test_count(self): 5687db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 5697db96d56Sopenharmony_ci i = 105 5707db96d56Sopenharmony_ci p = 112 5717db96d56Sopenharmony_ci w = 119 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci self.assertEqual(b.count(b'i'), 4) 5747db96d56Sopenharmony_ci self.assertEqual(b.count(b'ss'), 2) 5757db96d56Sopenharmony_ci self.assertEqual(b.count(b'w'), 0) 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ci self.assertEqual(b.count(i), 4) 5787db96d56Sopenharmony_ci self.assertEqual(b.count(w), 0) 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci self.assertEqual(b.count(b'i', 6), 2) 5817db96d56Sopenharmony_ci self.assertEqual(b.count(b'p', 6), 2) 5827db96d56Sopenharmony_ci self.assertEqual(b.count(b'i', 1, 3), 1) 5837db96d56Sopenharmony_ci self.assertEqual(b.count(b'p', 7, 9), 1) 5847db96d56Sopenharmony_ci 5857db96d56Sopenharmony_ci self.assertEqual(b.count(i, 6), 2) 5867db96d56Sopenharmony_ci self.assertEqual(b.count(p, 6), 2) 5877db96d56Sopenharmony_ci self.assertEqual(b.count(i, 1, 3), 1) 5887db96d56Sopenharmony_ci self.assertEqual(b.count(p, 7, 9), 1) 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci def test_startswith(self): 5917db96d56Sopenharmony_ci b = self.type2test(b'hello') 5927db96d56Sopenharmony_ci self.assertFalse(self.type2test().startswith(b"anything")) 5937db96d56Sopenharmony_ci self.assertTrue(b.startswith(b"hello")) 5947db96d56Sopenharmony_ci self.assertTrue(b.startswith(b"hel")) 5957db96d56Sopenharmony_ci self.assertTrue(b.startswith(b"h")) 5967db96d56Sopenharmony_ci self.assertFalse(b.startswith(b"hellow")) 5977db96d56Sopenharmony_ci self.assertFalse(b.startswith(b"ha")) 5987db96d56Sopenharmony_ci with self.assertRaises(TypeError) as cm: 5997db96d56Sopenharmony_ci b.startswith([b'h']) 6007db96d56Sopenharmony_ci exc = str(cm.exception) 6017db96d56Sopenharmony_ci self.assertIn('bytes', exc) 6027db96d56Sopenharmony_ci self.assertIn('tuple', exc) 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci def test_endswith(self): 6057db96d56Sopenharmony_ci b = self.type2test(b'hello') 6067db96d56Sopenharmony_ci self.assertFalse(bytearray().endswith(b"anything")) 6077db96d56Sopenharmony_ci self.assertTrue(b.endswith(b"hello")) 6087db96d56Sopenharmony_ci self.assertTrue(b.endswith(b"llo")) 6097db96d56Sopenharmony_ci self.assertTrue(b.endswith(b"o")) 6107db96d56Sopenharmony_ci self.assertFalse(b.endswith(b"whello")) 6117db96d56Sopenharmony_ci self.assertFalse(b.endswith(b"no")) 6127db96d56Sopenharmony_ci with self.assertRaises(TypeError) as cm: 6137db96d56Sopenharmony_ci b.endswith([b'o']) 6147db96d56Sopenharmony_ci exc = str(cm.exception) 6157db96d56Sopenharmony_ci self.assertIn('bytes', exc) 6167db96d56Sopenharmony_ci self.assertIn('tuple', exc) 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ci def test_find(self): 6197db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 6207db96d56Sopenharmony_ci i = 105 6217db96d56Sopenharmony_ci w = 119 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci self.assertEqual(b.find(b'ss'), 2) 6247db96d56Sopenharmony_ci self.assertEqual(b.find(b'w'), -1) 6257db96d56Sopenharmony_ci self.assertEqual(b.find(b'mississippian'), -1) 6267db96d56Sopenharmony_ci 6277db96d56Sopenharmony_ci self.assertEqual(b.find(i), 1) 6287db96d56Sopenharmony_ci self.assertEqual(b.find(w), -1) 6297db96d56Sopenharmony_ci 6307db96d56Sopenharmony_ci self.assertEqual(b.find(b'ss', 3), 5) 6317db96d56Sopenharmony_ci self.assertEqual(b.find(b'ss', 1, 7), 2) 6327db96d56Sopenharmony_ci self.assertEqual(b.find(b'ss', 1, 3), -1) 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci self.assertEqual(b.find(i, 6), 7) 6357db96d56Sopenharmony_ci self.assertEqual(b.find(i, 1, 3), 1) 6367db96d56Sopenharmony_ci self.assertEqual(b.find(w, 1, 3), -1) 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ci for index in (-1, 256, sys.maxsize + 1): 6397db96d56Sopenharmony_ci self.assertRaisesRegex( 6407db96d56Sopenharmony_ci ValueError, r'byte must be in range\(0, 256\)', 6417db96d56Sopenharmony_ci b.find, index) 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci def test_rfind(self): 6447db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 6457db96d56Sopenharmony_ci i = 105 6467db96d56Sopenharmony_ci w = 119 6477db96d56Sopenharmony_ci 6487db96d56Sopenharmony_ci self.assertEqual(b.rfind(b'ss'), 5) 6497db96d56Sopenharmony_ci self.assertEqual(b.rfind(b'w'), -1) 6507db96d56Sopenharmony_ci self.assertEqual(b.rfind(b'mississippian'), -1) 6517db96d56Sopenharmony_ci 6527db96d56Sopenharmony_ci self.assertEqual(b.rfind(i), 10) 6537db96d56Sopenharmony_ci self.assertEqual(b.rfind(w), -1) 6547db96d56Sopenharmony_ci 6557db96d56Sopenharmony_ci self.assertEqual(b.rfind(b'ss', 3), 5) 6567db96d56Sopenharmony_ci self.assertEqual(b.rfind(b'ss', 0, 6), 2) 6577db96d56Sopenharmony_ci 6587db96d56Sopenharmony_ci self.assertEqual(b.rfind(i, 1, 3), 1) 6597db96d56Sopenharmony_ci self.assertEqual(b.rfind(i, 3, 9), 7) 6607db96d56Sopenharmony_ci self.assertEqual(b.rfind(w, 1, 3), -1) 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci def test_index(self): 6637db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 6647db96d56Sopenharmony_ci i = 105 6657db96d56Sopenharmony_ci w = 119 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci self.assertEqual(b.index(b'ss'), 2) 6687db96d56Sopenharmony_ci self.assertRaises(ValueError, b.index, b'w') 6697db96d56Sopenharmony_ci self.assertRaises(ValueError, b.index, b'mississippian') 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ci self.assertEqual(b.index(i), 1) 6727db96d56Sopenharmony_ci self.assertRaises(ValueError, b.index, w) 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ci self.assertEqual(b.index(b'ss', 3), 5) 6757db96d56Sopenharmony_ci self.assertEqual(b.index(b'ss', 1, 7), 2) 6767db96d56Sopenharmony_ci self.assertRaises(ValueError, b.index, b'ss', 1, 3) 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_ci self.assertEqual(b.index(i, 6), 7) 6797db96d56Sopenharmony_ci self.assertEqual(b.index(i, 1, 3), 1) 6807db96d56Sopenharmony_ci self.assertRaises(ValueError, b.index, w, 1, 3) 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci def test_rindex(self): 6837db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 6847db96d56Sopenharmony_ci i = 105 6857db96d56Sopenharmony_ci w = 119 6867db96d56Sopenharmony_ci 6877db96d56Sopenharmony_ci self.assertEqual(b.rindex(b'ss'), 5) 6887db96d56Sopenharmony_ci self.assertRaises(ValueError, b.rindex, b'w') 6897db96d56Sopenharmony_ci self.assertRaises(ValueError, b.rindex, b'mississippian') 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_ci self.assertEqual(b.rindex(i), 10) 6927db96d56Sopenharmony_ci self.assertRaises(ValueError, b.rindex, w) 6937db96d56Sopenharmony_ci 6947db96d56Sopenharmony_ci self.assertEqual(b.rindex(b'ss', 3), 5) 6957db96d56Sopenharmony_ci self.assertEqual(b.rindex(b'ss', 0, 6), 2) 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci self.assertEqual(b.rindex(i, 1, 3), 1) 6987db96d56Sopenharmony_ci self.assertEqual(b.rindex(i, 3, 9), 7) 6997db96d56Sopenharmony_ci self.assertRaises(ValueError, b.rindex, w, 1, 3) 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci def test_mod(self): 7027db96d56Sopenharmony_ci b = self.type2test(b'hello, %b!') 7037db96d56Sopenharmony_ci orig = b 7047db96d56Sopenharmony_ci b = b % b'world' 7057db96d56Sopenharmony_ci self.assertEqual(b, b'hello, world!') 7067db96d56Sopenharmony_ci self.assertEqual(orig, b'hello, %b!') 7077db96d56Sopenharmony_ci self.assertFalse(b is orig) 7087db96d56Sopenharmony_ci b = self.type2test(b'%s / 100 = %d%%') 7097db96d56Sopenharmony_ci a = b % (b'seventy-nine', 79) 7107db96d56Sopenharmony_ci self.assertEqual(a, b'seventy-nine / 100 = 79%') 7117db96d56Sopenharmony_ci self.assertIs(type(a), self.type2test) 7127db96d56Sopenharmony_ci # issue 29714 7137db96d56Sopenharmony_ci b = self.type2test(b'hello,\x00%b!') 7147db96d56Sopenharmony_ci b = b % b'world' 7157db96d56Sopenharmony_ci self.assertEqual(b, b'hello,\x00world!') 7167db96d56Sopenharmony_ci self.assertIs(type(b), self.type2test) 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci def check(fmt, vals, result): 7197db96d56Sopenharmony_ci b = self.type2test(fmt) 7207db96d56Sopenharmony_ci b = b % vals 7217db96d56Sopenharmony_ci self.assertEqual(b, result) 7227db96d56Sopenharmony_ci self.assertIs(type(b), self.type2test) 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci # A set of tests adapted from test_unicode:UnicodeTest.test_formatting 7257db96d56Sopenharmony_ci check(b'...%(foo)b...', {b'foo':b"abc"}, b'...abc...') 7267db96d56Sopenharmony_ci check(b'...%(f(o)o)b...', {b'f(o)o':b"abc", b'foo':b'bar'}, b'...abc...') 7277db96d56Sopenharmony_ci check(b'...%(foo)b...', {b'foo':b"abc",b'def':123}, b'...abc...') 7287db96d56Sopenharmony_ci check(b'%*b', (5, b'abc',), b' abc') 7297db96d56Sopenharmony_ci check(b'%*b', (-5, b'abc',), b'abc ') 7307db96d56Sopenharmony_ci check(b'%*.*b', (5, 2, b'abc',), b' ab') 7317db96d56Sopenharmony_ci check(b'%*.*b', (5, 3, b'abc',), b' abc') 7327db96d56Sopenharmony_ci check(b'%i %*.*b', (10, 5, 3, b'abc',), b'10 abc') 7337db96d56Sopenharmony_ci check(b'%i%b %*.*b', (10, b'3', 5, 3, b'abc',), b'103 abc') 7347db96d56Sopenharmony_ci check(b'%c', b'a', b'a') 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci def test_imod(self): 7377db96d56Sopenharmony_ci b = self.type2test(b'hello, %b!') 7387db96d56Sopenharmony_ci orig = b 7397db96d56Sopenharmony_ci b %= b'world' 7407db96d56Sopenharmony_ci self.assertEqual(b, b'hello, world!') 7417db96d56Sopenharmony_ci self.assertEqual(orig, b'hello, %b!') 7427db96d56Sopenharmony_ci self.assertFalse(b is orig) 7437db96d56Sopenharmony_ci b = self.type2test(b'%s / 100 = %d%%') 7447db96d56Sopenharmony_ci b %= (b'seventy-nine', 79) 7457db96d56Sopenharmony_ci self.assertEqual(b, b'seventy-nine / 100 = 79%') 7467db96d56Sopenharmony_ci self.assertIs(type(b), self.type2test) 7477db96d56Sopenharmony_ci # issue 29714 7487db96d56Sopenharmony_ci b = self.type2test(b'hello,\x00%b!') 7497db96d56Sopenharmony_ci b %= b'world' 7507db96d56Sopenharmony_ci self.assertEqual(b, b'hello,\x00world!') 7517db96d56Sopenharmony_ci self.assertIs(type(b), self.type2test) 7527db96d56Sopenharmony_ci 7537db96d56Sopenharmony_ci def test_rmod(self): 7547db96d56Sopenharmony_ci with self.assertRaises(TypeError): 7557db96d56Sopenharmony_ci object() % self.type2test(b'abc') 7567db96d56Sopenharmony_ci self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented) 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci def test_replace(self): 7597db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 7607db96d56Sopenharmony_ci self.assertEqual(b.replace(b'i', b'a'), b'massassappa') 7617db96d56Sopenharmony_ci self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi') 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci def test_replace_int_error(self): 7647db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'') 7657db96d56Sopenharmony_ci 7667db96d56Sopenharmony_ci def test_split_string_error(self): 7677db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').split, ' ') 7687db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ') 7697db96d56Sopenharmony_ci 7707db96d56Sopenharmony_ci def test_split_int_error(self): 7717db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').split, 32) 7727db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32) 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci def test_split_unicodewhitespace(self): 7757db96d56Sopenharmony_ci for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'): 7767db96d56Sopenharmony_ci b = self.type2test(b) 7777db96d56Sopenharmony_ci self.assertEqual(b.split(), [b]) 7787db96d56Sopenharmony_ci b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") 7797db96d56Sopenharmony_ci self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f']) 7807db96d56Sopenharmony_ci 7817db96d56Sopenharmony_ci def test_rsplit_unicodewhitespace(self): 7827db96d56Sopenharmony_ci b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") 7837db96d56Sopenharmony_ci self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f']) 7847db96d56Sopenharmony_ci 7857db96d56Sopenharmony_ci def test_partition(self): 7867db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 7877db96d56Sopenharmony_ci self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi')) 7887db96d56Sopenharmony_ci self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b'')) 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci def test_rpartition(self): 7917db96d56Sopenharmony_ci b = self.type2test(b'mississippi') 7927db96d56Sopenharmony_ci self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi')) 7937db96d56Sopenharmony_ci self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b'')) 7947db96d56Sopenharmony_ci self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi')) 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci def test_partition_string_error(self): 7977db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ') 7987db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ') 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci def test_partition_int_error(self): 8017db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').partition, 32) 8027db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32) 8037db96d56Sopenharmony_ci 8047db96d56Sopenharmony_ci def test_pickling(self): 8057db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 8067db96d56Sopenharmony_ci for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0": 8077db96d56Sopenharmony_ci b = self.type2test(b) 8087db96d56Sopenharmony_ci ps = pickle.dumps(b, proto) 8097db96d56Sopenharmony_ci q = pickle.loads(ps) 8107db96d56Sopenharmony_ci self.assertEqual(b, q) 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci def test_iterator_pickling(self): 8137db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 8147db96d56Sopenharmony_ci for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0": 8157db96d56Sopenharmony_ci it = itorg = iter(self.type2test(b)) 8167db96d56Sopenharmony_ci data = list(self.type2test(b)) 8177db96d56Sopenharmony_ci d = pickle.dumps(it, proto) 8187db96d56Sopenharmony_ci it = pickle.loads(d) 8197db96d56Sopenharmony_ci self.assertEqual(type(itorg), type(it)) 8207db96d56Sopenharmony_ci self.assertEqual(list(it), data) 8217db96d56Sopenharmony_ci 8227db96d56Sopenharmony_ci it = pickle.loads(d) 8237db96d56Sopenharmony_ci if not b: 8247db96d56Sopenharmony_ci continue 8257db96d56Sopenharmony_ci next(it) 8267db96d56Sopenharmony_ci d = pickle.dumps(it, proto) 8277db96d56Sopenharmony_ci it = pickle.loads(d) 8287db96d56Sopenharmony_ci self.assertEqual(list(it), data[1:]) 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ci def test_strip_bytearray(self): 8317db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b') 8327db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc') 8337db96d56Sopenharmony_ci self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab') 8347db96d56Sopenharmony_ci 8357db96d56Sopenharmony_ci def test_strip_string_error(self): 8367db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac') 8377db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac') 8387db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac') 8397db96d56Sopenharmony_ci 8407db96d56Sopenharmony_ci def test_strip_int_error(self): 8417db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32) 8427db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32) 8437db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32) 8447db96d56Sopenharmony_ci 8457db96d56Sopenharmony_ci def test_center(self): 8467db96d56Sopenharmony_ci # Fill character can be either bytes or bytearray (issue 12380) 8477db96d56Sopenharmony_ci b = self.type2test(b'abc') 8487db96d56Sopenharmony_ci for fill_type in (bytes, bytearray): 8497db96d56Sopenharmony_ci self.assertEqual(b.center(7, fill_type(b'-')), 8507db96d56Sopenharmony_ci self.type2test(b'--abc--')) 8517db96d56Sopenharmony_ci 8527db96d56Sopenharmony_ci def test_ljust(self): 8537db96d56Sopenharmony_ci # Fill character can be either bytes or bytearray (issue 12380) 8547db96d56Sopenharmony_ci b = self.type2test(b'abc') 8557db96d56Sopenharmony_ci for fill_type in (bytes, bytearray): 8567db96d56Sopenharmony_ci self.assertEqual(b.ljust(7, fill_type(b'-')), 8577db96d56Sopenharmony_ci self.type2test(b'abc----')) 8587db96d56Sopenharmony_ci 8597db96d56Sopenharmony_ci def test_rjust(self): 8607db96d56Sopenharmony_ci # Fill character can be either bytes or bytearray (issue 12380) 8617db96d56Sopenharmony_ci b = self.type2test(b'abc') 8627db96d56Sopenharmony_ci for fill_type in (bytes, bytearray): 8637db96d56Sopenharmony_ci self.assertEqual(b.rjust(7, fill_type(b'-')), 8647db96d56Sopenharmony_ci self.type2test(b'----abc')) 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci def test_xjust_int_error(self): 8677db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32) 8687db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32) 8697db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32) 8707db96d56Sopenharmony_ci 8717db96d56Sopenharmony_ci def test_ord(self): 8727db96d56Sopenharmony_ci b = self.type2test(b'\0A\x7f\x80\xff') 8737db96d56Sopenharmony_ci self.assertEqual([ord(b[i:i+1]) for i in range(len(b))], 8747db96d56Sopenharmony_ci [0, 65, 127, 128, 255]) 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_ci def test_maketrans(self): 8777db96d56Sopenharmony_ci transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377' 8787db96d56Sopenharmony_ci self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable) 8797db96d56Sopenharmony_ci transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz' 8807db96d56Sopenharmony_ci self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable) 8817db96d56Sopenharmony_ci self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq') 8827db96d56Sopenharmony_ci self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def') 8837db96d56Sopenharmony_ci 8847db96d56Sopenharmony_ci def test_none_arguments(self): 8857db96d56Sopenharmony_ci # issue 11828 8867db96d56Sopenharmony_ci b = self.type2test(b'hello') 8877db96d56Sopenharmony_ci l = self.type2test(b'l') 8887db96d56Sopenharmony_ci h = self.type2test(b'h') 8897db96d56Sopenharmony_ci x = self.type2test(b'x') 8907db96d56Sopenharmony_ci o = self.type2test(b'o') 8917db96d56Sopenharmony_ci 8927db96d56Sopenharmony_ci self.assertEqual(2, b.find(l, None)) 8937db96d56Sopenharmony_ci self.assertEqual(3, b.find(l, -2, None)) 8947db96d56Sopenharmony_ci self.assertEqual(2, b.find(l, None, -2)) 8957db96d56Sopenharmony_ci self.assertEqual(0, b.find(h, None, None)) 8967db96d56Sopenharmony_ci 8977db96d56Sopenharmony_ci self.assertEqual(3, b.rfind(l, None)) 8987db96d56Sopenharmony_ci self.assertEqual(3, b.rfind(l, -2, None)) 8997db96d56Sopenharmony_ci self.assertEqual(2, b.rfind(l, None, -2)) 9007db96d56Sopenharmony_ci self.assertEqual(0, b.rfind(h, None, None)) 9017db96d56Sopenharmony_ci 9027db96d56Sopenharmony_ci self.assertEqual(2, b.index(l, None)) 9037db96d56Sopenharmony_ci self.assertEqual(3, b.index(l, -2, None)) 9047db96d56Sopenharmony_ci self.assertEqual(2, b.index(l, None, -2)) 9057db96d56Sopenharmony_ci self.assertEqual(0, b.index(h, None, None)) 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ci self.assertEqual(3, b.rindex(l, None)) 9087db96d56Sopenharmony_ci self.assertEqual(3, b.rindex(l, -2, None)) 9097db96d56Sopenharmony_ci self.assertEqual(2, b.rindex(l, None, -2)) 9107db96d56Sopenharmony_ci self.assertEqual(0, b.rindex(h, None, None)) 9117db96d56Sopenharmony_ci 9127db96d56Sopenharmony_ci self.assertEqual(2, b.count(l, None)) 9137db96d56Sopenharmony_ci self.assertEqual(1, b.count(l, -2, None)) 9147db96d56Sopenharmony_ci self.assertEqual(1, b.count(l, None, -2)) 9157db96d56Sopenharmony_ci self.assertEqual(0, b.count(x, None, None)) 9167db96d56Sopenharmony_ci 9177db96d56Sopenharmony_ci self.assertEqual(True, b.endswith(o, None)) 9187db96d56Sopenharmony_ci self.assertEqual(True, b.endswith(o, -2, None)) 9197db96d56Sopenharmony_ci self.assertEqual(True, b.endswith(l, None, -2)) 9207db96d56Sopenharmony_ci self.assertEqual(False, b.endswith(x, None, None)) 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci self.assertEqual(True, b.startswith(h, None)) 9237db96d56Sopenharmony_ci self.assertEqual(True, b.startswith(l, -2, None)) 9247db96d56Sopenharmony_ci self.assertEqual(True, b.startswith(h, None, -2)) 9257db96d56Sopenharmony_ci self.assertEqual(False, b.startswith(x, None, None)) 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci def test_integer_arguments_out_of_byte_range(self): 9287db96d56Sopenharmony_ci b = self.type2test(b'hello') 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ci for method in (b.count, b.find, b.index, b.rfind, b.rindex): 9317db96d56Sopenharmony_ci self.assertRaises(ValueError, method, -1) 9327db96d56Sopenharmony_ci self.assertRaises(ValueError, method, 256) 9337db96d56Sopenharmony_ci self.assertRaises(ValueError, method, 9999) 9347db96d56Sopenharmony_ci 9357db96d56Sopenharmony_ci def test_find_etc_raise_correct_error_messages(self): 9367db96d56Sopenharmony_ci # issue 11828 9377db96d56Sopenharmony_ci b = self.type2test(b'hello') 9387db96d56Sopenharmony_ci x = self.type2test(b'x') 9397db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\bfind\b', b.find, 9407db96d56Sopenharmony_ci x, None, None, None) 9417db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind, 9427db96d56Sopenharmony_ci x, None, None, None) 9437db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\bindex\b', b.index, 9447db96d56Sopenharmony_ci x, None, None, None) 9457db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex, 9467db96d56Sopenharmony_ci x, None, None, None) 9477db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\bcount\b', b.count, 9487db96d56Sopenharmony_ci x, None, None, None) 9497db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith, 9507db96d56Sopenharmony_ci x, None, None, None) 9517db96d56Sopenharmony_ci self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith, 9527db96d56Sopenharmony_ci x, None, None, None) 9537db96d56Sopenharmony_ci 9547db96d56Sopenharmony_ci def test_free_after_iterating(self): 9557db96d56Sopenharmony_ci test.support.check_free_after_iterating(self, iter, self.type2test) 9567db96d56Sopenharmony_ci test.support.check_free_after_iterating(self, reversed, self.type2test) 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci def test_translate(self): 9597db96d56Sopenharmony_ci b = self.type2test(b'hello') 9607db96d56Sopenharmony_ci rosetta = bytearray(range(256)) 9617db96d56Sopenharmony_ci rosetta[ord('o')] = ord('e') 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_ci self.assertRaises(TypeError, b.translate) 9647db96d56Sopenharmony_ci self.assertRaises(TypeError, b.translate, None, None) 9657db96d56Sopenharmony_ci self.assertRaises(ValueError, b.translate, bytes(range(255))) 9667db96d56Sopenharmony_ci 9677db96d56Sopenharmony_ci c = b.translate(rosetta, b'hello') 9687db96d56Sopenharmony_ci self.assertEqual(b, b'hello') 9697db96d56Sopenharmony_ci self.assertIsInstance(c, self.type2test) 9707db96d56Sopenharmony_ci 9717db96d56Sopenharmony_ci c = b.translate(rosetta) 9727db96d56Sopenharmony_ci d = b.translate(rosetta, b'') 9737db96d56Sopenharmony_ci self.assertEqual(c, d) 9747db96d56Sopenharmony_ci self.assertEqual(c, b'helle') 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci c = b.translate(rosetta, b'l') 9777db96d56Sopenharmony_ci self.assertEqual(c, b'hee') 9787db96d56Sopenharmony_ci c = b.translate(None, b'e') 9797db96d56Sopenharmony_ci self.assertEqual(c, b'hllo') 9807db96d56Sopenharmony_ci 9817db96d56Sopenharmony_ci # test delete as a keyword argument 9827db96d56Sopenharmony_ci c = b.translate(rosetta, delete=b'') 9837db96d56Sopenharmony_ci self.assertEqual(c, b'helle') 9847db96d56Sopenharmony_ci c = b.translate(rosetta, delete=b'l') 9857db96d56Sopenharmony_ci self.assertEqual(c, b'hee') 9867db96d56Sopenharmony_ci c = b.translate(None, delete=b'e') 9877db96d56Sopenharmony_ci self.assertEqual(c, b'hllo') 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci def test_sq_item(self): 9907db96d56Sopenharmony_ci _testcapi = import_helper.import_module('_testcapi') 9917db96d56Sopenharmony_ci obj = self.type2test((42,)) 9927db96d56Sopenharmony_ci with self.assertRaises(IndexError): 9937db96d56Sopenharmony_ci _testcapi.sequence_getitem(obj, -2) 9947db96d56Sopenharmony_ci with self.assertRaises(IndexError): 9957db96d56Sopenharmony_ci _testcapi.sequence_getitem(obj, 1) 9967db96d56Sopenharmony_ci self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42) 9977db96d56Sopenharmony_ci 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ciclass BytesTest(BaseBytesTest, unittest.TestCase): 10007db96d56Sopenharmony_ci type2test = bytes 10017db96d56Sopenharmony_ci 10027db96d56Sopenharmony_ci def test__bytes__(self): 10037db96d56Sopenharmony_ci foo = b'foo\x00bar' 10047db96d56Sopenharmony_ci self.assertEqual(foo.__bytes__(), foo) 10057db96d56Sopenharmony_ci self.assertEqual(type(foo.__bytes__()), self.type2test) 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_ci class bytes_subclass(bytes): 10087db96d56Sopenharmony_ci pass 10097db96d56Sopenharmony_ci 10107db96d56Sopenharmony_ci bar = bytes_subclass(b'bar\x00foo') 10117db96d56Sopenharmony_ci self.assertEqual(bar.__bytes__(), bar) 10127db96d56Sopenharmony_ci self.assertEqual(type(bar.__bytes__()), self.type2test) 10137db96d56Sopenharmony_ci 10147db96d56Sopenharmony_ci def test_getitem_error(self): 10157db96d56Sopenharmony_ci b = b'python' 10167db96d56Sopenharmony_ci msg = "byte indices must be integers or slices" 10177db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 10187db96d56Sopenharmony_ci b['a'] 10197db96d56Sopenharmony_ci 10207db96d56Sopenharmony_ci def test_buffer_is_readonly(self): 10217db96d56Sopenharmony_ci fd = os.open(__file__, os.O_RDONLY) 10227db96d56Sopenharmony_ci with open(fd, "rb", buffering=0) as f: 10237db96d56Sopenharmony_ci self.assertRaises(TypeError, f.readinto, b"") 10247db96d56Sopenharmony_ci 10257db96d56Sopenharmony_ci def test_custom(self): 10267db96d56Sopenharmony_ci class A: 10277db96d56Sopenharmony_ci def __bytes__(self): 10287db96d56Sopenharmony_ci return b'abc' 10297db96d56Sopenharmony_ci self.assertEqual(bytes(A()), b'abc') 10307db96d56Sopenharmony_ci class A: pass 10317db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, A()) 10327db96d56Sopenharmony_ci class A: 10337db96d56Sopenharmony_ci def __bytes__(self): 10347db96d56Sopenharmony_ci return None 10357db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, A()) 10367db96d56Sopenharmony_ci class A: 10377db96d56Sopenharmony_ci def __bytes__(self): 10387db96d56Sopenharmony_ci return b'a' 10397db96d56Sopenharmony_ci def __index__(self): 10407db96d56Sopenharmony_ci return 42 10417db96d56Sopenharmony_ci self.assertEqual(bytes(A()), b'a') 10427db96d56Sopenharmony_ci # Issue #25766 10437db96d56Sopenharmony_ci class A(str): 10447db96d56Sopenharmony_ci def __bytes__(self): 10457db96d56Sopenharmony_ci return b'abc' 10467db96d56Sopenharmony_ci self.assertEqual(bytes(A('\u20ac')), b'abc') 10477db96d56Sopenharmony_ci self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4') 10487db96d56Sopenharmony_ci # Issue #24731 10497db96d56Sopenharmony_ci class A: 10507db96d56Sopenharmony_ci def __bytes__(self): 10517db96d56Sopenharmony_ci return OtherBytesSubclass(b'abc') 10527db96d56Sopenharmony_ci self.assertEqual(bytes(A()), b'abc') 10537db96d56Sopenharmony_ci self.assertIs(type(bytes(A())), OtherBytesSubclass) 10547db96d56Sopenharmony_ci self.assertEqual(BytesSubclass(A()), b'abc') 10557db96d56Sopenharmony_ci self.assertIs(type(BytesSubclass(A())), BytesSubclass) 10567db96d56Sopenharmony_ci 10577db96d56Sopenharmony_ci # Test PyBytes_FromFormat() 10587db96d56Sopenharmony_ci def test_from_format(self): 10597db96d56Sopenharmony_ci ctypes = import_helper.import_module('ctypes') 10607db96d56Sopenharmony_ci _testcapi = import_helper.import_module('_testcapi') 10617db96d56Sopenharmony_ci from ctypes import pythonapi, py_object 10627db96d56Sopenharmony_ci from ctypes import ( 10637db96d56Sopenharmony_ci c_int, c_uint, 10647db96d56Sopenharmony_ci c_long, c_ulong, 10657db96d56Sopenharmony_ci c_size_t, c_ssize_t, 10667db96d56Sopenharmony_ci c_char_p) 10677db96d56Sopenharmony_ci 10687db96d56Sopenharmony_ci PyBytes_FromFormat = pythonapi.PyBytes_FromFormat 10697db96d56Sopenharmony_ci PyBytes_FromFormat.argtypes = (c_char_p,) 10707db96d56Sopenharmony_ci PyBytes_FromFormat.restype = py_object 10717db96d56Sopenharmony_ci 10727db96d56Sopenharmony_ci # basic tests 10737db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'format'), 10747db96d56Sopenharmony_ci b'format') 10757db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'), 10767db96d56Sopenharmony_ci b'Hello world !') 10777db96d56Sopenharmony_ci 10787db96d56Sopenharmony_ci # test formatters 10797db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)), 10807db96d56Sopenharmony_ci b'c=\0') 10817db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))), 10827db96d56Sopenharmony_ci b'c=@') 10837db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)), 10847db96d56Sopenharmony_ci b'c=\xff') 10857db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd', 10867db96d56Sopenharmony_ci c_int(1), c_long(2), 10877db96d56Sopenharmony_ci c_size_t(3)), 10887db96d56Sopenharmony_ci b'd=1 ld=2 zd=3') 10897db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd', 10907db96d56Sopenharmony_ci c_int(-1), c_long(-2), 10917db96d56Sopenharmony_ci c_size_t(-3)), 10927db96d56Sopenharmony_ci b'd=-1 ld=-2 zd=-3') 10937db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu', 10947db96d56Sopenharmony_ci c_uint(123), c_ulong(456), 10957db96d56Sopenharmony_ci c_size_t(789)), 10967db96d56Sopenharmony_ci b'u=123 lu=456 zu=789') 10977db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)), 10987db96d56Sopenharmony_ci b'i=123') 10997db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)), 11007db96d56Sopenharmony_ci b'i=-123') 11017db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)), 11027db96d56Sopenharmony_ci b'x=abc') 11037db96d56Sopenharmony_ci 11047db96d56Sopenharmony_ci sizeof_ptr = ctypes.sizeof(c_char_p) 11057db96d56Sopenharmony_ci 11067db96d56Sopenharmony_ci if os.name == 'nt': 11077db96d56Sopenharmony_ci # Windows (MSCRT) 11087db96d56Sopenharmony_ci ptr_format = '0x%0{}X'.format(2 * sizeof_ptr) 11097db96d56Sopenharmony_ci def ptr_formatter(ptr): 11107db96d56Sopenharmony_ci return (ptr_format % ptr) 11117db96d56Sopenharmony_ci else: 11127db96d56Sopenharmony_ci # UNIX (glibc) 11137db96d56Sopenharmony_ci def ptr_formatter(ptr): 11147db96d56Sopenharmony_ci return '%#x' % ptr 11157db96d56Sopenharmony_ci 11167db96d56Sopenharmony_ci ptr = 0xabcdef 11177db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)), 11187db96d56Sopenharmony_ci ('ptr=' + ptr_formatter(ptr)).encode('ascii')) 11197db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')), 11207db96d56Sopenharmony_ci b's=cstr') 11217db96d56Sopenharmony_ci 11227db96d56Sopenharmony_ci # test minimum and maximum integer values 11237db96d56Sopenharmony_ci size_max = c_size_t(-1).value 11247db96d56Sopenharmony_ci for formatstr, ctypes_type, value, py_formatter in ( 11257db96d56Sopenharmony_ci (b'%d', c_int, _testcapi.INT_MIN, str), 11267db96d56Sopenharmony_ci (b'%d', c_int, _testcapi.INT_MAX, str), 11277db96d56Sopenharmony_ci (b'%ld', c_long, _testcapi.LONG_MIN, str), 11287db96d56Sopenharmony_ci (b'%ld', c_long, _testcapi.LONG_MAX, str), 11297db96d56Sopenharmony_ci (b'%lu', c_ulong, _testcapi.ULONG_MAX, str), 11307db96d56Sopenharmony_ci (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str), 11317db96d56Sopenharmony_ci (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str), 11327db96d56Sopenharmony_ci (b'%zu', c_size_t, size_max, str), 11337db96d56Sopenharmony_ci (b'%p', c_char_p, size_max, ptr_formatter), 11347db96d56Sopenharmony_ci ): 11357db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)), 11367db96d56Sopenharmony_ci py_formatter(value).encode('ascii')), 11377db96d56Sopenharmony_ci 11387db96d56Sopenharmony_ci # width and precision (width is currently ignored) 11397db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'), 11407db96d56Sopenharmony_ci b'a') 11417db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'), 11427db96d56Sopenharmony_ci b'abc') 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci # '%%' formatter 11457db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%%'), 11467db96d56Sopenharmony_ci b'%') 11477db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'[%%]'), 11487db96d56Sopenharmony_ci b'[%]') 11497db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), 11507db96d56Sopenharmony_ci b'%_') 11517db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%%s'), 11527db96d56Sopenharmony_ci b'%s') 11537db96d56Sopenharmony_ci 11547db96d56Sopenharmony_ci # Invalid formats and partial formatting 11557db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%'), b'%') 11567db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)), 11577db96d56Sopenharmony_ci b'x=2 y=%') 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci # Issue #19969: %c must raise OverflowError for values 11607db96d56Sopenharmony_ci # not in the range [0; 255] 11617db96d56Sopenharmony_ci self.assertRaises(OverflowError, 11627db96d56Sopenharmony_ci PyBytes_FromFormat, b'%c', c_int(-1)) 11637db96d56Sopenharmony_ci self.assertRaises(OverflowError, 11647db96d56Sopenharmony_ci PyBytes_FromFormat, b'%c', c_int(256)) 11657db96d56Sopenharmony_ci 11667db96d56Sopenharmony_ci # Issue #33817: empty strings 11677db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b''), 11687db96d56Sopenharmony_ci b'') 11697db96d56Sopenharmony_ci self.assertEqual(PyBytes_FromFormat(b'%s', b''), 11707db96d56Sopenharmony_ci b'') 11717db96d56Sopenharmony_ci 11727db96d56Sopenharmony_ci def test_bytes_blocking(self): 11737db96d56Sopenharmony_ci class IterationBlocked(list): 11747db96d56Sopenharmony_ci __bytes__ = None 11757db96d56Sopenharmony_ci i = [0, 1, 2, 3] 11767db96d56Sopenharmony_ci self.assertEqual(bytes(i), b'\x00\x01\x02\x03') 11777db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, IterationBlocked(i)) 11787db96d56Sopenharmony_ci 11797db96d56Sopenharmony_ci # At least in CPython, because bytes.__new__ and the C API 11807db96d56Sopenharmony_ci # PyBytes_FromObject have different fallback rules, integer 11817db96d56Sopenharmony_ci # fallback is handled specially, so test separately. 11827db96d56Sopenharmony_ci class IntBlocked(int): 11837db96d56Sopenharmony_ci __bytes__ = None 11847db96d56Sopenharmony_ci self.assertEqual(bytes(3), b'\0\0\0') 11857db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, IntBlocked(3)) 11867db96d56Sopenharmony_ci 11877db96d56Sopenharmony_ci # While there is no separately-defined rule for handling bytes 11887db96d56Sopenharmony_ci # subclasses differently from other buffer-interface classes, 11897db96d56Sopenharmony_ci # an implementation may well special-case them (as CPython 2.x 11907db96d56Sopenharmony_ci # str did), so test them separately. 11917db96d56Sopenharmony_ci class BytesSubclassBlocked(bytes): 11927db96d56Sopenharmony_ci __bytes__ = None 11937db96d56Sopenharmony_ci self.assertEqual(bytes(b'ab'), b'ab') 11947db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab')) 11957db96d56Sopenharmony_ci 11967db96d56Sopenharmony_ci class BufferBlocked(bytearray): 11977db96d56Sopenharmony_ci __bytes__ = None 11987db96d56Sopenharmony_ci ba, bb = bytearray(b'ab'), BufferBlocked(b'ab') 11997db96d56Sopenharmony_ci self.assertEqual(bytes(ba), b'ab') 12007db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, bb) 12017db96d56Sopenharmony_ci 12027db96d56Sopenharmony_ci def test_repeat_id_preserving(self): 12037db96d56Sopenharmony_ci a = b'123abc1@' 12047db96d56Sopenharmony_ci b = b'456zyx-+' 12057db96d56Sopenharmony_ci self.assertEqual(id(a), id(a)) 12067db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(b)) 12077db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(a * -4)) 12087db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(a * 0)) 12097db96d56Sopenharmony_ci self.assertEqual(id(a), id(a * 1)) 12107db96d56Sopenharmony_ci self.assertEqual(id(a), id(1 * a)) 12117db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(a * 2)) 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci class SubBytes(bytes): 12147db96d56Sopenharmony_ci pass 12157db96d56Sopenharmony_ci 12167db96d56Sopenharmony_ci s = SubBytes(b'qwerty()') 12177db96d56Sopenharmony_ci self.assertEqual(id(s), id(s)) 12187db96d56Sopenharmony_ci self.assertNotEqual(id(s), id(s * -4)) 12197db96d56Sopenharmony_ci self.assertNotEqual(id(s), id(s * 0)) 12207db96d56Sopenharmony_ci self.assertNotEqual(id(s), id(s * 1)) 12217db96d56Sopenharmony_ci self.assertNotEqual(id(s), id(1 * s)) 12227db96d56Sopenharmony_ci self.assertNotEqual(id(s), id(s * 2)) 12237db96d56Sopenharmony_ci 12247db96d56Sopenharmony_ci 12257db96d56Sopenharmony_ciclass ByteArrayTest(BaseBytesTest, unittest.TestCase): 12267db96d56Sopenharmony_ci type2test = bytearray 12277db96d56Sopenharmony_ci 12287db96d56Sopenharmony_ci def test_getitem_error(self): 12297db96d56Sopenharmony_ci b = bytearray(b'python') 12307db96d56Sopenharmony_ci msg = "bytearray indices must be integers or slices" 12317db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 12327db96d56Sopenharmony_ci b['a'] 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci def test_setitem_error(self): 12357db96d56Sopenharmony_ci b = bytearray(b'python') 12367db96d56Sopenharmony_ci msg = "bytearray indices must be integers or slices" 12377db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 12387db96d56Sopenharmony_ci b['a'] = "python" 12397db96d56Sopenharmony_ci 12407db96d56Sopenharmony_ci def test_nohash(self): 12417db96d56Sopenharmony_ci self.assertRaises(TypeError, hash, bytearray()) 12427db96d56Sopenharmony_ci 12437db96d56Sopenharmony_ci def test_bytearray_api(self): 12447db96d56Sopenharmony_ci short_sample = b"Hello world\n" 12457db96d56Sopenharmony_ci sample = short_sample + b"\0"*(20 - len(short_sample)) 12467db96d56Sopenharmony_ci tfn = tempfile.mktemp() 12477db96d56Sopenharmony_ci try: 12487db96d56Sopenharmony_ci # Prepare 12497db96d56Sopenharmony_ci with open(tfn, "wb") as f: 12507db96d56Sopenharmony_ci f.write(short_sample) 12517db96d56Sopenharmony_ci # Test readinto 12527db96d56Sopenharmony_ci with open(tfn, "rb") as f: 12537db96d56Sopenharmony_ci b = bytearray(20) 12547db96d56Sopenharmony_ci n = f.readinto(b) 12557db96d56Sopenharmony_ci self.assertEqual(n, len(short_sample)) 12567db96d56Sopenharmony_ci self.assertEqual(list(b), list(sample)) 12577db96d56Sopenharmony_ci # Test writing in binary mode 12587db96d56Sopenharmony_ci with open(tfn, "wb") as f: 12597db96d56Sopenharmony_ci f.write(b) 12607db96d56Sopenharmony_ci with open(tfn, "rb") as f: 12617db96d56Sopenharmony_ci self.assertEqual(f.read(), sample) 12627db96d56Sopenharmony_ci # Text mode is ambiguous; don't test 12637db96d56Sopenharmony_ci finally: 12647db96d56Sopenharmony_ci try: 12657db96d56Sopenharmony_ci os.remove(tfn) 12667db96d56Sopenharmony_ci except OSError: 12677db96d56Sopenharmony_ci pass 12687db96d56Sopenharmony_ci 12697db96d56Sopenharmony_ci def test_reverse(self): 12707db96d56Sopenharmony_ci b = bytearray(b'hello') 12717db96d56Sopenharmony_ci self.assertEqual(b.reverse(), None) 12727db96d56Sopenharmony_ci self.assertEqual(b, b'olleh') 12737db96d56Sopenharmony_ci b = bytearray(b'hello1') # test even number of items 12747db96d56Sopenharmony_ci b.reverse() 12757db96d56Sopenharmony_ci self.assertEqual(b, b'1olleh') 12767db96d56Sopenharmony_ci b = bytearray() 12777db96d56Sopenharmony_ci b.reverse() 12787db96d56Sopenharmony_ci self.assertFalse(b) 12797db96d56Sopenharmony_ci 12807db96d56Sopenharmony_ci def test_clear(self): 12817db96d56Sopenharmony_ci b = bytearray(b'python') 12827db96d56Sopenharmony_ci b.clear() 12837db96d56Sopenharmony_ci self.assertEqual(b, b'') 12847db96d56Sopenharmony_ci 12857db96d56Sopenharmony_ci b = bytearray(b'') 12867db96d56Sopenharmony_ci b.clear() 12877db96d56Sopenharmony_ci self.assertEqual(b, b'') 12887db96d56Sopenharmony_ci 12897db96d56Sopenharmony_ci b = bytearray(b'') 12907db96d56Sopenharmony_ci b.append(ord('r')) 12917db96d56Sopenharmony_ci b.clear() 12927db96d56Sopenharmony_ci b.append(ord('p')) 12937db96d56Sopenharmony_ci self.assertEqual(b, b'p') 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci def test_copy(self): 12967db96d56Sopenharmony_ci b = bytearray(b'abc') 12977db96d56Sopenharmony_ci bb = b.copy() 12987db96d56Sopenharmony_ci self.assertEqual(bb, b'abc') 12997db96d56Sopenharmony_ci 13007db96d56Sopenharmony_ci b = bytearray(b'') 13017db96d56Sopenharmony_ci bb = b.copy() 13027db96d56Sopenharmony_ci self.assertEqual(bb, b'') 13037db96d56Sopenharmony_ci 13047db96d56Sopenharmony_ci # test that it's indeed a copy and not a reference 13057db96d56Sopenharmony_ci b = bytearray(b'abc') 13067db96d56Sopenharmony_ci bb = b.copy() 13077db96d56Sopenharmony_ci self.assertEqual(b, bb) 13087db96d56Sopenharmony_ci self.assertIsNot(b, bb) 13097db96d56Sopenharmony_ci bb.append(ord('d')) 13107db96d56Sopenharmony_ci self.assertEqual(bb, b'abcd') 13117db96d56Sopenharmony_ci self.assertEqual(b, b'abc') 13127db96d56Sopenharmony_ci 13137db96d56Sopenharmony_ci def test_regexps(self): 13147db96d56Sopenharmony_ci def by(s): 13157db96d56Sopenharmony_ci return bytearray(map(ord, s)) 13167db96d56Sopenharmony_ci b = by("Hello, world") 13177db96d56Sopenharmony_ci self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")]) 13187db96d56Sopenharmony_ci 13197db96d56Sopenharmony_ci def test_setitem(self): 13207db96d56Sopenharmony_ci b = bytearray([1, 2, 3]) 13217db96d56Sopenharmony_ci b[1] = 100 13227db96d56Sopenharmony_ci self.assertEqual(b, bytearray([1, 100, 3])) 13237db96d56Sopenharmony_ci b[-1] = 200 13247db96d56Sopenharmony_ci self.assertEqual(b, bytearray([1, 100, 200])) 13257db96d56Sopenharmony_ci b[0] = Indexable(10) 13267db96d56Sopenharmony_ci self.assertEqual(b, bytearray([10, 100, 200])) 13277db96d56Sopenharmony_ci try: 13287db96d56Sopenharmony_ci b[3] = 0 13297db96d56Sopenharmony_ci self.fail("Didn't raise IndexError") 13307db96d56Sopenharmony_ci except IndexError: 13317db96d56Sopenharmony_ci pass 13327db96d56Sopenharmony_ci try: 13337db96d56Sopenharmony_ci b[-10] = 0 13347db96d56Sopenharmony_ci self.fail("Didn't raise IndexError") 13357db96d56Sopenharmony_ci except IndexError: 13367db96d56Sopenharmony_ci pass 13377db96d56Sopenharmony_ci try: 13387db96d56Sopenharmony_ci b[0] = 256 13397db96d56Sopenharmony_ci self.fail("Didn't raise ValueError") 13407db96d56Sopenharmony_ci except ValueError: 13417db96d56Sopenharmony_ci pass 13427db96d56Sopenharmony_ci try: 13437db96d56Sopenharmony_ci b[0] = Indexable(-1) 13447db96d56Sopenharmony_ci self.fail("Didn't raise ValueError") 13457db96d56Sopenharmony_ci except ValueError: 13467db96d56Sopenharmony_ci pass 13477db96d56Sopenharmony_ci try: 13487db96d56Sopenharmony_ci b[0] = None 13497db96d56Sopenharmony_ci self.fail("Didn't raise TypeError") 13507db96d56Sopenharmony_ci except TypeError: 13517db96d56Sopenharmony_ci pass 13527db96d56Sopenharmony_ci 13537db96d56Sopenharmony_ci def test_delitem(self): 13547db96d56Sopenharmony_ci b = bytearray(range(10)) 13557db96d56Sopenharmony_ci del b[0] 13567db96d56Sopenharmony_ci self.assertEqual(b, bytearray(range(1, 10))) 13577db96d56Sopenharmony_ci del b[-1] 13587db96d56Sopenharmony_ci self.assertEqual(b, bytearray(range(1, 9))) 13597db96d56Sopenharmony_ci del b[4] 13607db96d56Sopenharmony_ci self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8])) 13617db96d56Sopenharmony_ci 13627db96d56Sopenharmony_ci def test_setslice(self): 13637db96d56Sopenharmony_ci b = bytearray(range(10)) 13647db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(10))) 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ci b[0:5] = bytearray([1, 1, 1, 1, 1]) 13677db96d56Sopenharmony_ci self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9])) 13687db96d56Sopenharmony_ci 13697db96d56Sopenharmony_ci del b[0:-5] 13707db96d56Sopenharmony_ci self.assertEqual(b, bytearray([5, 6, 7, 8, 9])) 13717db96d56Sopenharmony_ci 13727db96d56Sopenharmony_ci b[0:0] = bytearray([0, 1, 2, 3, 4]) 13737db96d56Sopenharmony_ci self.assertEqual(b, bytearray(range(10))) 13747db96d56Sopenharmony_ci 13757db96d56Sopenharmony_ci b[-7:-3] = bytearray([100, 101]) 13767db96d56Sopenharmony_ci self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9])) 13777db96d56Sopenharmony_ci 13787db96d56Sopenharmony_ci b[3:5] = [3, 4, 5, 6] 13797db96d56Sopenharmony_ci self.assertEqual(b, bytearray(range(10))) 13807db96d56Sopenharmony_ci 13817db96d56Sopenharmony_ci b[3:0] = [42, 42, 42] 13827db96d56Sopenharmony_ci self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9])) 13837db96d56Sopenharmony_ci 13847db96d56Sopenharmony_ci b[3:] = b'foo' 13857db96d56Sopenharmony_ci self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111])) 13867db96d56Sopenharmony_ci 13877db96d56Sopenharmony_ci b[:3] = memoryview(b'foo') 13887db96d56Sopenharmony_ci self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111])) 13897db96d56Sopenharmony_ci 13907db96d56Sopenharmony_ci b[3:4] = [] 13917db96d56Sopenharmony_ci self.assertEqual(b, bytearray([102, 111, 111, 111, 111])) 13927db96d56Sopenharmony_ci 13937db96d56Sopenharmony_ci for elem in [5, -5, 0, int(10e20), 'str', 2.3, 13947db96d56Sopenharmony_ci ['a', 'b'], [b'a', b'b'], [[]]]: 13957db96d56Sopenharmony_ci with self.assertRaises(TypeError): 13967db96d56Sopenharmony_ci b[3:4] = elem 13977db96d56Sopenharmony_ci 13987db96d56Sopenharmony_ci for elem in [[254, 255, 256], [-256, 9000]]: 13997db96d56Sopenharmony_ci with self.assertRaises(ValueError): 14007db96d56Sopenharmony_ci b[3:4] = elem 14017db96d56Sopenharmony_ci 14027db96d56Sopenharmony_ci def test_setslice_extend(self): 14037db96d56Sopenharmony_ci # Exercise the resizing logic (see issue #19087) 14047db96d56Sopenharmony_ci b = bytearray(range(100)) 14057db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(100))) 14067db96d56Sopenharmony_ci del b[:10] 14077db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(10, 100))) 14087db96d56Sopenharmony_ci b.extend(range(100, 110)) 14097db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(10, 110))) 14107db96d56Sopenharmony_ci 14117db96d56Sopenharmony_ci def test_fifo_overrun(self): 14127db96d56Sopenharmony_ci # Test for issue #23985, a buffer overrun when implementing a FIFO 14137db96d56Sopenharmony_ci # Build Python in pydebug mode for best results. 14147db96d56Sopenharmony_ci b = bytearray(10) 14157db96d56Sopenharmony_ci b.pop() # Defeat expanding buffer off-by-one quirk 14167db96d56Sopenharmony_ci del b[:1] # Advance start pointer without reallocating 14177db96d56Sopenharmony_ci b += bytes(2) # Append exactly the number of deleted bytes 14187db96d56Sopenharmony_ci del b # Free memory buffer, allowing pydebug verification 14197db96d56Sopenharmony_ci 14207db96d56Sopenharmony_ci def test_del_expand(self): 14217db96d56Sopenharmony_ci # Reducing the size should not expand the buffer (issue #23985) 14227db96d56Sopenharmony_ci b = bytearray(10) 14237db96d56Sopenharmony_ci size = sys.getsizeof(b) 14247db96d56Sopenharmony_ci del b[:1] 14257db96d56Sopenharmony_ci self.assertLessEqual(sys.getsizeof(b), size) 14267db96d56Sopenharmony_ci 14277db96d56Sopenharmony_ci def test_extended_set_del_slice(self): 14287db96d56Sopenharmony_ci indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize, 14297db96d56Sopenharmony_ci -1, -2, -31, -300) 14307db96d56Sopenharmony_ci for start in indices: 14317db96d56Sopenharmony_ci for stop in indices: 14327db96d56Sopenharmony_ci # Skip invalid step 0 14337db96d56Sopenharmony_ci for step in indices[1:]: 14347db96d56Sopenharmony_ci L = list(range(255)) 14357db96d56Sopenharmony_ci b = bytearray(L) 14367db96d56Sopenharmony_ci # Make sure we have a slice of exactly the right length, 14377db96d56Sopenharmony_ci # but with different data. 14387db96d56Sopenharmony_ci data = L[start:stop:step] 14397db96d56Sopenharmony_ci data.reverse() 14407db96d56Sopenharmony_ci L[start:stop:step] = data 14417db96d56Sopenharmony_ci b[start:stop:step] = data 14427db96d56Sopenharmony_ci self.assertEqual(b, bytearray(L)) 14437db96d56Sopenharmony_ci 14447db96d56Sopenharmony_ci del L[start:stop:step] 14457db96d56Sopenharmony_ci del b[start:stop:step] 14467db96d56Sopenharmony_ci self.assertEqual(b, bytearray(L)) 14477db96d56Sopenharmony_ci 14487db96d56Sopenharmony_ci def test_setslice_trap(self): 14497db96d56Sopenharmony_ci # This test verifies that we correctly handle assigning self 14507db96d56Sopenharmony_ci # to a slice of self (the old Lambert Meertens trap). 14517db96d56Sopenharmony_ci b = bytearray(range(256)) 14527db96d56Sopenharmony_ci b[8:] = b 14537db96d56Sopenharmony_ci self.assertEqual(b, bytearray(list(range(8)) + list(range(256)))) 14547db96d56Sopenharmony_ci 14557db96d56Sopenharmony_ci def test_iconcat(self): 14567db96d56Sopenharmony_ci b = bytearray(b"abc") 14577db96d56Sopenharmony_ci b1 = b 14587db96d56Sopenharmony_ci b += b"def" 14597db96d56Sopenharmony_ci self.assertEqual(b, b"abcdef") 14607db96d56Sopenharmony_ci self.assertEqual(b, b1) 14617db96d56Sopenharmony_ci self.assertIs(b, b1) 14627db96d56Sopenharmony_ci b += b"xyz" 14637db96d56Sopenharmony_ci self.assertEqual(b, b"abcdefxyz") 14647db96d56Sopenharmony_ci try: 14657db96d56Sopenharmony_ci b += "" 14667db96d56Sopenharmony_ci except TypeError: 14677db96d56Sopenharmony_ci pass 14687db96d56Sopenharmony_ci else: 14697db96d56Sopenharmony_ci self.fail("bytes += unicode didn't raise TypeError") 14707db96d56Sopenharmony_ci 14717db96d56Sopenharmony_ci def test_irepeat(self): 14727db96d56Sopenharmony_ci b = bytearray(b"abc") 14737db96d56Sopenharmony_ci b1 = b 14747db96d56Sopenharmony_ci b *= 3 14757db96d56Sopenharmony_ci self.assertEqual(b, b"abcabcabc") 14767db96d56Sopenharmony_ci self.assertEqual(b, b1) 14777db96d56Sopenharmony_ci self.assertIs(b, b1) 14787db96d56Sopenharmony_ci 14797db96d56Sopenharmony_ci def test_irepeat_1char(self): 14807db96d56Sopenharmony_ci b = bytearray(b"x") 14817db96d56Sopenharmony_ci b1 = b 14827db96d56Sopenharmony_ci b *= 100 14837db96d56Sopenharmony_ci self.assertEqual(b, b"x"*100) 14847db96d56Sopenharmony_ci self.assertEqual(b, b1) 14857db96d56Sopenharmony_ci self.assertIs(b, b1) 14867db96d56Sopenharmony_ci 14877db96d56Sopenharmony_ci def test_alloc(self): 14887db96d56Sopenharmony_ci b = bytearray() 14897db96d56Sopenharmony_ci alloc = b.__alloc__() 14907db96d56Sopenharmony_ci self.assertGreaterEqual(alloc, 0) 14917db96d56Sopenharmony_ci seq = [alloc] 14927db96d56Sopenharmony_ci for i in range(100): 14937db96d56Sopenharmony_ci b += b"x" 14947db96d56Sopenharmony_ci alloc = b.__alloc__() 14957db96d56Sopenharmony_ci self.assertGreater(alloc, len(b)) # including trailing null byte 14967db96d56Sopenharmony_ci if alloc not in seq: 14977db96d56Sopenharmony_ci seq.append(alloc) 14987db96d56Sopenharmony_ci 14997db96d56Sopenharmony_ci def test_init_alloc(self): 15007db96d56Sopenharmony_ci b = bytearray() 15017db96d56Sopenharmony_ci def g(): 15027db96d56Sopenharmony_ci for i in range(1, 100): 15037db96d56Sopenharmony_ci yield i 15047db96d56Sopenharmony_ci a = list(b) 15057db96d56Sopenharmony_ci self.assertEqual(a, list(range(1, len(a)+1))) 15067db96d56Sopenharmony_ci self.assertEqual(len(b), len(a)) 15077db96d56Sopenharmony_ci self.assertLessEqual(len(b), i) 15087db96d56Sopenharmony_ci alloc = b.__alloc__() 15097db96d56Sopenharmony_ci self.assertGreater(alloc, len(b)) # including trailing null byte 15107db96d56Sopenharmony_ci b.__init__(g()) 15117db96d56Sopenharmony_ci self.assertEqual(list(b), list(range(1, 100))) 15127db96d56Sopenharmony_ci self.assertEqual(len(b), 99) 15137db96d56Sopenharmony_ci alloc = b.__alloc__() 15147db96d56Sopenharmony_ci self.assertGreater(alloc, len(b)) 15157db96d56Sopenharmony_ci 15167db96d56Sopenharmony_ci def test_extend(self): 15177db96d56Sopenharmony_ci orig = b'hello' 15187db96d56Sopenharmony_ci a = bytearray(orig) 15197db96d56Sopenharmony_ci a.extend(a) 15207db96d56Sopenharmony_ci self.assertEqual(a, orig + orig) 15217db96d56Sopenharmony_ci self.assertEqual(a[5:], orig) 15227db96d56Sopenharmony_ci a = bytearray(b'') 15237db96d56Sopenharmony_ci # Test iterators that don't have a __length_hint__ 15247db96d56Sopenharmony_ci a.extend(map(int, orig * 25)) 15257db96d56Sopenharmony_ci a.extend(int(x) for x in orig * 25) 15267db96d56Sopenharmony_ci self.assertEqual(a, orig * 50) 15277db96d56Sopenharmony_ci self.assertEqual(a[-5:], orig) 15287db96d56Sopenharmony_ci a = bytearray(b'') 15297db96d56Sopenharmony_ci a.extend(iter(map(int, orig * 50))) 15307db96d56Sopenharmony_ci self.assertEqual(a, orig * 50) 15317db96d56Sopenharmony_ci self.assertEqual(a[-5:], orig) 15327db96d56Sopenharmony_ci a = bytearray(b'') 15337db96d56Sopenharmony_ci a.extend(list(map(int, orig * 50))) 15347db96d56Sopenharmony_ci self.assertEqual(a, orig * 50) 15357db96d56Sopenharmony_ci self.assertEqual(a[-5:], orig) 15367db96d56Sopenharmony_ci a = bytearray(b'') 15377db96d56Sopenharmony_ci self.assertRaises(ValueError, a.extend, [0, 1, 2, 256]) 15387db96d56Sopenharmony_ci self.assertRaises(ValueError, a.extend, [0, 1, 2, -1]) 15397db96d56Sopenharmony_ci self.assertEqual(len(a), 0) 15407db96d56Sopenharmony_ci a = bytearray(b'') 15417db96d56Sopenharmony_ci a.extend([Indexable(ord('a'))]) 15427db96d56Sopenharmony_ci self.assertEqual(a, b'a') 15437db96d56Sopenharmony_ci 15447db96d56Sopenharmony_ci def test_remove(self): 15457db96d56Sopenharmony_ci b = bytearray(b'hello') 15467db96d56Sopenharmony_ci b.remove(ord('l')) 15477db96d56Sopenharmony_ci self.assertEqual(b, b'helo') 15487db96d56Sopenharmony_ci b.remove(ord('l')) 15497db96d56Sopenharmony_ci self.assertEqual(b, b'heo') 15507db96d56Sopenharmony_ci self.assertRaises(ValueError, lambda: b.remove(ord('l'))) 15517db96d56Sopenharmony_ci self.assertRaises(ValueError, lambda: b.remove(400)) 15527db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b.remove('e')) 15537db96d56Sopenharmony_ci # remove first and last 15547db96d56Sopenharmony_ci b.remove(ord('o')) 15557db96d56Sopenharmony_ci b.remove(ord('h')) 15567db96d56Sopenharmony_ci self.assertEqual(b, b'e') 15577db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b.remove(b'e')) 15587db96d56Sopenharmony_ci b.remove(Indexable(ord('e'))) 15597db96d56Sopenharmony_ci self.assertEqual(b, b'') 15607db96d56Sopenharmony_ci 15617db96d56Sopenharmony_ci # test values outside of the ascii range: (0, 127) 15627db96d56Sopenharmony_ci c = bytearray([126, 127, 128, 129]) 15637db96d56Sopenharmony_ci c.remove(127) 15647db96d56Sopenharmony_ci self.assertEqual(c, bytes([126, 128, 129])) 15657db96d56Sopenharmony_ci c.remove(129) 15667db96d56Sopenharmony_ci self.assertEqual(c, bytes([126, 128])) 15677db96d56Sopenharmony_ci 15687db96d56Sopenharmony_ci def test_pop(self): 15697db96d56Sopenharmony_ci b = bytearray(b'world') 15707db96d56Sopenharmony_ci self.assertEqual(b.pop(), ord('d')) 15717db96d56Sopenharmony_ci self.assertEqual(b.pop(0), ord('w')) 15727db96d56Sopenharmony_ci self.assertEqual(b.pop(-2), ord('r')) 15737db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: b.pop(10)) 15747db96d56Sopenharmony_ci self.assertRaises(IndexError, lambda: bytearray().pop()) 15757db96d56Sopenharmony_ci # test for issue #6846 15767db96d56Sopenharmony_ci self.assertEqual(bytearray(b'\xff').pop(), 0xff) 15777db96d56Sopenharmony_ci 15787db96d56Sopenharmony_ci def test_nosort(self): 15797db96d56Sopenharmony_ci self.assertRaises(AttributeError, lambda: bytearray().sort()) 15807db96d56Sopenharmony_ci 15817db96d56Sopenharmony_ci def test_append(self): 15827db96d56Sopenharmony_ci b = bytearray(b'hell') 15837db96d56Sopenharmony_ci b.append(ord('o')) 15847db96d56Sopenharmony_ci self.assertEqual(b, b'hello') 15857db96d56Sopenharmony_ci self.assertEqual(b.append(100), None) 15867db96d56Sopenharmony_ci b = bytearray() 15877db96d56Sopenharmony_ci b.append(ord('A')) 15887db96d56Sopenharmony_ci self.assertEqual(len(b), 1) 15897db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b.append(b'o')) 15907db96d56Sopenharmony_ci b = bytearray() 15917db96d56Sopenharmony_ci b.append(Indexable(ord('A'))) 15927db96d56Sopenharmony_ci self.assertEqual(b, b'A') 15937db96d56Sopenharmony_ci 15947db96d56Sopenharmony_ci def test_insert(self): 15957db96d56Sopenharmony_ci b = bytearray(b'msssspp') 15967db96d56Sopenharmony_ci b.insert(1, ord('i')) 15977db96d56Sopenharmony_ci b.insert(4, ord('i')) 15987db96d56Sopenharmony_ci b.insert(-2, ord('i')) 15997db96d56Sopenharmony_ci b.insert(1000, ord('i')) 16007db96d56Sopenharmony_ci self.assertEqual(b, b'mississippi') 16017db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: b.insert(0, b'1')) 16027db96d56Sopenharmony_ci b = bytearray() 16037db96d56Sopenharmony_ci b.insert(0, Indexable(ord('A'))) 16047db96d56Sopenharmony_ci self.assertEqual(b, b'A') 16057db96d56Sopenharmony_ci 16067db96d56Sopenharmony_ci def test_copied(self): 16077db96d56Sopenharmony_ci # Issue 4348. Make sure that operations that don't mutate the array 16087db96d56Sopenharmony_ci # copy the bytes. 16097db96d56Sopenharmony_ci b = bytearray(b'abc') 16107db96d56Sopenharmony_ci self.assertIsNot(b, b.replace(b'abc', b'cde', 0)) 16117db96d56Sopenharmony_ci 16127db96d56Sopenharmony_ci t = bytearray([i for i in range(256)]) 16137db96d56Sopenharmony_ci x = bytearray(b'') 16147db96d56Sopenharmony_ci self.assertIsNot(x, x.translate(t)) 16157db96d56Sopenharmony_ci 16167db96d56Sopenharmony_ci def test_partition_bytearray_doesnt_share_nullstring(self): 16177db96d56Sopenharmony_ci a, b, c = bytearray(b"x").partition(b"y") 16187db96d56Sopenharmony_ci self.assertEqual(b, b"") 16197db96d56Sopenharmony_ci self.assertEqual(c, b"") 16207db96d56Sopenharmony_ci self.assertIsNot(b, c) 16217db96d56Sopenharmony_ci b += b"!" 16227db96d56Sopenharmony_ci self.assertEqual(c, b"") 16237db96d56Sopenharmony_ci a, b, c = bytearray(b"x").partition(b"y") 16247db96d56Sopenharmony_ci self.assertEqual(b, b"") 16257db96d56Sopenharmony_ci self.assertEqual(c, b"") 16267db96d56Sopenharmony_ci # Same for rpartition 16277db96d56Sopenharmony_ci b, c, a = bytearray(b"x").rpartition(b"y") 16287db96d56Sopenharmony_ci self.assertEqual(b, b"") 16297db96d56Sopenharmony_ci self.assertEqual(c, b"") 16307db96d56Sopenharmony_ci self.assertIsNot(b, c) 16317db96d56Sopenharmony_ci b += b"!" 16327db96d56Sopenharmony_ci self.assertEqual(c, b"") 16337db96d56Sopenharmony_ci c, b, a = bytearray(b"x").rpartition(b"y") 16347db96d56Sopenharmony_ci self.assertEqual(b, b"") 16357db96d56Sopenharmony_ci self.assertEqual(c, b"") 16367db96d56Sopenharmony_ci 16377db96d56Sopenharmony_ci def test_resize_forbidden(self): 16387db96d56Sopenharmony_ci # #4509: can't resize a bytearray when there are buffer exports, even 16397db96d56Sopenharmony_ci # if it wouldn't reallocate the underlying buffer. 16407db96d56Sopenharmony_ci # Furthermore, no destructive changes to the buffer may be applied 16417db96d56Sopenharmony_ci # before raising the error. 16427db96d56Sopenharmony_ci b = bytearray(range(10)) 16437db96d56Sopenharmony_ci v = memoryview(b) 16447db96d56Sopenharmony_ci def resize(n): 16457db96d56Sopenharmony_ci b[1:-1] = range(n + 1, 2*n - 1) 16467db96d56Sopenharmony_ci resize(10) 16477db96d56Sopenharmony_ci orig = b[:] 16487db96d56Sopenharmony_ci self.assertRaises(BufferError, resize, 11) 16497db96d56Sopenharmony_ci self.assertEqual(b, orig) 16507db96d56Sopenharmony_ci self.assertRaises(BufferError, resize, 9) 16517db96d56Sopenharmony_ci self.assertEqual(b, orig) 16527db96d56Sopenharmony_ci self.assertRaises(BufferError, resize, 0) 16537db96d56Sopenharmony_ci self.assertEqual(b, orig) 16547db96d56Sopenharmony_ci # Other operations implying resize 16557db96d56Sopenharmony_ci self.assertRaises(BufferError, b.pop, 0) 16567db96d56Sopenharmony_ci self.assertEqual(b, orig) 16577db96d56Sopenharmony_ci self.assertRaises(BufferError, b.remove, b[1]) 16587db96d56Sopenharmony_ci self.assertEqual(b, orig) 16597db96d56Sopenharmony_ci def delitem(): 16607db96d56Sopenharmony_ci del b[1] 16617db96d56Sopenharmony_ci self.assertRaises(BufferError, delitem) 16627db96d56Sopenharmony_ci self.assertEqual(b, orig) 16637db96d56Sopenharmony_ci # deleting a non-contiguous slice 16647db96d56Sopenharmony_ci def delslice(): 16657db96d56Sopenharmony_ci b[1:-1:2] = b"" 16667db96d56Sopenharmony_ci self.assertRaises(BufferError, delslice) 16677db96d56Sopenharmony_ci self.assertEqual(b, orig) 16687db96d56Sopenharmony_ci 16697db96d56Sopenharmony_ci @test.support.cpython_only 16707db96d56Sopenharmony_ci def test_obsolete_write_lock(self): 16717db96d56Sopenharmony_ci _testcapi = import_helper.import_module('_testcapi') 16727db96d56Sopenharmony_ci self.assertRaises(BufferError, _testcapi.getbuffer_with_null_view, bytearray()) 16737db96d56Sopenharmony_ci 16747db96d56Sopenharmony_ci def test_iterator_pickling2(self): 16757db96d56Sopenharmony_ci orig = bytearray(b'abc') 16767db96d56Sopenharmony_ci data = list(b'qwerty') 16777db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 16787db96d56Sopenharmony_ci # initial iterator 16797db96d56Sopenharmony_ci itorig = iter(orig) 16807db96d56Sopenharmony_ci d = pickle.dumps((itorig, orig), proto) 16817db96d56Sopenharmony_ci it, b = pickle.loads(d) 16827db96d56Sopenharmony_ci b[:] = data 16837db96d56Sopenharmony_ci self.assertEqual(type(it), type(itorig)) 16847db96d56Sopenharmony_ci self.assertEqual(list(it), data) 16857db96d56Sopenharmony_ci 16867db96d56Sopenharmony_ci # running iterator 16877db96d56Sopenharmony_ci next(itorig) 16887db96d56Sopenharmony_ci d = pickle.dumps((itorig, orig), proto) 16897db96d56Sopenharmony_ci it, b = pickle.loads(d) 16907db96d56Sopenharmony_ci b[:] = data 16917db96d56Sopenharmony_ci self.assertEqual(type(it), type(itorig)) 16927db96d56Sopenharmony_ci self.assertEqual(list(it), data[1:]) 16937db96d56Sopenharmony_ci 16947db96d56Sopenharmony_ci # empty iterator 16957db96d56Sopenharmony_ci for i in range(1, len(orig)): 16967db96d56Sopenharmony_ci next(itorig) 16977db96d56Sopenharmony_ci d = pickle.dumps((itorig, orig), proto) 16987db96d56Sopenharmony_ci it, b = pickle.loads(d) 16997db96d56Sopenharmony_ci b[:] = data 17007db96d56Sopenharmony_ci self.assertEqual(type(it), type(itorig)) 17017db96d56Sopenharmony_ci self.assertEqual(list(it), data[len(orig):]) 17027db96d56Sopenharmony_ci 17037db96d56Sopenharmony_ci # exhausted iterator 17047db96d56Sopenharmony_ci self.assertRaises(StopIteration, next, itorig) 17057db96d56Sopenharmony_ci d = pickle.dumps((itorig, orig), proto) 17067db96d56Sopenharmony_ci it, b = pickle.loads(d) 17077db96d56Sopenharmony_ci b[:] = data 17087db96d56Sopenharmony_ci self.assertEqual(list(it), []) 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator 17117db96d56Sopenharmony_ci 17127db96d56Sopenharmony_ci def test_iterator_length_hint(self): 17137db96d56Sopenharmony_ci # Issue 27443: __length_hint__ can return negative integer 17147db96d56Sopenharmony_ci ba = bytearray(b'ab') 17157db96d56Sopenharmony_ci it = iter(ba) 17167db96d56Sopenharmony_ci next(it) 17177db96d56Sopenharmony_ci ba.clear() 17187db96d56Sopenharmony_ci # Shouldn't raise an error 17197db96d56Sopenharmony_ci self.assertEqual(list(it), []) 17207db96d56Sopenharmony_ci 17217db96d56Sopenharmony_ci def test_repeat_after_setslice(self): 17227db96d56Sopenharmony_ci # bpo-42924: * used to copy from the wrong memory location 17237db96d56Sopenharmony_ci b = bytearray(b'abc') 17247db96d56Sopenharmony_ci b[:2] = b'x' 17257db96d56Sopenharmony_ci b1 = b * 1 17267db96d56Sopenharmony_ci b3 = b * 3 17277db96d56Sopenharmony_ci self.assertEqual(b1, b'xc') 17287db96d56Sopenharmony_ci self.assertEqual(b1, b) 17297db96d56Sopenharmony_ci self.assertEqual(b3, b'xcxcxc') 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci def test_mutating_index(self): 17327db96d56Sopenharmony_ci class Boom: 17337db96d56Sopenharmony_ci def __index__(self): 17347db96d56Sopenharmony_ci b.clear() 17357db96d56Sopenharmony_ci return 0 17367db96d56Sopenharmony_ci 17377db96d56Sopenharmony_ci with self.subTest("tp_as_mapping"): 17387db96d56Sopenharmony_ci b = bytearray(b'Now you see me...') 17397db96d56Sopenharmony_ci with self.assertRaises(IndexError): 17407db96d56Sopenharmony_ci b[0] = Boom() 17417db96d56Sopenharmony_ci 17427db96d56Sopenharmony_ci with self.subTest("tp_as_sequence"): 17437db96d56Sopenharmony_ci _testcapi = import_helper.import_module('_testcapi') 17447db96d56Sopenharmony_ci b = bytearray(b'Now you see me...') 17457db96d56Sopenharmony_ci with self.assertRaises(IndexError): 17467db96d56Sopenharmony_ci _testcapi.sequence_setitem(b, 0, Boom()) 17477db96d56Sopenharmony_ci 17487db96d56Sopenharmony_ci 17497db96d56Sopenharmony_ciclass AssortedBytesTest(unittest.TestCase): 17507db96d56Sopenharmony_ci # 17517db96d56Sopenharmony_ci # Test various combinations of bytes and bytearray 17527db96d56Sopenharmony_ci # 17537db96d56Sopenharmony_ci 17547db96d56Sopenharmony_ci @check_bytes_warnings 17557db96d56Sopenharmony_ci def test_repr_str(self): 17567db96d56Sopenharmony_ci for f in str, repr: 17577db96d56Sopenharmony_ci self.assertEqual(f(bytearray()), "bytearray(b'')") 17587db96d56Sopenharmony_ci self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')") 17597db96d56Sopenharmony_ci self.assertEqual(f(bytearray([0, 1, 254, 255])), 17607db96d56Sopenharmony_ci "bytearray(b'\\x00\\x01\\xfe\\xff')") 17617db96d56Sopenharmony_ci self.assertEqual(f(b"abc"), "b'abc'") 17627db96d56Sopenharmony_ci self.assertEqual(f(b"'"), '''b"'"''') # ''' 17637db96d56Sopenharmony_ci self.assertEqual(f(b"'\""), r"""b'\'"'""") # ' 17647db96d56Sopenharmony_ci 17657db96d56Sopenharmony_ci @check_bytes_warnings 17667db96d56Sopenharmony_ci def test_format(self): 17677db96d56Sopenharmony_ci for b in b'abc', bytearray(b'abc'): 17687db96d56Sopenharmony_ci self.assertEqual(format(b), str(b)) 17697db96d56Sopenharmony_ci self.assertEqual(format(b, ''), str(b)) 17707db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 17717db96d56Sopenharmony_ci r'\b%s\b' % re.escape(type(b).__name__)): 17727db96d56Sopenharmony_ci format(b, 's') 17737db96d56Sopenharmony_ci 17747db96d56Sopenharmony_ci def test_compare_bytes_to_bytearray(self): 17757db96d56Sopenharmony_ci self.assertEqual(b"abc" == bytes(b"abc"), True) 17767db96d56Sopenharmony_ci self.assertEqual(b"ab" != bytes(b"abc"), True) 17777db96d56Sopenharmony_ci self.assertEqual(b"ab" <= bytes(b"abc"), True) 17787db96d56Sopenharmony_ci self.assertEqual(b"ab" < bytes(b"abc"), True) 17797db96d56Sopenharmony_ci self.assertEqual(b"abc" >= bytes(b"ab"), True) 17807db96d56Sopenharmony_ci self.assertEqual(b"abc" > bytes(b"ab"), True) 17817db96d56Sopenharmony_ci 17827db96d56Sopenharmony_ci self.assertEqual(b"abc" != bytes(b"abc"), False) 17837db96d56Sopenharmony_ci self.assertEqual(b"ab" == bytes(b"abc"), False) 17847db96d56Sopenharmony_ci self.assertEqual(b"ab" > bytes(b"abc"), False) 17857db96d56Sopenharmony_ci self.assertEqual(b"ab" >= bytes(b"abc"), False) 17867db96d56Sopenharmony_ci self.assertEqual(b"abc" < bytes(b"ab"), False) 17877db96d56Sopenharmony_ci self.assertEqual(b"abc" <= bytes(b"ab"), False) 17887db96d56Sopenharmony_ci 17897db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") == b"abc", True) 17907db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") != b"abc", True) 17917db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") <= b"abc", True) 17927db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") < b"abc", True) 17937db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") >= b"ab", True) 17947db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") > b"ab", True) 17957db96d56Sopenharmony_ci 17967db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") != b"abc", False) 17977db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") == b"abc", False) 17987db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") > b"abc", False) 17997db96d56Sopenharmony_ci self.assertEqual(bytes(b"ab") >= b"abc", False) 18007db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") < b"ab", False) 18017db96d56Sopenharmony_ci self.assertEqual(bytes(b"abc") <= b"ab", False) 18027db96d56Sopenharmony_ci 18037db96d56Sopenharmony_ci @test.support.requires_docstrings 18047db96d56Sopenharmony_ci def test_doc(self): 18057db96d56Sopenharmony_ci self.assertIsNotNone(bytearray.__doc__) 18067db96d56Sopenharmony_ci self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__) 18077db96d56Sopenharmony_ci self.assertIsNotNone(bytes.__doc__) 18087db96d56Sopenharmony_ci self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__) 18097db96d56Sopenharmony_ci 18107db96d56Sopenharmony_ci def test_from_bytearray(self): 18117db96d56Sopenharmony_ci sample = bytes(b"Hello world\n\x80\x81\xfe\xff") 18127db96d56Sopenharmony_ci buf = memoryview(sample) 18137db96d56Sopenharmony_ci b = bytearray(buf) 18147db96d56Sopenharmony_ci self.assertEqual(b, bytearray(sample)) 18157db96d56Sopenharmony_ci 18167db96d56Sopenharmony_ci @check_bytes_warnings 18177db96d56Sopenharmony_ci def test_to_str(self): 18187db96d56Sopenharmony_ci self.assertEqual(str(b''), "b''") 18197db96d56Sopenharmony_ci self.assertEqual(str(b'x'), "b'x'") 18207db96d56Sopenharmony_ci self.assertEqual(str(b'\x80'), "b'\\x80'") 18217db96d56Sopenharmony_ci self.assertEqual(str(bytearray(b'')), "bytearray(b'')") 18227db96d56Sopenharmony_ci self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')") 18237db96d56Sopenharmony_ci self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')") 18247db96d56Sopenharmony_ci 18257db96d56Sopenharmony_ci def test_literal(self): 18267db96d56Sopenharmony_ci tests = [ 18277db96d56Sopenharmony_ci (b"Wonderful spam", "Wonderful spam"), 18287db96d56Sopenharmony_ci (br"Wonderful spam too", "Wonderful spam too"), 18297db96d56Sopenharmony_ci (b"\xaa\x00\000\200", "\xaa\x00\000\200"), 18307db96d56Sopenharmony_ci (br"\xaa\x00\000\200", r"\xaa\x00\000\200"), 18317db96d56Sopenharmony_ci ] 18327db96d56Sopenharmony_ci for b, s in tests: 18337db96d56Sopenharmony_ci self.assertEqual(b, bytearray(s, 'latin-1')) 18347db96d56Sopenharmony_ci for c in range(128, 256): 18357db96d56Sopenharmony_ci self.assertRaises(SyntaxError, eval, 18367db96d56Sopenharmony_ci 'b"%s"' % chr(c)) 18377db96d56Sopenharmony_ci 18387db96d56Sopenharmony_ci def test_split_bytearray(self): 18397db96d56Sopenharmony_ci self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b']) 18407db96d56Sopenharmony_ci 18417db96d56Sopenharmony_ci def test_rsplit_bytearray(self): 18427db96d56Sopenharmony_ci self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b']) 18437db96d56Sopenharmony_ci 18447db96d56Sopenharmony_ci def test_return_self(self): 18457db96d56Sopenharmony_ci # bytearray.replace must always return a new bytearray 18467db96d56Sopenharmony_ci b = bytearray() 18477db96d56Sopenharmony_ci self.assertIsNot(b.replace(b'', b''), b) 18487db96d56Sopenharmony_ci 18497db96d56Sopenharmony_ci @unittest.skipUnless(sys.flags.bytes_warning, 18507db96d56Sopenharmony_ci "BytesWarning is needed for this test: use -bb option") 18517db96d56Sopenharmony_ci def test_compare(self): 18527db96d56Sopenharmony_ci def bytes_warning(): 18537db96d56Sopenharmony_ci return warnings_helper.check_warnings(('', BytesWarning)) 18547db96d56Sopenharmony_ci with bytes_warning(): 18557db96d56Sopenharmony_ci b'' == '' 18567db96d56Sopenharmony_ci with bytes_warning(): 18577db96d56Sopenharmony_ci '' == b'' 18587db96d56Sopenharmony_ci with bytes_warning(): 18597db96d56Sopenharmony_ci b'' != '' 18607db96d56Sopenharmony_ci with bytes_warning(): 18617db96d56Sopenharmony_ci '' != b'' 18627db96d56Sopenharmony_ci with bytes_warning(): 18637db96d56Sopenharmony_ci bytearray(b'') == '' 18647db96d56Sopenharmony_ci with bytes_warning(): 18657db96d56Sopenharmony_ci '' == bytearray(b'') 18667db96d56Sopenharmony_ci with bytes_warning(): 18677db96d56Sopenharmony_ci bytearray(b'') != '' 18687db96d56Sopenharmony_ci with bytes_warning(): 18697db96d56Sopenharmony_ci '' != bytearray(b'') 18707db96d56Sopenharmony_ci with bytes_warning(): 18717db96d56Sopenharmony_ci b'\0' == 0 18727db96d56Sopenharmony_ci with bytes_warning(): 18737db96d56Sopenharmony_ci 0 == b'\0' 18747db96d56Sopenharmony_ci with bytes_warning(): 18757db96d56Sopenharmony_ci b'\0' != 0 18767db96d56Sopenharmony_ci with bytes_warning(): 18777db96d56Sopenharmony_ci 0 != b'\0' 18787db96d56Sopenharmony_ci 18797db96d56Sopenharmony_ci # Optimizations: 18807db96d56Sopenharmony_ci # __iter__? (optimization) 18817db96d56Sopenharmony_ci # __reversed__? (optimization) 18827db96d56Sopenharmony_ci 18837db96d56Sopenharmony_ci # XXX More string methods? (Those that don't use character properties) 18847db96d56Sopenharmony_ci 18857db96d56Sopenharmony_ci # There are tests in string_tests.py that are more 18867db96d56Sopenharmony_ci # comprehensive for things like partition, etc. 18877db96d56Sopenharmony_ci # Unfortunately they are all bundled with tests that 18887db96d56Sopenharmony_ci # are not appropriate for bytes 18897db96d56Sopenharmony_ci 18907db96d56Sopenharmony_ci # I've started porting some of those into bytearray_tests.py, we should port 18917db96d56Sopenharmony_ci # the rest that make sense (the code can be cleaned up to use modern 18927db96d56Sopenharmony_ci # unittest methods at the same time). 18937db96d56Sopenharmony_ci 18947db96d56Sopenharmony_ciclass BytearrayPEP3137Test(unittest.TestCase): 18957db96d56Sopenharmony_ci def marshal(self, x): 18967db96d56Sopenharmony_ci return bytearray(x) 18977db96d56Sopenharmony_ci 18987db96d56Sopenharmony_ci def test_returns_new_copy(self): 18997db96d56Sopenharmony_ci val = self.marshal(b'1234') 19007db96d56Sopenharmony_ci # On immutable types these MAY return a reference to themselves 19017db96d56Sopenharmony_ci # but on mutable types like bytearray they MUST return a new copy. 19027db96d56Sopenharmony_ci for methname in ('zfill', 'rjust', 'ljust', 'center'): 19037db96d56Sopenharmony_ci method = getattr(val, methname) 19047db96d56Sopenharmony_ci newval = method(3) 19057db96d56Sopenharmony_ci self.assertEqual(val, newval) 19067db96d56Sopenharmony_ci self.assertIsNot(val, newval, 19077db96d56Sopenharmony_ci methname+' returned self on a mutable object') 19087db96d56Sopenharmony_ci for expr in ('val.split()[0]', 'val.rsplit()[0]', 19097db96d56Sopenharmony_ci 'val.partition(b".")[0]', 'val.rpartition(b".")[2]', 19107db96d56Sopenharmony_ci 'val.splitlines()[0]', 'val.replace(b"", b"")'): 19117db96d56Sopenharmony_ci newval = eval(expr) 19127db96d56Sopenharmony_ci self.assertEqual(val, newval) 19137db96d56Sopenharmony_ci self.assertIsNot(val, newval, 19147db96d56Sopenharmony_ci expr+' returned val on a mutable object') 19157db96d56Sopenharmony_ci sep = self.marshal(b'') 19167db96d56Sopenharmony_ci newval = sep.join([val]) 19177db96d56Sopenharmony_ci self.assertEqual(val, newval) 19187db96d56Sopenharmony_ci self.assertIsNot(val, newval) 19197db96d56Sopenharmony_ci 19207db96d56Sopenharmony_ci 19217db96d56Sopenharmony_ciclass FixedStringTest(test.string_tests.BaseTest): 19227db96d56Sopenharmony_ci def fixtype(self, obj): 19237db96d56Sopenharmony_ci if isinstance(obj, str): 19247db96d56Sopenharmony_ci return self.type2test(obj.encode("utf-8")) 19257db96d56Sopenharmony_ci return super().fixtype(obj) 19267db96d56Sopenharmony_ci 19277db96d56Sopenharmony_ci contains_bytes = True 19287db96d56Sopenharmony_ci 19297db96d56Sopenharmony_ciclass ByteArrayAsStringTest(FixedStringTest, unittest.TestCase): 19307db96d56Sopenharmony_ci type2test = bytearray 19317db96d56Sopenharmony_ci 19327db96d56Sopenharmony_ciclass BytesAsStringTest(FixedStringTest, unittest.TestCase): 19337db96d56Sopenharmony_ci type2test = bytes 19347db96d56Sopenharmony_ci 19357db96d56Sopenharmony_ci 19367db96d56Sopenharmony_ciclass SubclassTest: 19377db96d56Sopenharmony_ci 19387db96d56Sopenharmony_ci def test_basic(self): 19397db96d56Sopenharmony_ci self.assertTrue(issubclass(self.type2test, self.basetype)) 19407db96d56Sopenharmony_ci self.assertIsInstance(self.type2test(), self.basetype) 19417db96d56Sopenharmony_ci 19427db96d56Sopenharmony_ci a, b = b"abcd", b"efgh" 19437db96d56Sopenharmony_ci _a, _b = self.type2test(a), self.type2test(b) 19447db96d56Sopenharmony_ci 19457db96d56Sopenharmony_ci # test comparison operators with subclass instances 19467db96d56Sopenharmony_ci self.assertTrue(_a == _a) 19477db96d56Sopenharmony_ci self.assertTrue(_a != _b) 19487db96d56Sopenharmony_ci self.assertTrue(_a < _b) 19497db96d56Sopenharmony_ci self.assertTrue(_a <= _b) 19507db96d56Sopenharmony_ci self.assertTrue(_b >= _a) 19517db96d56Sopenharmony_ci self.assertTrue(_b > _a) 19527db96d56Sopenharmony_ci self.assertIsNot(_a, a) 19537db96d56Sopenharmony_ci 19547db96d56Sopenharmony_ci # test concat of subclass instances 19557db96d56Sopenharmony_ci self.assertEqual(a + b, _a + _b) 19567db96d56Sopenharmony_ci self.assertEqual(a + b, a + _b) 19577db96d56Sopenharmony_ci self.assertEqual(a + b, _a + b) 19587db96d56Sopenharmony_ci 19597db96d56Sopenharmony_ci # test repeat 19607db96d56Sopenharmony_ci self.assertTrue(a*5 == _a*5) 19617db96d56Sopenharmony_ci 19627db96d56Sopenharmony_ci def test_join(self): 19637db96d56Sopenharmony_ci # Make sure join returns a NEW object for single item sequences 19647db96d56Sopenharmony_ci # involving a subclass. 19657db96d56Sopenharmony_ci # Make sure that it is of the appropriate type. 19667db96d56Sopenharmony_ci s1 = self.type2test(b"abcd") 19677db96d56Sopenharmony_ci s2 = self.basetype().join([s1]) 19687db96d56Sopenharmony_ci self.assertIsNot(s1, s2) 19697db96d56Sopenharmony_ci self.assertIs(type(s2), self.basetype, type(s2)) 19707db96d56Sopenharmony_ci 19717db96d56Sopenharmony_ci # Test reverse, calling join on subclass 19727db96d56Sopenharmony_ci s3 = s1.join([b"abcd"]) 19737db96d56Sopenharmony_ci self.assertIs(type(s3), self.basetype) 19747db96d56Sopenharmony_ci 19757db96d56Sopenharmony_ci def test_pickle(self): 19767db96d56Sopenharmony_ci a = self.type2test(b"abcd") 19777db96d56Sopenharmony_ci a.x = 10 19787db96d56Sopenharmony_ci a.z = self.type2test(b"efgh") 19797db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 19807db96d56Sopenharmony_ci b = pickle.loads(pickle.dumps(a, proto)) 19817db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(b)) 19827db96d56Sopenharmony_ci self.assertEqual(a, b) 19837db96d56Sopenharmony_ci self.assertEqual(a.x, b.x) 19847db96d56Sopenharmony_ci self.assertEqual(a.z, b.z) 19857db96d56Sopenharmony_ci self.assertEqual(type(a), type(b)) 19867db96d56Sopenharmony_ci self.assertEqual(type(a.z), type(b.z)) 19877db96d56Sopenharmony_ci self.assertFalse(hasattr(b, 'y')) 19887db96d56Sopenharmony_ci 19897db96d56Sopenharmony_ci def test_copy(self): 19907db96d56Sopenharmony_ci a = self.type2test(b"abcd") 19917db96d56Sopenharmony_ci a.x = 10 19927db96d56Sopenharmony_ci a.z = self.type2test(b"efgh") 19937db96d56Sopenharmony_ci for copy_method in (copy.copy, copy.deepcopy): 19947db96d56Sopenharmony_ci b = copy_method(a) 19957db96d56Sopenharmony_ci self.assertNotEqual(id(a), id(b)) 19967db96d56Sopenharmony_ci self.assertEqual(a, b) 19977db96d56Sopenharmony_ci self.assertEqual(a.x, b.x) 19987db96d56Sopenharmony_ci self.assertEqual(a.z, b.z) 19997db96d56Sopenharmony_ci self.assertEqual(type(a), type(b)) 20007db96d56Sopenharmony_ci self.assertEqual(type(a.z), type(b.z)) 20017db96d56Sopenharmony_ci self.assertFalse(hasattr(b, 'y')) 20027db96d56Sopenharmony_ci 20037db96d56Sopenharmony_ci def test_fromhex(self): 20047db96d56Sopenharmony_ci b = self.type2test.fromhex('1a2B30') 20057db96d56Sopenharmony_ci self.assertEqual(b, b'\x1a\x2b\x30') 20067db96d56Sopenharmony_ci self.assertIs(type(b), self.type2test) 20077db96d56Sopenharmony_ci 20087db96d56Sopenharmony_ci class B1(self.basetype): 20097db96d56Sopenharmony_ci def __new__(cls, value): 20107db96d56Sopenharmony_ci me = self.basetype.__new__(cls, value) 20117db96d56Sopenharmony_ci me.foo = 'bar' 20127db96d56Sopenharmony_ci return me 20137db96d56Sopenharmony_ci 20147db96d56Sopenharmony_ci b = B1.fromhex('1a2B30') 20157db96d56Sopenharmony_ci self.assertEqual(b, b'\x1a\x2b\x30') 20167db96d56Sopenharmony_ci self.assertIs(type(b), B1) 20177db96d56Sopenharmony_ci self.assertEqual(b.foo, 'bar') 20187db96d56Sopenharmony_ci 20197db96d56Sopenharmony_ci class B2(self.basetype): 20207db96d56Sopenharmony_ci def __init__(me, *args, **kwargs): 20217db96d56Sopenharmony_ci if self.basetype is not bytes: 20227db96d56Sopenharmony_ci self.basetype.__init__(me, *args, **kwargs) 20237db96d56Sopenharmony_ci me.foo = 'bar' 20247db96d56Sopenharmony_ci 20257db96d56Sopenharmony_ci b = B2.fromhex('1a2B30') 20267db96d56Sopenharmony_ci self.assertEqual(b, b'\x1a\x2b\x30') 20277db96d56Sopenharmony_ci self.assertIs(type(b), B2) 20287db96d56Sopenharmony_ci self.assertEqual(b.foo, 'bar') 20297db96d56Sopenharmony_ci 20307db96d56Sopenharmony_ci 20317db96d56Sopenharmony_ciclass ByteArraySubclass(bytearray): 20327db96d56Sopenharmony_ci pass 20337db96d56Sopenharmony_ci 20347db96d56Sopenharmony_ciclass ByteArraySubclassWithSlots(bytearray): 20357db96d56Sopenharmony_ci __slots__ = ('x', 'y', '__dict__') 20367db96d56Sopenharmony_ci 20377db96d56Sopenharmony_ciclass BytesSubclass(bytes): 20387db96d56Sopenharmony_ci pass 20397db96d56Sopenharmony_ci 20407db96d56Sopenharmony_ciclass OtherBytesSubclass(bytes): 20417db96d56Sopenharmony_ci pass 20427db96d56Sopenharmony_ci 20437db96d56Sopenharmony_ciclass ByteArraySubclassTest(SubclassTest, unittest.TestCase): 20447db96d56Sopenharmony_ci basetype = bytearray 20457db96d56Sopenharmony_ci type2test = ByteArraySubclass 20467db96d56Sopenharmony_ci 20477db96d56Sopenharmony_ci def test_init_override(self): 20487db96d56Sopenharmony_ci class subclass(bytearray): 20497db96d56Sopenharmony_ci def __init__(me, newarg=1, *args, **kwargs): 20507db96d56Sopenharmony_ci bytearray.__init__(me, *args, **kwargs) 20517db96d56Sopenharmony_ci x = subclass(4, b"abcd") 20527db96d56Sopenharmony_ci x = subclass(4, source=b"abcd") 20537db96d56Sopenharmony_ci self.assertEqual(x, b"abcd") 20547db96d56Sopenharmony_ci x = subclass(newarg=4, source=b"abcd") 20557db96d56Sopenharmony_ci self.assertEqual(x, b"abcd") 20567db96d56Sopenharmony_ci 20577db96d56Sopenharmony_ciclass ByteArraySubclassWithSlotsTest(SubclassTest, unittest.TestCase): 20587db96d56Sopenharmony_ci basetype = bytearray 20597db96d56Sopenharmony_ci type2test = ByteArraySubclassWithSlots 20607db96d56Sopenharmony_ci 20617db96d56Sopenharmony_ciclass BytesSubclassTest(SubclassTest, unittest.TestCase): 20627db96d56Sopenharmony_ci basetype = bytes 20637db96d56Sopenharmony_ci type2test = BytesSubclass 20647db96d56Sopenharmony_ci 20657db96d56Sopenharmony_ci 20667db96d56Sopenharmony_ciif __name__ == "__main__": 20677db96d56Sopenharmony_ci unittest.main() 2068