blob: 13ad238242d0c545566073e6cb85adc0062e6864 [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
Martin Panter152a19c2016-04-06 06:37:17 +00003XXX This is a mess. Common tests should be unified with string_tests.py (and
4the latter should be modernized).
Guido van Rossum98297ee2007-11-06 21:34:58 +00005"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00006
INADA Naokia634e232017-01-06 17:32:01 +09007import array
Guido van Rossumd624f182006-04-24 13:47:05 +00008import os
9import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000010import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000011import copy
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000012import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000013import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000014import tempfile
Victor Stinner22eb6892019-06-26 00:51:05 +020015import textwrap
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000016import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010017
Benjamin Petersonee8712c2008-05-20 21:35:26 +000018import test.support
Hai Shia089d212020-07-06 17:15:08 +080019from test.support import import_helper
Hai Shifcce8c62020-08-08 05:55:35 +080020from test.support import warnings_helper
Georg Brandlc7885542007-03-06 19:16:20 +000021import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030022import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010023from test.support import bigaddrspacetest, MAX_Py_ssize_t
Victor Stinner22eb6892019-06-26 00:51:05 +020024from test.support.script_helper import assert_python_failure
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000025
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000026
27if sys.flags.bytes_warning:
28 def check_bytes_warnings(func):
29 @functools.wraps(func)
30 def wrapper(*args, **kw):
Hai Shifcce8c62020-08-08 05:55:35 +080031 with warnings_helper.check_warnings(('', BytesWarning)):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000032 return func(*args, **kw)
33 return wrapper
34else:
35 # no-op
36 def check_bytes_warnings(func):
37 return func
38
39
Georg Brandl9a54d7c2008-07-16 23:15:30 +000040class Indexable:
41 def __init__(self, value=0):
42 self.value = value
43 def __index__(self):
44 return self.value
45
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000046
Ezio Melotti0dceb562013-01-10 07:43:26 +020047class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048
49 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000050 b = self.type2test()
51 self.assertEqual(type(b), self.type2test)
52 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000053
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000054 def test_copy(self):
55 a = self.type2test(b"abcd")
56 for copy_method in (copy.copy, copy.deepcopy):
57 b = copy_method(a)
58 self.assertEqual(a, b)
59 self.assertEqual(type(a), type(b))
60
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000061 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000062 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertEqual(len(b), 0)
64 self.assertRaises(IndexError, lambda: b[0])
65 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 self.assertRaises(IndexError, lambda: b[sys.maxsize])
67 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000068 self.assertRaises(IndexError, lambda: b[10**100])
69 self.assertRaises(IndexError, lambda: b[-1])
70 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000071 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
72 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
73 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertRaises(IndexError, lambda: b[-10**100])
75
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030076 def test_from_iterable(self):
77 b = self.type2test(range(256))
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000078 self.assertEqual(len(b), 256)
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030079 self.assertEqual(list(b), list(range(256)))
80
81 # Non-sequence iterable.
82 b = self.type2test({42})
83 self.assertEqual(b, b"*")
84 b = self.type2test({43, 45})
85 self.assertIn(tuple(b), {(43, 45), (45, 43)})
86
87 # Iterator that has a __length_hint__.
88 b = self.type2test(iter(range(256)))
89 self.assertEqual(len(b), 256)
90 self.assertEqual(list(b), list(range(256)))
91
92 # Iterator that doesn't have a __length_hint__.
93 b = self.type2test(i for i in range(256) if i % 2)
94 self.assertEqual(len(b), 128)
95 self.assertEqual(list(b), list(range(256))[1::2])
96
97 # Sequence without __iter__.
98 class S:
99 def __getitem__(self, i):
100 return (1, 2, 3)[i]
101 b = self.type2test(S())
102 self.assertEqual(b, b"\x01\x02\x03")
103
104 def test_from_tuple(self):
105 # There is a special case for tuples.
106 b = self.type2test(tuple(range(256)))
107 self.assertEqual(len(b), 256)
108 self.assertEqual(list(b), list(range(256)))
109 b = self.type2test((1, 2, 3))
110 self.assertEqual(b, b"\x01\x02\x03")
111
112 def test_from_list(self):
113 # There is a special case for lists.
114 b = self.type2test(list(range(256)))
115 self.assertEqual(len(b), 256)
116 self.assertEqual(list(b), list(range(256)))
117 b = self.type2test([1, 2, 3])
118 self.assertEqual(b, b"\x01\x02\x03")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000119
Serhiy Storchaka914f9a02018-10-21 15:25:53 +0300120 def test_from_mutating_list(self):
121 # Issue #34973: Crash in bytes constructor with mutating list.
122 class X:
123 def __index__(self):
124 a.clear()
125 return 42
126 a = [X(), X()]
127 self.assertEqual(bytes(a), b'*')
128
129 class Y:
130 def __index__(self):
131 if len(a) < 1000:
132 a.append(self)
133 return 42
134 a = [Y()]
135 self.assertEqual(bytes(a), b'*' * 1000) # should not crash
136
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000137 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000138 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
139 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000141 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
142 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000143
INADA Naokia634e232017-01-06 17:32:01 +0900144 def test_from_buffer(self):
145 a = self.type2test(array.array('B', [1, 2, 3]))
146 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300147 a = self.type2test(b"\x01\x02\x03")
148 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900149
Serhiy Storchakae8904212018-10-15 00:02:57 +0300150 # Issues #29159 and #34974.
151 # Fallback when __index__ raises a TypeError
INADA Naokia634e232017-01-06 17:32:01 +0900152 class B(bytes):
153 def __index__(self):
154 raise TypeError
155
156 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
157
Guido van Rossum98297ee2007-11-06 21:34:58 +0000158 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000159 self.assertEqual(self.type2test(0), b'')
160 self.assertEqual(self.type2test(1), b'\x00')
161 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
162 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000163
Benjamin Peterson4c045832010-04-16 22:35:32 +0000164 self.assertEqual(self.type2test('0', 'ascii'), b'0')
165 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000166 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000167
168 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000169 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000170 class C:
171 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000172 self.assertRaises(TypeError, self.type2test, ["0"])
173 self.assertRaises(TypeError, self.type2test, [0.0])
174 self.assertRaises(TypeError, self.type2test, [None])
175 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300176 self.assertRaises(TypeError, self.type2test, encoding='ascii')
177 self.assertRaises(TypeError, self.type2test, errors='ignore')
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200178 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
179 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
180 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
181 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
182 self.assertRaises(TypeError, self.type2test, '')
183 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
184 self.assertRaises(TypeError, self.type2test, '', b'ascii')
185 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000186
187 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000188 self.assertRaises(ValueError, self.type2test, [-1])
189 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
190 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
191 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
192 self.assertRaises(ValueError, self.type2test, [-10**100])
193 self.assertRaises(ValueError, self.type2test, [256])
194 self.assertRaises(ValueError, self.type2test, [257])
195 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
196 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
197 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000198
Antoine Pitroucc231542014-11-02 18:40:09 +0100199 @bigaddrspacetest
200 def test_constructor_overflow(self):
201 size = MAX_Py_ssize_t
202 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
203 try:
204 # Should either pass or raise an error (e.g. on debug builds with
205 # additional malloc() overhead), but shouldn't crash.
206 bytearray(size - 4)
207 except (OverflowError, MemoryError):
208 pass
209
Serhiy Storchakae8904212018-10-15 00:02:57 +0300210 def test_constructor_exceptions(self):
211 # Issue #34974: bytes and bytearray constructors replace unexpected
212 # exceptions.
213 class BadInt:
214 def __index__(self):
215 1/0
216 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
217 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
218
219 class BadIterable:
220 def __iter__(self):
221 1/0
222 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
223
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000224 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000225 b1 = self.type2test([1, 2, 3])
226 b2 = self.type2test([1, 2, 3])
227 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000228
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000229 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000230 self.assertTrue(b2 != b3)
231 self.assertTrue(b1 <= b2)
232 self.assertTrue(b1 <= b3)
233 self.assertTrue(b1 < b3)
234 self.assertTrue(b1 >= b2)
235 self.assertTrue(b3 >= b2)
236 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000237
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000238 self.assertFalse(b1 != b2)
239 self.assertFalse(b2 == b3)
240 self.assertFalse(b1 > b2)
241 self.assertFalse(b1 > b3)
242 self.assertFalse(b1 >= b3)
243 self.assertFalse(b1 < b2)
244 self.assertFalse(b3 < b2)
245 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000246
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000247 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000248 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000249 # Byte comparisons with unicode should always fail!
250 # Test this for all expected byte orders and Unicode character
251 # sizes.
252 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
253 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
254 False)
255 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
256 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
257 False)
258 self.assertEqual(self.type2test() == str(), False)
259 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000260
261 def test_reversed(self):
262 input = list(map(ord, "Hello"))
263 b = self.type2test(input)
264 output = list(reversed(b))
265 input.reverse()
266 self.assertEqual(output, input)
267
268 def test_getslice(self):
269 def by(s):
270 return self.type2test(map(ord, s))
271 b = by("Hello, world")
272
273 self.assertEqual(b[:5], by("Hello"))
274 self.assertEqual(b[1:5], by("ello"))
275 self.assertEqual(b[5:7], by(", "))
276 self.assertEqual(b[7:], by("world"))
277 self.assertEqual(b[7:12], by("world"))
278 self.assertEqual(b[7:100], by("world"))
279
280 self.assertEqual(b[:-7], by("Hello"))
281 self.assertEqual(b[-11:-7], by("ello"))
282 self.assertEqual(b[-7:-5], by(", "))
283 self.assertEqual(b[-5:], by("world"))
284 self.assertEqual(b[-5:12], by("world"))
285 self.assertEqual(b[-5:100], by("world"))
286 self.assertEqual(b[-100:5], by("Hello"))
287
288 def test_extended_getslice(self):
289 # Test extended slicing by comparing with list slicing.
290 L = list(range(255))
291 b = self.type2test(L)
Zackery Spytz14514d92019-05-17 01:13:03 -0600292 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Christian Heimes510711d2008-01-30 11:57:58 +0000293 for start in indices:
294 for stop in indices:
295 # Skip step 0 (invalid)
296 for step in indices[1:]:
297 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
298
299 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000300 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000301 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000302 b = self.type2test(sample, enc)
303 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000304 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
305 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000306 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000307
308 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300309 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000310 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000311 b = self.type2test(sample, enc)
312 self.assertEqual(b.decode(enc), sample)
313 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000314 b = self.type2test(sample, "latin-1")
315 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
316 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
317 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000318 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000319 # Default encoding is utf-8
320 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000321
Victor Stinner22eb6892019-06-26 00:51:05 +0200322 def test_check_encoding_errors(self):
323 # bpo-37388: bytes(str) and bytes.encode() must check encoding
324 # and errors arguments in dev mode
325 invalid = 'Boom, Shaka Laka, Boom!'
326 encodings = ('ascii', 'utf8', 'latin1')
327 code = textwrap.dedent(f'''
328 import sys
329 type2test = {self.type2test.__name__}
330 encodings = {encodings!r}
331
332 for data in ('', 'short string'):
333 try:
334 type2test(data, encoding={invalid!r})
335 except LookupError:
336 pass
337 else:
338 sys.exit(21)
339
340 for encoding in encodings:
341 try:
342 type2test(data, encoding=encoding, errors={invalid!r})
343 except LookupError:
344 pass
345 else:
346 sys.exit(22)
347
348 for data in (b'', b'short string'):
349 data = type2test(data)
350 print(repr(data))
351 try:
352 data.decode(encoding={invalid!r})
353 except LookupError:
354 sys.exit(10)
355 else:
356 sys.exit(23)
357
358 try:
359 data.decode(errors={invalid!r})
360 except LookupError:
361 pass
362 else:
363 sys.exit(24)
364
365 for encoding in encodings:
366 try:
367 data.decode(encoding=encoding, errors={invalid!r})
368 except LookupError:
369 pass
370 else:
371 sys.exit(25)
372
373 sys.exit(10)
374 ''')
375 proc = assert_python_failure('-X', 'dev', '-c', code)
376 self.assertEqual(proc.rc, 10, proc)
377
Christian Heimes510711d2008-01-30 11:57:58 +0000378 def test_from_int(self):
379 b = self.type2test(0)
380 self.assertEqual(b, self.type2test())
381 b = self.type2test(10)
382 self.assertEqual(b, self.type2test([0]*10))
383 b = self.type2test(10000)
384 self.assertEqual(b, self.type2test([0]*10000))
385
386 def test_concat(self):
387 b1 = self.type2test(b"abc")
388 b2 = self.type2test(b"def")
389 self.assertEqual(b1 + b2, b"abcdef")
390 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
391 self.assertEqual(bytes(b"def") + b1, b"defabc")
392 self.assertRaises(TypeError, lambda: b1 + "def")
393 self.assertRaises(TypeError, lambda: "abc" + b2)
394
395 def test_repeat(self):
396 for b in b"abc", self.type2test(b"abc"):
397 self.assertEqual(b * 3, b"abcabcabc")
398 self.assertEqual(b * 0, b"")
399 self.assertEqual(b * -1, b"")
400 self.assertRaises(TypeError, lambda: b * 3.14)
401 self.assertRaises(TypeError, lambda: 3.14 * b)
402 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000403 with self.assertRaises((OverflowError, MemoryError)):
404 c = b * sys.maxsize
405 with self.assertRaises((OverflowError, MemoryError)):
406 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000407
408 def test_repeat_1char(self):
409 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
410
411 def test_contains(self):
412 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000413 self.assertIn(ord('a'), b)
414 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000415 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000416 self.assertRaises(ValueError, lambda: 300 in b)
417 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300418 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000419 self.assertRaises(TypeError, lambda: None in b)
420 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
421 self.assertRaises(TypeError, lambda: "a" in b)
422 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000423 self.assertIn(f(b""), b)
424 self.assertIn(f(b"a"), b)
425 self.assertIn(f(b"b"), b)
426 self.assertIn(f(b"c"), b)
427 self.assertIn(f(b"ab"), b)
428 self.assertIn(f(b"bc"), b)
429 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000430 self.assertNotIn(f(b"ac"), b)
431 self.assertNotIn(f(b"d"), b)
432 self.assertNotIn(f(b"dab"), b)
433 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000434
435 def test_fromhex(self):
436 self.assertRaises(TypeError, self.type2test.fromhex)
437 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000438 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000439 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000440 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
441 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200442
443 # check that ASCII whitespace is ignored
444 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
445 for c in "\x09\x0A\x0B\x0C\x0D\x20":
446 self.assertEqual(self.type2test.fromhex(c), self.type2test())
447 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
448 self.assertRaises(ValueError, self.type2test.fromhex, c)
449
Ezio Melottib3aedd42010-11-20 19:04:17 +0000450 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000451 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
452 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
453 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
454 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
455 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
456 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
457
Victor Stinner2bf89932015-10-14 11:25:33 +0200458 for data, pos in (
459 # invalid first hexadecimal character
460 ('12 x4 56', 3),
461 # invalid second hexadecimal character
462 ('12 3x 56', 4),
463 # two invalid hexadecimal characters
464 ('12 xy 56', 3),
465 # test non-ASCII string
466 ('12 3\xff 56', 4),
467 ):
468 with self.assertRaises(ValueError) as cm:
469 self.type2test.fromhex(data)
470 self.assertIn('at position %s' % pos, str(cm.exception))
471
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000472 def test_hex(self):
473 self.assertRaises(TypeError, self.type2test.hex)
474 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000475 self.assertEqual(self.type2test(b"").hex(), "")
476 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
477 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
478 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000479
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700480 def test_hex_separator_basics(self):
481 three_bytes = self.type2test(b'\xb9\x01\xef')
482 self.assertEqual(three_bytes.hex(), 'b901ef')
483 with self.assertRaises(ValueError):
484 three_bytes.hex('')
485 with self.assertRaises(ValueError):
486 three_bytes.hex('xx')
487 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
488 with self.assertRaises(TypeError):
489 three_bytes.hex(None, 0)
490 with self.assertRaises(ValueError):
491 three_bytes.hex('\xff')
492 with self.assertRaises(ValueError):
493 three_bytes.hex(b'\xff')
494 with self.assertRaises(ValueError):
495 three_bytes.hex(b'\x80')
496 with self.assertRaises(ValueError):
497 three_bytes.hex(chr(0x100))
498 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
499 self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef')
500 self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef')
501 self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef')
502 self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef')
503 self.assertEqual(three_bytes.hex(':', 3), 'b901ef')
504 self.assertEqual(three_bytes.hex(':', 4), 'b901ef')
505 self.assertEqual(three_bytes.hex(':', -4), 'b901ef')
506 self.assertEqual(three_bytes.hex(':'), 'b9:01:ef')
507 self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef')
508 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
509 self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef')
510 self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef')
511 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
512 self.assertEqual(three_bytes.hex('*', -2), 'b901*ef')
513
514 value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
515 self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030')
516
517 def test_hex_separator_five_bytes(self):
518 five_bytes = self.type2test(range(90,95))
519 self.assertEqual(five_bytes.hex(), '5a5b5c5d5e')
520
521 def test_hex_separator_six_bytes(self):
522 six_bytes = self.type2test(x*3 for x in range(1, 7))
523 self.assertEqual(six_bytes.hex(), '0306090c0f12')
524 self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12')
525 self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12')
526 self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12')
527 self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12')
528 self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12')
529 self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12')
530 self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12')
531 self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12')
532 self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12')
533 self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f@12')
534 self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12')
535 self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12')
536
Christian Heimes510711d2008-01-30 11:57:58 +0000537 def test_join(self):
538 self.assertEqual(self.type2test(b"").join([]), b"")
539 self.assertEqual(self.type2test(b"").join([b""]), b"")
540 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
541 lst = list(map(self.type2test, lst))
542 self.assertEqual(self.type2test(b"").join(lst), b"abc")
543 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
544 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200545 dot_join = self.type2test(b".:").join
546 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
547 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
548 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
549 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
550 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
551 # Stress it with many items
Bruce Merryd07d9f42020-01-29 09:09:24 +0200552 seq = [b"abc"] * 100000
553 expected = b"abc" + b".:abc" * 99999
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200554 self.assertEqual(dot_join(seq), expected)
Bruce Merryd07d9f42020-01-29 09:09:24 +0200555 # Stress test with empty separator
556 seq = [b"abc"] * 100000
557 expected = b"abc" * 100000
558 self.assertEqual(self.type2test(b"").join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400559 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200560 # Error handling and cleanup when some item in the middle of the
561 # sequence has the wrong type.
562 with self.assertRaises(TypeError):
563 dot_join([bytearray(b"ab"), "cd", b"ef"])
564 with self.assertRaises(TypeError):
565 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000566
Christian Heimes510711d2008-01-30 11:57:58 +0000567 def test_count(self):
568 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200569 i = 105
570 p = 112
571 w = 119
572
Christian Heimes510711d2008-01-30 11:57:58 +0000573 self.assertEqual(b.count(b'i'), 4)
574 self.assertEqual(b.count(b'ss'), 2)
575 self.assertEqual(b.count(b'w'), 0)
576
Antoine Pitrouac65d962011-10-20 23:54:17 +0200577 self.assertEqual(b.count(i), 4)
578 self.assertEqual(b.count(w), 0)
579
580 self.assertEqual(b.count(b'i', 6), 2)
581 self.assertEqual(b.count(b'p', 6), 2)
582 self.assertEqual(b.count(b'i', 1, 3), 1)
583 self.assertEqual(b.count(b'p', 7, 9), 1)
584
585 self.assertEqual(b.count(i, 6), 2)
586 self.assertEqual(b.count(p, 6), 2)
587 self.assertEqual(b.count(i, 1, 3), 1)
588 self.assertEqual(b.count(p, 7, 9), 1)
589
Christian Heimes510711d2008-01-30 11:57:58 +0000590 def test_startswith(self):
591 b = self.type2test(b'hello')
592 self.assertFalse(self.type2test().startswith(b"anything"))
593 self.assertTrue(b.startswith(b"hello"))
594 self.assertTrue(b.startswith(b"hel"))
595 self.assertTrue(b.startswith(b"h"))
596 self.assertFalse(b.startswith(b"hellow"))
597 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300598 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300599 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300600 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300601 self.assertIn('bytes', exc)
602 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000603
604 def test_endswith(self):
605 b = self.type2test(b'hello')
606 self.assertFalse(bytearray().endswith(b"anything"))
607 self.assertTrue(b.endswith(b"hello"))
608 self.assertTrue(b.endswith(b"llo"))
609 self.assertTrue(b.endswith(b"o"))
610 self.assertFalse(b.endswith(b"whello"))
611 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300612 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300613 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300614 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300615 self.assertIn('bytes', exc)
616 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000617
618 def test_find(self):
619 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200620 i = 105
621 w = 119
622
Christian Heimes510711d2008-01-30 11:57:58 +0000623 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000624 self.assertEqual(b.find(b'w'), -1)
625 self.assertEqual(b.find(b'mississippian'), -1)
626
Antoine Pitrouac65d962011-10-20 23:54:17 +0200627 self.assertEqual(b.find(i), 1)
628 self.assertEqual(b.find(w), -1)
629
630 self.assertEqual(b.find(b'ss', 3), 5)
631 self.assertEqual(b.find(b'ss', 1, 7), 2)
632 self.assertEqual(b.find(b'ss', 1, 3), -1)
633
634 self.assertEqual(b.find(i, 6), 7)
635 self.assertEqual(b.find(i, 1, 3), 1)
636 self.assertEqual(b.find(w, 1, 3), -1)
637
Victor Stinnerf8eac002011-12-18 01:17:41 +0100638 for index in (-1, 256, sys.maxsize + 1):
639 self.assertRaisesRegex(
640 ValueError, r'byte must be in range\(0, 256\)',
641 b.find, index)
642
Christian Heimes510711d2008-01-30 11:57:58 +0000643 def test_rfind(self):
644 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200645 i = 105
646 w = 119
647
Christian Heimes510711d2008-01-30 11:57:58 +0000648 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000649 self.assertEqual(b.rfind(b'w'), -1)
650 self.assertEqual(b.rfind(b'mississippian'), -1)
651
Antoine Pitrouac65d962011-10-20 23:54:17 +0200652 self.assertEqual(b.rfind(i), 10)
653 self.assertEqual(b.rfind(w), -1)
654
655 self.assertEqual(b.rfind(b'ss', 3), 5)
656 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
657
658 self.assertEqual(b.rfind(i, 1, 3), 1)
659 self.assertEqual(b.rfind(i, 3, 9), 7)
660 self.assertEqual(b.rfind(w, 1, 3), -1)
661
Christian Heimes510711d2008-01-30 11:57:58 +0000662 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200663 b = self.type2test(b'mississippi')
664 i = 105
665 w = 119
666
667 self.assertEqual(b.index(b'ss'), 2)
668 self.assertRaises(ValueError, b.index, b'w')
669 self.assertRaises(ValueError, b.index, b'mississippian')
670
671 self.assertEqual(b.index(i), 1)
672 self.assertRaises(ValueError, b.index, w)
673
674 self.assertEqual(b.index(b'ss', 3), 5)
675 self.assertEqual(b.index(b'ss', 1, 7), 2)
676 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
677
678 self.assertEqual(b.index(i, 6), 7)
679 self.assertEqual(b.index(i, 1, 3), 1)
680 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000681
682 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200683 b = self.type2test(b'mississippi')
684 i = 105
685 w = 119
686
687 self.assertEqual(b.rindex(b'ss'), 5)
688 self.assertRaises(ValueError, b.rindex, b'w')
689 self.assertRaises(ValueError, b.rindex, b'mississippian')
690
691 self.assertEqual(b.rindex(i), 10)
692 self.assertRaises(ValueError, b.rindex, w)
693
694 self.assertEqual(b.rindex(b'ss', 3), 5)
695 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
696
697 self.assertEqual(b.rindex(i, 1, 3), 1)
698 self.assertEqual(b.rindex(i, 3, 9), 7)
699 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000700
Ethan Furmanb95b5612015-01-23 20:05:18 -0800701 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300702 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800703 orig = b
704 b = b % b'world'
705 self.assertEqual(b, b'hello, world!')
706 self.assertEqual(orig, b'hello, %b!')
707 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300708 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800709 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200710 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200711 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800712 # issue 29714
713 b = self.type2test(b'hello,\x00%b!')
714 b = b % b'world'
715 self.assertEqual(b, b'hello,\x00world!')
716 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800717
718 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300719 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800720 orig = b
721 b %= b'world'
722 self.assertEqual(b, b'hello, world!')
723 self.assertEqual(orig, b'hello, %b!')
724 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300725 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800726 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200727 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200728 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800729 # issue 29714
730 b = self.type2test(b'hello,\x00%b!')
731 b %= b'world'
732 self.assertEqual(b, b'hello,\x00world!')
733 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300734
735 def test_rmod(self):
736 with self.assertRaises(TypeError):
737 object() % self.type2test(b'abc')
738 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800739
Christian Heimes510711d2008-01-30 11:57:58 +0000740 def test_replace(self):
741 b = self.type2test(b'mississippi')
742 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
743 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
744
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300745 def test_replace_int_error(self):
746 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
747
Christian Heimes510711d2008-01-30 11:57:58 +0000748 def test_split_string_error(self):
749 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300750 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
751
752 def test_split_int_error(self):
753 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
754 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000755
Antoine Pitrouf8453022010-01-12 22:05:42 +0000756 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000757 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
758 b = self.type2test(b)
759 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000760 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
761 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
762
Christian Heimes510711d2008-01-30 11:57:58 +0000763 def test_rsplit_unicodewhitespace(self):
764 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000765 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
766
767 def test_partition(self):
768 b = self.type2test(b'mississippi')
769 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000770 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000771
772 def test_rpartition(self):
773 b = self.type2test(b'mississippi')
774 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
775 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000776 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000777
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300778 def test_partition_string_error(self):
779 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
780 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
781
782 def test_partition_int_error(self):
783 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
784 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
785
Christian Heimes510711d2008-01-30 11:57:58 +0000786 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000787 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000788 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
789 b = self.type2test(b)
790 ps = pickle.dumps(b, proto)
791 q = pickle.loads(ps)
792 self.assertEqual(b, q)
793
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000794 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200795 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
796 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
797 it = itorg = iter(self.type2test(b))
798 data = list(self.type2test(b))
799 d = pickle.dumps(it, proto)
800 it = pickle.loads(d)
801 self.assertEqual(type(itorg), type(it))
802 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000803
Serhiy Storchakabad12572014-12-15 14:03:42 +0200804 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200805 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200806 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200807 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200808 d = pickle.dumps(it, proto)
809 it = pickle.loads(d)
810 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000811
Christian Heimes510711d2008-01-30 11:57:58 +0000812 def test_strip_bytearray(self):
813 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
814 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
815 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
816
817 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300818 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
819 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
820 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
821
822 def test_strip_int_error(self):
823 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
824 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
825 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000826
Eli Bendersky906b88f2011-07-29 07:05:08 +0300827 def test_center(self):
828 # Fill character can be either bytes or bytearray (issue 12380)
829 b = self.type2test(b'abc')
830 for fill_type in (bytes, bytearray):
831 self.assertEqual(b.center(7, fill_type(b'-')),
832 self.type2test(b'--abc--'))
833
834 def test_ljust(self):
835 # Fill character can be either bytes or bytearray (issue 12380)
836 b = self.type2test(b'abc')
837 for fill_type in (bytes, bytearray):
838 self.assertEqual(b.ljust(7, fill_type(b'-')),
839 self.type2test(b'abc----'))
840
841 def test_rjust(self):
842 # Fill character can be either bytes or bytearray (issue 12380)
843 b = self.type2test(b'abc')
844 for fill_type in (bytes, bytearray):
845 self.assertEqual(b.rjust(7, fill_type(b'-')),
846 self.type2test(b'----abc'))
847
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300848 def test_xjust_int_error(self):
849 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
850 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
851 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
852
Christian Heimes510711d2008-01-30 11:57:58 +0000853 def test_ord(self):
854 b = self.type2test(b'\0A\x7f\x80\xff')
855 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
856 [0, 65, 127, 128, 255])
857
Georg Brandlabc38772009-04-12 15:51:51 +0000858 def test_maketrans(self):
859 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'
Georg Brandlabc38772009-04-12 15:51:51 +0000860 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000861 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'
862 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000863 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
864 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
865
Jesus Ceaac451502011-04-20 17:09:23 +0200866 def test_none_arguments(self):
867 # issue 11828
868 b = self.type2test(b'hello')
869 l = self.type2test(b'l')
870 h = self.type2test(b'h')
871 x = self.type2test(b'x')
872 o = self.type2test(b'o')
873
874 self.assertEqual(2, b.find(l, None))
875 self.assertEqual(3, b.find(l, -2, None))
876 self.assertEqual(2, b.find(l, None, -2))
877 self.assertEqual(0, b.find(h, None, None))
878
879 self.assertEqual(3, b.rfind(l, None))
880 self.assertEqual(3, b.rfind(l, -2, None))
881 self.assertEqual(2, b.rfind(l, None, -2))
882 self.assertEqual(0, b.rfind(h, None, None))
883
884 self.assertEqual(2, b.index(l, None))
885 self.assertEqual(3, b.index(l, -2, None))
886 self.assertEqual(2, b.index(l, None, -2))
887 self.assertEqual(0, b.index(h, None, None))
888
889 self.assertEqual(3, b.rindex(l, None))
890 self.assertEqual(3, b.rindex(l, -2, None))
891 self.assertEqual(2, b.rindex(l, None, -2))
892 self.assertEqual(0, b.rindex(h, None, None))
893
894 self.assertEqual(2, b.count(l, None))
895 self.assertEqual(1, b.count(l, -2, None))
896 self.assertEqual(1, b.count(l, None, -2))
897 self.assertEqual(0, b.count(x, None, None))
898
899 self.assertEqual(True, b.endswith(o, None))
900 self.assertEqual(True, b.endswith(o, -2, None))
901 self.assertEqual(True, b.endswith(l, None, -2))
902 self.assertEqual(False, b.endswith(x, None, None))
903
904 self.assertEqual(True, b.startswith(h, None))
905 self.assertEqual(True, b.startswith(l, -2, None))
906 self.assertEqual(True, b.startswith(h, None, -2))
907 self.assertEqual(False, b.startswith(x, None, None))
908
Antoine Pitrouac65d962011-10-20 23:54:17 +0200909 def test_integer_arguments_out_of_byte_range(self):
910 b = self.type2test(b'hello')
911
912 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
913 self.assertRaises(ValueError, method, -1)
914 self.assertRaises(ValueError, method, 256)
915 self.assertRaises(ValueError, method, 9999)
916
Jesus Ceaac451502011-04-20 17:09:23 +0200917 def test_find_etc_raise_correct_error_messages(self):
918 # issue 11828
919 b = self.type2test(b'hello')
920 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300921 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200922 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300923 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200924 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300925 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200926 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300927 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200928 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300929 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200930 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300931 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200932 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300933 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200934 x, None, None, None)
935
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300936 def test_free_after_iterating(self):
937 test.support.check_free_after_iterating(self, iter, self.type2test)
938 test.support.check_free_after_iterating(self, reversed, self.type2test)
939
Martin Panter1b6c6da2016-08-27 08:35:02 +0000940 def test_translate(self):
941 b = self.type2test(b'hello')
942 rosetta = bytearray(range(256))
943 rosetta[ord('o')] = ord('e')
944
945 self.assertRaises(TypeError, b.translate)
946 self.assertRaises(TypeError, b.translate, None, None)
947 self.assertRaises(ValueError, b.translate, bytes(range(255)))
948
949 c = b.translate(rosetta, b'hello')
950 self.assertEqual(b, b'hello')
951 self.assertIsInstance(c, self.type2test)
952
953 c = b.translate(rosetta)
954 d = b.translate(rosetta, b'')
955 self.assertEqual(c, d)
956 self.assertEqual(c, b'helle')
957
958 c = b.translate(rosetta, b'l')
959 self.assertEqual(c, b'hee')
960 c = b.translate(None, b'e')
961 self.assertEqual(c, b'hllo')
962
963 # test delete as a keyword argument
964 c = b.translate(rosetta, delete=b'')
965 self.assertEqual(c, b'helle')
966 c = b.translate(rosetta, delete=b'l')
967 self.assertEqual(c, b'hee')
968 c = b.translate(None, delete=b'e')
969 self.assertEqual(c, b'hllo')
970
Sergey Fedoseev92709a22019-09-09 21:28:34 +0500971 def test_sq_item(self):
Hai Shia089d212020-07-06 17:15:08 +0800972 _testcapi = import_helper.import_module('_testcapi')
Sergey Fedoseev92709a22019-09-09 21:28:34 +0500973 obj = self.type2test((42,))
974 with self.assertRaises(IndexError):
975 _testcapi.sequence_getitem(obj, -2)
976 with self.assertRaises(IndexError):
977 _testcapi.sequence_getitem(obj, 1)
978 self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42)
979
Christian Heimes510711d2008-01-30 11:57:58 +0000980
Ezio Melotti0dceb562013-01-10 07:43:26 +0200981class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000982 type2test = bytes
983
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400984 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200985 b = b'python'
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400986 msg = "byte indices must be integers or slices"
987 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200988 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400989
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000990 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200991 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000992 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000993 self.assertRaises(TypeError, f.readinto, b"")
994
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000995 def test_custom(self):
996 class A:
997 def __bytes__(self):
998 return b'abc'
999 self.assertEqual(bytes(A()), b'abc')
1000 class A: pass
1001 self.assertRaises(TypeError, bytes, A())
1002 class A:
1003 def __bytes__(self):
1004 return None
1005 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06001006 class A:
1007 def __bytes__(self):
1008 return b'a'
1009 def __index__(self):
1010 return 42
1011 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02001012 # Issue #25766
1013 class A(str):
1014 def __bytes__(self):
1015 return b'abc'
1016 self.assertEqual(bytes(A('\u20ac')), b'abc')
1017 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +02001018 # Issue #24731
1019 class A:
1020 def __bytes__(self):
1021 return OtherBytesSubclass(b'abc')
1022 self.assertEqual(bytes(A()), b'abc')
1023 self.assertIs(type(bytes(A())), OtherBytesSubclass)
1024 self.assertEqual(BytesSubclass(A()), b'abc')
1025 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +00001026
Victor Stinner29e762c2011-01-05 03:33:28 +00001027 # Test PyBytes_FromFormat()
1028 def test_from_format(self):
Hai Shia089d212020-07-06 17:15:08 +08001029 ctypes = import_helper.import_module('ctypes')
1030 _testcapi = import_helper.import_module('_testcapi')
Victor Stinner03dab782015-10-14 00:21:35 +02001031 from ctypes import pythonapi, py_object
1032 from ctypes import (
1033 c_int, c_uint,
1034 c_long, c_ulong,
1035 c_size_t, c_ssize_t,
1036 c_char_p)
1037
Victor Stinner29e762c2011-01-05 03:33:28 +00001038 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
Ronald Oussoren41761932020-11-08 10:05:27 +01001039 PyBytes_FromFormat.argtypes = (c_char_p,)
Victor Stinner29e762c2011-01-05 03:33:28 +00001040 PyBytes_FromFormat.restype = py_object
1041
Victor Stinner03dab782015-10-14 00:21:35 +02001042 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +00001043 self.assertEqual(PyBytes_FromFormat(b'format'),
1044 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +02001045 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
1046 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +00001047
Victor Stinner03dab782015-10-14 00:21:35 +02001048 # test formatters
1049 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
1050 b'c=\0')
1051 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
1052 b'c=@')
1053 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
1054 b'c=\xff')
1055 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
1056 c_int(1), c_long(2),
1057 c_size_t(3)),
1058 b'd=1 ld=2 zd=3')
1059 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
1060 c_int(-1), c_long(-2),
1061 c_size_t(-3)),
1062 b'd=-1 ld=-2 zd=-3')
1063 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
1064 c_uint(123), c_ulong(456),
1065 c_size_t(789)),
1066 b'u=123 lu=456 zu=789')
1067 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
1068 b'i=123')
1069 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
1070 b'i=-123')
1071 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
1072 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +02001073
1074 sizeof_ptr = ctypes.sizeof(c_char_p)
1075
1076 if os.name == 'nt':
1077 # Windows (MSCRT)
1078 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
1079 def ptr_formatter(ptr):
1080 return (ptr_format % ptr)
1081 else:
1082 # UNIX (glibc)
1083 def ptr_formatter(ptr):
1084 return '%#x' % ptr
1085
Victor Stinner7ab986d2015-10-14 02:55:12 +02001086 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +02001087 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
1088 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +02001089 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
1090 b's=cstr')
1091
1092 # test minimum and maximum integer values
1093 size_max = c_size_t(-1).value
1094 for formatstr, ctypes_type, value, py_formatter in (
1095 (b'%d', c_int, _testcapi.INT_MIN, str),
1096 (b'%d', c_int, _testcapi.INT_MAX, str),
1097 (b'%ld', c_long, _testcapi.LONG_MIN, str),
1098 (b'%ld', c_long, _testcapi.LONG_MAX, str),
1099 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
1100 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
1101 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
1102 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +02001103 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +02001104 ):
1105 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
1106 py_formatter(value).encode('ascii')),
1107
1108 # width and precision (width is currently ignored)
1109 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
1110 b'a')
1111 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
1112 b'abc')
1113
1114 # '%%' formatter
1115 self.assertEqual(PyBytes_FromFormat(b'%%'),
1116 b'%')
1117 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
1118 b'[%]')
1119 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
1120 b'%_')
1121 self.assertEqual(PyBytes_FromFormat(b'%%s'),
1122 b'%s')
1123
1124 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +00001125 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +02001126 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
1127 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +00001128
Victor Stinner03dab782015-10-14 00:21:35 +02001129 # Issue #19969: %c must raise OverflowError for values
1130 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +01001131 self.assertRaises(OverflowError,
1132 PyBytes_FromFormat, b'%c', c_int(-1))
1133 self.assertRaises(OverflowError,
1134 PyBytes_FromFormat, b'%c', c_int(256))
1135
Serhiy Storchaka44cc4822019-01-12 09:22:29 +02001136 # Issue #33817: empty strings
1137 self.assertEqual(PyBytes_FromFormat(b''),
1138 b'')
1139 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1140 b'')
1141
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001142 def test_bytes_blocking(self):
1143 class IterationBlocked(list):
1144 __bytes__ = None
1145 i = [0, 1, 2, 3]
1146 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1147 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1148
1149 # At least in CPython, because bytes.__new__ and the C API
1150 # PyBytes_FromObject have different fallback rules, integer
1151 # fallback is handled specially, so test separately.
1152 class IntBlocked(int):
1153 __bytes__ = None
1154 self.assertEqual(bytes(3), b'\0\0\0')
1155 self.assertRaises(TypeError, bytes, IntBlocked(3))
1156
1157 # While there is no separately-defined rule for handling bytes
1158 # subclasses differently from other buffer-interface classes,
1159 # an implementation may well special-case them (as CPython 2.x
1160 # str did), so test them separately.
1161 class BytesSubclassBlocked(bytes):
1162 __bytes__ = None
1163 self.assertEqual(bytes(b'ab'), b'ab')
1164 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1165
1166 class BufferBlocked(bytearray):
1167 __bytes__ = None
1168 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1169 self.assertEqual(bytes(ba), b'ab')
1170 self.assertRaises(TypeError, bytes, bb)
1171
Miss Islington (bot)45a97d92021-08-13 04:04:08 -07001172 def test_repeat_id_preserving(self):
1173 a = b'123abc1@'
1174 b = b'456zyx-+'
1175 self.assertEqual(id(a), id(a))
1176 self.assertNotEqual(id(a), id(b))
1177 self.assertNotEqual(id(a), id(a * -4))
1178 self.assertNotEqual(id(a), id(a * 0))
1179 self.assertEqual(id(a), id(a * 1))
1180 self.assertEqual(id(a), id(1 * a))
1181 self.assertNotEqual(id(a), id(a * 2))
1182
1183 class SubBytes(bytes):
1184 pass
1185
1186 s = SubBytes(b'qwerty()')
1187 self.assertEqual(id(s), id(s))
1188 self.assertNotEqual(id(s), id(s * -4))
1189 self.assertNotEqual(id(s), id(s * 0))
1190 self.assertNotEqual(id(s), id(s * 1))
1191 self.assertNotEqual(id(s), id(1 * s))
1192 self.assertNotEqual(id(s), id(s * 2))
1193
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001194
Ezio Melotti0dceb562013-01-10 07:43:26 +02001195class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001196 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001197
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001198 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001199 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001200 msg = "bytearray indices must be integers or slices"
1201 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001202 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001203
1204 def test_setitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001205 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001206 msg = "bytearray indices must be integers or slices"
1207 with self.assertRaisesRegex(TypeError, msg):
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001208 b['a'] = "python"
1209
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001210 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001211 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001212
Guido van Rossum254348e2007-11-21 19:29:53 +00001213 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001214 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001215 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001216 tfn = tempfile.mktemp()
1217 try:
1218 # Prepare
1219 with open(tfn, "wb") as f:
1220 f.write(short_sample)
1221 # Test readinto
1222 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001223 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001224 n = f.readinto(b)
1225 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001226 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001227 # Test writing in binary mode
1228 with open(tfn, "wb") as f:
1229 f.write(b)
1230 with open(tfn, "rb") as f:
1231 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001232 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001233 finally:
1234 try:
1235 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001236 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001237 pass
1238
Neal Norwitz6968b052007-02-27 19:02:19 +00001239 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001240 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001241 self.assertEqual(b.reverse(), None)
1242 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001243 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001244 b.reverse()
1245 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001246 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001247 b.reverse()
1248 self.assertFalse(b)
1249
Eli Bendersky4db28d32011-03-03 18:21:02 +00001250 def test_clear(self):
1251 b = bytearray(b'python')
1252 b.clear()
1253 self.assertEqual(b, b'')
1254
1255 b = bytearray(b'')
1256 b.clear()
1257 self.assertEqual(b, b'')
1258
1259 b = bytearray(b'')
1260 b.append(ord('r'))
1261 b.clear()
1262 b.append(ord('p'))
1263 self.assertEqual(b, b'p')
1264
1265 def test_copy(self):
1266 b = bytearray(b'abc')
1267 bb = b.copy()
1268 self.assertEqual(bb, b'abc')
1269
1270 b = bytearray(b'')
1271 bb = b.copy()
1272 self.assertEqual(bb, b'')
1273
1274 # test that it's indeed a copy and not a reference
1275 b = bytearray(b'abc')
1276 bb = b.copy()
1277 self.assertEqual(b, bb)
1278 self.assertIsNot(b, bb)
1279 bb.append(ord('d'))
1280 self.assertEqual(bb, b'abcd')
1281 self.assertEqual(b, b'abc')
1282
Guido van Rossumd624f182006-04-24 13:47:05 +00001283 def test_regexps(self):
1284 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001285 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001286 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001287 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001288
1289 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001290 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001291 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001292 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001293 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001294 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001295 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001296 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001297 try:
1298 b[3] = 0
1299 self.fail("Didn't raise IndexError")
1300 except IndexError:
1301 pass
1302 try:
1303 b[-10] = 0
1304 self.fail("Didn't raise IndexError")
1305 except IndexError:
1306 pass
1307 try:
1308 b[0] = 256
1309 self.fail("Didn't raise ValueError")
1310 except ValueError:
1311 pass
1312 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001313 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001314 self.fail("Didn't raise ValueError")
1315 except ValueError:
1316 pass
1317 try:
1318 b[0] = None
1319 self.fail("Didn't raise TypeError")
1320 except TypeError:
1321 pass
1322
1323 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001324 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001325 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001326 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001327 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001328 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001329 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001330 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001331
1332 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001333 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001334 self.assertEqual(list(b), list(range(10)))
1335
Guido van Rossum254348e2007-11-21 19:29:53 +00001336 b[0:5] = bytearray([1, 1, 1, 1, 1])
1337 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001338
1339 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001340 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001341
Guido van Rossum254348e2007-11-21 19:29:53 +00001342 b[0:0] = bytearray([0, 1, 2, 3, 4])
1343 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001344
Guido van Rossum254348e2007-11-21 19:29:53 +00001345 b[-7:-3] = bytearray([100, 101])
1346 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001347
1348 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001349 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001350
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001351 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001352 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001353
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001354 b[3:] = b'foo'
1355 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1356
1357 b[:3] = memoryview(b'foo')
1358 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1359
1360 b[3:4] = []
1361 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1362
1363 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1364 ['a', 'b'], [b'a', b'b'], [[]]]:
1365 with self.assertRaises(TypeError):
1366 b[3:4] = elem
1367
1368 for elem in [[254, 255, 256], [-256, 9000]]:
1369 with self.assertRaises(ValueError):
1370 b[3:4] = elem
1371
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001372 def test_setslice_extend(self):
1373 # Exercise the resizing logic (see issue #19087)
1374 b = bytearray(range(100))
1375 self.assertEqual(list(b), list(range(100)))
1376 del b[:10]
1377 self.assertEqual(list(b), list(range(10, 100)))
1378 b.extend(range(100, 110))
1379 self.assertEqual(list(b), list(range(10, 110)))
1380
Antoine Pitrou25454112015-05-19 20:52:27 +02001381 def test_fifo_overrun(self):
1382 # Test for issue #23985, a buffer overrun when implementing a FIFO
1383 # Build Python in pydebug mode for best results.
1384 b = bytearray(10)
1385 b.pop() # Defeat expanding buffer off-by-one quirk
1386 del b[:1] # Advance start pointer without reallocating
1387 b += bytes(2) # Append exactly the number of deleted bytes
1388 del b # Free memory buffer, allowing pydebug verification
1389
1390 def test_del_expand(self):
1391 # Reducing the size should not expand the buffer (issue #23985)
1392 b = bytearray(10)
1393 size = sys.getsizeof(b)
1394 del b[:1]
1395 self.assertLessEqual(sys.getsizeof(b), size)
1396
Thomas Wouters376446d2006-12-19 08:30:14 +00001397 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -06001398 indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
1399 -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001400 for start in indices:
1401 for stop in indices:
1402 # Skip invalid step 0
1403 for step in indices[1:]:
1404 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001405 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001406 # Make sure we have a slice of exactly the right length,
1407 # but with different data.
1408 data = L[start:stop:step]
1409 data.reverse()
1410 L[start:stop:step] = data
1411 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001412 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001413
Thomas Wouters376446d2006-12-19 08:30:14 +00001414 del L[start:stop:step]
1415 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001416 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001417
Guido van Rossumd624f182006-04-24 13:47:05 +00001418 def test_setslice_trap(self):
1419 # This test verifies that we correctly handle assigning self
1420 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001421 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001422 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001423 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001424
Guido van Rossum13e57212006-04-27 22:54:26 +00001425 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001426 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001427 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001428 b += b"def"
1429 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001430 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001431 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001432 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001433 self.assertEqual(b, b"abcdefxyz")
1434 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001435 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001436 except TypeError:
1437 pass
1438 else:
1439 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001440
1441 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001442 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001443 b1 = b
1444 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001445 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001446 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001447 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001448
1449 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001450 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001451 b1 = b
1452 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001453 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001454 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001455 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001456
Guido van Rossum20188312006-05-05 15:15:40 +00001457 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001458 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001459 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001460 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001461 seq = [alloc]
1462 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001463 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001464 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001465 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001466 if alloc not in seq:
1467 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001468
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001469 def test_init_alloc(self):
1470 b = bytearray()
1471 def g():
1472 for i in range(1, 100):
1473 yield i
1474 a = list(b)
1475 self.assertEqual(a, list(range(1, len(a)+1)))
1476 self.assertEqual(len(b), len(a))
1477 self.assertLessEqual(len(b), i)
1478 alloc = b.__alloc__()
1479 self.assertGreater(alloc, len(b)) # including trailing null byte
1480 b.__init__(g())
1481 self.assertEqual(list(b), list(range(1, 100)))
1482 self.assertEqual(len(b), 99)
1483 alloc = b.__alloc__()
1484 self.assertGreater(alloc, len(b))
1485
Neal Norwitz6968b052007-02-27 19:02:19 +00001486 def test_extend(self):
1487 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001488 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001489 a.extend(a)
1490 self.assertEqual(a, orig + orig)
1491 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001492 a = bytearray(b'')
1493 # Test iterators that don't have a __length_hint__
1494 a.extend(map(int, orig * 25))
1495 a.extend(int(x) for x in orig * 25)
1496 self.assertEqual(a, orig * 50)
1497 self.assertEqual(a[-5:], orig)
1498 a = bytearray(b'')
1499 a.extend(iter(map(int, orig * 50)))
1500 self.assertEqual(a, orig * 50)
1501 self.assertEqual(a[-5:], orig)
1502 a = bytearray(b'')
1503 a.extend(list(map(int, orig * 50)))
1504 self.assertEqual(a, orig * 50)
1505 self.assertEqual(a[-5:], orig)
1506 a = bytearray(b'')
1507 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1508 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1509 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001510 a = bytearray(b'')
1511 a.extend([Indexable(ord('a'))])
1512 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001513
Neal Norwitz6968b052007-02-27 19:02:19 +00001514 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001515 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001516 b.remove(ord('l'))
1517 self.assertEqual(b, b'helo')
1518 b.remove(ord('l'))
1519 self.assertEqual(b, b'heo')
1520 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1521 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001522 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001523 # remove first and last
1524 b.remove(ord('o'))
1525 b.remove(ord('h'))
1526 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001527 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001528 b.remove(Indexable(ord('e')))
1529 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001530
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001531 # test values outside of the ascii range: (0, 127)
1532 c = bytearray([126, 127, 128, 129])
1533 c.remove(127)
1534 self.assertEqual(c, bytes([126, 128, 129]))
1535 c.remove(129)
1536 self.assertEqual(c, bytes([126, 128]))
1537
Neal Norwitz6968b052007-02-27 19:02:19 +00001538 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001539 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001540 self.assertEqual(b.pop(), ord('d'))
1541 self.assertEqual(b.pop(0), ord('w'))
1542 self.assertEqual(b.pop(-2), ord('r'))
1543 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001544 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001545 # test for issue #6846
1546 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001547
1548 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001549 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001550
Neal Norwitz6968b052007-02-27 19:02:19 +00001551 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001552 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001553 b.append(ord('o'))
1554 self.assertEqual(b, b'hello')
1555 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001556 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001557 b.append(ord('A'))
1558 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001559 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001560 b = bytearray()
1561 b.append(Indexable(ord('A')))
1562 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001563
1564 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001565 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001566 b.insert(1, ord('i'))
1567 b.insert(4, ord('i'))
1568 b.insert(-2, ord('i'))
1569 b.insert(1000, ord('i'))
1570 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001571 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001572 b = bytearray()
1573 b.insert(0, Indexable(ord('A')))
1574 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001575
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001576 def test_copied(self):
1577 # Issue 4348. Make sure that operations that don't mutate the array
1578 # copy the bytes.
1579 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001580 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001581
1582 t = bytearray([i for i in range(256)])
1583 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001584 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001585
Guido van Rossum254348e2007-11-21 19:29:53 +00001586 def test_partition_bytearray_doesnt_share_nullstring(self):
1587 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001588 self.assertEqual(b, b"")
1589 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001590 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001591 b += b"!"
1592 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001593 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001594 self.assertEqual(b, b"")
1595 self.assertEqual(c, b"")
1596 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001597 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001598 self.assertEqual(b, b"")
1599 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001600 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001601 b += b"!"
1602 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001603 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001604 self.assertEqual(b, b"")
1605 self.assertEqual(c, b"")
1606
Antoine Pitrou5504e892008-12-06 21:27:53 +00001607 def test_resize_forbidden(self):
1608 # #4509: can't resize a bytearray when there are buffer exports, even
1609 # if it wouldn't reallocate the underlying buffer.
1610 # Furthermore, no destructive changes to the buffer may be applied
1611 # before raising the error.
1612 b = bytearray(range(10))
1613 v = memoryview(b)
1614 def resize(n):
1615 b[1:-1] = range(n + 1, 2*n - 1)
1616 resize(10)
1617 orig = b[:]
1618 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001619 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001620 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001621 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001622 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001623 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001624 # Other operations implying resize
1625 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001626 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001627 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001628 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001629 def delitem():
1630 del b[1]
1631 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001632 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001633 # deleting a non-contiguous slice
1634 def delslice():
1635 b[1:-1:2] = b""
1636 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001637 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001638
Stefan Krah650c1e82015-02-03 21:43:23 +01001639 @test.support.cpython_only
1640 def test_obsolete_write_lock(self):
1641 from _testcapi import getbuffer_with_null_view
1642 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001643
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001644 def test_iterator_pickling2(self):
1645 orig = bytearray(b'abc')
1646 data = list(b'qwerty')
1647 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1648 # initial iterator
1649 itorig = iter(orig)
1650 d = pickle.dumps((itorig, orig), proto)
1651 it, b = pickle.loads(d)
1652 b[:] = data
1653 self.assertEqual(type(it), type(itorig))
1654 self.assertEqual(list(it), data)
1655
1656 # running iterator
1657 next(itorig)
1658 d = pickle.dumps((itorig, orig), proto)
1659 it, b = pickle.loads(d)
1660 b[:] = data
1661 self.assertEqual(type(it), type(itorig))
1662 self.assertEqual(list(it), data[1:])
1663
1664 # empty iterator
1665 for i in range(1, len(orig)):
1666 next(itorig)
1667 d = pickle.dumps((itorig, orig), proto)
1668 it, b = pickle.loads(d)
1669 b[:] = data
1670 self.assertEqual(type(it), type(itorig))
1671 self.assertEqual(list(it), data[len(orig):])
1672
1673 # exhausted iterator
1674 self.assertRaises(StopIteration, next, itorig)
1675 d = pickle.dumps((itorig, orig), proto)
1676 it, b = pickle.loads(d)
1677 b[:] = data
1678 self.assertEqual(list(it), [])
1679
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001680 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001681
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001682 def test_iterator_length_hint(self):
1683 # Issue 27443: __length_hint__ can return negative integer
1684 ba = bytearray(b'ab')
1685 it = iter(ba)
1686 next(it)
1687 ba.clear()
1688 # Shouldn't raise an error
1689 self.assertEqual(list(it), [])
1690
Tobias Holl61d8c542021-01-13 17:16:40 +01001691 def test_repeat_after_setslice(self):
1692 # bpo-42924: * used to copy from the wrong memory location
1693 b = bytearray(b'abc')
1694 b[:2] = b'x'
1695 b1 = b * 1
1696 b3 = b * 3
1697 self.assertEqual(b1, b'xc')
1698 self.assertEqual(b1, b)
1699 self.assertEqual(b3, b'xcxcxc')
1700
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001701
Christian Heimes510711d2008-01-30 11:57:58 +00001702class AssortedBytesTest(unittest.TestCase):
1703 #
1704 # Test various combinations of bytes and bytearray
1705 #
1706
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001707 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001708 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001709 for f in str, repr:
1710 self.assertEqual(f(bytearray()), "bytearray(b'')")
1711 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1712 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1713 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1714 self.assertEqual(f(b"abc"), "b'abc'")
1715 self.assertEqual(f(b"'"), '''b"'"''') # '''
1716 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001717
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001718 @check_bytes_warnings
1719 def test_format(self):
1720 for b in b'abc', bytearray(b'abc'):
1721 self.assertEqual(format(b), str(b))
1722 self.assertEqual(format(b, ''), str(b))
1723 with self.assertRaisesRegex(TypeError,
1724 r'\b%s\b' % re.escape(type(b).__name__)):
1725 format(b, 's')
1726
Christian Heimes510711d2008-01-30 11:57:58 +00001727 def test_compare_bytes_to_bytearray(self):
1728 self.assertEqual(b"abc" == bytes(b"abc"), True)
1729 self.assertEqual(b"ab" != bytes(b"abc"), True)
1730 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1731 self.assertEqual(b"ab" < bytes(b"abc"), True)
1732 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1733 self.assertEqual(b"abc" > bytes(b"ab"), True)
1734
1735 self.assertEqual(b"abc" != bytes(b"abc"), False)
1736 self.assertEqual(b"ab" == bytes(b"abc"), False)
1737 self.assertEqual(b"ab" > bytes(b"abc"), False)
1738 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1739 self.assertEqual(b"abc" < bytes(b"ab"), False)
1740 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1741
1742 self.assertEqual(bytes(b"abc") == b"abc", True)
1743 self.assertEqual(bytes(b"ab") != b"abc", True)
1744 self.assertEqual(bytes(b"ab") <= b"abc", True)
1745 self.assertEqual(bytes(b"ab") < b"abc", True)
1746 self.assertEqual(bytes(b"abc") >= b"ab", True)
1747 self.assertEqual(bytes(b"abc") > b"ab", True)
1748
1749 self.assertEqual(bytes(b"abc") != b"abc", False)
1750 self.assertEqual(bytes(b"ab") == b"abc", False)
1751 self.assertEqual(bytes(b"ab") > b"abc", False)
1752 self.assertEqual(bytes(b"ab") >= b"abc", False)
1753 self.assertEqual(bytes(b"abc") < b"ab", False)
1754 self.assertEqual(bytes(b"abc") <= b"ab", False)
1755
Stefan Krah6e572b82013-01-26 13:06:36 +01001756 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001757 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001758 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001759 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001760 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001761 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001762
1763 def test_from_bytearray(self):
1764 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1765 buf = memoryview(sample)
1766 b = bytearray(buf)
1767 self.assertEqual(b, bytearray(sample))
1768
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001769 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001770 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001771 self.assertEqual(str(b''), "b''")
1772 self.assertEqual(str(b'x'), "b'x'")
1773 self.assertEqual(str(b'\x80'), "b'\\x80'")
1774 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1775 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1776 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001777
1778 def test_literal(self):
1779 tests = [
1780 (b"Wonderful spam", "Wonderful spam"),
1781 (br"Wonderful spam too", "Wonderful spam too"),
1782 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1783 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1784 ]
1785 for b, s in tests:
1786 self.assertEqual(b, bytearray(s, 'latin-1'))
1787 for c in range(128, 256):
1788 self.assertRaises(SyntaxError, eval,
1789 'b"%s"' % chr(c))
1790
Christian Heimes510711d2008-01-30 11:57:58 +00001791 def test_split_bytearray(self):
1792 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1793
1794 def test_rsplit_bytearray(self):
1795 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1796
Georg Brandleb2c9642008-05-30 12:05:02 +00001797 def test_return_self(self):
1798 # bytearray.replace must always return a new bytearray
1799 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001800 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001801
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001802 @unittest.skipUnless(sys.flags.bytes_warning,
1803 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001804 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001805 def bytes_warning():
Hai Shifcce8c62020-08-08 05:55:35 +08001806 return warnings_helper.check_warnings(('', BytesWarning))
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001807 with bytes_warning():
1808 b'' == ''
1809 with bytes_warning():
1810 '' == b''
1811 with bytes_warning():
1812 b'' != ''
1813 with bytes_warning():
1814 '' != b''
1815 with bytes_warning():
1816 bytearray(b'') == ''
1817 with bytes_warning():
1818 '' == bytearray(b'')
1819 with bytes_warning():
1820 bytearray(b'') != ''
1821 with bytes_warning():
1822 '' != bytearray(b'')
1823 with bytes_warning():
1824 b'\0' == 0
1825 with bytes_warning():
1826 0 == b'\0'
1827 with bytes_warning():
1828 b'\0' != 0
1829 with bytes_warning():
1830 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001831
Guido van Rossumd624f182006-04-24 13:47:05 +00001832 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001833 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001834 # __reversed__? (optimization)
1835
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001836 # XXX More string methods? (Those that don't use character properties)
1837
Neal Norwitz6968b052007-02-27 19:02:19 +00001838 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001839 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001840 # Unfortunately they are all bundled with tests that
1841 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001842
Guido van Rossum254348e2007-11-21 19:29:53 +00001843 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001844 # the rest that make sense (the code can be cleaned up to use modern
1845 # unittest methods at the same time).
1846
Martin Panter152a19c2016-04-06 06:37:17 +00001847class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001848 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001849 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001850
1851 def test_returns_new_copy(self):
1852 val = self.marshal(b'1234')
1853 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001854 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001855 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1856 method = getattr(val, methname)
1857 newval = method(3)
1858 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001859 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001860 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001861 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1862 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1863 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1864 newval = eval(expr)
1865 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001866 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001867 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001868 sep = self.marshal(b'')
1869 newval = sep.join([val])
1870 self.assertEqual(val, newval)
1871 self.assertIsNot(val, newval)
1872
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001873
Christian Heimes510711d2008-01-30 11:57:58 +00001874class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001875 def fixtype(self, obj):
1876 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001877 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001878 return super().fixtype(obj)
1879
Martin Panter152a19c2016-04-06 06:37:17 +00001880 contains_bytes = True
1881
Ezio Melotti0dceb562013-01-10 07:43:26 +02001882class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001883 type2test = bytearray
1884
Ezio Melotti0dceb562013-01-10 07:43:26 +02001885class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001886 type2test = bytes
1887
Georg Brandlc7885542007-03-06 19:16:20 +00001888
Ezio Melotti0dceb562013-01-10 07:43:26 +02001889class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001890
1891 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001892 self.assertTrue(issubclass(self.type2test, self.basetype))
1893 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001894
1895 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001896 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001897
1898 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001899 self.assertTrue(_a == _a)
1900 self.assertTrue(_a != _b)
1901 self.assertTrue(_a < _b)
1902 self.assertTrue(_a <= _b)
1903 self.assertTrue(_b >= _a)
1904 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001905 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001906
1907 # test concat of subclass instances
1908 self.assertEqual(a + b, _a + _b)
1909 self.assertEqual(a + b, a + _b)
1910 self.assertEqual(a + b, _a + b)
1911
1912 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001913 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001914
1915 def test_join(self):
1916 # Make sure join returns a NEW object for single item sequences
1917 # involving a subclass.
1918 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001919 s1 = self.type2test(b"abcd")
1920 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001921 self.assertIsNot(s1, s2)
1922 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001923
1924 # Test reverse, calling join on subclass
1925 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001926 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001927
1928 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001929 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001930 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001931 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001932 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001933 b = pickle.loads(pickle.dumps(a, proto))
1934 self.assertNotEqual(id(a), id(b))
1935 self.assertEqual(a, b)
1936 self.assertEqual(a.x, b.x)
1937 self.assertEqual(a.y, b.y)
1938 self.assertEqual(type(a), type(b))
1939 self.assertEqual(type(a.y), type(b.y))
1940
1941 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001942 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001943 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001944 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001945 for copy_method in (copy.copy, copy.deepcopy):
1946 b = copy_method(a)
1947 self.assertNotEqual(id(a), id(b))
1948 self.assertEqual(a, b)
1949 self.assertEqual(a.x, b.x)
1950 self.assertEqual(a.y, b.y)
1951 self.assertEqual(type(a), type(b))
1952 self.assertEqual(type(a.y), type(b.y))
1953
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001954 def test_fromhex(self):
1955 b = self.type2test.fromhex('1a2B30')
1956 self.assertEqual(b, b'\x1a\x2b\x30')
1957 self.assertIs(type(b), self.type2test)
1958
1959 class B1(self.basetype):
1960 def __new__(cls, value):
1961 me = self.basetype.__new__(cls, value)
1962 me.foo = 'bar'
1963 return me
1964
1965 b = B1.fromhex('1a2B30')
1966 self.assertEqual(b, b'\x1a\x2b\x30')
1967 self.assertIs(type(b), B1)
1968 self.assertEqual(b.foo, 'bar')
1969
1970 class B2(self.basetype):
1971 def __init__(me, *args, **kwargs):
1972 if self.basetype is not bytes:
1973 self.basetype.__init__(me, *args, **kwargs)
1974 me.foo = 'bar'
1975
1976 b = B2.fromhex('1a2B30')
1977 self.assertEqual(b, b'\x1a\x2b\x30')
1978 self.assertIs(type(b), B2)
1979 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001980
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001981
1982class ByteArraySubclass(bytearray):
1983 pass
1984
1985class BytesSubclass(bytes):
1986 pass
1987
Serhiy Storchaka15095802015-11-25 15:47:01 +02001988class OtherBytesSubclass(bytes):
1989 pass
1990
Ezio Melotti0dceb562013-01-10 07:43:26 +02001991class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001992 basetype = bytearray
1993 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001994
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001995 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001996 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001997 def __init__(me, newarg=1, *args, **kwargs):
1998 bytearray.__init__(me, *args, **kwargs)
1999 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00002000 x = subclass(4, source=b"abcd")
2001 self.assertEqual(x, b"abcd")
2002 x = subclass(newarg=4, source=b"abcd")
2003 self.assertEqual(x, b"abcd")
2004
2005
Ezio Melotti0dceb562013-01-10 07:43:26 +02002006class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03002007 basetype = bytes
2008 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00002009
2010
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00002011if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02002012 unittest.main()