# Bytes test cases (compile and run) [case testBytesBasics] # Note: Add tests for additional operations to testBytesOps or in a new test case def f(x: bytes) -> bytes: return x def eq(a: bytes, b: bytes) -> bool: return a == b def neq(a: bytes, b: bytes) -> bool: return a != b [file driver.py] from native import f, eq, neq assert f(b'123') == b'123' assert f(b'\x07 \x0b " \t \x7f \xf0') == b'\x07 \x0b " \t \x7f \xf0' assert eq(b'123', b'123') assert not eq(b'123', b'1234') assert not eq(b'123', b'124') assert not eq(b'123', b'223') assert neq(b'123', b'1234') try: f('x') assert False except TypeError: pass [case testBytesInit] def test_bytes_init() -> None: b1 = bytes([5]) assert b1 == b'\x05' b2 = bytes([5, 10, 12]) assert b2 == b'\x05\n\x0c' b3 = bytes(bytearray(b'foo')) assert b3 == b'foo' b4 = bytes(b'aaa') assert b4 == b'aaa' b5 = bytes(5) assert b5 == b'\x00\x00\x00\x00\x00' try: bytes('x') assert False except TypeError: pass [case testBytesOps] from testutil import assertRaises def test_indexing() -> None: # Use bytes() to avoid constant folding b = b'asdf' + bytes() assert b[0] == 97 assert b[1] == 115 assert b[3] == 102 assert b[-1] == 102 b = b'\xae\x80\xfe\x15' + bytes() assert b[0] == 174 assert b[1] == 128 assert b[2] == 254 assert b[3] == 21 assert b[-4] == 174 with assertRaises(IndexError, "index out of range"): b[4] with assertRaises(IndexError, "index out of range"): b[-5] with assertRaises(IndexError, "index out of range"): b[2**26] def test_concat() -> None: b1 = b'123' + bytes() b2 = b'456' + bytes() assert b1 + b2 == b'123456' b3 = b1 + b2 b3 = b3 + b1 assert b3 == b'123456123' assert b1 == b'123' assert b2 == b'456' assert type(b1) == bytes assert type(b2) == bytes assert type(b3) == bytes brr1 = bytearray(3) brr2 = bytearray(range(5)) b4 = b1 + brr1 assert b4 == b'123\x00\x00\x00' assert type(brr1) == bytearray assert type(b4) == bytes brr3 = brr1 + brr2 assert brr3 == bytearray(b'\x00\x00\x00\x00\x01\x02\x03\x04') assert len(brr3) == 8 assert type(brr3) == bytearray brr3 = brr3 + bytearray([10]) assert brr3 == bytearray(b'\x00\x00\x00\x00\x01\x02\x03\x04\n') b5 = brr2 + b2 assert b5 == bytearray(b'\x00\x01\x02\x03\x04456') assert type(b5) == bytearray b6 = b2 + brr2 assert b6 == b'456\x00\x01\x02\x03\x04' assert type(b6) == bytes def test_join() -> None: seq = (b'1', b'"', b'\xf0') assert b'\x07'.join(seq) == b'1\x07"\x07\xf0' assert b', '.join(()) == b'' assert b', '.join([bytes() + b'ab']) == b'ab' assert b', '.join([bytes() + b'ab', b'cd']) == b'ab, cd' def test_len() -> None: # Use bytes() to avoid constant folding b = b'foo' + bytes() assert len(b) == 3 assert len(bytes()) == 0 def test_ord() -> None: assert ord(b'a') == ord('a') assert ord(b'a' + bytes()) == ord('a') assert ord(b'\x00') == 0 assert ord(b'\x00' + bytes()) == 0 assert ord(b'\xfe') == 254 assert ord(b'\xfe' + bytes()) == 254 with assertRaises(TypeError): ord(b'aa') with assertRaises(TypeError): ord(b'') def test_ord_bytesarray() -> None: assert ord(bytearray(b'a')) == ord('a') assert ord(bytearray(b'\x00')) == 0 assert ord(bytearray(b'\xfe')) == 254 with assertRaises(TypeError): ord(bytearray(b'aa')) with assertRaises(TypeError): ord(bytearray(b'')) def test_multiply() -> None: # Use bytes() and int() to avoid constant folding b = b'ab' + bytes() zero = int() one = 1 + zero three = 3 + zero neg_one = -1 + zero assert b * zero == b'' assert b * one == b'ab' assert b * three == b'ababab' assert b * neg_one == b'' assert zero * b == b'' assert one * b == b'ab' assert three * b == b'ababab' assert neg_one * b == b'' # Test with empty bytes empty = bytes() five = 5 + zero assert empty * five == b'' assert five * empty == b'' # Test with single byte single = b'\xff' + bytes() four = 4 + zero assert single * four == b'\xff\xff\xff\xff' assert four * single == b'\xff\xff\xff\xff' # Test type preservation two = 2 + zero result = b * two assert type(result) == bytes def test_translate() -> None: # Identity translation table (fast path - exact bytes) identity = bytes(range(256)) b = b'hello world' + bytes() assert b.translate(identity) == b'hello world' # ROT13-like translation for lowercase letters table = bytearray(range(256)) for i in range(ord('a'), ord('z') + 1): table[i] = ord('a') + (i - ord('a') + 13) % 26 table_bytes = bytes(table) assert b'hello'.translate(table_bytes) == b'uryyb' assert (b'abc' + bytes()).translate(table_bytes) == b'nop' # Test with special characters assert b'\x00\x01\xff'.translate(identity) == b'\x00\x01\xff' # Test with bytearray table (slow path - fallback to Python method) bytearray_table = bytearray(range(256)) assert b'hello'.translate(bytearray_table) == b'hello' # Modify bytearray table to uppercase for i in range(ord('a'), ord('z') + 1): bytearray_table[i] = ord('A') + (i - ord('a')) assert b'hello world'.translate(bytearray_table) == b'HELLO WORLD' assert (b'test' + bytes()).translate(bytearray_table) == b'TEST' # Test error on wrong table size with assertRaises(ValueError, "translation table must be 256 characters long"): b'test'.translate(b'short') with assertRaises(ValueError, "translation table must be 256 characters long"): b'test'.translate(bytes(100)) def test_startswith() -> None: # Test default behavior test = b'some string' assert test.startswith(b'some') assert test.startswith(b'some string') assert not test.startswith(b'other') assert not test.startswith(b'some string but longer') # Test empty cases assert test.startswith(b'') assert b''.startswith(b'') assert not b''.startswith(test) # Test bytearray to verify slow paths assert test.startswith(bytearray(b'some')) assert not test.startswith(bytearray(b'other')) test2 = bytearray(b'some string') assert test2.startswith(b'some') assert not test2.startswith(b'other') def test_endswith() -> None: # Test default behavior test = b'some string' assert test.endswith(b'string') assert test.endswith(b'some string') assert not test.endswith(b'other') assert not test.endswith(b'some string but longer') # Test empty cases assert test.endswith(b'') assert b''.endswith(b'') assert not b''.endswith(test) # Test bytearray to verify slow paths assert test.endswith(bytearray(b'string')) assert not test.endswith(bytearray(b'other')) test2 = bytearray(b'some string') assert test2.endswith(b'string') assert not test2.endswith(b'other') [case testBytesSlicing] def test_bytes_slicing() -> None: b = b'abcdefg' zero = int() ten = 10 + zero two = 2 + zero five = 5 + zero seven = 7 + zero assert b[:ten] == b'abcdefg' assert b[0:seven] == b'abcdefg' assert b[0:(len(b)+1)] == b'abcdefg' assert b[two:five] == b'cde' assert b[two:two] == b'' assert b[-two:-two] == b'' assert b[-ten:(-ten+1)] == b'' assert b[:-two] == b'abcde' assert b[:two] == b'ab' assert b[:] == b'abcdefg' assert b[-two:] == b'fg' assert b[zero:] == b'abcdefg' assert b[:zero] == b'' assert b[-ten:] == b'abcdefg' assert b[-ten:ten] == b'abcdefg' big_ints = [1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, 2**24, 2**63] for big_int in big_ints: assert b[1:big_int] == b'bcdefg' assert b[big_int:] == b'' assert b[-big_int:-1] == b'abcdef' assert b[-big_int:big_int] == b'abcdefg' assert type(b[-big_int:-1]) == bytes assert type(b[-ten:]) == bytes assert type(b[:]) == bytes [case testBytearrayBasics] from typing import Any from testutil import assertRaises def test_basics() -> None: brr0 = bytearray() assert brr0 == bytearray(b'') assert brr0 == b'' assert len(brr0) == 0 brr1 = bytearray(3) assert brr1 == bytearray(b'\x00\x00\x00') assert brr1 == b'\x00\x00\x00' l = [10, 20, 30, 40] brr2 = bytearray(l) assert brr2 == bytearray(b'\n\x14\x1e(') assert brr2 == b'\n\x14\x1e(' brr3 = bytearray(range(5)) assert brr3 == bytearray(b'\x00\x01\x02\x03\x04') assert brr3 == b'\x00\x01\x02\x03\x04' brr4 = bytearray('string', 'utf-8') assert brr4 == bytearray(b'string') assert brr4 == b'string' assert len(brr1) == 3 assert len(brr2) == 4 def test_bytearray_type_object() -> None: b = bytearray() assert type(b) is bytearray def fb(b: bytes) -> str: return "xy" def test_bytearray_passed_into_bytes() -> None: brr1: Any = bytearray() with assertRaises(TypeError, "bytes object expected; got bytearray"): fb(brr1) with assertRaises(TypeError, "bytes object expected; got bytearray"): b: bytes = brr1 def fba(brr: bytearray) -> str: return "xy" def test_bytes_passed_into_bytearray() -> None: b: Any = b"foo" with assertRaises(TypeError, "bytearray object expected; got bytes"): fba(b) with assertRaises(TypeError, "bytearray object expected; got bytes"): brr: bytearray = b [case testBytearraySlicing] def test_bytearray_slicing() -> None: b = bytearray(b'abcdefg') zero = int() ten = 10 + zero two = 2 + zero five = 5 + zero seven = 7 + zero assert b[:ten] == b'abcdefg' assert b[0:seven] == b'abcdefg' assert b[two:five] == b'cde' assert b[two:two] == b'' assert b[-two:-two] == b'' assert b[-ten:(-ten+1)] == b'' assert b[:-two] == b'abcde' assert b[:two] == b'ab' assert b[:] == b'abcdefg' assert b[-two:] == b'fg' assert b[zero:] == b'abcdefg' assert b[:zero] == b'' assert b[-ten:] == b'abcdefg' assert b[-ten:ten] == b'abcdefg' big_ints = [1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, 2**24, 2**63] for big_int in big_ints: assert b[1:big_int] == b'bcdefg' assert b[big_int:] == b'' assert b[-big_int:-1] == b'abcdef' assert b[-big_int:big_int] == b'abcdefg' assert type(b[-big_int:-1]) == bytearray assert type(b[-ten:]) == bytearray assert type(b[:]) == bytearray [case testBytearrayIndexing] from testutil import assertRaises def test_bytearray_indexing() -> None: b = bytearray(b'\xae\x80\xfe\x15') assert b[0] == 174 assert b[1] == 128 assert b[2] == 254 assert b[3] == 21 assert b[-4] == 174 with assertRaises(IndexError, "index out of range"): b[4] with assertRaises(IndexError, "index out of range"): b[-5] b2 = bytearray([175, 255, 128, 22]) assert b2[0] == 175 assert b2[1] == 255 assert b2[-1] == 22 assert b2[2] == 128 with assertRaises(ValueError, "byte must be in range(0, 256)"): b2[0] = -1 with assertRaises(ValueError, "byte must be in range(0, 256)"): b2[0] = 256 [case testBytesJoin] from typing import Any from testutil import assertRaises from a import bytes_subclass def test_bytes_join() -> None: assert b' '.join([b'a', b'b']) == b'a b' assert b' '.join([]) == b'' y: bytes = bytes_subclass() assert y.join([]) == b'spook' n: Any = 5 with assertRaises(TypeError, "can only join an iterable"): assert b' '.join(n) [file a.py] class bytes_subclass(bytes): def join(self, iter): return b'spook' [case testBytesFormatting] from testutil import assertRaises # https://www.python.org/dev/peps/pep-0461/ def test_bytes_formatting() -> None: val = 10 assert b"%x" % val == b'a' assert b'%4x' % val == b' a' assert b'%#4x' % val == b' 0xa' assert b'%04X' % val == b'000A' assert b'%d' % val == b'10' assert b'%d' % (val + 2) == b'12' assert b'%d' % 0 == b'0' assert b'%d' % -3 == b'-3' assert b'folded: %d' % (4 - 2) == b'folded: 2' large_num = 2**65 assert b'number: %d' % large_num == b'number: 36893488147419103232' assert b'negative integer: %d' % (-large_num) == b'negative integer: -36893488147419103232' assert b'%c' % 48 == b'0' assert b'%c' % b'a' == b'a' assert b'%c%c' % (48, b'a') == b'0a' assert b'%b' % b'abc' == b'abc' assert b'%b' % 'some string'.encode('utf8') == b'some string' assert b'%a' % 3.14 == b'3.14' assert b'%a' % b'abc' == b"b'abc'" assert b'%a' % 'def' == b"'def'" def test_bytes_formatting_2() -> None: var = b'bb' num = 10 assert b'aaa%bbbb%s' % (var, var) == b'aaabbbbbbb' assert b'aaa%dbbb%b' % (num, var) == b'aaa10bbbbb' assert b'%s%b' % (var, var) == b'bbbb' assert b'%b' % bytes() == b'' assert b'%b' % b'' == b'' assert b'\xff%s' % b'\xff' == b'\xff\xff' assert b'\xff%b' % '你好'.encode() == b'\xff\xe4\xbd\xa0\xe5\xa5\xbd' aa = b'\xe4\xbd\xa0\xe5\xa5\xbd%b' % b'\xe4\xbd\xa0\xe5\xa5\xbd' assert aa == b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd' assert aa.decode() == '你好你好' [typing fixtures/typing-full.pyi] class A: def __bytes__(self): return b'aaa' def test_bytes_dunder() -> None: assert b'%b' % A() == b'aaa' assert b'%s' % A() == b'aaa' [case testIsInstance] from copysubclass import subbytes, subbytearray from typing import Any def test_bytes() -> None: b: Any = b'' assert isinstance(b, bytes) assert isinstance(b + b'123', bytes) assert isinstance(b + b'\xff', bytes) assert isinstance(subbytes(), bytes) assert isinstance(subbytes(b + b'123'), bytes) assert isinstance(subbytes(b + b'\xff'), bytes) assert not isinstance(set(), bytes) assert not isinstance((), bytes) assert not isinstance((b'1',b'2',b'3'), bytes) assert not isinstance({b'a',b'b'}, bytes) assert not isinstance(int() + 1, bytes) assert not isinstance(str() + 'a', bytes) def test_user_defined_bytes() -> None: from userdefinedbytes import bytes assert isinstance(bytes(), bytes) assert not isinstance(b'\x7f', bytes) def test_bytearray() -> None: assert isinstance(bytearray(), bytearray) assert isinstance(bytearray(b'123'), bytearray) assert isinstance(bytearray(b'\xff'), bytearray) assert isinstance(subbytearray(), bytearray) assert isinstance(subbytearray(bytearray(b'123')), bytearray) assert isinstance(subbytearray(bytearray(b'\xff')), bytearray) assert not isinstance(set(), bytearray) assert not isinstance((), bytearray) assert not isinstance((bytearray(b'1'),bytearray(b'2'),bytearray(b'3')), bytearray) assert not isinstance([bytearray(b'a'),bytearray(b'b')], bytearray) assert not isinstance(int() + 1, bytearray) assert not isinstance(str() + 'a', bytearray) [file copysubclass.py] class subbytes(bytes): pass class subbytearray(bytearray): pass [file userdefinedbytes.py] class bytes: pass [case testBytesOptionalEquality] from __future__ import annotations def eq_b_opt_b(x: bytes | None, y: bytes) -> bool: return x == y def ne_b_b_opt(x: bytes, y: bytes | None) -> bool: return x != y def test_optional_eq() -> None: b = b'x' assert eq_b_opt_b(b, b) assert eq_b_opt_b(b + bytes([int()]), b + bytes([int()])) assert not eq_b_opt_b(b'x', b'y') assert not eq_b_opt_b(b'y', b'x') assert not eq_b_opt_b(None, b'x') def test_optional_ne() -> None: b = b'x' assert not ne_b_b_opt(b, b) assert not ne_b_b_opt(b + b'y', b + bytes() + b'y') assert ne_b_b_opt(b'x', b'y') assert ne_b_b_opt(b'y', b'x') assert ne_b_b_opt(b'x', None)