blob: bbd45c75298e72ac0427a4a284673ae21c38a520 [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
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000015import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010016
Benjamin Petersonee8712c2008-05-20 21:35:26 +000017import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000018import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030019import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010020from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000021
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000022
23if sys.flags.bytes_warning:
24 def check_bytes_warnings(func):
25 @functools.wraps(func)
26 def wrapper(*args, **kw):
27 with test.support.check_warnings(('', BytesWarning)):
28 return func(*args, **kw)
29 return wrapper
30else:
31 # no-op
32 def check_bytes_warnings(func):
33 return func
34
35
Georg Brandl9a54d7c2008-07-16 23:15:30 +000036class Indexable:
37 def __init__(self, value=0):
38 self.value = value
39 def __index__(self):
40 return self.value
41
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042
Ezio Melotti0dceb562013-01-10 07:43:26 +020043class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000044
45 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000046 b = self.type2test()
47 self.assertEqual(type(b), self.type2test)
48 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000049
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000050 def test_copy(self):
51 a = self.type2test(b"abcd")
52 for copy_method in (copy.copy, copy.deepcopy):
53 b = copy_method(a)
54 self.assertEqual(a, b)
55 self.assertEqual(type(a), type(b))
56
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000057 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000058 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000059 self.assertEqual(len(b), 0)
60 self.assertRaises(IndexError, lambda: b[0])
61 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000062 self.assertRaises(IndexError, lambda: b[sys.maxsize])
63 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000064 self.assertRaises(IndexError, lambda: b[10**100])
65 self.assertRaises(IndexError, lambda: b[-1])
66 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000067 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
69 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000070 self.assertRaises(IndexError, lambda: b[-10**100])
71
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030072 def test_from_iterable(self):
73 b = self.type2test(range(256))
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertEqual(len(b), 256)
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030075 self.assertEqual(list(b), list(range(256)))
76
77 # Non-sequence iterable.
78 b = self.type2test({42})
79 self.assertEqual(b, b"*")
80 b = self.type2test({43, 45})
81 self.assertIn(tuple(b), {(43, 45), (45, 43)})
82
83 # Iterator that has a __length_hint__.
84 b = self.type2test(iter(range(256)))
85 self.assertEqual(len(b), 256)
86 self.assertEqual(list(b), list(range(256)))
87
88 # Iterator that doesn't have a __length_hint__.
89 b = self.type2test(i for i in range(256) if i % 2)
90 self.assertEqual(len(b), 128)
91 self.assertEqual(list(b), list(range(256))[1::2])
92
93 # Sequence without __iter__.
94 class S:
95 def __getitem__(self, i):
96 return (1, 2, 3)[i]
97 b = self.type2test(S())
98 self.assertEqual(b, b"\x01\x02\x03")
99
100 def test_from_tuple(self):
101 # There is a special case for tuples.
102 b = self.type2test(tuple(range(256)))
103 self.assertEqual(len(b), 256)
104 self.assertEqual(list(b), list(range(256)))
105 b = self.type2test((1, 2, 3))
106 self.assertEqual(b, b"\x01\x02\x03")
107
108 def test_from_list(self):
109 # There is a special case for lists.
110 b = self.type2test(list(range(256)))
111 self.assertEqual(len(b), 256)
112 self.assertEqual(list(b), list(range(256)))
113 b = self.type2test([1, 2, 3])
114 self.assertEqual(b, b"\x01\x02\x03")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000115
Serhiy Storchaka914f9a02018-10-21 15:25:53 +0300116 def test_from_mutating_list(self):
117 # Issue #34973: Crash in bytes constructor with mutating list.
118 class X:
119 def __index__(self):
120 a.clear()
121 return 42
122 a = [X(), X()]
123 self.assertEqual(bytes(a), b'*')
124
125 class Y:
126 def __index__(self):
127 if len(a) < 1000:
128 a.append(self)
129 return 42
130 a = [Y()]
131 self.assertEqual(bytes(a), b'*' * 1000) # should not crash
132
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000133 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000134 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
135 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000137 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
138 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000139
INADA Naokia634e232017-01-06 17:32:01 +0900140 def test_from_buffer(self):
141 a = self.type2test(array.array('B', [1, 2, 3]))
142 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300143 a = self.type2test(b"\x01\x02\x03")
144 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900145
Serhiy Storchakae8904212018-10-15 00:02:57 +0300146 # Issues #29159 and #34974.
147 # Fallback when __index__ raises a TypeError
INADA Naokia634e232017-01-06 17:32:01 +0900148 class B(bytes):
149 def __index__(self):
150 raise TypeError
151
152 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
153
Guido van Rossum98297ee2007-11-06 21:34:58 +0000154 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000155 self.assertEqual(self.type2test(0), b'')
156 self.assertEqual(self.type2test(1), b'\x00')
157 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
158 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000159
Benjamin Peterson4c045832010-04-16 22:35:32 +0000160 self.assertEqual(self.type2test('0', 'ascii'), b'0')
161 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000162 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000163
164 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000165 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000166 class C:
167 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000168 self.assertRaises(TypeError, self.type2test, ["0"])
169 self.assertRaises(TypeError, self.type2test, [0.0])
170 self.assertRaises(TypeError, self.type2test, [None])
171 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300172 self.assertRaises(TypeError, self.type2test, encoding='ascii')
173 self.assertRaises(TypeError, self.type2test, errors='ignore')
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200174 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
175 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
176 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
177 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
178 self.assertRaises(TypeError, self.type2test, '')
179 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
180 self.assertRaises(TypeError, self.type2test, '', b'ascii')
181 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000182
183 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000184 self.assertRaises(ValueError, self.type2test, [-1])
185 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
186 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
187 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
188 self.assertRaises(ValueError, self.type2test, [-10**100])
189 self.assertRaises(ValueError, self.type2test, [256])
190 self.assertRaises(ValueError, self.type2test, [257])
191 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
192 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
193 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000194
Antoine Pitroucc231542014-11-02 18:40:09 +0100195 @bigaddrspacetest
196 def test_constructor_overflow(self):
197 size = MAX_Py_ssize_t
198 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
199 try:
200 # Should either pass or raise an error (e.g. on debug builds with
201 # additional malloc() overhead), but shouldn't crash.
202 bytearray(size - 4)
203 except (OverflowError, MemoryError):
204 pass
205
Serhiy Storchakae8904212018-10-15 00:02:57 +0300206 def test_constructor_exceptions(self):
207 # Issue #34974: bytes and bytearray constructors replace unexpected
208 # exceptions.
209 class BadInt:
210 def __index__(self):
211 1/0
212 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
213 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
214
215 class BadIterable:
216 def __iter__(self):
217 1/0
218 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
219
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000220 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000221 b1 = self.type2test([1, 2, 3])
222 b2 = self.type2test([1, 2, 3])
223 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000224
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000225 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000226 self.assertTrue(b2 != b3)
227 self.assertTrue(b1 <= b2)
228 self.assertTrue(b1 <= b3)
229 self.assertTrue(b1 < b3)
230 self.assertTrue(b1 >= b2)
231 self.assertTrue(b3 >= b2)
232 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000233
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000234 self.assertFalse(b1 != b2)
235 self.assertFalse(b2 == b3)
236 self.assertFalse(b1 > b2)
237 self.assertFalse(b1 > b3)
238 self.assertFalse(b1 >= b3)
239 self.assertFalse(b1 < b2)
240 self.assertFalse(b3 < b2)
241 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000242
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000243 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000244 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000245 # Byte comparisons with unicode should always fail!
246 # Test this for all expected byte orders and Unicode character
247 # sizes.
248 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
249 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
250 False)
251 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
252 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
253 False)
254 self.assertEqual(self.type2test() == str(), False)
255 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000256
257 def test_reversed(self):
258 input = list(map(ord, "Hello"))
259 b = self.type2test(input)
260 output = list(reversed(b))
261 input.reverse()
262 self.assertEqual(output, input)
263
264 def test_getslice(self):
265 def by(s):
266 return self.type2test(map(ord, s))
267 b = by("Hello, world")
268
269 self.assertEqual(b[:5], by("Hello"))
270 self.assertEqual(b[1:5], by("ello"))
271 self.assertEqual(b[5:7], by(", "))
272 self.assertEqual(b[7:], by("world"))
273 self.assertEqual(b[7:12], by("world"))
274 self.assertEqual(b[7:100], by("world"))
275
276 self.assertEqual(b[:-7], by("Hello"))
277 self.assertEqual(b[-11:-7], by("ello"))
278 self.assertEqual(b[-7:-5], by(", "))
279 self.assertEqual(b[-5:], by("world"))
280 self.assertEqual(b[-5:12], by("world"))
281 self.assertEqual(b[-5:100], by("world"))
282 self.assertEqual(b[-100:5], by("Hello"))
283
284 def test_extended_getslice(self):
285 # Test extended slicing by comparing with list slicing.
286 L = list(range(255))
287 b = self.type2test(L)
Zackery Spytz14514d92019-05-17 01:13:03 -0600288 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Christian Heimes510711d2008-01-30 11:57:58 +0000289 for start in indices:
290 for stop in indices:
291 # Skip step 0 (invalid)
292 for step in indices[1:]:
293 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
294
295 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000296 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000297 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000298 b = self.type2test(sample, enc)
299 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000300 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
301 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000302 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000303
304 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300305 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000306 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000307 b = self.type2test(sample, enc)
308 self.assertEqual(b.decode(enc), sample)
309 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000310 b = self.type2test(sample, "latin-1")
311 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
312 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
313 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000314 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000315 # Default encoding is utf-8
316 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000317
318 def test_from_int(self):
319 b = self.type2test(0)
320 self.assertEqual(b, self.type2test())
321 b = self.type2test(10)
322 self.assertEqual(b, self.type2test([0]*10))
323 b = self.type2test(10000)
324 self.assertEqual(b, self.type2test([0]*10000))
325
326 def test_concat(self):
327 b1 = self.type2test(b"abc")
328 b2 = self.type2test(b"def")
329 self.assertEqual(b1 + b2, b"abcdef")
330 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
331 self.assertEqual(bytes(b"def") + b1, b"defabc")
332 self.assertRaises(TypeError, lambda: b1 + "def")
333 self.assertRaises(TypeError, lambda: "abc" + b2)
334
335 def test_repeat(self):
336 for b in b"abc", self.type2test(b"abc"):
337 self.assertEqual(b * 3, b"abcabcabc")
338 self.assertEqual(b * 0, b"")
339 self.assertEqual(b * -1, b"")
340 self.assertRaises(TypeError, lambda: b * 3.14)
341 self.assertRaises(TypeError, lambda: 3.14 * b)
342 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000343 with self.assertRaises((OverflowError, MemoryError)):
344 c = b * sys.maxsize
345 with self.assertRaises((OverflowError, MemoryError)):
346 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000347
348 def test_repeat_1char(self):
349 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
350
351 def test_contains(self):
352 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000353 self.assertIn(ord('a'), b)
354 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000355 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000356 self.assertRaises(ValueError, lambda: 300 in b)
357 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300358 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000359 self.assertRaises(TypeError, lambda: None in b)
360 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
361 self.assertRaises(TypeError, lambda: "a" in b)
362 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000363 self.assertIn(f(b""), b)
364 self.assertIn(f(b"a"), b)
365 self.assertIn(f(b"b"), b)
366 self.assertIn(f(b"c"), b)
367 self.assertIn(f(b"ab"), b)
368 self.assertIn(f(b"bc"), b)
369 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000370 self.assertNotIn(f(b"ac"), b)
371 self.assertNotIn(f(b"d"), b)
372 self.assertNotIn(f(b"dab"), b)
373 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000374
375 def test_fromhex(self):
376 self.assertRaises(TypeError, self.type2test.fromhex)
377 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000378 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000379 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000380 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
381 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200382
383 # check that ASCII whitespace is ignored
384 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
385 for c in "\x09\x0A\x0B\x0C\x0D\x20":
386 self.assertEqual(self.type2test.fromhex(c), self.type2test())
387 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
388 self.assertRaises(ValueError, self.type2test.fromhex, c)
389
Ezio Melottib3aedd42010-11-20 19:04:17 +0000390 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000391 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
392 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
393 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
394 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
395 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
396 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
397
Victor Stinner2bf89932015-10-14 11:25:33 +0200398 for data, pos in (
399 # invalid first hexadecimal character
400 ('12 x4 56', 3),
401 # invalid second hexadecimal character
402 ('12 3x 56', 4),
403 # two invalid hexadecimal characters
404 ('12 xy 56', 3),
405 # test non-ASCII string
406 ('12 3\xff 56', 4),
407 ):
408 with self.assertRaises(ValueError) as cm:
409 self.type2test.fromhex(data)
410 self.assertIn('at position %s' % pos, str(cm.exception))
411
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000412 def test_hex(self):
413 self.assertRaises(TypeError, self.type2test.hex)
414 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000415 self.assertEqual(self.type2test(b"").hex(), "")
416 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
417 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
418 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000419
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700420 def test_hex_separator_basics(self):
421 three_bytes = self.type2test(b'\xb9\x01\xef')
422 self.assertEqual(three_bytes.hex(), 'b901ef')
423 with self.assertRaises(ValueError):
424 three_bytes.hex('')
425 with self.assertRaises(ValueError):
426 three_bytes.hex('xx')
427 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
428 with self.assertRaises(TypeError):
429 three_bytes.hex(None, 0)
430 with self.assertRaises(ValueError):
431 three_bytes.hex('\xff')
432 with self.assertRaises(ValueError):
433 three_bytes.hex(b'\xff')
434 with self.assertRaises(ValueError):
435 three_bytes.hex(b'\x80')
436 with self.assertRaises(ValueError):
437 three_bytes.hex(chr(0x100))
438 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
439 self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef')
440 self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef')
441 self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef')
442 self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef')
443 self.assertEqual(three_bytes.hex(':', 3), 'b901ef')
444 self.assertEqual(three_bytes.hex(':', 4), 'b901ef')
445 self.assertEqual(three_bytes.hex(':', -4), 'b901ef')
446 self.assertEqual(three_bytes.hex(':'), 'b9:01:ef')
447 self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef')
448 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
449 self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef')
450 self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef')
451 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
452 self.assertEqual(three_bytes.hex('*', -2), 'b901*ef')
453
454 value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
455 self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030')
456
457 def test_hex_separator_five_bytes(self):
458 five_bytes = self.type2test(range(90,95))
459 self.assertEqual(five_bytes.hex(), '5a5b5c5d5e')
460
461 def test_hex_separator_six_bytes(self):
462 six_bytes = self.type2test(x*3 for x in range(1, 7))
463 self.assertEqual(six_bytes.hex(), '0306090c0f12')
464 self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12')
465 self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12')
466 self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12')
467 self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12')
468 self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12')
469 self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12')
470 self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12')
471 self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12')
472 self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12')
473 self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f@12')
474 self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12')
475 self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12')
476
Christian Heimes510711d2008-01-30 11:57:58 +0000477 def test_join(self):
478 self.assertEqual(self.type2test(b"").join([]), b"")
479 self.assertEqual(self.type2test(b"").join([b""]), b"")
480 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
481 lst = list(map(self.type2test, lst))
482 self.assertEqual(self.type2test(b"").join(lst), b"abc")
483 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
484 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200485 dot_join = self.type2test(b".:").join
486 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
487 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
488 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
489 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
490 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
491 # Stress it with many items
492 seq = [b"abc"] * 1000
493 expected = b"abc" + b".:abc" * 999
494 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400495 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200496 # Error handling and cleanup when some item in the middle of the
497 # sequence has the wrong type.
498 with self.assertRaises(TypeError):
499 dot_join([bytearray(b"ab"), "cd", b"ef"])
500 with self.assertRaises(TypeError):
501 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000502
Christian Heimes510711d2008-01-30 11:57:58 +0000503 def test_count(self):
504 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200505 i = 105
506 p = 112
507 w = 119
508
Christian Heimes510711d2008-01-30 11:57:58 +0000509 self.assertEqual(b.count(b'i'), 4)
510 self.assertEqual(b.count(b'ss'), 2)
511 self.assertEqual(b.count(b'w'), 0)
512
Antoine Pitrouac65d962011-10-20 23:54:17 +0200513 self.assertEqual(b.count(i), 4)
514 self.assertEqual(b.count(w), 0)
515
516 self.assertEqual(b.count(b'i', 6), 2)
517 self.assertEqual(b.count(b'p', 6), 2)
518 self.assertEqual(b.count(b'i', 1, 3), 1)
519 self.assertEqual(b.count(b'p', 7, 9), 1)
520
521 self.assertEqual(b.count(i, 6), 2)
522 self.assertEqual(b.count(p, 6), 2)
523 self.assertEqual(b.count(i, 1, 3), 1)
524 self.assertEqual(b.count(p, 7, 9), 1)
525
Christian Heimes510711d2008-01-30 11:57:58 +0000526 def test_startswith(self):
527 b = self.type2test(b'hello')
528 self.assertFalse(self.type2test().startswith(b"anything"))
529 self.assertTrue(b.startswith(b"hello"))
530 self.assertTrue(b.startswith(b"hel"))
531 self.assertTrue(b.startswith(b"h"))
532 self.assertFalse(b.startswith(b"hellow"))
533 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300534 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300535 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300536 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300537 self.assertIn('bytes', exc)
538 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000539
540 def test_endswith(self):
541 b = self.type2test(b'hello')
542 self.assertFalse(bytearray().endswith(b"anything"))
543 self.assertTrue(b.endswith(b"hello"))
544 self.assertTrue(b.endswith(b"llo"))
545 self.assertTrue(b.endswith(b"o"))
546 self.assertFalse(b.endswith(b"whello"))
547 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300548 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300549 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300550 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300551 self.assertIn('bytes', exc)
552 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000553
554 def test_find(self):
555 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200556 i = 105
557 w = 119
558
Christian Heimes510711d2008-01-30 11:57:58 +0000559 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000560 self.assertEqual(b.find(b'w'), -1)
561 self.assertEqual(b.find(b'mississippian'), -1)
562
Antoine Pitrouac65d962011-10-20 23:54:17 +0200563 self.assertEqual(b.find(i), 1)
564 self.assertEqual(b.find(w), -1)
565
566 self.assertEqual(b.find(b'ss', 3), 5)
567 self.assertEqual(b.find(b'ss', 1, 7), 2)
568 self.assertEqual(b.find(b'ss', 1, 3), -1)
569
570 self.assertEqual(b.find(i, 6), 7)
571 self.assertEqual(b.find(i, 1, 3), 1)
572 self.assertEqual(b.find(w, 1, 3), -1)
573
Victor Stinnerf8eac002011-12-18 01:17:41 +0100574 for index in (-1, 256, sys.maxsize + 1):
575 self.assertRaisesRegex(
576 ValueError, r'byte must be in range\(0, 256\)',
577 b.find, index)
578
Christian Heimes510711d2008-01-30 11:57:58 +0000579 def test_rfind(self):
580 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200581 i = 105
582 w = 119
583
Christian Heimes510711d2008-01-30 11:57:58 +0000584 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000585 self.assertEqual(b.rfind(b'w'), -1)
586 self.assertEqual(b.rfind(b'mississippian'), -1)
587
Antoine Pitrouac65d962011-10-20 23:54:17 +0200588 self.assertEqual(b.rfind(i), 10)
589 self.assertEqual(b.rfind(w), -1)
590
591 self.assertEqual(b.rfind(b'ss', 3), 5)
592 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
593
594 self.assertEqual(b.rfind(i, 1, 3), 1)
595 self.assertEqual(b.rfind(i, 3, 9), 7)
596 self.assertEqual(b.rfind(w, 1, 3), -1)
597
Christian Heimes510711d2008-01-30 11:57:58 +0000598 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200599 b = self.type2test(b'mississippi')
600 i = 105
601 w = 119
602
603 self.assertEqual(b.index(b'ss'), 2)
604 self.assertRaises(ValueError, b.index, b'w')
605 self.assertRaises(ValueError, b.index, b'mississippian')
606
607 self.assertEqual(b.index(i), 1)
608 self.assertRaises(ValueError, b.index, w)
609
610 self.assertEqual(b.index(b'ss', 3), 5)
611 self.assertEqual(b.index(b'ss', 1, 7), 2)
612 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
613
614 self.assertEqual(b.index(i, 6), 7)
615 self.assertEqual(b.index(i, 1, 3), 1)
616 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000617
618 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200619 b = self.type2test(b'mississippi')
620 i = 105
621 w = 119
622
623 self.assertEqual(b.rindex(b'ss'), 5)
624 self.assertRaises(ValueError, b.rindex, b'w')
625 self.assertRaises(ValueError, b.rindex, b'mississippian')
626
627 self.assertEqual(b.rindex(i), 10)
628 self.assertRaises(ValueError, b.rindex, w)
629
630 self.assertEqual(b.rindex(b'ss', 3), 5)
631 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
632
633 self.assertEqual(b.rindex(i, 1, 3), 1)
634 self.assertEqual(b.rindex(i, 3, 9), 7)
635 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000636
Ethan Furmanb95b5612015-01-23 20:05:18 -0800637 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300638 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800639 orig = b
640 b = b % b'world'
641 self.assertEqual(b, b'hello, world!')
642 self.assertEqual(orig, b'hello, %b!')
643 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300644 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800645 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200646 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200647 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800648 # issue 29714
649 b = self.type2test(b'hello,\x00%b!')
650 b = b % b'world'
651 self.assertEqual(b, b'hello,\x00world!')
652 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800653
654 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300655 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800656 orig = b
657 b %= b'world'
658 self.assertEqual(b, b'hello, world!')
659 self.assertEqual(orig, b'hello, %b!')
660 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300661 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800662 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200663 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200664 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800665 # issue 29714
666 b = self.type2test(b'hello,\x00%b!')
667 b %= b'world'
668 self.assertEqual(b, b'hello,\x00world!')
669 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300670
671 def test_rmod(self):
672 with self.assertRaises(TypeError):
673 object() % self.type2test(b'abc')
674 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800675
Christian Heimes510711d2008-01-30 11:57:58 +0000676 def test_replace(self):
677 b = self.type2test(b'mississippi')
678 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
679 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
680
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300681 def test_replace_int_error(self):
682 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
683
Christian Heimes510711d2008-01-30 11:57:58 +0000684 def test_split_string_error(self):
685 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300686 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
687
688 def test_split_int_error(self):
689 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
690 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000691
Antoine Pitrouf8453022010-01-12 22:05:42 +0000692 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000693 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
694 b = self.type2test(b)
695 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000696 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
697 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
698
Christian Heimes510711d2008-01-30 11:57:58 +0000699 def test_rsplit_unicodewhitespace(self):
700 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000701 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
702
703 def test_partition(self):
704 b = self.type2test(b'mississippi')
705 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000706 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000707
708 def test_rpartition(self):
709 b = self.type2test(b'mississippi')
710 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
711 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000712 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000713
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300714 def test_partition_string_error(self):
715 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
716 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
717
718 def test_partition_int_error(self):
719 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
720 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
721
Christian Heimes510711d2008-01-30 11:57:58 +0000722 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000723 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000724 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
725 b = self.type2test(b)
726 ps = pickle.dumps(b, proto)
727 q = pickle.loads(ps)
728 self.assertEqual(b, q)
729
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000730 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200731 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
732 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
733 it = itorg = iter(self.type2test(b))
734 data = list(self.type2test(b))
735 d = pickle.dumps(it, proto)
736 it = pickle.loads(d)
737 self.assertEqual(type(itorg), type(it))
738 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000739
Serhiy Storchakabad12572014-12-15 14:03:42 +0200740 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200741 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200742 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200743 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200744 d = pickle.dumps(it, proto)
745 it = pickle.loads(d)
746 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000747
Christian Heimes510711d2008-01-30 11:57:58 +0000748 def test_strip_bytearray(self):
749 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
750 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
751 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
752
753 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300754 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
755 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
756 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
757
758 def test_strip_int_error(self):
759 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
760 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
761 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000762
Eli Bendersky906b88f2011-07-29 07:05:08 +0300763 def test_center(self):
764 # Fill character can be either bytes or bytearray (issue 12380)
765 b = self.type2test(b'abc')
766 for fill_type in (bytes, bytearray):
767 self.assertEqual(b.center(7, fill_type(b'-')),
768 self.type2test(b'--abc--'))
769
770 def test_ljust(self):
771 # Fill character can be either bytes or bytearray (issue 12380)
772 b = self.type2test(b'abc')
773 for fill_type in (bytes, bytearray):
774 self.assertEqual(b.ljust(7, fill_type(b'-')),
775 self.type2test(b'abc----'))
776
777 def test_rjust(self):
778 # Fill character can be either bytes or bytearray (issue 12380)
779 b = self.type2test(b'abc')
780 for fill_type in (bytes, bytearray):
781 self.assertEqual(b.rjust(7, fill_type(b'-')),
782 self.type2test(b'----abc'))
783
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300784 def test_xjust_int_error(self):
785 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
786 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
787 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
788
Christian Heimes510711d2008-01-30 11:57:58 +0000789 def test_ord(self):
790 b = self.type2test(b'\0A\x7f\x80\xff')
791 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
792 [0, 65, 127, 128, 255])
793
Georg Brandlabc38772009-04-12 15:51:51 +0000794 def test_maketrans(self):
795 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 +0000796 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000797 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'
798 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000799 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
800 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
801
Jesus Ceaac451502011-04-20 17:09:23 +0200802 def test_none_arguments(self):
803 # issue 11828
804 b = self.type2test(b'hello')
805 l = self.type2test(b'l')
806 h = self.type2test(b'h')
807 x = self.type2test(b'x')
808 o = self.type2test(b'o')
809
810 self.assertEqual(2, b.find(l, None))
811 self.assertEqual(3, b.find(l, -2, None))
812 self.assertEqual(2, b.find(l, None, -2))
813 self.assertEqual(0, b.find(h, None, None))
814
815 self.assertEqual(3, b.rfind(l, None))
816 self.assertEqual(3, b.rfind(l, -2, None))
817 self.assertEqual(2, b.rfind(l, None, -2))
818 self.assertEqual(0, b.rfind(h, None, None))
819
820 self.assertEqual(2, b.index(l, None))
821 self.assertEqual(3, b.index(l, -2, None))
822 self.assertEqual(2, b.index(l, None, -2))
823 self.assertEqual(0, b.index(h, None, None))
824
825 self.assertEqual(3, b.rindex(l, None))
826 self.assertEqual(3, b.rindex(l, -2, None))
827 self.assertEqual(2, b.rindex(l, None, -2))
828 self.assertEqual(0, b.rindex(h, None, None))
829
830 self.assertEqual(2, b.count(l, None))
831 self.assertEqual(1, b.count(l, -2, None))
832 self.assertEqual(1, b.count(l, None, -2))
833 self.assertEqual(0, b.count(x, None, None))
834
835 self.assertEqual(True, b.endswith(o, None))
836 self.assertEqual(True, b.endswith(o, -2, None))
837 self.assertEqual(True, b.endswith(l, None, -2))
838 self.assertEqual(False, b.endswith(x, None, None))
839
840 self.assertEqual(True, b.startswith(h, None))
841 self.assertEqual(True, b.startswith(l, -2, None))
842 self.assertEqual(True, b.startswith(h, None, -2))
843 self.assertEqual(False, b.startswith(x, None, None))
844
Antoine Pitrouac65d962011-10-20 23:54:17 +0200845 def test_integer_arguments_out_of_byte_range(self):
846 b = self.type2test(b'hello')
847
848 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
849 self.assertRaises(ValueError, method, -1)
850 self.assertRaises(ValueError, method, 256)
851 self.assertRaises(ValueError, method, 9999)
852
Jesus Ceaac451502011-04-20 17:09:23 +0200853 def test_find_etc_raise_correct_error_messages(self):
854 # issue 11828
855 b = self.type2test(b'hello')
856 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300857 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200858 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300859 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200860 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300861 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200862 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300863 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200864 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300865 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200866 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300867 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200868 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300869 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200870 x, None, None, None)
871
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300872 def test_free_after_iterating(self):
873 test.support.check_free_after_iterating(self, iter, self.type2test)
874 test.support.check_free_after_iterating(self, reversed, self.type2test)
875
Martin Panter1b6c6da2016-08-27 08:35:02 +0000876 def test_translate(self):
877 b = self.type2test(b'hello')
878 rosetta = bytearray(range(256))
879 rosetta[ord('o')] = ord('e')
880
881 self.assertRaises(TypeError, b.translate)
882 self.assertRaises(TypeError, b.translate, None, None)
883 self.assertRaises(ValueError, b.translate, bytes(range(255)))
884
885 c = b.translate(rosetta, b'hello')
886 self.assertEqual(b, b'hello')
887 self.assertIsInstance(c, self.type2test)
888
889 c = b.translate(rosetta)
890 d = b.translate(rosetta, b'')
891 self.assertEqual(c, d)
892 self.assertEqual(c, b'helle')
893
894 c = b.translate(rosetta, b'l')
895 self.assertEqual(c, b'hee')
896 c = b.translate(None, b'e')
897 self.assertEqual(c, b'hllo')
898
899 # test delete as a keyword argument
900 c = b.translate(rosetta, delete=b'')
901 self.assertEqual(c, b'helle')
902 c = b.translate(rosetta, delete=b'l')
903 self.assertEqual(c, b'hee')
904 c = b.translate(None, delete=b'e')
905 self.assertEqual(c, b'hllo')
906
Christian Heimes510711d2008-01-30 11:57:58 +0000907
Ezio Melotti0dceb562013-01-10 07:43:26 +0200908class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000909 type2test = bytes
910
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400911 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200912 b = b'python'
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400913 msg = "byte indices must be integers or slices"
914 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200915 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400916
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000917 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200918 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000919 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000920 self.assertRaises(TypeError, f.readinto, b"")
921
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000922 def test_custom(self):
923 class A:
924 def __bytes__(self):
925 return b'abc'
926 self.assertEqual(bytes(A()), b'abc')
927 class A: pass
928 self.assertRaises(TypeError, bytes, A())
929 class A:
930 def __bytes__(self):
931 return None
932 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600933 class A:
934 def __bytes__(self):
935 return b'a'
936 def __index__(self):
937 return 42
938 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200939 # Issue #25766
940 class A(str):
941 def __bytes__(self):
942 return b'abc'
943 self.assertEqual(bytes(A('\u20ac')), b'abc')
944 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200945 # Issue #24731
946 class A:
947 def __bytes__(self):
948 return OtherBytesSubclass(b'abc')
949 self.assertEqual(bytes(A()), b'abc')
950 self.assertIs(type(bytes(A())), OtherBytesSubclass)
951 self.assertEqual(BytesSubclass(A()), b'abc')
952 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000953
Victor Stinner29e762c2011-01-05 03:33:28 +0000954 # Test PyBytes_FromFormat()
955 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200956 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200957 _testcapi = test.support.import_module('_testcapi')
958 from ctypes import pythonapi, py_object
959 from ctypes import (
960 c_int, c_uint,
961 c_long, c_ulong,
962 c_size_t, c_ssize_t,
963 c_char_p)
964
Victor Stinner29e762c2011-01-05 03:33:28 +0000965 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
966 PyBytes_FromFormat.restype = py_object
967
Victor Stinner03dab782015-10-14 00:21:35 +0200968 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000969 self.assertEqual(PyBytes_FromFormat(b'format'),
970 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200971 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
972 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000973
Victor Stinner03dab782015-10-14 00:21:35 +0200974 # test formatters
975 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
976 b'c=\0')
977 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
978 b'c=@')
979 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
980 b'c=\xff')
981 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
982 c_int(1), c_long(2),
983 c_size_t(3)),
984 b'd=1 ld=2 zd=3')
985 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
986 c_int(-1), c_long(-2),
987 c_size_t(-3)),
988 b'd=-1 ld=-2 zd=-3')
989 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
990 c_uint(123), c_ulong(456),
991 c_size_t(789)),
992 b'u=123 lu=456 zu=789')
993 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
994 b'i=123')
995 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
996 b'i=-123')
997 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
998 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200999
1000 sizeof_ptr = ctypes.sizeof(c_char_p)
1001
1002 if os.name == 'nt':
1003 # Windows (MSCRT)
1004 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
1005 def ptr_formatter(ptr):
1006 return (ptr_format % ptr)
1007 else:
1008 # UNIX (glibc)
1009 def ptr_formatter(ptr):
1010 return '%#x' % ptr
1011
Victor Stinner7ab986d2015-10-14 02:55:12 +02001012 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +02001013 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
1014 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +02001015 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
1016 b's=cstr')
1017
1018 # test minimum and maximum integer values
1019 size_max = c_size_t(-1).value
1020 for formatstr, ctypes_type, value, py_formatter in (
1021 (b'%d', c_int, _testcapi.INT_MIN, str),
1022 (b'%d', c_int, _testcapi.INT_MAX, str),
1023 (b'%ld', c_long, _testcapi.LONG_MIN, str),
1024 (b'%ld', c_long, _testcapi.LONG_MAX, str),
1025 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
1026 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
1027 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
1028 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +02001029 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +02001030 ):
1031 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
1032 py_formatter(value).encode('ascii')),
1033
1034 # width and precision (width is currently ignored)
1035 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
1036 b'a')
1037 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
1038 b'abc')
1039
1040 # '%%' formatter
1041 self.assertEqual(PyBytes_FromFormat(b'%%'),
1042 b'%')
1043 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
1044 b'[%]')
1045 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
1046 b'%_')
1047 self.assertEqual(PyBytes_FromFormat(b'%%s'),
1048 b'%s')
1049
1050 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +00001051 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +02001052 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
1053 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +00001054
Victor Stinner03dab782015-10-14 00:21:35 +02001055 # Issue #19969: %c must raise OverflowError for values
1056 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +01001057 self.assertRaises(OverflowError,
1058 PyBytes_FromFormat, b'%c', c_int(-1))
1059 self.assertRaises(OverflowError,
1060 PyBytes_FromFormat, b'%c', c_int(256))
1061
Serhiy Storchaka44cc4822019-01-12 09:22:29 +02001062 # Issue #33817: empty strings
1063 self.assertEqual(PyBytes_FromFormat(b''),
1064 b'')
1065 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1066 b'')
1067
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001068 def test_bytes_blocking(self):
1069 class IterationBlocked(list):
1070 __bytes__ = None
1071 i = [0, 1, 2, 3]
1072 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1073 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1074
1075 # At least in CPython, because bytes.__new__ and the C API
1076 # PyBytes_FromObject have different fallback rules, integer
1077 # fallback is handled specially, so test separately.
1078 class IntBlocked(int):
1079 __bytes__ = None
1080 self.assertEqual(bytes(3), b'\0\0\0')
1081 self.assertRaises(TypeError, bytes, IntBlocked(3))
1082
1083 # While there is no separately-defined rule for handling bytes
1084 # subclasses differently from other buffer-interface classes,
1085 # an implementation may well special-case them (as CPython 2.x
1086 # str did), so test them separately.
1087 class BytesSubclassBlocked(bytes):
1088 __bytes__ = None
1089 self.assertEqual(bytes(b'ab'), b'ab')
1090 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1091
1092 class BufferBlocked(bytearray):
1093 __bytes__ = None
1094 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1095 self.assertEqual(bytes(ba), b'ab')
1096 self.assertRaises(TypeError, bytes, bb)
1097
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001098
Ezio Melotti0dceb562013-01-10 07:43:26 +02001099class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001100 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001101
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001102 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001103 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001104 msg = "bytearray indices must be integers or slices"
1105 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001106 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001107
1108 def test_setitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001109 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001110 msg = "bytearray indices must be integers or slices"
1111 with self.assertRaisesRegex(TypeError, msg):
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001112 b['a'] = "python"
1113
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001114 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001115 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001116
Guido van Rossum254348e2007-11-21 19:29:53 +00001117 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001118 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001119 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001120 tfn = tempfile.mktemp()
1121 try:
1122 # Prepare
1123 with open(tfn, "wb") as f:
1124 f.write(short_sample)
1125 # Test readinto
1126 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001127 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001128 n = f.readinto(b)
1129 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001130 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001131 # Test writing in binary mode
1132 with open(tfn, "wb") as f:
1133 f.write(b)
1134 with open(tfn, "rb") as f:
1135 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001136 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001137 finally:
1138 try:
1139 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001140 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001141 pass
1142
Neal Norwitz6968b052007-02-27 19:02:19 +00001143 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001144 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001145 self.assertEqual(b.reverse(), None)
1146 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001147 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001148 b.reverse()
1149 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001150 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001151 b.reverse()
1152 self.assertFalse(b)
1153
Eli Bendersky4db28d32011-03-03 18:21:02 +00001154 def test_clear(self):
1155 b = bytearray(b'python')
1156 b.clear()
1157 self.assertEqual(b, b'')
1158
1159 b = bytearray(b'')
1160 b.clear()
1161 self.assertEqual(b, b'')
1162
1163 b = bytearray(b'')
1164 b.append(ord('r'))
1165 b.clear()
1166 b.append(ord('p'))
1167 self.assertEqual(b, b'p')
1168
1169 def test_copy(self):
1170 b = bytearray(b'abc')
1171 bb = b.copy()
1172 self.assertEqual(bb, b'abc')
1173
1174 b = bytearray(b'')
1175 bb = b.copy()
1176 self.assertEqual(bb, b'')
1177
1178 # test that it's indeed a copy and not a reference
1179 b = bytearray(b'abc')
1180 bb = b.copy()
1181 self.assertEqual(b, bb)
1182 self.assertIsNot(b, bb)
1183 bb.append(ord('d'))
1184 self.assertEqual(bb, b'abcd')
1185 self.assertEqual(b, b'abc')
1186
Guido van Rossumd624f182006-04-24 13:47:05 +00001187 def test_regexps(self):
1188 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001189 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001190 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001191 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001192
1193 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001194 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001195 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001196 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001197 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001198 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001199 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001200 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001201 try:
1202 b[3] = 0
1203 self.fail("Didn't raise IndexError")
1204 except IndexError:
1205 pass
1206 try:
1207 b[-10] = 0
1208 self.fail("Didn't raise IndexError")
1209 except IndexError:
1210 pass
1211 try:
1212 b[0] = 256
1213 self.fail("Didn't raise ValueError")
1214 except ValueError:
1215 pass
1216 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001217 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001218 self.fail("Didn't raise ValueError")
1219 except ValueError:
1220 pass
1221 try:
1222 b[0] = None
1223 self.fail("Didn't raise TypeError")
1224 except TypeError:
1225 pass
1226
1227 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001228 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001229 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001230 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001231 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001232 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001233 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001234 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001235
1236 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001237 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001238 self.assertEqual(list(b), list(range(10)))
1239
Guido van Rossum254348e2007-11-21 19:29:53 +00001240 b[0:5] = bytearray([1, 1, 1, 1, 1])
1241 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001242
1243 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001244 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001245
Guido van Rossum254348e2007-11-21 19:29:53 +00001246 b[0:0] = bytearray([0, 1, 2, 3, 4])
1247 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001248
Guido van Rossum254348e2007-11-21 19:29:53 +00001249 b[-7:-3] = bytearray([100, 101])
1250 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001251
1252 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001253 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001254
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001255 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001256 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 +00001257
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001258 b[3:] = b'foo'
1259 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1260
1261 b[:3] = memoryview(b'foo')
1262 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1263
1264 b[3:4] = []
1265 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1266
1267 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1268 ['a', 'b'], [b'a', b'b'], [[]]]:
1269 with self.assertRaises(TypeError):
1270 b[3:4] = elem
1271
1272 for elem in [[254, 255, 256], [-256, 9000]]:
1273 with self.assertRaises(ValueError):
1274 b[3:4] = elem
1275
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001276 def test_setslice_extend(self):
1277 # Exercise the resizing logic (see issue #19087)
1278 b = bytearray(range(100))
1279 self.assertEqual(list(b), list(range(100)))
1280 del b[:10]
1281 self.assertEqual(list(b), list(range(10, 100)))
1282 b.extend(range(100, 110))
1283 self.assertEqual(list(b), list(range(10, 110)))
1284
Antoine Pitrou25454112015-05-19 20:52:27 +02001285 def test_fifo_overrun(self):
1286 # Test for issue #23985, a buffer overrun when implementing a FIFO
1287 # Build Python in pydebug mode for best results.
1288 b = bytearray(10)
1289 b.pop() # Defeat expanding buffer off-by-one quirk
1290 del b[:1] # Advance start pointer without reallocating
1291 b += bytes(2) # Append exactly the number of deleted bytes
1292 del b # Free memory buffer, allowing pydebug verification
1293
1294 def test_del_expand(self):
1295 # Reducing the size should not expand the buffer (issue #23985)
1296 b = bytearray(10)
1297 size = sys.getsizeof(b)
1298 del b[:1]
1299 self.assertLessEqual(sys.getsizeof(b), size)
1300
Thomas Wouters376446d2006-12-19 08:30:14 +00001301 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -06001302 indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
1303 -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001304 for start in indices:
1305 for stop in indices:
1306 # Skip invalid step 0
1307 for step in indices[1:]:
1308 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001309 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001310 # Make sure we have a slice of exactly the right length,
1311 # but with different data.
1312 data = L[start:stop:step]
1313 data.reverse()
1314 L[start:stop:step] = data
1315 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001316 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001317
Thomas Wouters376446d2006-12-19 08:30:14 +00001318 del L[start:stop:step]
1319 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001320 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001321
Guido van Rossumd624f182006-04-24 13:47:05 +00001322 def test_setslice_trap(self):
1323 # This test verifies that we correctly handle assigning self
1324 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001325 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001326 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001327 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001328
Guido van Rossum13e57212006-04-27 22:54:26 +00001329 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001330 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001331 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001332 b += b"def"
1333 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001334 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001335 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001336 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001337 self.assertEqual(b, b"abcdefxyz")
1338 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001339 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001340 except TypeError:
1341 pass
1342 else:
1343 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001344
1345 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001346 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001347 b1 = b
1348 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001349 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001350 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001351 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001352
1353 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001354 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001355 b1 = b
1356 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001357 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001358 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001359 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001360
Guido van Rossum20188312006-05-05 15:15:40 +00001361 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001362 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001363 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001364 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001365 seq = [alloc]
1366 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001367 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001368 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001369 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001370 if alloc not in seq:
1371 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001372
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001373 def test_init_alloc(self):
1374 b = bytearray()
1375 def g():
1376 for i in range(1, 100):
1377 yield i
1378 a = list(b)
1379 self.assertEqual(a, list(range(1, len(a)+1)))
1380 self.assertEqual(len(b), len(a))
1381 self.assertLessEqual(len(b), i)
1382 alloc = b.__alloc__()
1383 self.assertGreater(alloc, len(b)) # including trailing null byte
1384 b.__init__(g())
1385 self.assertEqual(list(b), list(range(1, 100)))
1386 self.assertEqual(len(b), 99)
1387 alloc = b.__alloc__()
1388 self.assertGreater(alloc, len(b))
1389
Neal Norwitz6968b052007-02-27 19:02:19 +00001390 def test_extend(self):
1391 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001392 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001393 a.extend(a)
1394 self.assertEqual(a, orig + orig)
1395 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001396 a = bytearray(b'')
1397 # Test iterators that don't have a __length_hint__
1398 a.extend(map(int, orig * 25))
1399 a.extend(int(x) for x in orig * 25)
1400 self.assertEqual(a, orig * 50)
1401 self.assertEqual(a[-5:], orig)
1402 a = bytearray(b'')
1403 a.extend(iter(map(int, orig * 50)))
1404 self.assertEqual(a, orig * 50)
1405 self.assertEqual(a[-5:], orig)
1406 a = bytearray(b'')
1407 a.extend(list(map(int, orig * 50)))
1408 self.assertEqual(a, orig * 50)
1409 self.assertEqual(a[-5:], orig)
1410 a = bytearray(b'')
1411 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1412 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1413 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001414 a = bytearray(b'')
1415 a.extend([Indexable(ord('a'))])
1416 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001417
Neal Norwitz6968b052007-02-27 19:02:19 +00001418 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001419 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001420 b.remove(ord('l'))
1421 self.assertEqual(b, b'helo')
1422 b.remove(ord('l'))
1423 self.assertEqual(b, b'heo')
1424 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1425 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001426 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001427 # remove first and last
1428 b.remove(ord('o'))
1429 b.remove(ord('h'))
1430 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001431 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001432 b.remove(Indexable(ord('e')))
1433 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001434
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001435 # test values outside of the ascii range: (0, 127)
1436 c = bytearray([126, 127, 128, 129])
1437 c.remove(127)
1438 self.assertEqual(c, bytes([126, 128, 129]))
1439 c.remove(129)
1440 self.assertEqual(c, bytes([126, 128]))
1441
Neal Norwitz6968b052007-02-27 19:02:19 +00001442 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001443 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001444 self.assertEqual(b.pop(), ord('d'))
1445 self.assertEqual(b.pop(0), ord('w'))
1446 self.assertEqual(b.pop(-2), ord('r'))
1447 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001448 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001449 # test for issue #6846
1450 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001451
1452 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001453 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001454
Neal Norwitz6968b052007-02-27 19:02:19 +00001455 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001456 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001457 b.append(ord('o'))
1458 self.assertEqual(b, b'hello')
1459 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001460 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001461 b.append(ord('A'))
1462 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001463 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001464 b = bytearray()
1465 b.append(Indexable(ord('A')))
1466 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001467
1468 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001469 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001470 b.insert(1, ord('i'))
1471 b.insert(4, ord('i'))
1472 b.insert(-2, ord('i'))
1473 b.insert(1000, ord('i'))
1474 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001475 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001476 b = bytearray()
1477 b.insert(0, Indexable(ord('A')))
1478 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001479
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001480 def test_copied(self):
1481 # Issue 4348. Make sure that operations that don't mutate the array
1482 # copy the bytes.
1483 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001484 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001485
1486 t = bytearray([i for i in range(256)])
1487 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001488 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001489
Guido van Rossum254348e2007-11-21 19:29:53 +00001490 def test_partition_bytearray_doesnt_share_nullstring(self):
1491 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001492 self.assertEqual(b, b"")
1493 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001494 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001495 b += b"!"
1496 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001497 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001498 self.assertEqual(b, b"")
1499 self.assertEqual(c, b"")
1500 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001501 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001502 self.assertEqual(b, b"")
1503 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001504 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001505 b += b"!"
1506 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001507 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001508 self.assertEqual(b, b"")
1509 self.assertEqual(c, b"")
1510
Antoine Pitrou5504e892008-12-06 21:27:53 +00001511 def test_resize_forbidden(self):
1512 # #4509: can't resize a bytearray when there are buffer exports, even
1513 # if it wouldn't reallocate the underlying buffer.
1514 # Furthermore, no destructive changes to the buffer may be applied
1515 # before raising the error.
1516 b = bytearray(range(10))
1517 v = memoryview(b)
1518 def resize(n):
1519 b[1:-1] = range(n + 1, 2*n - 1)
1520 resize(10)
1521 orig = b[:]
1522 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001523 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001524 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001525 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001526 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001527 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001528 # Other operations implying resize
1529 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001530 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001531 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001532 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001533 def delitem():
1534 del b[1]
1535 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001536 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001537 # deleting a non-contiguous slice
1538 def delslice():
1539 b[1:-1:2] = b""
1540 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001541 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001542
Stefan Krah650c1e82015-02-03 21:43:23 +01001543 @test.support.cpython_only
1544 def test_obsolete_write_lock(self):
1545 from _testcapi import getbuffer_with_null_view
1546 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001547
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001548 def test_iterator_pickling2(self):
1549 orig = bytearray(b'abc')
1550 data = list(b'qwerty')
1551 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1552 # initial iterator
1553 itorig = iter(orig)
1554 d = pickle.dumps((itorig, orig), proto)
1555 it, b = pickle.loads(d)
1556 b[:] = data
1557 self.assertEqual(type(it), type(itorig))
1558 self.assertEqual(list(it), data)
1559
1560 # running iterator
1561 next(itorig)
1562 d = pickle.dumps((itorig, orig), proto)
1563 it, b = pickle.loads(d)
1564 b[:] = data
1565 self.assertEqual(type(it), type(itorig))
1566 self.assertEqual(list(it), data[1:])
1567
1568 # empty iterator
1569 for i in range(1, len(orig)):
1570 next(itorig)
1571 d = pickle.dumps((itorig, orig), proto)
1572 it, b = pickle.loads(d)
1573 b[:] = data
1574 self.assertEqual(type(it), type(itorig))
1575 self.assertEqual(list(it), data[len(orig):])
1576
1577 # exhausted iterator
1578 self.assertRaises(StopIteration, next, itorig)
1579 d = pickle.dumps((itorig, orig), proto)
1580 it, b = pickle.loads(d)
1581 b[:] = data
1582 self.assertEqual(list(it), [])
1583
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001584 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001585
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001586 def test_iterator_length_hint(self):
1587 # Issue 27443: __length_hint__ can return negative integer
1588 ba = bytearray(b'ab')
1589 it = iter(ba)
1590 next(it)
1591 ba.clear()
1592 # Shouldn't raise an error
1593 self.assertEqual(list(it), [])
1594
1595
Christian Heimes510711d2008-01-30 11:57:58 +00001596class AssortedBytesTest(unittest.TestCase):
1597 #
1598 # Test various combinations of bytes and bytearray
1599 #
1600
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001601 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001602 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001603 for f in str, repr:
1604 self.assertEqual(f(bytearray()), "bytearray(b'')")
1605 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1606 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1607 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1608 self.assertEqual(f(b"abc"), "b'abc'")
1609 self.assertEqual(f(b"'"), '''b"'"''') # '''
1610 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001611
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001612 @check_bytes_warnings
1613 def test_format(self):
1614 for b in b'abc', bytearray(b'abc'):
1615 self.assertEqual(format(b), str(b))
1616 self.assertEqual(format(b, ''), str(b))
1617 with self.assertRaisesRegex(TypeError,
1618 r'\b%s\b' % re.escape(type(b).__name__)):
1619 format(b, 's')
1620
Christian Heimes510711d2008-01-30 11:57:58 +00001621 def test_compare_bytes_to_bytearray(self):
1622 self.assertEqual(b"abc" == bytes(b"abc"), True)
1623 self.assertEqual(b"ab" != bytes(b"abc"), True)
1624 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1625 self.assertEqual(b"ab" < bytes(b"abc"), True)
1626 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1627 self.assertEqual(b"abc" > bytes(b"ab"), True)
1628
1629 self.assertEqual(b"abc" != bytes(b"abc"), False)
1630 self.assertEqual(b"ab" == bytes(b"abc"), False)
1631 self.assertEqual(b"ab" > bytes(b"abc"), False)
1632 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1633 self.assertEqual(b"abc" < bytes(b"ab"), False)
1634 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1635
1636 self.assertEqual(bytes(b"abc") == b"abc", True)
1637 self.assertEqual(bytes(b"ab") != b"abc", True)
1638 self.assertEqual(bytes(b"ab") <= b"abc", True)
1639 self.assertEqual(bytes(b"ab") < b"abc", True)
1640 self.assertEqual(bytes(b"abc") >= b"ab", True)
1641 self.assertEqual(bytes(b"abc") > b"ab", True)
1642
1643 self.assertEqual(bytes(b"abc") != b"abc", False)
1644 self.assertEqual(bytes(b"ab") == b"abc", False)
1645 self.assertEqual(bytes(b"ab") > b"abc", False)
1646 self.assertEqual(bytes(b"ab") >= b"abc", False)
1647 self.assertEqual(bytes(b"abc") < b"ab", False)
1648 self.assertEqual(bytes(b"abc") <= b"ab", False)
1649
Stefan Krah6e572b82013-01-26 13:06:36 +01001650 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001651 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001652 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001653 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001654 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001655 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001656
1657 def test_from_bytearray(self):
1658 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1659 buf = memoryview(sample)
1660 b = bytearray(buf)
1661 self.assertEqual(b, bytearray(sample))
1662
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001663 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001664 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001665 self.assertEqual(str(b''), "b''")
1666 self.assertEqual(str(b'x'), "b'x'")
1667 self.assertEqual(str(b'\x80'), "b'\\x80'")
1668 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1669 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1670 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001671
1672 def test_literal(self):
1673 tests = [
1674 (b"Wonderful spam", "Wonderful spam"),
1675 (br"Wonderful spam too", "Wonderful spam too"),
1676 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1677 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1678 ]
1679 for b, s in tests:
1680 self.assertEqual(b, bytearray(s, 'latin-1'))
1681 for c in range(128, 256):
1682 self.assertRaises(SyntaxError, eval,
1683 'b"%s"' % chr(c))
1684
Christian Heimes510711d2008-01-30 11:57:58 +00001685 def test_split_bytearray(self):
1686 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1687
1688 def test_rsplit_bytearray(self):
1689 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1690
Georg Brandleb2c9642008-05-30 12:05:02 +00001691 def test_return_self(self):
1692 # bytearray.replace must always return a new bytearray
1693 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001694 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001695
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001696 @unittest.skipUnless(sys.flags.bytes_warning,
1697 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001698 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001699 def bytes_warning():
1700 return test.support.check_warnings(('', BytesWarning))
1701 with bytes_warning():
1702 b'' == ''
1703 with bytes_warning():
1704 '' == b''
1705 with bytes_warning():
1706 b'' != ''
1707 with bytes_warning():
1708 '' != b''
1709 with bytes_warning():
1710 bytearray(b'') == ''
1711 with bytes_warning():
1712 '' == bytearray(b'')
1713 with bytes_warning():
1714 bytearray(b'') != ''
1715 with bytes_warning():
1716 '' != bytearray(b'')
1717 with bytes_warning():
1718 b'\0' == 0
1719 with bytes_warning():
1720 0 == b'\0'
1721 with bytes_warning():
1722 b'\0' != 0
1723 with bytes_warning():
1724 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001725
Guido van Rossumd624f182006-04-24 13:47:05 +00001726 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001727 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001728 # __reversed__? (optimization)
1729
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001730 # XXX More string methods? (Those that don't use character properties)
1731
Neal Norwitz6968b052007-02-27 19:02:19 +00001732 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001733 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001734 # Unfortunately they are all bundled with tests that
1735 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001736
Guido van Rossum254348e2007-11-21 19:29:53 +00001737 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001738 # the rest that make sense (the code can be cleaned up to use modern
1739 # unittest methods at the same time).
1740
Martin Panter152a19c2016-04-06 06:37:17 +00001741class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001742 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001743 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001744
1745 def test_returns_new_copy(self):
1746 val = self.marshal(b'1234')
1747 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001748 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001749 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1750 method = getattr(val, methname)
1751 newval = method(3)
1752 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001753 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001754 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001755 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1756 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1757 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1758 newval = eval(expr)
1759 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001760 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001761 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001762 sep = self.marshal(b'')
1763 newval = sep.join([val])
1764 self.assertEqual(val, newval)
1765 self.assertIsNot(val, newval)
1766
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001767
Christian Heimes510711d2008-01-30 11:57:58 +00001768class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001769 def fixtype(self, obj):
1770 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001771 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001772 return super().fixtype(obj)
1773
Martin Panter152a19c2016-04-06 06:37:17 +00001774 contains_bytes = True
1775
Ezio Melotti0dceb562013-01-10 07:43:26 +02001776class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001777 type2test = bytearray
1778
Ezio Melotti0dceb562013-01-10 07:43:26 +02001779class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001780 type2test = bytes
1781
Georg Brandlc7885542007-03-06 19:16:20 +00001782
Ezio Melotti0dceb562013-01-10 07:43:26 +02001783class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001784
1785 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001786 self.assertTrue(issubclass(self.type2test, self.basetype))
1787 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001788
1789 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001790 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001791
1792 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001793 self.assertTrue(_a == _a)
1794 self.assertTrue(_a != _b)
1795 self.assertTrue(_a < _b)
1796 self.assertTrue(_a <= _b)
1797 self.assertTrue(_b >= _a)
1798 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001799 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001800
1801 # test concat of subclass instances
1802 self.assertEqual(a + b, _a + _b)
1803 self.assertEqual(a + b, a + _b)
1804 self.assertEqual(a + b, _a + b)
1805
1806 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001807 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001808
1809 def test_join(self):
1810 # Make sure join returns a NEW object for single item sequences
1811 # involving a subclass.
1812 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001813 s1 = self.type2test(b"abcd")
1814 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001815 self.assertIsNot(s1, s2)
1816 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001817
1818 # Test reverse, calling join on subclass
1819 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001820 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001821
1822 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001823 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001824 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001825 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001826 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001827 b = pickle.loads(pickle.dumps(a, proto))
1828 self.assertNotEqual(id(a), id(b))
1829 self.assertEqual(a, b)
1830 self.assertEqual(a.x, b.x)
1831 self.assertEqual(a.y, b.y)
1832 self.assertEqual(type(a), type(b))
1833 self.assertEqual(type(a.y), type(b.y))
1834
1835 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001836 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001837 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001838 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001839 for copy_method in (copy.copy, copy.deepcopy):
1840 b = copy_method(a)
1841 self.assertNotEqual(id(a), id(b))
1842 self.assertEqual(a, b)
1843 self.assertEqual(a.x, b.x)
1844 self.assertEqual(a.y, b.y)
1845 self.assertEqual(type(a), type(b))
1846 self.assertEqual(type(a.y), type(b.y))
1847
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001848 def test_fromhex(self):
1849 b = self.type2test.fromhex('1a2B30')
1850 self.assertEqual(b, b'\x1a\x2b\x30')
1851 self.assertIs(type(b), self.type2test)
1852
1853 class B1(self.basetype):
1854 def __new__(cls, value):
1855 me = self.basetype.__new__(cls, value)
1856 me.foo = 'bar'
1857 return me
1858
1859 b = B1.fromhex('1a2B30')
1860 self.assertEqual(b, b'\x1a\x2b\x30')
1861 self.assertIs(type(b), B1)
1862 self.assertEqual(b.foo, 'bar')
1863
1864 class B2(self.basetype):
1865 def __init__(me, *args, **kwargs):
1866 if self.basetype is not bytes:
1867 self.basetype.__init__(me, *args, **kwargs)
1868 me.foo = 'bar'
1869
1870 b = B2.fromhex('1a2B30')
1871 self.assertEqual(b, b'\x1a\x2b\x30')
1872 self.assertIs(type(b), B2)
1873 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001874
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001875
1876class ByteArraySubclass(bytearray):
1877 pass
1878
1879class BytesSubclass(bytes):
1880 pass
1881
Serhiy Storchaka15095802015-11-25 15:47:01 +02001882class OtherBytesSubclass(bytes):
1883 pass
1884
Ezio Melotti0dceb562013-01-10 07:43:26 +02001885class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001886 basetype = bytearray
1887 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001888
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001889 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001890 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001891 def __init__(me, newarg=1, *args, **kwargs):
1892 bytearray.__init__(me, *args, **kwargs)
1893 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001894 x = subclass(4, source=b"abcd")
1895 self.assertEqual(x, b"abcd")
1896 x = subclass(newarg=4, source=b"abcd")
1897 self.assertEqual(x, b"abcd")
1898
1899
Ezio Melotti0dceb562013-01-10 07:43:26 +02001900class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001901 basetype = bytes
1902 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001903
1904
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001905if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001906 unittest.main()