blob: d550abfc65640d77ae55e1682794107833333841 [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
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001172
Ezio Melotti0dceb562013-01-10 07:43:26 +02001173class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001174 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001175
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001176 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001177 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001178 msg = "bytearray indices must be integers or slices"
1179 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001180 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001181
1182 def test_setitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001183 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001184 msg = "bytearray indices must be integers or slices"
1185 with self.assertRaisesRegex(TypeError, msg):
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001186 b['a'] = "python"
1187
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001188 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001189 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001190
Guido van Rossum254348e2007-11-21 19:29:53 +00001191 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001192 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001193 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001194 tfn = tempfile.mktemp()
1195 try:
1196 # Prepare
1197 with open(tfn, "wb") as f:
1198 f.write(short_sample)
1199 # Test readinto
1200 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001201 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001202 n = f.readinto(b)
1203 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001204 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001205 # Test writing in binary mode
1206 with open(tfn, "wb") as f:
1207 f.write(b)
1208 with open(tfn, "rb") as f:
1209 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001210 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001211 finally:
1212 try:
1213 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001214 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001215 pass
1216
Neal Norwitz6968b052007-02-27 19:02:19 +00001217 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001218 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001219 self.assertEqual(b.reverse(), None)
1220 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001221 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001222 b.reverse()
1223 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001224 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001225 b.reverse()
1226 self.assertFalse(b)
1227
Eli Bendersky4db28d32011-03-03 18:21:02 +00001228 def test_clear(self):
1229 b = bytearray(b'python')
1230 b.clear()
1231 self.assertEqual(b, b'')
1232
1233 b = bytearray(b'')
1234 b.clear()
1235 self.assertEqual(b, b'')
1236
1237 b = bytearray(b'')
1238 b.append(ord('r'))
1239 b.clear()
1240 b.append(ord('p'))
1241 self.assertEqual(b, b'p')
1242
1243 def test_copy(self):
1244 b = bytearray(b'abc')
1245 bb = b.copy()
1246 self.assertEqual(bb, b'abc')
1247
1248 b = bytearray(b'')
1249 bb = b.copy()
1250 self.assertEqual(bb, b'')
1251
1252 # test that it's indeed a copy and not a reference
1253 b = bytearray(b'abc')
1254 bb = b.copy()
1255 self.assertEqual(b, bb)
1256 self.assertIsNot(b, bb)
1257 bb.append(ord('d'))
1258 self.assertEqual(bb, b'abcd')
1259 self.assertEqual(b, b'abc')
1260
Guido van Rossumd624f182006-04-24 13:47:05 +00001261 def test_regexps(self):
1262 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001263 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001264 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001265 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001266
1267 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001268 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001269 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001270 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001271 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001272 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001273 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001274 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001275 try:
1276 b[3] = 0
1277 self.fail("Didn't raise IndexError")
1278 except IndexError:
1279 pass
1280 try:
1281 b[-10] = 0
1282 self.fail("Didn't raise IndexError")
1283 except IndexError:
1284 pass
1285 try:
1286 b[0] = 256
1287 self.fail("Didn't raise ValueError")
1288 except ValueError:
1289 pass
1290 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001291 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001292 self.fail("Didn't raise ValueError")
1293 except ValueError:
1294 pass
1295 try:
1296 b[0] = None
1297 self.fail("Didn't raise TypeError")
1298 except TypeError:
1299 pass
1300
1301 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001302 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001303 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001304 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001305 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001306 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001307 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001308 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001309
1310 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001311 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001312 self.assertEqual(list(b), list(range(10)))
1313
Guido van Rossum254348e2007-11-21 19:29:53 +00001314 b[0:5] = bytearray([1, 1, 1, 1, 1])
1315 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001316
1317 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001318 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001319
Guido van Rossum254348e2007-11-21 19:29:53 +00001320 b[0:0] = bytearray([0, 1, 2, 3, 4])
1321 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001322
Guido van Rossum254348e2007-11-21 19:29:53 +00001323 b[-7:-3] = bytearray([100, 101])
1324 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001325
1326 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001327 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001328
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001329 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001330 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 +00001331
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001332 b[3:] = b'foo'
1333 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1334
1335 b[:3] = memoryview(b'foo')
1336 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1337
1338 b[3:4] = []
1339 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1340
1341 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1342 ['a', 'b'], [b'a', b'b'], [[]]]:
1343 with self.assertRaises(TypeError):
1344 b[3:4] = elem
1345
1346 for elem in [[254, 255, 256], [-256, 9000]]:
1347 with self.assertRaises(ValueError):
1348 b[3:4] = elem
1349
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001350 def test_setslice_extend(self):
1351 # Exercise the resizing logic (see issue #19087)
1352 b = bytearray(range(100))
1353 self.assertEqual(list(b), list(range(100)))
1354 del b[:10]
1355 self.assertEqual(list(b), list(range(10, 100)))
1356 b.extend(range(100, 110))
1357 self.assertEqual(list(b), list(range(10, 110)))
1358
Antoine Pitrou25454112015-05-19 20:52:27 +02001359 def test_fifo_overrun(self):
1360 # Test for issue #23985, a buffer overrun when implementing a FIFO
1361 # Build Python in pydebug mode for best results.
1362 b = bytearray(10)
1363 b.pop() # Defeat expanding buffer off-by-one quirk
1364 del b[:1] # Advance start pointer without reallocating
1365 b += bytes(2) # Append exactly the number of deleted bytes
1366 del b # Free memory buffer, allowing pydebug verification
1367
1368 def test_del_expand(self):
1369 # Reducing the size should not expand the buffer (issue #23985)
1370 b = bytearray(10)
1371 size = sys.getsizeof(b)
1372 del b[:1]
1373 self.assertLessEqual(sys.getsizeof(b), size)
1374
Thomas Wouters376446d2006-12-19 08:30:14 +00001375 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -06001376 indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
1377 -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001378 for start in indices:
1379 for stop in indices:
1380 # Skip invalid step 0
1381 for step in indices[1:]:
1382 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001383 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001384 # Make sure we have a slice of exactly the right length,
1385 # but with different data.
1386 data = L[start:stop:step]
1387 data.reverse()
1388 L[start:stop:step] = data
1389 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001390 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001391
Thomas Wouters376446d2006-12-19 08:30:14 +00001392 del L[start:stop:step]
1393 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001394 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001395
Guido van Rossumd624f182006-04-24 13:47:05 +00001396 def test_setslice_trap(self):
1397 # This test verifies that we correctly handle assigning self
1398 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001399 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001400 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001401 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001402
Guido van Rossum13e57212006-04-27 22:54:26 +00001403 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001404 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001405 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001406 b += b"def"
1407 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001408 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001409 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001410 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001411 self.assertEqual(b, b"abcdefxyz")
1412 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001413 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001414 except TypeError:
1415 pass
1416 else:
1417 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001418
1419 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001420 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001421 b1 = b
1422 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001423 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001424 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001425 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001426
1427 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001428 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001429 b1 = b
1430 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001431 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001432 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001433 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001434
Guido van Rossum20188312006-05-05 15:15:40 +00001435 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001436 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001437 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001438 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001439 seq = [alloc]
1440 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001441 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001442 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001443 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001444 if alloc not in seq:
1445 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001446
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001447 def test_init_alloc(self):
1448 b = bytearray()
1449 def g():
1450 for i in range(1, 100):
1451 yield i
1452 a = list(b)
1453 self.assertEqual(a, list(range(1, len(a)+1)))
1454 self.assertEqual(len(b), len(a))
1455 self.assertLessEqual(len(b), i)
1456 alloc = b.__alloc__()
1457 self.assertGreater(alloc, len(b)) # including trailing null byte
1458 b.__init__(g())
1459 self.assertEqual(list(b), list(range(1, 100)))
1460 self.assertEqual(len(b), 99)
1461 alloc = b.__alloc__()
1462 self.assertGreater(alloc, len(b))
1463
Neal Norwitz6968b052007-02-27 19:02:19 +00001464 def test_extend(self):
1465 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001466 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001467 a.extend(a)
1468 self.assertEqual(a, orig + orig)
1469 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001470 a = bytearray(b'')
1471 # Test iterators that don't have a __length_hint__
1472 a.extend(map(int, orig * 25))
1473 a.extend(int(x) for x in orig * 25)
1474 self.assertEqual(a, orig * 50)
1475 self.assertEqual(a[-5:], orig)
1476 a = bytearray(b'')
1477 a.extend(iter(map(int, orig * 50)))
1478 self.assertEqual(a, orig * 50)
1479 self.assertEqual(a[-5:], orig)
1480 a = bytearray(b'')
1481 a.extend(list(map(int, orig * 50)))
1482 self.assertEqual(a, orig * 50)
1483 self.assertEqual(a[-5:], orig)
1484 a = bytearray(b'')
1485 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1486 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1487 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001488 a = bytearray(b'')
1489 a.extend([Indexable(ord('a'))])
1490 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001491
Neal Norwitz6968b052007-02-27 19:02:19 +00001492 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001493 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001494 b.remove(ord('l'))
1495 self.assertEqual(b, b'helo')
1496 b.remove(ord('l'))
1497 self.assertEqual(b, b'heo')
1498 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1499 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001500 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001501 # remove first and last
1502 b.remove(ord('o'))
1503 b.remove(ord('h'))
1504 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001505 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001506 b.remove(Indexable(ord('e')))
1507 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001508
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001509 # test values outside of the ascii range: (0, 127)
1510 c = bytearray([126, 127, 128, 129])
1511 c.remove(127)
1512 self.assertEqual(c, bytes([126, 128, 129]))
1513 c.remove(129)
1514 self.assertEqual(c, bytes([126, 128]))
1515
Neal Norwitz6968b052007-02-27 19:02:19 +00001516 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001517 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001518 self.assertEqual(b.pop(), ord('d'))
1519 self.assertEqual(b.pop(0), ord('w'))
1520 self.assertEqual(b.pop(-2), ord('r'))
1521 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001522 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001523 # test for issue #6846
1524 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001525
1526 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001527 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001528
Neal Norwitz6968b052007-02-27 19:02:19 +00001529 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001530 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001531 b.append(ord('o'))
1532 self.assertEqual(b, b'hello')
1533 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001534 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001535 b.append(ord('A'))
1536 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001537 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001538 b = bytearray()
1539 b.append(Indexable(ord('A')))
1540 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001541
1542 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001543 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001544 b.insert(1, ord('i'))
1545 b.insert(4, ord('i'))
1546 b.insert(-2, ord('i'))
1547 b.insert(1000, ord('i'))
1548 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001549 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001550 b = bytearray()
1551 b.insert(0, Indexable(ord('A')))
1552 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001553
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001554 def test_copied(self):
1555 # Issue 4348. Make sure that operations that don't mutate the array
1556 # copy the bytes.
1557 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001558 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001559
1560 t = bytearray([i for i in range(256)])
1561 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001562 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001563
Guido van Rossum254348e2007-11-21 19:29:53 +00001564 def test_partition_bytearray_doesnt_share_nullstring(self):
1565 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001566 self.assertEqual(b, b"")
1567 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001568 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001569 b += b"!"
1570 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001571 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001572 self.assertEqual(b, b"")
1573 self.assertEqual(c, b"")
1574 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001575 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001576 self.assertEqual(b, b"")
1577 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001578 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001579 b += b"!"
1580 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001581 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001582 self.assertEqual(b, b"")
1583 self.assertEqual(c, b"")
1584
Antoine Pitrou5504e892008-12-06 21:27:53 +00001585 def test_resize_forbidden(self):
1586 # #4509: can't resize a bytearray when there are buffer exports, even
1587 # if it wouldn't reallocate the underlying buffer.
1588 # Furthermore, no destructive changes to the buffer may be applied
1589 # before raising the error.
1590 b = bytearray(range(10))
1591 v = memoryview(b)
1592 def resize(n):
1593 b[1:-1] = range(n + 1, 2*n - 1)
1594 resize(10)
1595 orig = b[:]
1596 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001597 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001598 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001599 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001600 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001601 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001602 # Other operations implying resize
1603 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001604 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001605 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001606 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001607 def delitem():
1608 del b[1]
1609 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001610 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001611 # deleting a non-contiguous slice
1612 def delslice():
1613 b[1:-1:2] = b""
1614 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001615 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001616
Stefan Krah650c1e82015-02-03 21:43:23 +01001617 @test.support.cpython_only
1618 def test_obsolete_write_lock(self):
1619 from _testcapi import getbuffer_with_null_view
1620 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001621
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001622 def test_iterator_pickling2(self):
1623 orig = bytearray(b'abc')
1624 data = list(b'qwerty')
1625 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1626 # initial iterator
1627 itorig = iter(orig)
1628 d = pickle.dumps((itorig, orig), proto)
1629 it, b = pickle.loads(d)
1630 b[:] = data
1631 self.assertEqual(type(it), type(itorig))
1632 self.assertEqual(list(it), data)
1633
1634 # running iterator
1635 next(itorig)
1636 d = pickle.dumps((itorig, orig), proto)
1637 it, b = pickle.loads(d)
1638 b[:] = data
1639 self.assertEqual(type(it), type(itorig))
1640 self.assertEqual(list(it), data[1:])
1641
1642 # empty iterator
1643 for i in range(1, len(orig)):
1644 next(itorig)
1645 d = pickle.dumps((itorig, orig), proto)
1646 it, b = pickle.loads(d)
1647 b[:] = data
1648 self.assertEqual(type(it), type(itorig))
1649 self.assertEqual(list(it), data[len(orig):])
1650
1651 # exhausted iterator
1652 self.assertRaises(StopIteration, next, itorig)
1653 d = pickle.dumps((itorig, orig), proto)
1654 it, b = pickle.loads(d)
1655 b[:] = data
1656 self.assertEqual(list(it), [])
1657
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001658 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001659
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001660 def test_iterator_length_hint(self):
1661 # Issue 27443: __length_hint__ can return negative integer
1662 ba = bytearray(b'ab')
1663 it = iter(ba)
1664 next(it)
1665 ba.clear()
1666 # Shouldn't raise an error
1667 self.assertEqual(list(it), [])
1668
1669
Christian Heimes510711d2008-01-30 11:57:58 +00001670class AssortedBytesTest(unittest.TestCase):
1671 #
1672 # Test various combinations of bytes and bytearray
1673 #
1674
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001675 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001676 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001677 for f in str, repr:
1678 self.assertEqual(f(bytearray()), "bytearray(b'')")
1679 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1680 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1681 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1682 self.assertEqual(f(b"abc"), "b'abc'")
1683 self.assertEqual(f(b"'"), '''b"'"''') # '''
1684 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001685
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001686 @check_bytes_warnings
1687 def test_format(self):
1688 for b in b'abc', bytearray(b'abc'):
1689 self.assertEqual(format(b), str(b))
1690 self.assertEqual(format(b, ''), str(b))
1691 with self.assertRaisesRegex(TypeError,
1692 r'\b%s\b' % re.escape(type(b).__name__)):
1693 format(b, 's')
1694
Christian Heimes510711d2008-01-30 11:57:58 +00001695 def test_compare_bytes_to_bytearray(self):
1696 self.assertEqual(b"abc" == bytes(b"abc"), True)
1697 self.assertEqual(b"ab" != bytes(b"abc"), True)
1698 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1699 self.assertEqual(b"ab" < bytes(b"abc"), True)
1700 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1701 self.assertEqual(b"abc" > bytes(b"ab"), True)
1702
1703 self.assertEqual(b"abc" != bytes(b"abc"), False)
1704 self.assertEqual(b"ab" == bytes(b"abc"), False)
1705 self.assertEqual(b"ab" > bytes(b"abc"), False)
1706 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1707 self.assertEqual(b"abc" < bytes(b"ab"), False)
1708 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1709
1710 self.assertEqual(bytes(b"abc") == b"abc", True)
1711 self.assertEqual(bytes(b"ab") != b"abc", True)
1712 self.assertEqual(bytes(b"ab") <= b"abc", True)
1713 self.assertEqual(bytes(b"ab") < b"abc", True)
1714 self.assertEqual(bytes(b"abc") >= b"ab", True)
1715 self.assertEqual(bytes(b"abc") > b"ab", True)
1716
1717 self.assertEqual(bytes(b"abc") != b"abc", False)
1718 self.assertEqual(bytes(b"ab") == b"abc", False)
1719 self.assertEqual(bytes(b"ab") > b"abc", False)
1720 self.assertEqual(bytes(b"ab") >= b"abc", False)
1721 self.assertEqual(bytes(b"abc") < b"ab", False)
1722 self.assertEqual(bytes(b"abc") <= b"ab", False)
1723
Stefan Krah6e572b82013-01-26 13:06:36 +01001724 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001725 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001726 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001727 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001728 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001729 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001730
1731 def test_from_bytearray(self):
1732 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1733 buf = memoryview(sample)
1734 b = bytearray(buf)
1735 self.assertEqual(b, bytearray(sample))
1736
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001737 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001738 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001739 self.assertEqual(str(b''), "b''")
1740 self.assertEqual(str(b'x'), "b'x'")
1741 self.assertEqual(str(b'\x80'), "b'\\x80'")
1742 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1743 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1744 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001745
1746 def test_literal(self):
1747 tests = [
1748 (b"Wonderful spam", "Wonderful spam"),
1749 (br"Wonderful spam too", "Wonderful spam too"),
1750 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1751 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1752 ]
1753 for b, s in tests:
1754 self.assertEqual(b, bytearray(s, 'latin-1'))
1755 for c in range(128, 256):
1756 self.assertRaises(SyntaxError, eval,
1757 'b"%s"' % chr(c))
1758
Christian Heimes510711d2008-01-30 11:57:58 +00001759 def test_split_bytearray(self):
1760 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1761
1762 def test_rsplit_bytearray(self):
1763 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1764
Georg Brandleb2c9642008-05-30 12:05:02 +00001765 def test_return_self(self):
1766 # bytearray.replace must always return a new bytearray
1767 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001768 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001769
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001770 @unittest.skipUnless(sys.flags.bytes_warning,
1771 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001772 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001773 def bytes_warning():
Hai Shifcce8c62020-08-08 05:55:35 +08001774 return warnings_helper.check_warnings(('', BytesWarning))
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001775 with bytes_warning():
1776 b'' == ''
1777 with bytes_warning():
1778 '' == b''
1779 with bytes_warning():
1780 b'' != ''
1781 with bytes_warning():
1782 '' != b''
1783 with bytes_warning():
1784 bytearray(b'') == ''
1785 with bytes_warning():
1786 '' == bytearray(b'')
1787 with bytes_warning():
1788 bytearray(b'') != ''
1789 with bytes_warning():
1790 '' != bytearray(b'')
1791 with bytes_warning():
1792 b'\0' == 0
1793 with bytes_warning():
1794 0 == b'\0'
1795 with bytes_warning():
1796 b'\0' != 0
1797 with bytes_warning():
1798 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001799
Guido van Rossumd624f182006-04-24 13:47:05 +00001800 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001801 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001802 # __reversed__? (optimization)
1803
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001804 # XXX More string methods? (Those that don't use character properties)
1805
Neal Norwitz6968b052007-02-27 19:02:19 +00001806 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001807 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001808 # Unfortunately they are all bundled with tests that
1809 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001810
Guido van Rossum254348e2007-11-21 19:29:53 +00001811 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001812 # the rest that make sense (the code can be cleaned up to use modern
1813 # unittest methods at the same time).
1814
Martin Panter152a19c2016-04-06 06:37:17 +00001815class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001816 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001817 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001818
1819 def test_returns_new_copy(self):
1820 val = self.marshal(b'1234')
1821 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001822 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001823 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1824 method = getattr(val, methname)
1825 newval = method(3)
1826 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001827 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001828 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001829 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1830 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1831 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1832 newval = eval(expr)
1833 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001834 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001835 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001836 sep = self.marshal(b'')
1837 newval = sep.join([val])
1838 self.assertEqual(val, newval)
1839 self.assertIsNot(val, newval)
1840
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001841
Christian Heimes510711d2008-01-30 11:57:58 +00001842class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001843 def fixtype(self, obj):
1844 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001845 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001846 return super().fixtype(obj)
1847
Martin Panter152a19c2016-04-06 06:37:17 +00001848 contains_bytes = True
1849
Ezio Melotti0dceb562013-01-10 07:43:26 +02001850class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001851 type2test = bytearray
1852
Ezio Melotti0dceb562013-01-10 07:43:26 +02001853class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001854 type2test = bytes
1855
Georg Brandlc7885542007-03-06 19:16:20 +00001856
Ezio Melotti0dceb562013-01-10 07:43:26 +02001857class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001858
1859 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001860 self.assertTrue(issubclass(self.type2test, self.basetype))
1861 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001862
1863 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001864 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001865
1866 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001867 self.assertTrue(_a == _a)
1868 self.assertTrue(_a != _b)
1869 self.assertTrue(_a < _b)
1870 self.assertTrue(_a <= _b)
1871 self.assertTrue(_b >= _a)
1872 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001873 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001874
1875 # test concat of subclass instances
1876 self.assertEqual(a + b, _a + _b)
1877 self.assertEqual(a + b, a + _b)
1878 self.assertEqual(a + b, _a + b)
1879
1880 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001881 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001882
1883 def test_join(self):
1884 # Make sure join returns a NEW object for single item sequences
1885 # involving a subclass.
1886 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001887 s1 = self.type2test(b"abcd")
1888 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001889 self.assertIsNot(s1, s2)
1890 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001891
1892 # Test reverse, calling join on subclass
1893 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001894 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001895
1896 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001897 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001898 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001899 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001900 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001901 b = pickle.loads(pickle.dumps(a, proto))
1902 self.assertNotEqual(id(a), id(b))
1903 self.assertEqual(a, b)
1904 self.assertEqual(a.x, b.x)
1905 self.assertEqual(a.y, b.y)
1906 self.assertEqual(type(a), type(b))
1907 self.assertEqual(type(a.y), type(b.y))
1908
1909 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001910 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001911 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001912 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001913 for copy_method in (copy.copy, copy.deepcopy):
1914 b = copy_method(a)
1915 self.assertNotEqual(id(a), id(b))
1916 self.assertEqual(a, b)
1917 self.assertEqual(a.x, b.x)
1918 self.assertEqual(a.y, b.y)
1919 self.assertEqual(type(a), type(b))
1920 self.assertEqual(type(a.y), type(b.y))
1921
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001922 def test_fromhex(self):
1923 b = self.type2test.fromhex('1a2B30')
1924 self.assertEqual(b, b'\x1a\x2b\x30')
1925 self.assertIs(type(b), self.type2test)
1926
1927 class B1(self.basetype):
1928 def __new__(cls, value):
1929 me = self.basetype.__new__(cls, value)
1930 me.foo = 'bar'
1931 return me
1932
1933 b = B1.fromhex('1a2B30')
1934 self.assertEqual(b, b'\x1a\x2b\x30')
1935 self.assertIs(type(b), B1)
1936 self.assertEqual(b.foo, 'bar')
1937
1938 class B2(self.basetype):
1939 def __init__(me, *args, **kwargs):
1940 if self.basetype is not bytes:
1941 self.basetype.__init__(me, *args, **kwargs)
1942 me.foo = 'bar'
1943
1944 b = B2.fromhex('1a2B30')
1945 self.assertEqual(b, b'\x1a\x2b\x30')
1946 self.assertIs(type(b), B2)
1947 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001948
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001949
1950class ByteArraySubclass(bytearray):
1951 pass
1952
1953class BytesSubclass(bytes):
1954 pass
1955
Serhiy Storchaka15095802015-11-25 15:47:01 +02001956class OtherBytesSubclass(bytes):
1957 pass
1958
Ezio Melotti0dceb562013-01-10 07:43:26 +02001959class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001960 basetype = bytearray
1961 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001962
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001963 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001964 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001965 def __init__(me, newarg=1, *args, **kwargs):
1966 bytearray.__init__(me, *args, **kwargs)
1967 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001968 x = subclass(4, source=b"abcd")
1969 self.assertEqual(x, b"abcd")
1970 x = subclass(newarg=4, source=b"abcd")
1971 self.assertEqual(x, b"abcd")
1972
1973
Ezio Melotti0dceb562013-01-10 07:43:26 +02001974class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001975 basetype = bytes
1976 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001977
1978
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001979if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001980 unittest.main()