blob: 9502a8f974bd3704aaf428192d4b99722f0cf383 [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
Christian Heimes510711d2008-01-30 11:57:58 +0000420 def test_join(self):
421 self.assertEqual(self.type2test(b"").join([]), b"")
422 self.assertEqual(self.type2test(b"").join([b""]), b"")
423 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
424 lst = list(map(self.type2test, lst))
425 self.assertEqual(self.type2test(b"").join(lst), b"abc")
426 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
427 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200428 dot_join = self.type2test(b".:").join
429 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
430 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
431 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
432 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
433 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
434 # Stress it with many items
435 seq = [b"abc"] * 1000
436 expected = b"abc" + b".:abc" * 999
437 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400438 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200439 # Error handling and cleanup when some item in the middle of the
440 # sequence has the wrong type.
441 with self.assertRaises(TypeError):
442 dot_join([bytearray(b"ab"), "cd", b"ef"])
443 with self.assertRaises(TypeError):
444 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000445
Christian Heimes510711d2008-01-30 11:57:58 +0000446 def test_count(self):
447 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200448 i = 105
449 p = 112
450 w = 119
451
Christian Heimes510711d2008-01-30 11:57:58 +0000452 self.assertEqual(b.count(b'i'), 4)
453 self.assertEqual(b.count(b'ss'), 2)
454 self.assertEqual(b.count(b'w'), 0)
455
Antoine Pitrouac65d962011-10-20 23:54:17 +0200456 self.assertEqual(b.count(i), 4)
457 self.assertEqual(b.count(w), 0)
458
459 self.assertEqual(b.count(b'i', 6), 2)
460 self.assertEqual(b.count(b'p', 6), 2)
461 self.assertEqual(b.count(b'i', 1, 3), 1)
462 self.assertEqual(b.count(b'p', 7, 9), 1)
463
464 self.assertEqual(b.count(i, 6), 2)
465 self.assertEqual(b.count(p, 6), 2)
466 self.assertEqual(b.count(i, 1, 3), 1)
467 self.assertEqual(b.count(p, 7, 9), 1)
468
Christian Heimes510711d2008-01-30 11:57:58 +0000469 def test_startswith(self):
470 b = self.type2test(b'hello')
471 self.assertFalse(self.type2test().startswith(b"anything"))
472 self.assertTrue(b.startswith(b"hello"))
473 self.assertTrue(b.startswith(b"hel"))
474 self.assertTrue(b.startswith(b"h"))
475 self.assertFalse(b.startswith(b"hellow"))
476 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300477 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300478 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300479 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300480 self.assertIn('bytes', exc)
481 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000482
483 def test_endswith(self):
484 b = self.type2test(b'hello')
485 self.assertFalse(bytearray().endswith(b"anything"))
486 self.assertTrue(b.endswith(b"hello"))
487 self.assertTrue(b.endswith(b"llo"))
488 self.assertTrue(b.endswith(b"o"))
489 self.assertFalse(b.endswith(b"whello"))
490 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300491 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300492 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300493 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300494 self.assertIn('bytes', exc)
495 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000496
497 def test_find(self):
498 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200499 i = 105
500 w = 119
501
Christian Heimes510711d2008-01-30 11:57:58 +0000502 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000503 self.assertEqual(b.find(b'w'), -1)
504 self.assertEqual(b.find(b'mississippian'), -1)
505
Antoine Pitrouac65d962011-10-20 23:54:17 +0200506 self.assertEqual(b.find(i), 1)
507 self.assertEqual(b.find(w), -1)
508
509 self.assertEqual(b.find(b'ss', 3), 5)
510 self.assertEqual(b.find(b'ss', 1, 7), 2)
511 self.assertEqual(b.find(b'ss', 1, 3), -1)
512
513 self.assertEqual(b.find(i, 6), 7)
514 self.assertEqual(b.find(i, 1, 3), 1)
515 self.assertEqual(b.find(w, 1, 3), -1)
516
Victor Stinnerf8eac002011-12-18 01:17:41 +0100517 for index in (-1, 256, sys.maxsize + 1):
518 self.assertRaisesRegex(
519 ValueError, r'byte must be in range\(0, 256\)',
520 b.find, index)
521
Christian Heimes510711d2008-01-30 11:57:58 +0000522 def test_rfind(self):
523 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200524 i = 105
525 w = 119
526
Christian Heimes510711d2008-01-30 11:57:58 +0000527 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000528 self.assertEqual(b.rfind(b'w'), -1)
529 self.assertEqual(b.rfind(b'mississippian'), -1)
530
Antoine Pitrouac65d962011-10-20 23:54:17 +0200531 self.assertEqual(b.rfind(i), 10)
532 self.assertEqual(b.rfind(w), -1)
533
534 self.assertEqual(b.rfind(b'ss', 3), 5)
535 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
536
537 self.assertEqual(b.rfind(i, 1, 3), 1)
538 self.assertEqual(b.rfind(i, 3, 9), 7)
539 self.assertEqual(b.rfind(w, 1, 3), -1)
540
Christian Heimes510711d2008-01-30 11:57:58 +0000541 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200542 b = self.type2test(b'mississippi')
543 i = 105
544 w = 119
545
546 self.assertEqual(b.index(b'ss'), 2)
547 self.assertRaises(ValueError, b.index, b'w')
548 self.assertRaises(ValueError, b.index, b'mississippian')
549
550 self.assertEqual(b.index(i), 1)
551 self.assertRaises(ValueError, b.index, w)
552
553 self.assertEqual(b.index(b'ss', 3), 5)
554 self.assertEqual(b.index(b'ss', 1, 7), 2)
555 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
556
557 self.assertEqual(b.index(i, 6), 7)
558 self.assertEqual(b.index(i, 1, 3), 1)
559 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000560
561 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200562 b = self.type2test(b'mississippi')
563 i = 105
564 w = 119
565
566 self.assertEqual(b.rindex(b'ss'), 5)
567 self.assertRaises(ValueError, b.rindex, b'w')
568 self.assertRaises(ValueError, b.rindex, b'mississippian')
569
570 self.assertEqual(b.rindex(i), 10)
571 self.assertRaises(ValueError, b.rindex, w)
572
573 self.assertEqual(b.rindex(b'ss', 3), 5)
574 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
575
576 self.assertEqual(b.rindex(i, 1, 3), 1)
577 self.assertEqual(b.rindex(i, 3, 9), 7)
578 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000579
Ethan Furmanb95b5612015-01-23 20:05:18 -0800580 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300581 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800582 orig = b
583 b = b % b'world'
584 self.assertEqual(b, b'hello, world!')
585 self.assertEqual(orig, b'hello, %b!')
586 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300587 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800588 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200589 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200590 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800591 # issue 29714
592 b = self.type2test(b'hello,\x00%b!')
593 b = b % b'world'
594 self.assertEqual(b, b'hello,\x00world!')
595 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800596
597 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300598 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800599 orig = b
600 b %= b'world'
601 self.assertEqual(b, b'hello, world!')
602 self.assertEqual(orig, b'hello, %b!')
603 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300604 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800605 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200606 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200607 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800608 # issue 29714
609 b = self.type2test(b'hello,\x00%b!')
610 b %= b'world'
611 self.assertEqual(b, b'hello,\x00world!')
612 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300613
614 def test_rmod(self):
615 with self.assertRaises(TypeError):
616 object() % self.type2test(b'abc')
617 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800618
Christian Heimes510711d2008-01-30 11:57:58 +0000619 def test_replace(self):
620 b = self.type2test(b'mississippi')
621 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
622 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
623
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300624 def test_replace_int_error(self):
625 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
626
Christian Heimes510711d2008-01-30 11:57:58 +0000627 def test_split_string_error(self):
628 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300629 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
630
631 def test_split_int_error(self):
632 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
633 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000634
Antoine Pitrouf8453022010-01-12 22:05:42 +0000635 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000636 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
637 b = self.type2test(b)
638 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000639 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
640 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
641
Christian Heimes510711d2008-01-30 11:57:58 +0000642 def test_rsplit_unicodewhitespace(self):
643 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000644 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
645
646 def test_partition(self):
647 b = self.type2test(b'mississippi')
648 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000649 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000650
651 def test_rpartition(self):
652 b = self.type2test(b'mississippi')
653 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
654 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000655 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000656
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300657 def test_partition_string_error(self):
658 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
659 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
660
661 def test_partition_int_error(self):
662 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
663 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
664
Christian Heimes510711d2008-01-30 11:57:58 +0000665 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000666 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000667 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
668 b = self.type2test(b)
669 ps = pickle.dumps(b, proto)
670 q = pickle.loads(ps)
671 self.assertEqual(b, q)
672
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000673 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200674 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
675 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
676 it = itorg = iter(self.type2test(b))
677 data = list(self.type2test(b))
678 d = pickle.dumps(it, proto)
679 it = pickle.loads(d)
680 self.assertEqual(type(itorg), type(it))
681 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000682
Serhiy Storchakabad12572014-12-15 14:03:42 +0200683 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200684 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200685 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200686 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200687 d = pickle.dumps(it, proto)
688 it = pickle.loads(d)
689 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000690
Christian Heimes510711d2008-01-30 11:57:58 +0000691 def test_strip_bytearray(self):
692 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
693 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
694 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
695
696 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300697 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
698 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
699 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
700
701 def test_strip_int_error(self):
702 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
703 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
704 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000705
Eli Bendersky906b88f2011-07-29 07:05:08 +0300706 def test_center(self):
707 # Fill character can be either bytes or bytearray (issue 12380)
708 b = self.type2test(b'abc')
709 for fill_type in (bytes, bytearray):
710 self.assertEqual(b.center(7, fill_type(b'-')),
711 self.type2test(b'--abc--'))
712
713 def test_ljust(self):
714 # Fill character can be either bytes or bytearray (issue 12380)
715 b = self.type2test(b'abc')
716 for fill_type in (bytes, bytearray):
717 self.assertEqual(b.ljust(7, fill_type(b'-')),
718 self.type2test(b'abc----'))
719
720 def test_rjust(self):
721 # Fill character can be either bytes or bytearray (issue 12380)
722 b = self.type2test(b'abc')
723 for fill_type in (bytes, bytearray):
724 self.assertEqual(b.rjust(7, fill_type(b'-')),
725 self.type2test(b'----abc'))
726
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300727 def test_xjust_int_error(self):
728 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
729 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
730 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
731
Christian Heimes510711d2008-01-30 11:57:58 +0000732 def test_ord(self):
733 b = self.type2test(b'\0A\x7f\x80\xff')
734 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
735 [0, 65, 127, 128, 255])
736
Georg Brandlabc38772009-04-12 15:51:51 +0000737 def test_maketrans(self):
738 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 +0000739 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000740 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'
741 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000742 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
743 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
744
Jesus Ceaac451502011-04-20 17:09:23 +0200745 def test_none_arguments(self):
746 # issue 11828
747 b = self.type2test(b'hello')
748 l = self.type2test(b'l')
749 h = self.type2test(b'h')
750 x = self.type2test(b'x')
751 o = self.type2test(b'o')
752
753 self.assertEqual(2, b.find(l, None))
754 self.assertEqual(3, b.find(l, -2, None))
755 self.assertEqual(2, b.find(l, None, -2))
756 self.assertEqual(0, b.find(h, None, None))
757
758 self.assertEqual(3, b.rfind(l, None))
759 self.assertEqual(3, b.rfind(l, -2, None))
760 self.assertEqual(2, b.rfind(l, None, -2))
761 self.assertEqual(0, b.rfind(h, None, None))
762
763 self.assertEqual(2, b.index(l, None))
764 self.assertEqual(3, b.index(l, -2, None))
765 self.assertEqual(2, b.index(l, None, -2))
766 self.assertEqual(0, b.index(h, None, None))
767
768 self.assertEqual(3, b.rindex(l, None))
769 self.assertEqual(3, b.rindex(l, -2, None))
770 self.assertEqual(2, b.rindex(l, None, -2))
771 self.assertEqual(0, b.rindex(h, None, None))
772
773 self.assertEqual(2, b.count(l, None))
774 self.assertEqual(1, b.count(l, -2, None))
775 self.assertEqual(1, b.count(l, None, -2))
776 self.assertEqual(0, b.count(x, None, None))
777
778 self.assertEqual(True, b.endswith(o, None))
779 self.assertEqual(True, b.endswith(o, -2, None))
780 self.assertEqual(True, b.endswith(l, None, -2))
781 self.assertEqual(False, b.endswith(x, None, None))
782
783 self.assertEqual(True, b.startswith(h, None))
784 self.assertEqual(True, b.startswith(l, -2, None))
785 self.assertEqual(True, b.startswith(h, None, -2))
786 self.assertEqual(False, b.startswith(x, None, None))
787
Antoine Pitrouac65d962011-10-20 23:54:17 +0200788 def test_integer_arguments_out_of_byte_range(self):
789 b = self.type2test(b'hello')
790
791 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
792 self.assertRaises(ValueError, method, -1)
793 self.assertRaises(ValueError, method, 256)
794 self.assertRaises(ValueError, method, 9999)
795
Jesus Ceaac451502011-04-20 17:09:23 +0200796 def test_find_etc_raise_correct_error_messages(self):
797 # issue 11828
798 b = self.type2test(b'hello')
799 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300800 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200801 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300802 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200803 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300804 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200805 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300806 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200807 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300808 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200809 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300810 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200811 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300812 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200813 x, None, None, None)
814
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300815 def test_free_after_iterating(self):
816 test.support.check_free_after_iterating(self, iter, self.type2test)
817 test.support.check_free_after_iterating(self, reversed, self.type2test)
818
Martin Panter1b6c6da2016-08-27 08:35:02 +0000819 def test_translate(self):
820 b = self.type2test(b'hello')
821 rosetta = bytearray(range(256))
822 rosetta[ord('o')] = ord('e')
823
824 self.assertRaises(TypeError, b.translate)
825 self.assertRaises(TypeError, b.translate, None, None)
826 self.assertRaises(ValueError, b.translate, bytes(range(255)))
827
828 c = b.translate(rosetta, b'hello')
829 self.assertEqual(b, b'hello')
830 self.assertIsInstance(c, self.type2test)
831
832 c = b.translate(rosetta)
833 d = b.translate(rosetta, b'')
834 self.assertEqual(c, d)
835 self.assertEqual(c, b'helle')
836
837 c = b.translate(rosetta, b'l')
838 self.assertEqual(c, b'hee')
839 c = b.translate(None, b'e')
840 self.assertEqual(c, b'hllo')
841
842 # test delete as a keyword argument
843 c = b.translate(rosetta, delete=b'')
844 self.assertEqual(c, b'helle')
845 c = b.translate(rosetta, delete=b'l')
846 self.assertEqual(c, b'hee')
847 c = b.translate(None, delete=b'e')
848 self.assertEqual(c, b'hllo')
849
Christian Heimes510711d2008-01-30 11:57:58 +0000850
Ezio Melotti0dceb562013-01-10 07:43:26 +0200851class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000852 type2test = bytes
853
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400854 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200855 b = b'python'
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400856 msg = "byte indices must be integers or slices"
857 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200858 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400859
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000860 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200861 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000862 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000863 self.assertRaises(TypeError, f.readinto, b"")
864
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000865 def test_custom(self):
866 class A:
867 def __bytes__(self):
868 return b'abc'
869 self.assertEqual(bytes(A()), b'abc')
870 class A: pass
871 self.assertRaises(TypeError, bytes, A())
872 class A:
873 def __bytes__(self):
874 return None
875 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600876 class A:
877 def __bytes__(self):
878 return b'a'
879 def __index__(self):
880 return 42
881 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200882 # Issue #25766
883 class A(str):
884 def __bytes__(self):
885 return b'abc'
886 self.assertEqual(bytes(A('\u20ac')), b'abc')
887 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200888 # Issue #24731
889 class A:
890 def __bytes__(self):
891 return OtherBytesSubclass(b'abc')
892 self.assertEqual(bytes(A()), b'abc')
893 self.assertIs(type(bytes(A())), OtherBytesSubclass)
894 self.assertEqual(BytesSubclass(A()), b'abc')
895 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000896
Victor Stinner29e762c2011-01-05 03:33:28 +0000897 # Test PyBytes_FromFormat()
898 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200899 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200900 _testcapi = test.support.import_module('_testcapi')
901 from ctypes import pythonapi, py_object
902 from ctypes import (
903 c_int, c_uint,
904 c_long, c_ulong,
905 c_size_t, c_ssize_t,
906 c_char_p)
907
Victor Stinner29e762c2011-01-05 03:33:28 +0000908 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
909 PyBytes_FromFormat.restype = py_object
910
Victor Stinner03dab782015-10-14 00:21:35 +0200911 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000912 self.assertEqual(PyBytes_FromFormat(b'format'),
913 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200914 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
915 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000916
Victor Stinner03dab782015-10-14 00:21:35 +0200917 # test formatters
918 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
919 b'c=\0')
920 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
921 b'c=@')
922 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
923 b'c=\xff')
924 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
925 c_int(1), c_long(2),
926 c_size_t(3)),
927 b'd=1 ld=2 zd=3')
928 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
929 c_int(-1), c_long(-2),
930 c_size_t(-3)),
931 b'd=-1 ld=-2 zd=-3')
932 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
933 c_uint(123), c_ulong(456),
934 c_size_t(789)),
935 b'u=123 lu=456 zu=789')
936 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
937 b'i=123')
938 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
939 b'i=-123')
940 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
941 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200942
943 sizeof_ptr = ctypes.sizeof(c_char_p)
944
945 if os.name == 'nt':
946 # Windows (MSCRT)
947 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
948 def ptr_formatter(ptr):
949 return (ptr_format % ptr)
950 else:
951 # UNIX (glibc)
952 def ptr_formatter(ptr):
953 return '%#x' % ptr
954
Victor Stinner7ab986d2015-10-14 02:55:12 +0200955 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200956 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
957 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200958 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
959 b's=cstr')
960
961 # test minimum and maximum integer values
962 size_max = c_size_t(-1).value
963 for formatstr, ctypes_type, value, py_formatter in (
964 (b'%d', c_int, _testcapi.INT_MIN, str),
965 (b'%d', c_int, _testcapi.INT_MAX, str),
966 (b'%ld', c_long, _testcapi.LONG_MIN, str),
967 (b'%ld', c_long, _testcapi.LONG_MAX, str),
968 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
969 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
970 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
971 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200972 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200973 ):
974 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
975 py_formatter(value).encode('ascii')),
976
977 # width and precision (width is currently ignored)
978 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
979 b'a')
980 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
981 b'abc')
982
983 # '%%' formatter
984 self.assertEqual(PyBytes_FromFormat(b'%%'),
985 b'%')
986 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
987 b'[%]')
988 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
989 b'%_')
990 self.assertEqual(PyBytes_FromFormat(b'%%s'),
991 b'%s')
992
993 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000994 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200995 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
996 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000997
Victor Stinner03dab782015-10-14 00:21:35 +0200998 # Issue #19969: %c must raise OverflowError for values
999 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +01001000 self.assertRaises(OverflowError,
1001 PyBytes_FromFormat, b'%c', c_int(-1))
1002 self.assertRaises(OverflowError,
1003 PyBytes_FromFormat, b'%c', c_int(256))
1004
Serhiy Storchaka44cc4822019-01-12 09:22:29 +02001005 # Issue #33817: empty strings
1006 self.assertEqual(PyBytes_FromFormat(b''),
1007 b'')
1008 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1009 b'')
1010
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001011 def test_bytes_blocking(self):
1012 class IterationBlocked(list):
1013 __bytes__ = None
1014 i = [0, 1, 2, 3]
1015 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1016 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1017
1018 # At least in CPython, because bytes.__new__ and the C API
1019 # PyBytes_FromObject have different fallback rules, integer
1020 # fallback is handled specially, so test separately.
1021 class IntBlocked(int):
1022 __bytes__ = None
1023 self.assertEqual(bytes(3), b'\0\0\0')
1024 self.assertRaises(TypeError, bytes, IntBlocked(3))
1025
1026 # While there is no separately-defined rule for handling bytes
1027 # subclasses differently from other buffer-interface classes,
1028 # an implementation may well special-case them (as CPython 2.x
1029 # str did), so test them separately.
1030 class BytesSubclassBlocked(bytes):
1031 __bytes__ = None
1032 self.assertEqual(bytes(b'ab'), b'ab')
1033 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1034
1035 class BufferBlocked(bytearray):
1036 __bytes__ = None
1037 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1038 self.assertEqual(bytes(ba), b'ab')
1039 self.assertRaises(TypeError, bytes, bb)
1040
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001041
Ezio Melotti0dceb562013-01-10 07:43:26 +02001042class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001043 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001044
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001045 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001046 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001047 msg = "bytearray indices must be integers or slices"
1048 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001049 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001050
1051 def test_setitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001052 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001053 msg = "bytearray indices must be integers or slices"
1054 with self.assertRaisesRegex(TypeError, msg):
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001055 b['a'] = "python"
1056
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001057 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001058 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001059
Guido van Rossum254348e2007-11-21 19:29:53 +00001060 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001061 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001062 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001063 tfn = tempfile.mktemp()
1064 try:
1065 # Prepare
1066 with open(tfn, "wb") as f:
1067 f.write(short_sample)
1068 # Test readinto
1069 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001070 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001071 n = f.readinto(b)
1072 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001073 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001074 # Test writing in binary mode
1075 with open(tfn, "wb") as f:
1076 f.write(b)
1077 with open(tfn, "rb") as f:
1078 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001079 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001080 finally:
1081 try:
1082 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001083 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001084 pass
1085
Neal Norwitz6968b052007-02-27 19:02:19 +00001086 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001087 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001088 self.assertEqual(b.reverse(), None)
1089 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001090 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001091 b.reverse()
1092 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001093 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001094 b.reverse()
1095 self.assertFalse(b)
1096
Eli Bendersky4db28d32011-03-03 18:21:02 +00001097 def test_clear(self):
1098 b = bytearray(b'python')
1099 b.clear()
1100 self.assertEqual(b, b'')
1101
1102 b = bytearray(b'')
1103 b.clear()
1104 self.assertEqual(b, b'')
1105
1106 b = bytearray(b'')
1107 b.append(ord('r'))
1108 b.clear()
1109 b.append(ord('p'))
1110 self.assertEqual(b, b'p')
1111
1112 def test_copy(self):
1113 b = bytearray(b'abc')
1114 bb = b.copy()
1115 self.assertEqual(bb, b'abc')
1116
1117 b = bytearray(b'')
1118 bb = b.copy()
1119 self.assertEqual(bb, b'')
1120
1121 # test that it's indeed a copy and not a reference
1122 b = bytearray(b'abc')
1123 bb = b.copy()
1124 self.assertEqual(b, bb)
1125 self.assertIsNot(b, bb)
1126 bb.append(ord('d'))
1127 self.assertEqual(bb, b'abcd')
1128 self.assertEqual(b, b'abc')
1129
Guido van Rossumd624f182006-04-24 13:47:05 +00001130 def test_regexps(self):
1131 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001132 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001133 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001134 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001135
1136 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001138 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001140 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001141 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001142 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001143 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001144 try:
1145 b[3] = 0
1146 self.fail("Didn't raise IndexError")
1147 except IndexError:
1148 pass
1149 try:
1150 b[-10] = 0
1151 self.fail("Didn't raise IndexError")
1152 except IndexError:
1153 pass
1154 try:
1155 b[0] = 256
1156 self.fail("Didn't raise ValueError")
1157 except ValueError:
1158 pass
1159 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001160 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001161 self.fail("Didn't raise ValueError")
1162 except ValueError:
1163 pass
1164 try:
1165 b[0] = None
1166 self.fail("Didn't raise TypeError")
1167 except TypeError:
1168 pass
1169
1170 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001171 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001172 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001173 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001174 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001175 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001176 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001177 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001178
1179 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001180 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001181 self.assertEqual(list(b), list(range(10)))
1182
Guido van Rossum254348e2007-11-21 19:29:53 +00001183 b[0:5] = bytearray([1, 1, 1, 1, 1])
1184 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001185
1186 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001187 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001188
Guido van Rossum254348e2007-11-21 19:29:53 +00001189 b[0:0] = bytearray([0, 1, 2, 3, 4])
1190 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001191
Guido van Rossum254348e2007-11-21 19:29:53 +00001192 b[-7:-3] = bytearray([100, 101])
1193 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001194
1195 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001196 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001197
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001198 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001199 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 +00001200
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001201 b[3:] = b'foo'
1202 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1203
1204 b[:3] = memoryview(b'foo')
1205 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1206
1207 b[3:4] = []
1208 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1209
1210 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1211 ['a', 'b'], [b'a', b'b'], [[]]]:
1212 with self.assertRaises(TypeError):
1213 b[3:4] = elem
1214
1215 for elem in [[254, 255, 256], [-256, 9000]]:
1216 with self.assertRaises(ValueError):
1217 b[3:4] = elem
1218
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001219 def test_setslice_extend(self):
1220 # Exercise the resizing logic (see issue #19087)
1221 b = bytearray(range(100))
1222 self.assertEqual(list(b), list(range(100)))
1223 del b[:10]
1224 self.assertEqual(list(b), list(range(10, 100)))
1225 b.extend(range(100, 110))
1226 self.assertEqual(list(b), list(range(10, 110)))
1227
Antoine Pitrou25454112015-05-19 20:52:27 +02001228 def test_fifo_overrun(self):
1229 # Test for issue #23985, a buffer overrun when implementing a FIFO
1230 # Build Python in pydebug mode for best results.
1231 b = bytearray(10)
1232 b.pop() # Defeat expanding buffer off-by-one quirk
1233 del b[:1] # Advance start pointer without reallocating
1234 b += bytes(2) # Append exactly the number of deleted bytes
1235 del b # Free memory buffer, allowing pydebug verification
1236
1237 def test_del_expand(self):
1238 # Reducing the size should not expand the buffer (issue #23985)
1239 b = bytearray(10)
1240 size = sys.getsizeof(b)
1241 del b[:1]
1242 self.assertLessEqual(sys.getsizeof(b), size)
1243
Thomas Wouters376446d2006-12-19 08:30:14 +00001244 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -06001245 indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
1246 -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001247 for start in indices:
1248 for stop in indices:
1249 # Skip invalid step 0
1250 for step in indices[1:]:
1251 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001252 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001253 # Make sure we have a slice of exactly the right length,
1254 # but with different data.
1255 data = L[start:stop:step]
1256 data.reverse()
1257 L[start:stop:step] = data
1258 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001259 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001260
Thomas Wouters376446d2006-12-19 08:30:14 +00001261 del L[start:stop:step]
1262 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001263 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001264
Guido van Rossumd624f182006-04-24 13:47:05 +00001265 def test_setslice_trap(self):
1266 # This test verifies that we correctly handle assigning self
1267 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001268 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001269 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001270 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001271
Guido van Rossum13e57212006-04-27 22:54:26 +00001272 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001273 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001274 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001275 b += b"def"
1276 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001277 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001278 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001279 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001280 self.assertEqual(b, b"abcdefxyz")
1281 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001282 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001283 except TypeError:
1284 pass
1285 else:
1286 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001287
1288 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001289 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001290 b1 = b
1291 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001292 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001293 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001294 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001295
1296 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001297 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001298 b1 = b
1299 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001300 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001301 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001302 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001303
Guido van Rossum20188312006-05-05 15:15:40 +00001304 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001305 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001306 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001307 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001308 seq = [alloc]
1309 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001310 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001311 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001312 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001313 if alloc not in seq:
1314 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001315
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001316 def test_init_alloc(self):
1317 b = bytearray()
1318 def g():
1319 for i in range(1, 100):
1320 yield i
1321 a = list(b)
1322 self.assertEqual(a, list(range(1, len(a)+1)))
1323 self.assertEqual(len(b), len(a))
1324 self.assertLessEqual(len(b), i)
1325 alloc = b.__alloc__()
1326 self.assertGreater(alloc, len(b)) # including trailing null byte
1327 b.__init__(g())
1328 self.assertEqual(list(b), list(range(1, 100)))
1329 self.assertEqual(len(b), 99)
1330 alloc = b.__alloc__()
1331 self.assertGreater(alloc, len(b))
1332
Neal Norwitz6968b052007-02-27 19:02:19 +00001333 def test_extend(self):
1334 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001335 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001336 a.extend(a)
1337 self.assertEqual(a, orig + orig)
1338 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001339 a = bytearray(b'')
1340 # Test iterators that don't have a __length_hint__
1341 a.extend(map(int, orig * 25))
1342 a.extend(int(x) for x in orig * 25)
1343 self.assertEqual(a, orig * 50)
1344 self.assertEqual(a[-5:], orig)
1345 a = bytearray(b'')
1346 a.extend(iter(map(int, orig * 50)))
1347 self.assertEqual(a, orig * 50)
1348 self.assertEqual(a[-5:], orig)
1349 a = bytearray(b'')
1350 a.extend(list(map(int, orig * 50)))
1351 self.assertEqual(a, orig * 50)
1352 self.assertEqual(a[-5:], orig)
1353 a = bytearray(b'')
1354 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1355 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1356 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001357 a = bytearray(b'')
1358 a.extend([Indexable(ord('a'))])
1359 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001360
Neal Norwitz6968b052007-02-27 19:02:19 +00001361 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001362 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001363 b.remove(ord('l'))
1364 self.assertEqual(b, b'helo')
1365 b.remove(ord('l'))
1366 self.assertEqual(b, b'heo')
1367 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1368 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001369 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001370 # remove first and last
1371 b.remove(ord('o'))
1372 b.remove(ord('h'))
1373 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001374 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001375 b.remove(Indexable(ord('e')))
1376 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001377
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001378 # test values outside of the ascii range: (0, 127)
1379 c = bytearray([126, 127, 128, 129])
1380 c.remove(127)
1381 self.assertEqual(c, bytes([126, 128, 129]))
1382 c.remove(129)
1383 self.assertEqual(c, bytes([126, 128]))
1384
Neal Norwitz6968b052007-02-27 19:02:19 +00001385 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001386 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001387 self.assertEqual(b.pop(), ord('d'))
1388 self.assertEqual(b.pop(0), ord('w'))
1389 self.assertEqual(b.pop(-2), ord('r'))
1390 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001391 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001392 # test for issue #6846
1393 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001394
1395 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001396 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001397
Neal Norwitz6968b052007-02-27 19:02:19 +00001398 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001399 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001400 b.append(ord('o'))
1401 self.assertEqual(b, b'hello')
1402 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001403 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001404 b.append(ord('A'))
1405 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001406 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001407 b = bytearray()
1408 b.append(Indexable(ord('A')))
1409 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001410
1411 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001412 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001413 b.insert(1, ord('i'))
1414 b.insert(4, ord('i'))
1415 b.insert(-2, ord('i'))
1416 b.insert(1000, ord('i'))
1417 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001418 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001419 b = bytearray()
1420 b.insert(0, Indexable(ord('A')))
1421 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001422
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001423 def test_copied(self):
1424 # Issue 4348. Make sure that operations that don't mutate the array
1425 # copy the bytes.
1426 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001427 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001428
1429 t = bytearray([i for i in range(256)])
1430 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001431 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001432
Guido van Rossum254348e2007-11-21 19:29:53 +00001433 def test_partition_bytearray_doesnt_share_nullstring(self):
1434 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001435 self.assertEqual(b, b"")
1436 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001437 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001438 b += b"!"
1439 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001440 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001441 self.assertEqual(b, b"")
1442 self.assertEqual(c, b"")
1443 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001444 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001445 self.assertEqual(b, b"")
1446 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001447 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001448 b += b"!"
1449 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001450 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001451 self.assertEqual(b, b"")
1452 self.assertEqual(c, b"")
1453
Antoine Pitrou5504e892008-12-06 21:27:53 +00001454 def test_resize_forbidden(self):
1455 # #4509: can't resize a bytearray when there are buffer exports, even
1456 # if it wouldn't reallocate the underlying buffer.
1457 # Furthermore, no destructive changes to the buffer may be applied
1458 # before raising the error.
1459 b = bytearray(range(10))
1460 v = memoryview(b)
1461 def resize(n):
1462 b[1:-1] = range(n + 1, 2*n - 1)
1463 resize(10)
1464 orig = b[:]
1465 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001466 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001467 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001468 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001469 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001470 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001471 # Other operations implying resize
1472 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001473 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001474 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001475 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001476 def delitem():
1477 del b[1]
1478 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001479 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001480 # deleting a non-contiguous slice
1481 def delslice():
1482 b[1:-1:2] = b""
1483 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001484 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001485
Stefan Krah650c1e82015-02-03 21:43:23 +01001486 @test.support.cpython_only
1487 def test_obsolete_write_lock(self):
1488 from _testcapi import getbuffer_with_null_view
1489 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001490
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001491 def test_iterator_pickling2(self):
1492 orig = bytearray(b'abc')
1493 data = list(b'qwerty')
1494 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1495 # initial iterator
1496 itorig = iter(orig)
1497 d = pickle.dumps((itorig, orig), proto)
1498 it, b = pickle.loads(d)
1499 b[:] = data
1500 self.assertEqual(type(it), type(itorig))
1501 self.assertEqual(list(it), data)
1502
1503 # running iterator
1504 next(itorig)
1505 d = pickle.dumps((itorig, orig), proto)
1506 it, b = pickle.loads(d)
1507 b[:] = data
1508 self.assertEqual(type(it), type(itorig))
1509 self.assertEqual(list(it), data[1:])
1510
1511 # empty iterator
1512 for i in range(1, len(orig)):
1513 next(itorig)
1514 d = pickle.dumps((itorig, orig), proto)
1515 it, b = pickle.loads(d)
1516 b[:] = data
1517 self.assertEqual(type(it), type(itorig))
1518 self.assertEqual(list(it), data[len(orig):])
1519
1520 # exhausted iterator
1521 self.assertRaises(StopIteration, next, itorig)
1522 d = pickle.dumps((itorig, orig), proto)
1523 it, b = pickle.loads(d)
1524 b[:] = data
1525 self.assertEqual(list(it), [])
1526
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001527 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001528
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001529 def test_iterator_length_hint(self):
1530 # Issue 27443: __length_hint__ can return negative integer
1531 ba = bytearray(b'ab')
1532 it = iter(ba)
1533 next(it)
1534 ba.clear()
1535 # Shouldn't raise an error
1536 self.assertEqual(list(it), [])
1537
1538
Christian Heimes510711d2008-01-30 11:57:58 +00001539class AssortedBytesTest(unittest.TestCase):
1540 #
1541 # Test various combinations of bytes and bytearray
1542 #
1543
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001544 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001545 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001546 for f in str, repr:
1547 self.assertEqual(f(bytearray()), "bytearray(b'')")
1548 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1549 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1550 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1551 self.assertEqual(f(b"abc"), "b'abc'")
1552 self.assertEqual(f(b"'"), '''b"'"''') # '''
1553 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001554
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001555 @check_bytes_warnings
1556 def test_format(self):
1557 for b in b'abc', bytearray(b'abc'):
1558 self.assertEqual(format(b), str(b))
1559 self.assertEqual(format(b, ''), str(b))
1560 with self.assertRaisesRegex(TypeError,
1561 r'\b%s\b' % re.escape(type(b).__name__)):
1562 format(b, 's')
1563
Christian Heimes510711d2008-01-30 11:57:58 +00001564 def test_compare_bytes_to_bytearray(self):
1565 self.assertEqual(b"abc" == bytes(b"abc"), True)
1566 self.assertEqual(b"ab" != bytes(b"abc"), True)
1567 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1568 self.assertEqual(b"ab" < bytes(b"abc"), True)
1569 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1570 self.assertEqual(b"abc" > bytes(b"ab"), True)
1571
1572 self.assertEqual(b"abc" != bytes(b"abc"), False)
1573 self.assertEqual(b"ab" == bytes(b"abc"), False)
1574 self.assertEqual(b"ab" > bytes(b"abc"), False)
1575 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1576 self.assertEqual(b"abc" < bytes(b"ab"), False)
1577 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1578
1579 self.assertEqual(bytes(b"abc") == b"abc", True)
1580 self.assertEqual(bytes(b"ab") != b"abc", True)
1581 self.assertEqual(bytes(b"ab") <= b"abc", True)
1582 self.assertEqual(bytes(b"ab") < b"abc", True)
1583 self.assertEqual(bytes(b"abc") >= b"ab", True)
1584 self.assertEqual(bytes(b"abc") > b"ab", True)
1585
1586 self.assertEqual(bytes(b"abc") != b"abc", False)
1587 self.assertEqual(bytes(b"ab") == b"abc", False)
1588 self.assertEqual(bytes(b"ab") > b"abc", False)
1589 self.assertEqual(bytes(b"ab") >= b"abc", False)
1590 self.assertEqual(bytes(b"abc") < b"ab", False)
1591 self.assertEqual(bytes(b"abc") <= b"ab", False)
1592
Stefan Krah6e572b82013-01-26 13:06:36 +01001593 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001594 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001595 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001596 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001597 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001598 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001599
1600 def test_from_bytearray(self):
1601 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1602 buf = memoryview(sample)
1603 b = bytearray(buf)
1604 self.assertEqual(b, bytearray(sample))
1605
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001606 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001607 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001608 self.assertEqual(str(b''), "b''")
1609 self.assertEqual(str(b'x'), "b'x'")
1610 self.assertEqual(str(b'\x80'), "b'\\x80'")
1611 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1612 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1613 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001614
1615 def test_literal(self):
1616 tests = [
1617 (b"Wonderful spam", "Wonderful spam"),
1618 (br"Wonderful spam too", "Wonderful spam too"),
1619 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1620 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1621 ]
1622 for b, s in tests:
1623 self.assertEqual(b, bytearray(s, 'latin-1'))
1624 for c in range(128, 256):
1625 self.assertRaises(SyntaxError, eval,
1626 'b"%s"' % chr(c))
1627
Christian Heimes510711d2008-01-30 11:57:58 +00001628 def test_split_bytearray(self):
1629 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1630
1631 def test_rsplit_bytearray(self):
1632 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1633
Georg Brandleb2c9642008-05-30 12:05:02 +00001634 def test_return_self(self):
1635 # bytearray.replace must always return a new bytearray
1636 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001637 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001638
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001639 @unittest.skipUnless(sys.flags.bytes_warning,
1640 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001641 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001642 def bytes_warning():
1643 return test.support.check_warnings(('', BytesWarning))
1644 with bytes_warning():
1645 b'' == ''
1646 with bytes_warning():
1647 '' == b''
1648 with bytes_warning():
1649 b'' != ''
1650 with bytes_warning():
1651 '' != b''
1652 with bytes_warning():
1653 bytearray(b'') == ''
1654 with bytes_warning():
1655 '' == bytearray(b'')
1656 with bytes_warning():
1657 bytearray(b'') != ''
1658 with bytes_warning():
1659 '' != bytearray(b'')
1660 with bytes_warning():
1661 b'\0' == 0
1662 with bytes_warning():
1663 0 == b'\0'
1664 with bytes_warning():
1665 b'\0' != 0
1666 with bytes_warning():
1667 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001668
Guido van Rossumd624f182006-04-24 13:47:05 +00001669 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001670 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001671 # __reversed__? (optimization)
1672
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001673 # XXX More string methods? (Those that don't use character properties)
1674
Neal Norwitz6968b052007-02-27 19:02:19 +00001675 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001676 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001677 # Unfortunately they are all bundled with tests that
1678 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001679
Guido van Rossum254348e2007-11-21 19:29:53 +00001680 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001681 # the rest that make sense (the code can be cleaned up to use modern
1682 # unittest methods at the same time).
1683
Martin Panter152a19c2016-04-06 06:37:17 +00001684class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001685 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001686 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001687
1688 def test_returns_new_copy(self):
1689 val = self.marshal(b'1234')
1690 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001691 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001692 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1693 method = getattr(val, methname)
1694 newval = method(3)
1695 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001696 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001697 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001698 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1699 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1700 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1701 newval = eval(expr)
1702 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001703 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001704 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001705 sep = self.marshal(b'')
1706 newval = sep.join([val])
1707 self.assertEqual(val, newval)
1708 self.assertIsNot(val, newval)
1709
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001710
Christian Heimes510711d2008-01-30 11:57:58 +00001711class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001712 def fixtype(self, obj):
1713 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001714 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001715 return super().fixtype(obj)
1716
Martin Panter152a19c2016-04-06 06:37:17 +00001717 contains_bytes = True
1718
Ezio Melotti0dceb562013-01-10 07:43:26 +02001719class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001720 type2test = bytearray
1721
Ezio Melotti0dceb562013-01-10 07:43:26 +02001722class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001723 type2test = bytes
1724
Georg Brandlc7885542007-03-06 19:16:20 +00001725
Ezio Melotti0dceb562013-01-10 07:43:26 +02001726class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001727
1728 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001729 self.assertTrue(issubclass(self.type2test, self.basetype))
1730 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001731
1732 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001733 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001734
1735 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001736 self.assertTrue(_a == _a)
1737 self.assertTrue(_a != _b)
1738 self.assertTrue(_a < _b)
1739 self.assertTrue(_a <= _b)
1740 self.assertTrue(_b >= _a)
1741 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001742 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001743
1744 # test concat of subclass instances
1745 self.assertEqual(a + b, _a + _b)
1746 self.assertEqual(a + b, a + _b)
1747 self.assertEqual(a + b, _a + b)
1748
1749 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001750 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001751
1752 def test_join(self):
1753 # Make sure join returns a NEW object for single item sequences
1754 # involving a subclass.
1755 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001756 s1 = self.type2test(b"abcd")
1757 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001758 self.assertIsNot(s1, s2)
1759 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001760
1761 # Test reverse, calling join on subclass
1762 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001763 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001764
1765 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001766 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001767 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001768 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001769 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001770 b = pickle.loads(pickle.dumps(a, proto))
1771 self.assertNotEqual(id(a), id(b))
1772 self.assertEqual(a, b)
1773 self.assertEqual(a.x, b.x)
1774 self.assertEqual(a.y, b.y)
1775 self.assertEqual(type(a), type(b))
1776 self.assertEqual(type(a.y), type(b.y))
1777
1778 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001779 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001780 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001781 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001782 for copy_method in (copy.copy, copy.deepcopy):
1783 b = copy_method(a)
1784 self.assertNotEqual(id(a), id(b))
1785 self.assertEqual(a, b)
1786 self.assertEqual(a.x, b.x)
1787 self.assertEqual(a.y, b.y)
1788 self.assertEqual(type(a), type(b))
1789 self.assertEqual(type(a.y), type(b.y))
1790
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001791 def test_fromhex(self):
1792 b = self.type2test.fromhex('1a2B30')
1793 self.assertEqual(b, b'\x1a\x2b\x30')
1794 self.assertIs(type(b), self.type2test)
1795
1796 class B1(self.basetype):
1797 def __new__(cls, value):
1798 me = self.basetype.__new__(cls, value)
1799 me.foo = 'bar'
1800 return me
1801
1802 b = B1.fromhex('1a2B30')
1803 self.assertEqual(b, b'\x1a\x2b\x30')
1804 self.assertIs(type(b), B1)
1805 self.assertEqual(b.foo, 'bar')
1806
1807 class B2(self.basetype):
1808 def __init__(me, *args, **kwargs):
1809 if self.basetype is not bytes:
1810 self.basetype.__init__(me, *args, **kwargs)
1811 me.foo = 'bar'
1812
1813 b = B2.fromhex('1a2B30')
1814 self.assertEqual(b, b'\x1a\x2b\x30')
1815 self.assertIs(type(b), B2)
1816 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001817
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001818
1819class ByteArraySubclass(bytearray):
1820 pass
1821
1822class BytesSubclass(bytes):
1823 pass
1824
Serhiy Storchaka15095802015-11-25 15:47:01 +02001825class OtherBytesSubclass(bytes):
1826 pass
1827
Ezio Melotti0dceb562013-01-10 07:43:26 +02001828class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001829 basetype = bytearray
1830 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001831
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001832 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001833 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001834 def __init__(me, newarg=1, *args, **kwargs):
1835 bytearray.__init__(me, *args, **kwargs)
1836 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001837 x = subclass(4, source=b"abcd")
1838 self.assertEqual(x, b"abcd")
1839 x = subclass(newarg=4, source=b"abcd")
1840 self.assertEqual(x, b"abcd")
1841
1842
Ezio Melotti0dceb562013-01-10 07:43:26 +02001843class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001844 basetype = bytes
1845 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001846
1847
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001848if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001849 unittest.main()