1 """Unit tests for the bytes and bytearray types. 2 3 XXX This is a mess. Common tests should be unified with string_tests.py (and 4 the latter should be modernized). 5 """ 6 7 import array 8 import os 9 import re 10 import sys 11 import copy 12 import functools 13 import pickle 14 import tempfile 15 import unittest 16 17 import test.support 18 import test.string_tests 19 import test.list_tests 20 from test.support import bigaddrspacetest, MAX_Py_ssize_t 21 22 23 if sys.flags.bytes_warning: 24 def check_bytes_warnings(func): 25 @functools.wraps(func) 26 def wrapper(*args, **kw): 27 with test.support.check_warnings(('', BytesWarning)): 28 return func(*args, **kw) 29 return wrapper 30 else: 31 # no-op 32 def check_bytes_warnings(func): 33 return func 34 35 36 class Indexable: 37 def __init__(self, value=0): 38 self.value = value 39 def __index__(self): 40 return self.value 41 42 43 class BaseBytesTest: 44 45 def test_basics(self): 46 b = self.type2test() 47 self.assertEqual(type(b), self.type2test) 48 self.assertEqual(b.__class__, self.type2test) 49 50 def test_copy(self): 51 a = self.type2test(b"abcd") 52 for copy_method in (copy.copy, copy.deepcopy): 53 b = copy_method(a) 54 self.assertEqual(a, b) 55 self.assertEqual(type(a), type(b)) 56 57 def test_empty_sequence(self): 58 b = self.type2test() 59 self.assertEqual(len(b), 0) 60 self.assertRaises(IndexError, lambda: b[0]) 61 self.assertRaises(IndexError, lambda: b[1]) 62 self.assertRaises(IndexError, lambda: b[sys.maxsize]) 63 self.assertRaises(IndexError, lambda: b[sys.maxsize+1]) 64 self.assertRaises(IndexError, lambda: b[10**100]) 65 self.assertRaises(IndexError, lambda: b[-1]) 66 self.assertRaises(IndexError, lambda: b[-2]) 67 self.assertRaises(IndexError, lambda: b[-sys.maxsize]) 68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1]) 69 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2]) 70 self.assertRaises(IndexError, lambda: b[-10**100]) 71 72 def test_from_list(self): 73 ints = list(range(256)) 74 b = self.type2test(i for i in ints) 75 self.assertEqual(len(b), 256) 76 self.assertEqual(list(b), ints) 77 78 def test_from_index(self): 79 b = self.type2test([Indexable(), Indexable(1), Indexable(254), 80 Indexable(255)]) 81 self.assertEqual(list(b), [0, 1, 254, 255]) 82 self.assertRaises(ValueError, self.type2test, [Indexable(-1)]) 83 self.assertRaises(ValueError, self.type2test, [Indexable(256)]) 84 85 def test_from_buffer(self): 86 a = self.type2test(array.array('B', [1, 2, 3])) 87 self.assertEqual(a, b"\x01\x02\x03") 88 89 # http://bugs.python.org/issue29159 90 # Fallback when __index__ raises exception other than OverflowError 91 class B(bytes): 92 def __index__(self): 93 raise TypeError 94 95 self.assertEqual(self.type2test(B(b"foobar")), b"foobar") 96 97 def test_from_ssize(self): 98 self.assertEqual(self.type2test(0), b'') 99 self.assertEqual(self.type2test(1), b'\x00') 100 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00') 101 self.assertRaises(ValueError, self.type2test, -1) 102 103 self.assertEqual(self.type2test('0', 'ascii'), b'0') 104 self.assertEqual(self.type2test(b'0'), b'0') 105 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1) 106 107 def test_constructor_type_errors(self): 108 self.assertRaises(TypeError, self.type2test, 0.0) 109 class C: 110 pass 111 self.assertRaises(TypeError, self.type2test, ["0"]) 112 self.assertRaises(TypeError, self.type2test, [0.0]) 113 self.assertRaises(TypeError, self.type2test, [None]) 114 self.assertRaises(TypeError, self.type2test, [C()]) 115 self.assertRaises(TypeError, self.type2test, 0, 'ascii') 116 self.assertRaises(TypeError, self.type2test, b'', 'ascii') 117 self.assertRaises(TypeError, self.type2test, 0, errors='ignore') 118 self.assertRaises(TypeError, self.type2test, b'', errors='ignore') 119 self.assertRaises(TypeError, self.type2test, '') 120 self.assertRaises(TypeError, self.type2test, '', errors='ignore') 121 self.assertRaises(TypeError, self.type2test, '', b'ascii') 122 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore') 123 124 def test_constructor_value_errors(self): 125 self.assertRaises(ValueError, self.type2test, [-1]) 126 self.assertRaises(ValueError, self.type2test, [-sys.maxsize]) 127 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1]) 128 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2]) 129 self.assertRaises(ValueError, self.type2test, [-10**100]) 130 self.assertRaises(ValueError, self.type2test, [256]) 131 self.assertRaises(ValueError, self.type2test, [257]) 132 self.assertRaises(ValueError, self.type2test, [sys.maxsize]) 133 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1]) 134 self.assertRaises(ValueError, self.type2test, [10**100]) 135 136 @bigaddrspacetest 137 def test_constructor_overflow(self): 138 size = MAX_Py_ssize_t 139 self.assertRaises((OverflowError, MemoryError), self.type2test, size) 140 try: 141 # Should either pass or raise an error (e.g. on debug builds with 142 # additional malloc() overhead), but shouldn't crash. 143 bytearray(size - 4) 144 except (OverflowError, MemoryError): 145 pass 146 147 def test_compare(self): 148 b1 = self.type2test([1, 2, 3]) 149 b2 = self.type2test([1, 2, 3]) 150 b3 = self.type2test([1, 3]) 151 152 self.assertEqual(b1, b2) 153 self.assertTrue(b2 != b3) 154 self.assertTrue(b1 <= b2) 155 self.assertTrue(b1 <= b3) 156 self.assertTrue(b1 < b3) 157 self.assertTrue(b1 >= b2) 158 self.assertTrue(b3 >= b2) 159 self.assertTrue(b3 > b2) 160 161 self.assertFalse(b1 != b2) 162 self.assertFalse(b2 == b3) 163 self.assertFalse(b1 > b2) 164 self.assertFalse(b1 > b3) 165 self.assertFalse(b1 >= b3) 166 self.assertFalse(b1 < b2) 167 self.assertFalse(b3 < b2) 168 self.assertFalse(b3 <= b2) 169 170 @check_bytes_warnings 171 def test_compare_to_str(self): 172 # Byte comparisons with unicode should always fail! 173 # Test this for all expected byte orders and Unicode character 174 # sizes. 175 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False) 176 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", 177 False) 178 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False) 179 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", 180 False) 181 self.assertEqual(self.type2test() == str(), False) 182 self.assertEqual(self.type2test() != str(), True) 183 184 def test_reversed(self): 185 input = list(map(ord, "Hello")) 186 b = self.type2test(input) 187 output = list(reversed(b)) 188 input.reverse() 189 self.assertEqual(output, input) 190 191 def test_getslice(self): 192 def by(s): 193 return self.type2test(map(ord, s)) 194 b = by("Hello, world") 195 196 self.assertEqual(b[:5], by("Hello")) 197 self.assertEqual(b[1:5], by("ello")) 198 self.assertEqual(b[5:7], by(", ")) 199 self.assertEqual(b[7:], by("world")) 200 self.assertEqual(b[7:12], by("world")) 201 self.assertEqual(b[7:100], by("world")) 202 203 self.assertEqual(b[:-7], by("Hello")) 204 self.assertEqual(b[-11:-7], by("ello")) 205 self.assertEqual(b[-7:-5], by(", ")) 206 self.assertEqual(b[-5:], by("world")) 207 self.assertEqual(b[-5:12], by("world")) 208 self.assertEqual(b[-5:100], by("world")) 209 self.assertEqual(b[-100:5], by("Hello")) 210 211 def test_extended_getslice(self): 212 # Test extended slicing by comparing with list slicing. 213 L = list(range(255)) 214 b = self.type2test(L) 215 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100) 216 for start in indices: 217 for stop in indices: 218 # Skip step 0 (invalid) 219 for step in indices[1:]: 220 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step])) 221 222 def test_encoding(self): 223 sample = "Hello world\n\u1234\u5678\u9abc" 224 for enc in ("utf-8", "utf-16"): 225 b = self.type2test(sample, enc) 226 self.assertEqual(b, self.type2test(sample.encode(enc))) 227 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1") 228 b = self.type2test(sample, "latin-1", "ignore") 229 self.assertEqual(b, self.type2test(sample[:-3], "utf-8")) 230 231 def test_decode(self): 232 sample = "Hello world\n\u1234\u5678\u9abc" 233 for enc in ("utf-8", "utf-16"): 234 b = self.type2test(sample, enc) 235 self.assertEqual(b.decode(enc), sample) 236 sample = "Hello world\n\x80\x81\xfe\xff" 237 b = self.type2test(sample, "latin-1") 238 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8") 239 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n") 240 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"), 241 "Hello world\n") 242 # Default encoding is utf-8 243 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603') 244 245 def test_from_int(self): 246 b = self.type2test(0) 247 self.assertEqual(b, self.type2test()) 248 b = self.type2test(10) 249 self.assertEqual(b, self.type2test([0]*10)) 250 b = self.type2test(10000) 251 self.assertEqual(b, self.type2test([0]*10000)) 252 253 def test_concat(self): 254 b1 = self.type2test(b"abc") 255 b2 = self.type2test(b"def") 256 self.assertEqual(b1 + b2, b"abcdef") 257 self.assertEqual(b1 + bytes(b"def"), b"abcdef") 258 self.assertEqual(bytes(b"def") + b1, b"defabc") 259 self.assertRaises(TypeError, lambda: b1 + "def") 260 self.assertRaises(TypeError, lambda: "abc" + b2) 261 262 def test_repeat(self): 263 for b in b"abc", self.type2test(b"abc"): 264 self.assertEqual(b * 3, b"abcabcabc") 265 self.assertEqual(b * 0, b"") 266 self.assertEqual(b * -1, b"") 267 self.assertRaises(TypeError, lambda: b * 3.14) 268 self.assertRaises(TypeError, lambda: 3.14 * b) 269 # XXX Shouldn't bytes and bytearray agree on what to raise? 270 with self.assertRaises((OverflowError, MemoryError)): 271 c = b * sys.maxsize 272 with self.assertRaises((OverflowError, MemoryError)): 273 b *= sys.maxsize 274 275 def test_repeat_1char(self): 276 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100)) 277 278 def test_contains(self): 279 b = self.type2test(b"abc") 280 self.assertIn(ord('a'), b) 281 self.assertIn(int(ord('a')), b) 282 self.assertNotIn(200, b) 283 self.assertRaises(ValueError, lambda: 300 in b) 284 self.assertRaises(ValueError, lambda: -1 in b) 285 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b) 286 self.assertRaises(TypeError, lambda: None in b) 287 self.assertRaises(TypeError, lambda: float(ord('a')) in b) 288 self.assertRaises(TypeError, lambda: "a" in b) 289 for f in bytes, bytearray: 290 self.assertIn(f(b""), b) 291 self.assertIn(f(b"a"), b) 292 self.assertIn(f(b"b"), b) 293 self.assertIn(f(b"c"), b) 294 self.assertIn(f(b"ab"), b) 295 self.assertIn(f(b"bc"), b) 296 self.assertIn(f(b"abc"), b) 297 self.assertNotIn(f(b"ac"), b) 298 self.assertNotIn(f(b"d"), b) 299 self.assertNotIn(f(b"dab"), b) 300 self.assertNotIn(f(b"abd"), b) 301 302 def test_fromhex(self): 303 self.assertRaises(TypeError, self.type2test.fromhex) 304 self.assertRaises(TypeError, self.type2test.fromhex, 1) 305 self.assertEqual(self.type2test.fromhex(''), self.type2test()) 306 b = bytearray([0x1a, 0x2b, 0x30]) 307 self.assertEqual(self.type2test.fromhex('1a2B30'), b) 308 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b) 309 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0') 310 self.assertRaises(TypeError, self.type2test.fromhex, b'1B') 311 self.assertRaises(ValueError, self.type2test.fromhex, 'a') 312 self.assertRaises(ValueError, self.type2test.fromhex, 'rt') 313 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd') 314 self.assertRaises(ValueError, self.type2test.fromhex, '\x00') 315 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34') 316 317 for data, pos in ( 318 # invalid first hexadecimal character 319 ('12 x4 56', 3), 320 # invalid second hexadecimal character 321 ('12 3x 56', 4), 322 # two invalid hexadecimal characters 323 ('12 xy 56', 3), 324 # test non-ASCII string 325 ('12 3\xff 56', 4), 326 ): 327 with self.assertRaises(ValueError) as cm: 328 self.type2test.fromhex(data) 329 self.assertIn('at position %s' % pos, str(cm.exception)) 330 331 def test_hex(self): 332 self.assertRaises(TypeError, self.type2test.hex) 333 self.assertRaises(TypeError, self.type2test.hex, 1) 334 self.assertEqual(self.type2test(b"").hex(), "") 335 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30') 336 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30') 337 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30') 338 339 def test_join(self): 340 self.assertEqual(self.type2test(b"").join([]), b"") 341 self.assertEqual(self.type2test(b"").join([b""]), b"") 342 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]: 343 lst = list(map(self.type2test, lst)) 344 self.assertEqual(self.type2test(b"").join(lst), b"abc") 345 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc") 346 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc") 347 dot_join = self.type2test(b".:").join 348 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd") 349 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd") 350 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd") 351 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd") 352 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd") 353 # Stress it with many items 354 seq = [b"abc"] * 1000 355 expected = b"abc" + b".:abc" * 999 356 self.assertEqual(dot_join(seq), expected) 357 self.assertRaises(TypeError, self.type2test(b" ").join, None) 358 # Error handling and cleanup when some item in the middle of the 359 # sequence has the wrong type. 360 with self.assertRaises(TypeError): 361 dot_join([bytearray(b"ab"), "cd", b"ef"]) 362 with self.assertRaises(TypeError): 363 dot_join([memoryview(b"ab"), "cd", b"ef"]) 364 365 def test_count(self): 366 b = self.type2test(b'mississippi') 367 i = 105 368 p = 112 369 w = 119 370 371 self.assertEqual(b.count(b'i'), 4) 372 self.assertEqual(b.count(b'ss'), 2) 373 self.assertEqual(b.count(b'w'), 0) 374 375 self.assertEqual(b.count(i), 4) 376 self.assertEqual(b.count(w), 0) 377 378 self.assertEqual(b.count(b'i', 6), 2) 379 self.assertEqual(b.count(b'p', 6), 2) 380 self.assertEqual(b.count(b'i', 1, 3), 1) 381 self.assertEqual(b.count(b'p', 7, 9), 1) 382 383 self.assertEqual(b.count(i, 6), 2) 384 self.assertEqual(b.count(p, 6), 2) 385 self.assertEqual(b.count(i, 1, 3), 1) 386 self.assertEqual(b.count(p, 7, 9), 1) 387 388 def test_startswith(self): 389 b = self.type2test(b'hello') 390 self.assertFalse(self.type2test().startswith(b"anything")) 391 self.assertTrue(b.startswith(b"hello")) 392 self.assertTrue(b.startswith(b"hel")) 393 self.assertTrue(b.startswith(b"h")) 394 self.assertFalse(b.startswith(b"hellow")) 395 self.assertFalse(b.startswith(b"ha")) 396 with self.assertRaises(TypeError) as cm: 397 b.startswith([b'h']) 398 exc = str(cm.exception) 399 self.assertIn('bytes', exc) 400 self.assertIn('tuple', exc) 401 402 def test_endswith(self): 403 b = self.type2test(b'hello') 404 self.assertFalse(bytearray().endswith(b"anything")) 405 self.assertTrue(b.endswith(b"hello")) 406 self.assertTrue(b.endswith(b"llo")) 407 self.assertTrue(b.endswith(b"o")) 408 self.assertFalse(b.endswith(b"whello")) 409 self.assertFalse(b.endswith(b"no")) 410 with self.assertRaises(TypeError) as cm: 411 b.endswith([b'o']) 412 exc = str(cm.exception) 413 self.assertIn('bytes', exc) 414 self.assertIn('tuple', exc) 415 416 def test_find(self): 417 b = self.type2test(b'mississippi') 418 i = 105 419 w = 119 420 421 self.assertEqual(b.find(b'ss'), 2) 422 self.assertEqual(b.find(b'w'), -1) 423 self.assertEqual(b.find(b'mississippian'), -1) 424 425 self.assertEqual(b.find(i), 1) 426 self.assertEqual(b.find(w), -1) 427 428 self.assertEqual(b.find(b'ss', 3), 5) 429 self.assertEqual(b.find(b'ss', 1, 7), 2) 430 self.assertEqual(b.find(b'ss', 1, 3), -1) 431 432 self.assertEqual(b.find(i, 6), 7) 433 self.assertEqual(b.find(i, 1, 3), 1) 434 self.assertEqual(b.find(w, 1, 3), -1) 435 436 for index in (-1, 256, sys.maxsize + 1): 437 self.assertRaisesRegex( 438 ValueError, r'byte must be in range\(0, 256\)', 439 b.find, index) 440 441 def test_rfind(self): 442 b = self.type2test(b'mississippi') 443 i = 105 444 w = 119 445 446 self.assertEqual(b.rfind(b'ss'), 5) 447 self.assertEqual(b.rfind(b'w'), -1) 448 self.assertEqual(b.rfind(b'mississippian'), -1) 449 450 self.assertEqual(b.rfind(i), 10) 451 self.assertEqual(b.rfind(w), -1) 452 453 self.assertEqual(b.rfind(b'ss', 3), 5) 454 self.assertEqual(b.rfind(b'ss', 0, 6), 2) 455 456 self.assertEqual(b.rfind(i, 1, 3), 1) 457 self.assertEqual(b.rfind(i, 3, 9), 7) 458 self.assertEqual(b.rfind(w, 1, 3), -1) 459 460 def test_index(self): 461 b = self.type2test(b'mississippi') 462 i = 105 463 w = 119 464 465 self.assertEqual(b.index(b'ss'), 2) 466 self.assertRaises(ValueError, b.index, b'w') 467 self.assertRaises(ValueError, b.index, b'mississippian') 468 469 self.assertEqual(b.index(i), 1) 470 self.assertRaises(ValueError, b.index, w) 471 472 self.assertEqual(b.index(b'ss', 3), 5) 473 self.assertEqual(b.index(b'ss', 1, 7), 2) 474 self.assertRaises(ValueError, b.index, b'ss', 1, 3) 475 476 self.assertEqual(b.index(i, 6), 7) 477 self.assertEqual(b.index(i, 1, 3), 1) 478 self.assertRaises(ValueError, b.index, w, 1, 3) 479 480 def test_rindex(self): 481 b = self.type2test(b'mississippi') 482 i = 105 483 w = 119 484 485 self.assertEqual(b.rindex(b'ss'), 5) 486 self.assertRaises(ValueError, b.rindex, b'w') 487 self.assertRaises(ValueError, b.rindex, b'mississippian') 488 489 self.assertEqual(b.rindex(i), 10) 490 self.assertRaises(ValueError, b.rindex, w) 491 492 self.assertEqual(b.rindex(b'ss', 3), 5) 493 self.assertEqual(b.rindex(b'ss', 0, 6), 2) 494 495 self.assertEqual(b.rindex(i, 1, 3), 1) 496 self.assertEqual(b.rindex(i, 3, 9), 7) 497 self.assertRaises(ValueError, b.rindex, w, 1, 3) 498 499 def test_mod(self): 500 b = self.type2test(b'hello, %b!') 501 orig = b 502 b = b % b'world' 503 self.assertEqual(b, b'hello, world!') 504 self.assertEqual(orig, b'hello, %b!') 505 self.assertFalse(b is orig) 506 b = self.type2test(b'%s / 100 = %d%%') 507 a = b % (b'seventy-nine', 79) 508 self.assertEqual(a, b'seventy-nine / 100 = 79%') 509 self.assertIs(type(a), self.type2test) 510 511 def test_imod(self): 512 b = self.type2test(b'hello, %b!') 513 orig = b 514 b %= b'world' 515 self.assertEqual(b, b'hello, world!') 516 self.assertEqual(orig, b'hello, %b!') 517 self.assertFalse(b is orig) 518 b = self.type2test(b'%s / 100 = %d%%') 519 b %= (b'seventy-nine', 79) 520 self.assertEqual(b, b'seventy-nine / 100 = 79%') 521 self.assertIs(type(b), self.type2test) 522 523 def test_rmod(self): 524 with self.assertRaises(TypeError): 525 object() % self.type2test(b'abc') 526 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented) 527 528 def test_replace(self): 529 b = self.type2test(b'mississippi') 530 self.assertEqual(b.replace(b'i', b'a'), b'massassappa') 531 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi') 532 533 def test_split_string_error(self): 534 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ') 535 536 def test_split_unicodewhitespace(self): 537 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'): 538 b = self.type2test(b) 539 self.assertEqual(b.split(), [b]) 540 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") 541 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f']) 542 543 def test_rsplit_string_error(self): 544 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ') 545 546 def test_rsplit_unicodewhitespace(self): 547 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F") 548 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f']) 549 550 def test_partition(self): 551 b = self.type2test(b'mississippi') 552 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi')) 553 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b'')) 554 555 def test_rpartition(self): 556 b = self.type2test(b'mississippi') 557 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi')) 558 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b'')) 559 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi')) 560 561 def test_pickling(self): 562 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 563 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0": 564 b = self.type2test(b) 565 ps = pickle.dumps(b, proto) 566 q = pickle.loads(ps) 567 self.assertEqual(b, q) 568 569 def test_iterator_pickling(self): 570 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 571 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0": 572 it = itorg = iter(self.type2test(b)) 573 data = list(self.type2test(b)) 574 d = pickle.dumps(it, proto) 575 it = pickle.loads(d) 576 self.assertEqual(type(itorg), type(it)) 577 self.assertEqual(list(it), data) 578 579 it = pickle.loads(d) 580 if not b: 581 continue 582 next(it) 583 d = pickle.dumps(it, proto) 584 it = pickle.loads(d) 585 self.assertEqual(list(it), data[1:]) 586 587 def test_strip_bytearray(self): 588 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b') 589 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc') 590 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab') 591 592 def test_strip_string_error(self): 593 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b') 594 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b') 595 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b') 596 597 def test_center(self): 598 # Fill character can be either bytes or bytearray (issue 12380) 599 b = self.type2test(b'abc') 600 for fill_type in (bytes, bytearray): 601 self.assertEqual(b.center(7, fill_type(b'-')), 602 self.type2test(b'--abc--')) 603 604 def test_ljust(self): 605 # Fill character can be either bytes or bytearray (issue 12380) 606 b = self.type2test(b'abc') 607 for fill_type in (bytes, bytearray): 608 self.assertEqual(b.ljust(7, fill_type(b'-')), 609 self.type2test(b'abc----')) 610 611 def test_rjust(self): 612 # Fill character can be either bytes or bytearray (issue 12380) 613 b = self.type2test(b'abc') 614 for fill_type in (bytes, bytearray): 615 self.assertEqual(b.rjust(7, fill_type(b'-')), 616 self.type2test(b'----abc')) 617 618 def test_ord(self): 619 b = self.type2test(b'\0A\x7f\x80\xff') 620 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))], 621 [0, 65, 127, 128, 255]) 622 623 def test_maketrans(self): 624 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' 625 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable) 626 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' 627 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable) 628 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq') 629 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def') 630 631 def test_none_arguments(self): 632 # issue 11828 633 b = self.type2test(b'hello') 634 l = self.type2test(b'l') 635 h = self.type2test(b'h') 636 x = self.type2test(b'x') 637 o = self.type2test(b'o') 638 639 self.assertEqual(2, b.find(l, None)) 640 self.assertEqual(3, b.find(l, -2, None)) 641 self.assertEqual(2, b.find(l, None, -2)) 642 self.assertEqual(0, b.find(h, None, None)) 643 644 self.assertEqual(3, b.rfind(l, None)) 645 self.assertEqual(3, b.rfind(l, -2, None)) 646 self.assertEqual(2, b.rfind(l, None, -2)) 647 self.assertEqual(0, b.rfind(h, None, None)) 648 649 self.assertEqual(2, b.index(l, None)) 650 self.assertEqual(3, b.index(l, -2, None)) 651 self.assertEqual(2, b.index(l, None, -2)) 652 self.assertEqual(0, b.index(h, None, None)) 653 654 self.assertEqual(3, b.rindex(l, None)) 655 self.assertEqual(3, b.rindex(l, -2, None)) 656 self.assertEqual(2, b.rindex(l, None, -2)) 657 self.assertEqual(0, b.rindex(h, None, None)) 658 659 self.assertEqual(2, b.count(l, None)) 660 self.assertEqual(1, b.count(l, -2, None)) 661 self.assertEqual(1, b.count(l, None, -2)) 662 self.assertEqual(0, b.count(x, None, None)) 663 664 self.assertEqual(True, b.endswith(o, None)) 665 self.assertEqual(True, b.endswith(o, -2, None)) 666 self.assertEqual(True, b.endswith(l, None, -2)) 667 self.assertEqual(False, b.endswith(x, None, None)) 668 669 self.assertEqual(True, b.startswith(h, None)) 670 self.assertEqual(True, b.startswith(l, -2, None)) 671 self.assertEqual(True, b.startswith(h, None, -2)) 672 self.assertEqual(False, b.startswith(x, None, None)) 673 674 def test_integer_arguments_out_of_byte_range(self): 675 b = self.type2test(b'hello') 676 677 for method in (b.count, b.find, b.index, b.rfind, b.rindex): 678 self.assertRaises(ValueError, method, -1) 679 self.assertRaises(ValueError, method, 256) 680 self.assertRaises(ValueError, method, 9999) 681 682 def test_find_etc_raise_correct_error_messages(self): 683 # issue 11828 684 b = self.type2test(b'hello') 685 x = self.type2test(b'x') 686 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find, 687 x, None, None, None) 688 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind, 689 x, None, None, None) 690 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index, 691 x, None, None, None) 692 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex, 693 x, None, None, None) 694 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count, 695 x, None, None, None) 696 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith, 697 x, None, None, None) 698 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith, 699 x, None, None, None) 700 701 def test_free_after_iterating(self): 702 test.support.check_free_after_iterating(self, iter, self.type2test) 703 test.support.check_free_after_iterating(self, reversed, self.type2test) 704 705 def test_translate(self): 706 b = self.type2test(b'hello') 707 rosetta = bytearray(range(256)) 708 rosetta[ord('o')] = ord('e') 709 710 self.assertRaises(TypeError, b.translate) 711 self.assertRaises(TypeError, b.translate, None, None) 712 self.assertRaises(ValueError, b.translate, bytes(range(255))) 713 714 c = b.translate(rosetta, b'hello') 715 self.assertEqual(b, b'hello') 716 self.assertIsInstance(c, self.type2test) 717 718 c = b.translate(rosetta) 719 d = b.translate(rosetta, b'') 720 self.assertEqual(c, d) 721 self.assertEqual(c, b'helle') 722 723 c = b.translate(rosetta, b'l') 724 self.assertEqual(c, b'hee') 725 c = b.translate(None, b'e') 726 self.assertEqual(c, b'hllo') 727 728 # test delete as a keyword argument 729 c = b.translate(rosetta, delete=b'') 730 self.assertEqual(c, b'helle') 731 c = b.translate(rosetta, delete=b'l') 732 self.assertEqual(c, b'hee') 733 c = b.translate(None, delete=b'e') 734 self.assertEqual(c, b'hllo') 735 736 737 class BytesTest(BaseBytesTest, unittest.TestCase): 738 type2test = bytes 739 740 def test_getitem_error(self): 741 msg = "byte indices must be integers or slices" 742 with self.assertRaisesRegex(TypeError, msg): 743 b'python'['a'] 744 745 def test_buffer_is_readonly(self): 746 fd = os.open(__file__, os.O_RDONLY) 747 with open(fd, "rb", buffering=0) as f: 748 self.assertRaises(TypeError, f.readinto, b"") 749 750 def test_custom(self): 751 class A: 752 def __bytes__(self): 753 return b'abc' 754 self.assertEqual(bytes(A()), b'abc') 755 class A: pass 756 self.assertRaises(TypeError, bytes, A()) 757 class A: 758 def __bytes__(self): 759 return None 760 self.assertRaises(TypeError, bytes, A()) 761 class A: 762 def __bytes__(self): 763 return b'a' 764 def __index__(self): 765 return 42 766 self.assertEqual(bytes(A()), b'a') 767 # Issue #25766 768 class A(str): 769 def __bytes__(self): 770 return b'abc' 771 self.assertEqual(bytes(A('\u20ac')), b'abc') 772 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4') 773 # Issue #24731 774 class A: 775 def __bytes__(self): 776 return OtherBytesSubclass(b'abc') 777 self.assertEqual(bytes(A()), b'abc') 778 self.assertIs(type(bytes(A())), OtherBytesSubclass) 779 self.assertEqual(BytesSubclass(A()), b'abc') 780 self.assertIs(type(BytesSubclass(A())), BytesSubclass) 781 782 # Test PyBytes_FromFormat() 783 def test_from_format(self): 784 ctypes = test.support.import_module('ctypes') 785 _testcapi = test.support.import_module('_testcapi') 786 from ctypes import pythonapi, py_object 787 from ctypes import ( 788 c_int, c_uint, 789 c_long, c_ulong, 790 c_size_t, c_ssize_t, 791 c_char_p) 792 793 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat 794 PyBytes_FromFormat.restype = py_object 795 796 # basic tests 797 self.assertEqual(PyBytes_FromFormat(b'format'), 798 b'format') 799 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'), 800 b'Hello world !') 801 802 # test formatters 803 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)), 804 b'c=\0') 805 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))), 806 b'c=@') 807 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)), 808 b'c=\xff') 809 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd', 810 c_int(1), c_long(2), 811 c_size_t(3)), 812 b'd=1 ld=2 zd=3') 813 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd', 814 c_int(-1), c_long(-2), 815 c_size_t(-3)), 816 b'd=-1 ld=-2 zd=-3') 817 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu', 818 c_uint(123), c_ulong(456), 819 c_size_t(789)), 820 b'u=123 lu=456 zu=789') 821 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)), 822 b'i=123') 823 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)), 824 b'i=-123') 825 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)), 826 b'x=abc') 827 828 sizeof_ptr = ctypes.sizeof(c_char_p) 829 830 if os.name == 'nt': 831 # Windows (MSCRT) 832 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr) 833 def ptr_formatter(ptr): 834 return (ptr_format % ptr) 835 else: 836 # UNIX (glibc) 837 def ptr_formatter(ptr): 838 return '%#x' % ptr 839 840 ptr = 0xabcdef 841 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)), 842 ('ptr=' + ptr_formatter(ptr)).encode('ascii')) 843 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')), 844 b's=cstr') 845 846 # test minimum and maximum integer values 847 size_max = c_size_t(-1).value 848 for formatstr, ctypes_type, value, py_formatter in ( 849 (b'%d', c_int, _testcapi.INT_MIN, str), 850 (b'%d', c_int, _testcapi.INT_MAX, str), 851 (b'%ld', c_long, _testcapi.LONG_MIN, str), 852 (b'%ld', c_long, _testcapi.LONG_MAX, str), 853 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str), 854 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str), 855 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str), 856 (b'%zu', c_size_t, size_max, str), 857 (b'%p', c_char_p, size_max, ptr_formatter), 858 ): 859 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)), 860 py_formatter(value).encode('ascii')), 861 862 # width and precision (width is currently ignored) 863 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'), 864 b'a') 865 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'), 866 b'abc') 867 868 # '%%' formatter 869 self.assertEqual(PyBytes_FromFormat(b'%%'), 870 b'%') 871 self.assertEqual(PyBytes_FromFormat(b'[%%]'), 872 b'[%]') 873 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), 874 b'%_') 875 self.assertEqual(PyBytes_FromFormat(b'%%s'), 876 b'%s') 877 878 # Invalid formats and partial formatting 879 self.assertEqual(PyBytes_FromFormat(b'%'), b'%') 880 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)), 881 b'x=2 y=%') 882 883 # Issue #19969: %c must raise OverflowError for values 884 # not in the range [0; 255] 885 self.assertRaises(OverflowError, 886 PyBytes_FromFormat, b'%c', c_int(-1)) 887 self.assertRaises(OverflowError, 888 PyBytes_FromFormat, b'%c', c_int(256)) 889 890 def test_bytes_blocking(self): 891 class IterationBlocked(list): 892 __bytes__ = None 893 i = [0, 1, 2, 3] 894 self.assertEqual(bytes(i), b'\x00\x01\x02\x03') 895 self.assertRaises(TypeError, bytes, IterationBlocked(i)) 896 897 # At least in CPython, because bytes.__new__ and the C API 898 # PyBytes_FromObject have different fallback rules, integer 899 # fallback is handled specially, so test separately. 900 class IntBlocked(int): 901 __bytes__ = None 902 self.assertEqual(bytes(3), b'\0\0\0') 903 self.assertRaises(TypeError, bytes, IntBlocked(3)) 904 905 # While there is no separately-defined rule for handling bytes 906 # subclasses differently from other buffer-interface classes, 907 # an implementation may well special-case them (as CPython 2.x 908 # str did), so test them separately. 909 class BytesSubclassBlocked(bytes): 910 __bytes__ = None 911 self.assertEqual(bytes(b'ab'), b'ab') 912 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab')) 913 914 class BufferBlocked(bytearray): 915 __bytes__ = None 916 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab') 917 self.assertEqual(bytes(ba), b'ab') 918 self.assertRaises(TypeError, bytes, bb) 919 920 921 class ByteArrayTest(BaseBytesTest, unittest.TestCase): 922 type2test = bytearray 923 924 def test_getitem_error(self): 925 msg = "bytearray indices must be integers or slices" 926 with self.assertRaisesRegex(TypeError, msg): 927 bytearray(b'python')['a'] 928 929 def test_setitem_error(self): 930 msg = "bytearray indices must be integers or slices" 931 with self.assertRaisesRegex(TypeError, msg): 932 b = bytearray(b'python') 933 b['a'] = "python" 934 935 def test_nohash(self): 936 self.assertRaises(TypeError, hash, bytearray()) 937 938 def test_bytearray_api(self): 939 short_sample = b"Hello world\n" 940 sample = short_sample + b"\0"*(20 - len(short_sample)) 941 tfn = tempfile.mktemp() 942 try: 943 # Prepare 944 with open(tfn, "wb") as f: 945 f.write(short_sample) 946 # Test readinto 947 with open(tfn, "rb") as f: 948 b = bytearray(20) 949 n = f.readinto(b) 950 self.assertEqual(n, len(short_sample)) 951 self.assertEqual(list(b), list(sample)) 952 # Test writing in binary mode 953 with open(tfn, "wb") as f: 954 f.write(b) 955 with open(tfn, "rb") as f: 956 self.assertEqual(f.read(), sample) 957 # Text mode is ambiguous; don't test 958 finally: 959 try: 960 os.remove(tfn) 961 except OSError: 962 pass 963 964 def test_reverse(self): 965 b = bytearray(b'hello') 966 self.assertEqual(b.reverse(), None) 967 self.assertEqual(b, b'olleh') 968 b = bytearray(b'hello1') # test even number of items 969 b.reverse() 970 self.assertEqual(b, b'1olleh') 971 b = bytearray() 972 b.reverse() 973 self.assertFalse(b) 974 975 def test_clear(self): 976 b = bytearray(b'python') 977 b.clear() 978 self.assertEqual(b, b'') 979 980 b = bytearray(b'') 981 b.clear() 982 self.assertEqual(b, b'') 983 984 b = bytearray(b'') 985 b.append(ord('r')) 986 b.clear() 987 b.append(ord('p')) 988 self.assertEqual(b, b'p') 989 990 def test_copy(self): 991 b = bytearray(b'abc') 992 bb = b.copy() 993 self.assertEqual(bb, b'abc') 994 995 b = bytearray(b'') 996 bb = b.copy() 997 self.assertEqual(bb, b'') 998 999 # test that it's indeed a copy and not a reference 1000 b = bytearray(b'abc') 1001 bb = b.copy() 1002 self.assertEqual(b, bb) 1003 self.assertIsNot(b, bb) 1004 bb.append(ord('d')) 1005 self.assertEqual(bb, b'abcd') 1006 self.assertEqual(b, b'abc') 1007 1008 def test_regexps(self): 1009 def by(s): 1010 return bytearray(map(ord, s)) 1011 b = by("Hello, world") 1012 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")]) 1013 1014 def test_setitem(self): 1015 b = bytearray([1, 2, 3]) 1016 b[1] = 100 1017 self.assertEqual(b, bytearray([1, 100, 3])) 1018 b[-1] = 200 1019 self.assertEqual(b, bytearray([1, 100, 200])) 1020 b[0] = Indexable(10) 1021 self.assertEqual(b, bytearray([10, 100, 200])) 1022 try: 1023 b[3] = 0 1024 self.fail("Didn't raise IndexError") 1025 except IndexError: 1026 pass 1027 try: 1028 b[-10] = 0 1029 self.fail("Didn't raise IndexError") 1030 except IndexError: 1031 pass 1032 try: 1033 b[0] = 256 1034 self.fail("Didn't raise ValueError") 1035 except ValueError: 1036 pass 1037 try: 1038 b[0] = Indexable(-1) 1039 self.fail("Didn't raise ValueError") 1040 except ValueError: 1041 pass 1042 try: 1043 b[0] = None 1044 self.fail("Didn't raise TypeError") 1045 except TypeError: 1046 pass 1047 1048 def test_delitem(self): 1049 b = bytearray(range(10)) 1050 del b[0] 1051 self.assertEqual(b, bytearray(range(1, 10))) 1052 del b[-1] 1053 self.assertEqual(b, bytearray(range(1, 9))) 1054 del b[4] 1055 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8])) 1056 1057 def test_setslice(self): 1058 b = bytearray(range(10)) 1059 self.assertEqual(list(b), list(range(10))) 1060 1061 b[0:5] = bytearray([1, 1, 1, 1, 1]) 1062 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9])) 1063 1064 del b[0:-5] 1065 self.assertEqual(b, bytearray([5, 6, 7, 8, 9])) 1066 1067 b[0:0] = bytearray([0, 1, 2, 3, 4]) 1068 self.assertEqual(b, bytearray(range(10))) 1069 1070 b[-7:-3] = bytearray([100, 101]) 1071 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9])) 1072 1073 b[3:5] = [3, 4, 5, 6] 1074 self.assertEqual(b, bytearray(range(10))) 1075 1076 b[3:0] = [42, 42, 42] 1077 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9])) 1078 1079 b[3:] = b'foo' 1080 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111])) 1081 1082 b[:3] = memoryview(b'foo') 1083 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111])) 1084 1085 b[3:4] = [] 1086 self.assertEqual(b, bytearray([102, 111, 111, 111, 111])) 1087 1088 for elem in [5, -5, 0, int(10e20), 'str', 2.3, 1089 ['a', 'b'], [b'a', b'b'], [[]]]: 1090 with self.assertRaises(TypeError): 1091 b[3:4] = elem 1092 1093 for elem in [[254, 255, 256], [-256, 9000]]: 1094 with self.assertRaises(ValueError): 1095 b[3:4] = elem 1096 1097 def test_setslice_extend(self): 1098 # Exercise the resizing logic (see issue #19087) 1099 b = bytearray(range(100)) 1100 self.assertEqual(list(b), list(range(100))) 1101 del b[:10] 1102 self.assertEqual(list(b), list(range(10, 100))) 1103 b.extend(range(100, 110)) 1104 self.assertEqual(list(b), list(range(10, 110))) 1105 1106 def test_fifo_overrun(self): 1107 # Test for issue #23985, a buffer overrun when implementing a FIFO 1108 # Build Python in pydebug mode for best results. 1109 b = bytearray(10) 1110 b.pop() # Defeat expanding buffer off-by-one quirk 1111 del b[:1] # Advance start pointer without reallocating 1112 b += bytes(2) # Append exactly the number of deleted bytes 1113 del b # Free memory buffer, allowing pydebug verification 1114 1115 def test_del_expand(self): 1116 # Reducing the size should not expand the buffer (issue #23985) 1117 b = bytearray(10) 1118 size = sys.getsizeof(b) 1119 del b[:1] 1120 self.assertLessEqual(sys.getsizeof(b), size) 1121 1122 def test_extended_set_del_slice(self): 1123 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300) 1124 for start in indices: 1125 for stop in indices: 1126 # Skip invalid step 0 1127 for step in indices[1:]: 1128 L = list(range(255)) 1129 b = bytearray(L) 1130 # Make sure we have a slice of exactly the right length, 1131 # but with different data. 1132 data = L[start:stop:step] 1133 data.reverse() 1134 L[start:stop:step] = data 1135 b[start:stop:step] = data 1136 self.assertEqual(b, bytearray(L)) 1137 1138 del L[start:stop:step] 1139 del b[start:stop:step] 1140 self.assertEqual(b, bytearray(L)) 1141 1142 def test_setslice_trap(self): 1143 # This test verifies that we correctly handle assigning self 1144 # to a slice of self (the old Lambert Meertens trap). 1145 b = bytearray(range(256)) 1146 b[8:] = b 1147 self.assertEqual(b, bytearray(list(range(8)) + list(range(256)))) 1148 1149 def test_iconcat(self): 1150 b = bytearray(b"abc") 1151 b1 = b 1152 b += b"def" 1153 self.assertEqual(b, b"abcdef") 1154 self.assertEqual(b, b1) 1155 self.assertTrue(b is b1) 1156 b += b"xyz" 1157 self.assertEqual(b, b"abcdefxyz") 1158 try: 1159 b += "" 1160 except TypeError: 1161 pass 1162 else: 1163 self.fail("bytes += unicode didn't raise TypeError") 1164 1165 def test_irepeat(self): 1166 b = bytearray(b"abc") 1167 b1 = b 1168 b *= 3 1169 self.assertEqual(b, b"abcabcabc") 1170 self.assertEqual(b, b1) 1171 self.assertTrue(b is b1) 1172 1173 def test_irepeat_1char(self): 1174 b = bytearray(b"x") 1175 b1 = b 1176 b *= 100 1177 self.assertEqual(b, b"x"*100) 1178 self.assertEqual(b, b1) 1179 self.assertTrue(b is b1) 1180 1181 def test_alloc(self): 1182 b = bytearray() 1183 alloc = b.__alloc__() 1184 self.assertTrue(alloc >= 0) 1185 seq = [alloc] 1186 for i in range(100): 1187 b += b"x" 1188 alloc = b.__alloc__() 1189 self.assertGreater(alloc, len(b)) # including trailing null byte 1190 if alloc not in seq: 1191 seq.append(alloc) 1192 1193 def test_init_alloc(self): 1194 b = bytearray() 1195 def g(): 1196 for i in range(1, 100): 1197 yield i 1198 a = list(b) 1199 self.assertEqual(a, list(range(1, len(a)+1))) 1200 self.assertEqual(len(b), len(a)) 1201 self.assertLessEqual(len(b), i) 1202 alloc = b.__alloc__() 1203 self.assertGreater(alloc, len(b)) # including trailing null byte 1204 b.__init__(g()) 1205 self.assertEqual(list(b), list(range(1, 100))) 1206 self.assertEqual(len(b), 99) 1207 alloc = b.__alloc__() 1208 self.assertGreater(alloc, len(b)) 1209 1210 def test_extend(self): 1211 orig = b'hello' 1212 a = bytearray(orig) 1213 a.extend(a) 1214 self.assertEqual(a, orig + orig) 1215 self.assertEqual(a[5:], orig) 1216 a = bytearray(b'') 1217 # Test iterators that don't have a __length_hint__ 1218 a.extend(map(int, orig * 25)) 1219 a.extend(int(x) for x in orig * 25) 1220 self.assertEqual(a, orig * 50) 1221 self.assertEqual(a[-5:], orig) 1222 a = bytearray(b'') 1223 a.extend(iter(map(int, orig * 50))) 1224 self.assertEqual(a, orig * 50) 1225 self.assertEqual(a[-5:], orig) 1226 a = bytearray(b'') 1227 a.extend(list(map(int, orig * 50))) 1228 self.assertEqual(a, orig * 50) 1229 self.assertEqual(a[-5:], orig) 1230 a = bytearray(b'') 1231 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256]) 1232 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1]) 1233 self.assertEqual(len(a), 0) 1234 a = bytearray(b'') 1235 a.extend([Indexable(ord('a'))]) 1236 self.assertEqual(a, b'a') 1237 1238 def test_remove(self): 1239 b = bytearray(b'hello') 1240 b.remove(ord('l')) 1241 self.assertEqual(b, b'helo') 1242 b.remove(ord('l')) 1243 self.assertEqual(b, b'heo') 1244 self.assertRaises(ValueError, lambda: b.remove(ord('l'))) 1245 self.assertRaises(ValueError, lambda: b.remove(400)) 1246 self.assertRaises(TypeError, lambda: b.remove('e')) 1247 # remove first and last 1248 b.remove(ord('o')) 1249 b.remove(ord('h')) 1250 self.assertEqual(b, b'e') 1251 self.assertRaises(TypeError, lambda: b.remove(b'e')) 1252 b.remove(Indexable(ord('e'))) 1253 self.assertEqual(b, b'') 1254 1255 # test values outside of the ascii range: (0, 127) 1256 c = bytearray([126, 127, 128, 129]) 1257 c.remove(127) 1258 self.assertEqual(c, bytes([126, 128, 129])) 1259 c.remove(129) 1260 self.assertEqual(c, bytes([126, 128])) 1261 1262 def test_pop(self): 1263 b = bytearray(b'world') 1264 self.assertEqual(b.pop(), ord('d')) 1265 self.assertEqual(b.pop(0), ord('w')) 1266 self.assertEqual(b.pop(-2), ord('r')) 1267 self.assertRaises(IndexError, lambda: b.pop(10)) 1268 self.assertRaises(IndexError, lambda: bytearray().pop()) 1269 # test for issue #6846 1270 self.assertEqual(bytearray(b'\xff').pop(), 0xff) 1271 1272 def test_nosort(self): 1273 self.assertRaises(AttributeError, lambda: bytearray().sort()) 1274 1275 def test_append(self): 1276 b = bytearray(b'hell') 1277 b.append(ord('o')) 1278 self.assertEqual(b, b'hello') 1279 self.assertEqual(b.append(100), None) 1280 b = bytearray() 1281 b.append(ord('A')) 1282 self.assertEqual(len(b), 1) 1283 self.assertRaises(TypeError, lambda: b.append(b'o')) 1284 b = bytearray() 1285 b.append(Indexable(ord('A'))) 1286 self.assertEqual(b, b'A') 1287 1288 def test_insert(self): 1289 b = bytearray(b'msssspp') 1290 b.insert(1, ord('i')) 1291 b.insert(4, ord('i')) 1292 b.insert(-2, ord('i')) 1293 b.insert(1000, ord('i')) 1294 self.assertEqual(b, b'mississippi') 1295 self.assertRaises(TypeError, lambda: b.insert(0, b'1')) 1296 b = bytearray() 1297 b.insert(0, Indexable(ord('A'))) 1298 self.assertEqual(b, b'A') 1299 1300 def test_copied(self): 1301 # Issue 4348. Make sure that operations that don't mutate the array 1302 # copy the bytes. 1303 b = bytearray(b'abc') 1304 self.assertFalse(b is b.replace(b'abc', b'cde', 0)) 1305 1306 t = bytearray([i for i in range(256)]) 1307 x = bytearray(b'') 1308 self.assertFalse(x is x.translate(t)) 1309 1310 def test_partition_bytearray_doesnt_share_nullstring(self): 1311 a, b, c = bytearray(b"x").partition(b"y") 1312 self.assertEqual(b, b"") 1313 self.assertEqual(c, b"") 1314 self.assertTrue(b is not c) 1315 b += b"!" 1316 self.assertEqual(c, b"") 1317 a, b, c = bytearray(b"x").partition(b"y") 1318 self.assertEqual(b, b"") 1319 self.assertEqual(c, b"") 1320 # Same for rpartition 1321 b, c, a = bytearray(b"x").rpartition(b"y") 1322 self.assertEqual(b, b"") 1323 self.assertEqual(c, b"") 1324 self.assertTrue(b is not c) 1325 b += b"!" 1326 self.assertEqual(c, b"") 1327 c, b, a = bytearray(b"x").rpartition(b"y") 1328 self.assertEqual(b, b"") 1329 self.assertEqual(c, b"") 1330 1331 def test_resize_forbidden(self): 1332 # #4509: can't resize a bytearray when there are buffer exports, even 1333 # if it wouldn't reallocate the underlying buffer. 1334 # Furthermore, no destructive changes to the buffer may be applied 1335 # before raising the error. 1336 b = bytearray(range(10)) 1337 v = memoryview(b) 1338 def resize(n): 1339 b[1:-1] = range(n + 1, 2*n - 1) 1340 resize(10) 1341 orig = b[:] 1342 self.assertRaises(BufferError, resize, 11) 1343 self.assertEqual(b, orig) 1344 self.assertRaises(BufferError, resize, 9) 1345 self.assertEqual(b, orig) 1346 self.assertRaises(BufferError, resize, 0) 1347 self.assertEqual(b, orig) 1348 # Other operations implying resize 1349 self.assertRaises(BufferError, b.pop, 0) 1350 self.assertEqual(b, orig) 1351 self.assertRaises(BufferError, b.remove, b[1]) 1352 self.assertEqual(b, orig) 1353 def delitem(): 1354 del b[1] 1355 self.assertRaises(BufferError, delitem) 1356 self.assertEqual(b, orig) 1357 # deleting a non-contiguous slice 1358 def delslice(): 1359 b[1:-1:2] = b"" 1360 self.assertRaises(BufferError, delslice) 1361 self.assertEqual(b, orig) 1362 1363 @test.support.cpython_only 1364 def test_obsolete_write_lock(self): 1365 from _testcapi import getbuffer_with_null_view 1366 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray()) 1367 1368 def test_iterator_pickling2(self): 1369 orig = bytearray(b'abc') 1370 data = list(b'qwerty') 1371 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 1372 # initial iterator 1373 itorig = iter(orig) 1374 d = pickle.dumps((itorig, orig), proto) 1375 it, b = pickle.loads(d) 1376 b[:] = data 1377 self.assertEqual(type(it), type(itorig)) 1378 self.assertEqual(list(it), data) 1379 1380 # running iterator 1381 next(itorig) 1382 d = pickle.dumps((itorig, orig), proto) 1383 it, b = pickle.loads(d) 1384 b[:] = data 1385 self.assertEqual(type(it), type(itorig)) 1386 self.assertEqual(list(it), data[1:]) 1387 1388 # empty iterator 1389 for i in range(1, len(orig)): 1390 next(itorig) 1391 d = pickle.dumps((itorig, orig), proto) 1392 it, b = pickle.loads(d) 1393 b[:] = data 1394 self.assertEqual(type(it), type(itorig)) 1395 self.assertEqual(list(it), data[len(orig):]) 1396 1397 # exhausted iterator 1398 self.assertRaises(StopIteration, next, itorig) 1399 d = pickle.dumps((itorig, orig), proto) 1400 it, b = pickle.loads(d) 1401 b[:] = data 1402 self.assertEqual(list(it), []) 1403 1404 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator 1405 1406 def test_iterator_length_hint(self): 1407 # Issue 27443: __length_hint__ can return negative integer 1408 ba = bytearray(b'ab') 1409 it = iter(ba) 1410 next(it) 1411 ba.clear() 1412 # Shouldn't raise an error 1413 self.assertEqual(list(it), []) 1414 1415 1416 class AssortedBytesTest(unittest.TestCase): 1417 # 1418 # Test various combinations of bytes and bytearray 1419 # 1420 1421 @check_bytes_warnings 1422 def test_repr_str(self): 1423 for f in str, repr: 1424 self.assertEqual(f(bytearray()), "bytearray(b'')") 1425 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')") 1426 self.assertEqual(f(bytearray([0, 1, 254, 255])), 1427 "bytearray(b'\\x00\\x01\\xfe\\xff')") 1428 self.assertEqual(f(b"abc"), "b'abc'") 1429 self.assertEqual(f(b"'"), '''b"'"''') # ''' 1430 self.assertEqual(f(b"'\""), r"""b'\'"'""") # ' 1431 1432 @check_bytes_warnings 1433 def test_format(self): 1434 for b in b'abc', bytearray(b'abc'): 1435 self.assertEqual(format(b), str(b)) 1436 self.assertEqual(format(b, ''), str(b)) 1437 with self.assertRaisesRegex(TypeError, 1438 r'\b%s\b' % re.escape(type(b).__name__)): 1439 format(b, 's') 1440 1441 def test_compare_bytes_to_bytearray(self): 1442 self.assertEqual(b"abc" == bytes(b"abc"), True) 1443 self.assertEqual(b"ab" != bytes(b"abc"), True) 1444 self.assertEqual(b"ab" <= bytes(b"abc"), True) 1445 self.assertEqual(b"ab" < bytes(b"abc"), True) 1446 self.assertEqual(b"abc" >= bytes(b"ab"), True) 1447 self.assertEqual(b"abc" > bytes(b"ab"), True) 1448 1449 self.assertEqual(b"abc" != bytes(b"abc"), False) 1450 self.assertEqual(b"ab" == bytes(b"abc"), False) 1451 self.assertEqual(b"ab" > bytes(b"abc"), False) 1452 self.assertEqual(b"ab" >= bytes(b"abc"), False) 1453 self.assertEqual(b"abc" < bytes(b"ab"), False) 1454 self.assertEqual(b"abc" <= bytes(b"ab"), False) 1455 1456 self.assertEqual(bytes(b"abc") == b"abc", True) 1457 self.assertEqual(bytes(b"ab") != b"abc", True) 1458 self.assertEqual(bytes(b"ab") <= b"abc", True) 1459 self.assertEqual(bytes(b"ab") < b"abc", True) 1460 self.assertEqual(bytes(b"abc") >= b"ab", True) 1461 self.assertEqual(bytes(b"abc") > b"ab", True) 1462 1463 self.assertEqual(bytes(b"abc") != b"abc", False) 1464 self.assertEqual(bytes(b"ab") == b"abc", False) 1465 self.assertEqual(bytes(b"ab") > b"abc", False) 1466 self.assertEqual(bytes(b"ab") >= b"abc", False) 1467 self.assertEqual(bytes(b"abc") < b"ab", False) 1468 self.assertEqual(bytes(b"abc") <= b"ab", False) 1469 1470 @test.support.requires_docstrings 1471 def test_doc(self): 1472 self.assertIsNotNone(bytearray.__doc__) 1473 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__) 1474 self.assertIsNotNone(bytes.__doc__) 1475 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__) 1476 1477 def test_from_bytearray(self): 1478 sample = bytes(b"Hello world\n\x80\x81\xfe\xff") 1479 buf = memoryview(sample) 1480 b = bytearray(buf) 1481 self.assertEqual(b, bytearray(sample)) 1482 1483 @check_bytes_warnings 1484 def test_to_str(self): 1485 self.assertEqual(str(b''), "b''") 1486 self.assertEqual(str(b'x'), "b'x'") 1487 self.assertEqual(str(b'\x80'), "b'\\x80'") 1488 self.assertEqual(str(bytearray(b'')), "bytearray(b'')") 1489 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')") 1490 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')") 1491 1492 def test_literal(self): 1493 tests = [ 1494 (b"Wonderful spam", "Wonderful spam"), 1495 (br"Wonderful spam too", "Wonderful spam too"), 1496 (b"\xaa\x00\000\200", "\xaa\x00\000\200"), 1497 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"), 1498 ] 1499 for b, s in tests: 1500 self.assertEqual(b, bytearray(s, 'latin-1')) 1501 for c in range(128, 256): 1502 self.assertRaises(SyntaxError, eval, 1503 'b"%s"' % chr(c)) 1504 1505 def test_split_bytearray(self): 1506 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b']) 1507 1508 def test_rsplit_bytearray(self): 1509 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b']) 1510 1511 def test_return_self(self): 1512 # bytearray.replace must always return a new bytearray 1513 b = bytearray() 1514 self.assertFalse(b.replace(b'', b'') is b) 1515 1516 @unittest.skipUnless(sys.flags.bytes_warning, 1517 "BytesWarning is needed for this test: use -bb option") 1518 def test_compare(self): 1519 def bytes_warning(): 1520 return test.support.check_warnings(('', BytesWarning)) 1521 with bytes_warning(): 1522 b'' == '' 1523 with bytes_warning(): 1524 '' == b'' 1525 with bytes_warning(): 1526 b'' != '' 1527 with bytes_warning(): 1528 '' != b'' 1529 with bytes_warning(): 1530 bytearray(b'') == '' 1531 with bytes_warning(): 1532 '' == bytearray(b'') 1533 with bytes_warning(): 1534 bytearray(b'') != '' 1535 with bytes_warning(): 1536 '' != bytearray(b'') 1537 with bytes_warning(): 1538 b'\0' == 0 1539 with bytes_warning(): 1540 0 == b'\0' 1541 with bytes_warning(): 1542 b'\0' != 0 1543 with bytes_warning(): 1544 0 != b'\0' 1545 1546 # Optimizations: 1547 # __iter__? (optimization) 1548 # __reversed__? (optimization) 1549 1550 # XXX More string methods? (Those that don't use character properties) 1551 1552 # There are tests in string_tests.py that are more 1553 # comprehensive for things like partition, etc. 1554 # Unfortunately they are all bundled with tests that 1555 # are not appropriate for bytes 1556 1557 # I've started porting some of those into bytearray_tests.py, we should port 1558 # the rest that make sense (the code can be cleaned up to use modern 1559 # unittest methods at the same time). 1560 1561 class BytearrayPEP3137Test(unittest.TestCase): 1562 def marshal(self, x): 1563 return bytearray(x) 1564 1565 def test_returns_new_copy(self): 1566 val = self.marshal(b'1234') 1567 # On immutable types these MAY return a reference to themselves 1568 # but on mutable types like bytearray they MUST return a new copy. 1569 for methname in ('zfill', 'rjust', 'ljust', 'center'): 1570 method = getattr(val, methname) 1571 newval = method(3) 1572 self.assertEqual(val, newval) 1573 self.assertTrue(val is not newval, 1574 methname+' returned self on a mutable object') 1575 for expr in ('val.split()[0]', 'val.rsplit()[0]', 1576 'val.partition(b".")[0]', 'val.rpartition(b".")[2]', 1577 'val.splitlines()[0]', 'val.replace(b"", b"")'): 1578 newval = eval(expr) 1579 self.assertEqual(val, newval) 1580 self.assertTrue(val is not newval, 1581 expr+' returned val on a mutable object') 1582 sep = self.marshal(b'') 1583 newval = sep.join([val]) 1584 self.assertEqual(val, newval) 1585 self.assertIsNot(val, newval) 1586 1587 1588 class FixedStringTest(test.string_tests.BaseTest): 1589 def fixtype(self, obj): 1590 if isinstance(obj, str): 1591 return self.type2test(obj.encode("utf-8")) 1592 return super().fixtype(obj) 1593 1594 contains_bytes = True 1595 1596 class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase): 1597 type2test = bytearray 1598 1599 class BytesAsStringTest(FixedStringTest, unittest.TestCase): 1600 type2test = bytes 1601 1602 1603 class SubclassTest: 1604 1605 def test_basic(self): 1606 self.assertTrue(issubclass(self.type2test, self.basetype)) 1607 self.assertIsInstance(self.type2test(), self.basetype) 1608 1609 a, b = b"abcd", b"efgh" 1610 _a, _b = self.type2test(a), self.type2test(b) 1611 1612 # test comparison operators with subclass instances 1613 self.assertTrue(_a == _a) 1614 self.assertTrue(_a != _b) 1615 self.assertTrue(_a < _b) 1616 self.assertTrue(_a <= _b) 1617 self.assertTrue(_b >= _a) 1618 self.assertTrue(_b > _a) 1619 self.assertTrue(_a is not a) 1620 1621 # test concat of subclass instances 1622 self.assertEqual(a + b, _a + _b) 1623 self.assertEqual(a + b, a + _b) 1624 self.assertEqual(a + b, _a + b) 1625 1626 # test repeat 1627 self.assertTrue(a*5 == _a*5) 1628 1629 def test_join(self): 1630 # Make sure join returns a NEW object for single item sequences 1631 # involving a subclass. 1632 # Make sure that it is of the appropriate type. 1633 s1 = self.type2test(b"abcd") 1634 s2 = self.basetype().join([s1]) 1635 self.assertTrue(s1 is not s2) 1636 self.assertTrue(type(s2) is self.basetype, type(s2)) 1637 1638 # Test reverse, calling join on subclass 1639 s3 = s1.join([b"abcd"]) 1640 self.assertTrue(type(s3) is self.basetype) 1641 1642 def test_pickle(self): 1643 a = self.type2test(b"abcd") 1644 a.x = 10 1645 a.y = self.type2test(b"efgh") 1646 for proto in range(pickle.HIGHEST_PROTOCOL + 1): 1647 b = pickle.loads(pickle.dumps(a, proto)) 1648 self.assertNotEqual(id(a), id(b)) 1649 self.assertEqual(a, b) 1650 self.assertEqual(a.x, b.x) 1651 self.assertEqual(a.y, b.y) 1652 self.assertEqual(type(a), type(b)) 1653 self.assertEqual(type(a.y), type(b.y)) 1654 1655 def test_copy(self): 1656 a = self.type2test(b"abcd") 1657 a.x = 10 1658 a.y = self.type2test(b"efgh") 1659 for copy_method in (copy.copy, copy.deepcopy): 1660 b = copy_method(a) 1661 self.assertNotEqual(id(a), id(b)) 1662 self.assertEqual(a, b) 1663 self.assertEqual(a.x, b.x) 1664 self.assertEqual(a.y, b.y) 1665 self.assertEqual(type(a), type(b)) 1666 self.assertEqual(type(a.y), type(b.y)) 1667 1668 def test_fromhex(self): 1669 b = self.type2test.fromhex('1a2B30') 1670 self.assertEqual(b, b'\x1a\x2b\x30') 1671 self.assertIs(type(b), self.type2test) 1672 1673 class B1(self.basetype): 1674 def __new__(cls, value): 1675 me = self.basetype.__new__(cls, value) 1676 me.foo = 'bar' 1677 return me 1678 1679 b = B1.fromhex('1a2B30') 1680 self.assertEqual(b, b'\x1a\x2b\x30') 1681 self.assertIs(type(b), B1) 1682 self.assertEqual(b.foo, 'bar') 1683 1684 class B2(self.basetype): 1685 def __init__(me, *args, **kwargs): 1686 if self.basetype is not bytes: 1687 self.basetype.__init__(me, *args, **kwargs) 1688 me.foo = 'bar' 1689 1690 b = B2.fromhex('1a2B30') 1691 self.assertEqual(b, b'\x1a\x2b\x30') 1692 self.assertIs(type(b), B2) 1693 self.assertEqual(b.foo, 'bar') 1694 1695 1696 class ByteArraySubclass(bytearray): 1697 pass 1698 1699 class BytesSubclass(bytes): 1700 pass 1701 1702 class OtherBytesSubclass(bytes): 1703 pass 1704 1705 class ByteArraySubclassTest(SubclassTest, unittest.TestCase): 1706 basetype = bytearray 1707 type2test = ByteArraySubclass 1708 1709 def test_init_override(self): 1710 class subclass(bytearray): 1711 def __init__(me, newarg=1, *args, **kwargs): 1712 bytearray.__init__(me, *args, **kwargs) 1713 x = subclass(4, b"abcd") 1714 x = subclass(4, source=b"abcd") 1715 self.assertEqual(x, b"abcd") 1716 x = subclass(newarg=4, source=b"abcd") 1717 self.assertEqual(x, b"abcd") 1718 1719 1720 class BytesSubclassTest(SubclassTest, unittest.TestCase): 1721 basetype = bytes 1722 type2test = BytesSubclass 1723 1724 1725 if __name__ == "__main__": 1726 unittest.main() 1727