blob: b7b48bfe17f6eed411a532656bfc566df490d86b [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
116 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000117 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
118 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000119 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000120 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
121 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000122
INADA Naokia634e232017-01-06 17:32:01 +0900123 def test_from_buffer(self):
124 a = self.type2test(array.array('B', [1, 2, 3]))
125 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300126 a = self.type2test(b"\x01\x02\x03")
127 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900128
129 # http://bugs.python.org/issue29159
130 # Fallback when __index__ raises exception other than OverflowError
131 class B(bytes):
132 def __index__(self):
133 raise TypeError
134
135 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
136
Guido van Rossum98297ee2007-11-06 21:34:58 +0000137 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000138 self.assertEqual(self.type2test(0), b'')
139 self.assertEqual(self.type2test(1), b'\x00')
140 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
141 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000142
Benjamin Peterson4c045832010-04-16 22:35:32 +0000143 self.assertEqual(self.type2test('0', 'ascii'), b'0')
144 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000145 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000146
147 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000148 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000149 class C:
150 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000151 self.assertRaises(TypeError, self.type2test, ["0"])
152 self.assertRaises(TypeError, self.type2test, [0.0])
153 self.assertRaises(TypeError, self.type2test, [None])
154 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200155 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
156 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
157 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
158 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
159 self.assertRaises(TypeError, self.type2test, '')
160 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
161 self.assertRaises(TypeError, self.type2test, '', b'ascii')
162 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000163
164 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000165 self.assertRaises(ValueError, self.type2test, [-1])
166 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
167 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
168 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
169 self.assertRaises(ValueError, self.type2test, [-10**100])
170 self.assertRaises(ValueError, self.type2test, [256])
171 self.assertRaises(ValueError, self.type2test, [257])
172 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
173 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
174 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000175
Antoine Pitroucc231542014-11-02 18:40:09 +0100176 @bigaddrspacetest
177 def test_constructor_overflow(self):
178 size = MAX_Py_ssize_t
179 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
180 try:
181 # Should either pass or raise an error (e.g. on debug builds with
182 # additional malloc() overhead), but shouldn't crash.
183 bytearray(size - 4)
184 except (OverflowError, MemoryError):
185 pass
186
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000187 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000188 b1 = self.type2test([1, 2, 3])
189 b2 = self.type2test([1, 2, 3])
190 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000191
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000192 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000193 self.assertTrue(b2 != b3)
194 self.assertTrue(b1 <= b2)
195 self.assertTrue(b1 <= b3)
196 self.assertTrue(b1 < b3)
197 self.assertTrue(b1 >= b2)
198 self.assertTrue(b3 >= b2)
199 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000200
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000201 self.assertFalse(b1 != b2)
202 self.assertFalse(b2 == b3)
203 self.assertFalse(b1 > b2)
204 self.assertFalse(b1 > b3)
205 self.assertFalse(b1 >= b3)
206 self.assertFalse(b1 < b2)
207 self.assertFalse(b3 < b2)
208 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000209
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000210 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000211 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000212 # Byte comparisons with unicode should always fail!
213 # Test this for all expected byte orders and Unicode character
214 # sizes.
215 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
216 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
217 False)
218 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
219 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
220 False)
221 self.assertEqual(self.type2test() == str(), False)
222 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000223
224 def test_reversed(self):
225 input = list(map(ord, "Hello"))
226 b = self.type2test(input)
227 output = list(reversed(b))
228 input.reverse()
229 self.assertEqual(output, input)
230
231 def test_getslice(self):
232 def by(s):
233 return self.type2test(map(ord, s))
234 b = by("Hello, world")
235
236 self.assertEqual(b[:5], by("Hello"))
237 self.assertEqual(b[1:5], by("ello"))
238 self.assertEqual(b[5:7], by(", "))
239 self.assertEqual(b[7:], by("world"))
240 self.assertEqual(b[7:12], by("world"))
241 self.assertEqual(b[7:100], by("world"))
242
243 self.assertEqual(b[:-7], by("Hello"))
244 self.assertEqual(b[-11:-7], by("ello"))
245 self.assertEqual(b[-7:-5], by(", "))
246 self.assertEqual(b[-5:], by("world"))
247 self.assertEqual(b[-5:12], by("world"))
248 self.assertEqual(b[-5:100], by("world"))
249 self.assertEqual(b[-100:5], by("Hello"))
250
251 def test_extended_getslice(self):
252 # Test extended slicing by comparing with list slicing.
253 L = list(range(255))
254 b = self.type2test(L)
255 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
256 for start in indices:
257 for stop in indices:
258 # Skip step 0 (invalid)
259 for step in indices[1:]:
260 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
261
262 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000263 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000264 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000265 b = self.type2test(sample, enc)
266 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000267 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
268 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000269 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000270
271 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300272 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000273 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000274 b = self.type2test(sample, enc)
275 self.assertEqual(b.decode(enc), sample)
276 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000277 b = self.type2test(sample, "latin-1")
278 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
279 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
280 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000281 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000282 # Default encoding is utf-8
283 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000284
285 def test_from_int(self):
286 b = self.type2test(0)
287 self.assertEqual(b, self.type2test())
288 b = self.type2test(10)
289 self.assertEqual(b, self.type2test([0]*10))
290 b = self.type2test(10000)
291 self.assertEqual(b, self.type2test([0]*10000))
292
293 def test_concat(self):
294 b1 = self.type2test(b"abc")
295 b2 = self.type2test(b"def")
296 self.assertEqual(b1 + b2, b"abcdef")
297 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
298 self.assertEqual(bytes(b"def") + b1, b"defabc")
299 self.assertRaises(TypeError, lambda: b1 + "def")
300 self.assertRaises(TypeError, lambda: "abc" + b2)
301
302 def test_repeat(self):
303 for b in b"abc", self.type2test(b"abc"):
304 self.assertEqual(b * 3, b"abcabcabc")
305 self.assertEqual(b * 0, b"")
306 self.assertEqual(b * -1, b"")
307 self.assertRaises(TypeError, lambda: b * 3.14)
308 self.assertRaises(TypeError, lambda: 3.14 * b)
309 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000310 with self.assertRaises((OverflowError, MemoryError)):
311 c = b * sys.maxsize
312 with self.assertRaises((OverflowError, MemoryError)):
313 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000314
315 def test_repeat_1char(self):
316 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
317
318 def test_contains(self):
319 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000320 self.assertIn(ord('a'), b)
321 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000322 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000323 self.assertRaises(ValueError, lambda: 300 in b)
324 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300325 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000326 self.assertRaises(TypeError, lambda: None in b)
327 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
328 self.assertRaises(TypeError, lambda: "a" in b)
329 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000330 self.assertIn(f(b""), b)
331 self.assertIn(f(b"a"), b)
332 self.assertIn(f(b"b"), b)
333 self.assertIn(f(b"c"), b)
334 self.assertIn(f(b"ab"), b)
335 self.assertIn(f(b"bc"), b)
336 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000337 self.assertNotIn(f(b"ac"), b)
338 self.assertNotIn(f(b"d"), b)
339 self.assertNotIn(f(b"dab"), b)
340 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000341
342 def test_fromhex(self):
343 self.assertRaises(TypeError, self.type2test.fromhex)
344 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000345 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000346 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000347 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
348 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200349
350 # check that ASCII whitespace is ignored
351 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
352 for c in "\x09\x0A\x0B\x0C\x0D\x20":
353 self.assertEqual(self.type2test.fromhex(c), self.type2test())
354 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
355 self.assertRaises(ValueError, self.type2test.fromhex, c)
356
Ezio Melottib3aedd42010-11-20 19:04:17 +0000357 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000358 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
359 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
360 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
361 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
362 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
363 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
364
Victor Stinner2bf89932015-10-14 11:25:33 +0200365 for data, pos in (
366 # invalid first hexadecimal character
367 ('12 x4 56', 3),
368 # invalid second hexadecimal character
369 ('12 3x 56', 4),
370 # two invalid hexadecimal characters
371 ('12 xy 56', 3),
372 # test non-ASCII string
373 ('12 3\xff 56', 4),
374 ):
375 with self.assertRaises(ValueError) as cm:
376 self.type2test.fromhex(data)
377 self.assertIn('at position %s' % pos, str(cm.exception))
378
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000379 def test_hex(self):
380 self.assertRaises(TypeError, self.type2test.hex)
381 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000382 self.assertEqual(self.type2test(b"").hex(), "")
383 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
384 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
385 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000386
Christian Heimes510711d2008-01-30 11:57:58 +0000387 def test_join(self):
388 self.assertEqual(self.type2test(b"").join([]), b"")
389 self.assertEqual(self.type2test(b"").join([b""]), b"")
390 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
391 lst = list(map(self.type2test, lst))
392 self.assertEqual(self.type2test(b"").join(lst), b"abc")
393 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
394 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200395 dot_join = self.type2test(b".:").join
396 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
397 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
398 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
399 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
400 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
401 # Stress it with many items
402 seq = [b"abc"] * 1000
403 expected = b"abc" + b".:abc" * 999
404 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400405 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200406 # Error handling and cleanup when some item in the middle of the
407 # sequence has the wrong type.
408 with self.assertRaises(TypeError):
409 dot_join([bytearray(b"ab"), "cd", b"ef"])
410 with self.assertRaises(TypeError):
411 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000412
Christian Heimes510711d2008-01-30 11:57:58 +0000413 def test_count(self):
414 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200415 i = 105
416 p = 112
417 w = 119
418
Christian Heimes510711d2008-01-30 11:57:58 +0000419 self.assertEqual(b.count(b'i'), 4)
420 self.assertEqual(b.count(b'ss'), 2)
421 self.assertEqual(b.count(b'w'), 0)
422
Antoine Pitrouac65d962011-10-20 23:54:17 +0200423 self.assertEqual(b.count(i), 4)
424 self.assertEqual(b.count(w), 0)
425
426 self.assertEqual(b.count(b'i', 6), 2)
427 self.assertEqual(b.count(b'p', 6), 2)
428 self.assertEqual(b.count(b'i', 1, 3), 1)
429 self.assertEqual(b.count(b'p', 7, 9), 1)
430
431 self.assertEqual(b.count(i, 6), 2)
432 self.assertEqual(b.count(p, 6), 2)
433 self.assertEqual(b.count(i, 1, 3), 1)
434 self.assertEqual(b.count(p, 7, 9), 1)
435
Christian Heimes510711d2008-01-30 11:57:58 +0000436 def test_startswith(self):
437 b = self.type2test(b'hello')
438 self.assertFalse(self.type2test().startswith(b"anything"))
439 self.assertTrue(b.startswith(b"hello"))
440 self.assertTrue(b.startswith(b"hel"))
441 self.assertTrue(b.startswith(b"h"))
442 self.assertFalse(b.startswith(b"hellow"))
443 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300444 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300445 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300446 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300447 self.assertIn('bytes', exc)
448 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000449
450 def test_endswith(self):
451 b = self.type2test(b'hello')
452 self.assertFalse(bytearray().endswith(b"anything"))
453 self.assertTrue(b.endswith(b"hello"))
454 self.assertTrue(b.endswith(b"llo"))
455 self.assertTrue(b.endswith(b"o"))
456 self.assertFalse(b.endswith(b"whello"))
457 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300458 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300459 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300460 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300461 self.assertIn('bytes', exc)
462 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000463
464 def test_find(self):
465 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200466 i = 105
467 w = 119
468
Christian Heimes510711d2008-01-30 11:57:58 +0000469 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000470 self.assertEqual(b.find(b'w'), -1)
471 self.assertEqual(b.find(b'mississippian'), -1)
472
Antoine Pitrouac65d962011-10-20 23:54:17 +0200473 self.assertEqual(b.find(i), 1)
474 self.assertEqual(b.find(w), -1)
475
476 self.assertEqual(b.find(b'ss', 3), 5)
477 self.assertEqual(b.find(b'ss', 1, 7), 2)
478 self.assertEqual(b.find(b'ss', 1, 3), -1)
479
480 self.assertEqual(b.find(i, 6), 7)
481 self.assertEqual(b.find(i, 1, 3), 1)
482 self.assertEqual(b.find(w, 1, 3), -1)
483
Victor Stinnerf8eac002011-12-18 01:17:41 +0100484 for index in (-1, 256, sys.maxsize + 1):
485 self.assertRaisesRegex(
486 ValueError, r'byte must be in range\(0, 256\)',
487 b.find, index)
488
Christian Heimes510711d2008-01-30 11:57:58 +0000489 def test_rfind(self):
490 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200491 i = 105
492 w = 119
493
Christian Heimes510711d2008-01-30 11:57:58 +0000494 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000495 self.assertEqual(b.rfind(b'w'), -1)
496 self.assertEqual(b.rfind(b'mississippian'), -1)
497
Antoine Pitrouac65d962011-10-20 23:54:17 +0200498 self.assertEqual(b.rfind(i), 10)
499 self.assertEqual(b.rfind(w), -1)
500
501 self.assertEqual(b.rfind(b'ss', 3), 5)
502 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
503
504 self.assertEqual(b.rfind(i, 1, 3), 1)
505 self.assertEqual(b.rfind(i, 3, 9), 7)
506 self.assertEqual(b.rfind(w, 1, 3), -1)
507
Christian Heimes510711d2008-01-30 11:57:58 +0000508 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200509 b = self.type2test(b'mississippi')
510 i = 105
511 w = 119
512
513 self.assertEqual(b.index(b'ss'), 2)
514 self.assertRaises(ValueError, b.index, b'w')
515 self.assertRaises(ValueError, b.index, b'mississippian')
516
517 self.assertEqual(b.index(i), 1)
518 self.assertRaises(ValueError, b.index, w)
519
520 self.assertEqual(b.index(b'ss', 3), 5)
521 self.assertEqual(b.index(b'ss', 1, 7), 2)
522 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
523
524 self.assertEqual(b.index(i, 6), 7)
525 self.assertEqual(b.index(i, 1, 3), 1)
526 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000527
528 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200529 b = self.type2test(b'mississippi')
530 i = 105
531 w = 119
532
533 self.assertEqual(b.rindex(b'ss'), 5)
534 self.assertRaises(ValueError, b.rindex, b'w')
535 self.assertRaises(ValueError, b.rindex, b'mississippian')
536
537 self.assertEqual(b.rindex(i), 10)
538 self.assertRaises(ValueError, b.rindex, w)
539
540 self.assertEqual(b.rindex(b'ss', 3), 5)
541 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
542
543 self.assertEqual(b.rindex(i, 1, 3), 1)
544 self.assertEqual(b.rindex(i, 3, 9), 7)
545 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000546
Ethan Furmanb95b5612015-01-23 20:05:18 -0800547 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300548 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800549 orig = b
550 b = b % b'world'
551 self.assertEqual(b, b'hello, world!')
552 self.assertEqual(orig, b'hello, %b!')
553 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300554 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800555 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200556 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200557 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800558 # issue 29714
559 b = self.type2test(b'hello,\x00%b!')
560 b = b % b'world'
561 self.assertEqual(b, b'hello,\x00world!')
562 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800563
564 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300565 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800566 orig = b
567 b %= b'world'
568 self.assertEqual(b, b'hello, world!')
569 self.assertEqual(orig, b'hello, %b!')
570 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300571 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800572 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200573 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200574 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800575 # issue 29714
576 b = self.type2test(b'hello,\x00%b!')
577 b %= b'world'
578 self.assertEqual(b, b'hello,\x00world!')
579 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300580
581 def test_rmod(self):
582 with self.assertRaises(TypeError):
583 object() % self.type2test(b'abc')
584 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800585
Christian Heimes510711d2008-01-30 11:57:58 +0000586 def test_replace(self):
587 b = self.type2test(b'mississippi')
588 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
589 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
590
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300591 def test_replace_int_error(self):
592 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
593
Christian Heimes510711d2008-01-30 11:57:58 +0000594 def test_split_string_error(self):
595 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300596 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
597
598 def test_split_int_error(self):
599 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
600 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000601
Antoine Pitrouf8453022010-01-12 22:05:42 +0000602 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000603 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
604 b = self.type2test(b)
605 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000606 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
607 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
608
Christian Heimes510711d2008-01-30 11:57:58 +0000609 def test_rsplit_unicodewhitespace(self):
610 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000611 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
612
613 def test_partition(self):
614 b = self.type2test(b'mississippi')
615 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000616 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000617
618 def test_rpartition(self):
619 b = self.type2test(b'mississippi')
620 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
621 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000622 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000623
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300624 def test_partition_string_error(self):
625 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
626 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
627
628 def test_partition_int_error(self):
629 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
630 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
631
Christian Heimes510711d2008-01-30 11:57:58 +0000632 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000633 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000634 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
635 b = self.type2test(b)
636 ps = pickle.dumps(b, proto)
637 q = pickle.loads(ps)
638 self.assertEqual(b, q)
639
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000640 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200641 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
642 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
643 it = itorg = iter(self.type2test(b))
644 data = list(self.type2test(b))
645 d = pickle.dumps(it, proto)
646 it = pickle.loads(d)
647 self.assertEqual(type(itorg), type(it))
648 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000649
Serhiy Storchakabad12572014-12-15 14:03:42 +0200650 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200651 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200652 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200653 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200654 d = pickle.dumps(it, proto)
655 it = pickle.loads(d)
656 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000657
Christian Heimes510711d2008-01-30 11:57:58 +0000658 def test_strip_bytearray(self):
659 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
660 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
661 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
662
663 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300664 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
665 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
666 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
667
668 def test_strip_int_error(self):
669 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
670 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
671 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000672
Eli Bendersky906b88f2011-07-29 07:05:08 +0300673 def test_center(self):
674 # Fill character can be either bytes or bytearray (issue 12380)
675 b = self.type2test(b'abc')
676 for fill_type in (bytes, bytearray):
677 self.assertEqual(b.center(7, fill_type(b'-')),
678 self.type2test(b'--abc--'))
679
680 def test_ljust(self):
681 # Fill character can be either bytes or bytearray (issue 12380)
682 b = self.type2test(b'abc')
683 for fill_type in (bytes, bytearray):
684 self.assertEqual(b.ljust(7, fill_type(b'-')),
685 self.type2test(b'abc----'))
686
687 def test_rjust(self):
688 # Fill character can be either bytes or bytearray (issue 12380)
689 b = self.type2test(b'abc')
690 for fill_type in (bytes, bytearray):
691 self.assertEqual(b.rjust(7, fill_type(b'-')),
692 self.type2test(b'----abc'))
693
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300694 def test_xjust_int_error(self):
695 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
696 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
697 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
698
Christian Heimes510711d2008-01-30 11:57:58 +0000699 def test_ord(self):
700 b = self.type2test(b'\0A\x7f\x80\xff')
701 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
702 [0, 65, 127, 128, 255])
703
Georg Brandlabc38772009-04-12 15:51:51 +0000704 def test_maketrans(self):
705 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 +0000706 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000707 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'
708 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000709 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
710 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
711
Jesus Ceaac451502011-04-20 17:09:23 +0200712 def test_none_arguments(self):
713 # issue 11828
714 b = self.type2test(b'hello')
715 l = self.type2test(b'l')
716 h = self.type2test(b'h')
717 x = self.type2test(b'x')
718 o = self.type2test(b'o')
719
720 self.assertEqual(2, b.find(l, None))
721 self.assertEqual(3, b.find(l, -2, None))
722 self.assertEqual(2, b.find(l, None, -2))
723 self.assertEqual(0, b.find(h, None, None))
724
725 self.assertEqual(3, b.rfind(l, None))
726 self.assertEqual(3, b.rfind(l, -2, None))
727 self.assertEqual(2, b.rfind(l, None, -2))
728 self.assertEqual(0, b.rfind(h, None, None))
729
730 self.assertEqual(2, b.index(l, None))
731 self.assertEqual(3, b.index(l, -2, None))
732 self.assertEqual(2, b.index(l, None, -2))
733 self.assertEqual(0, b.index(h, None, None))
734
735 self.assertEqual(3, b.rindex(l, None))
736 self.assertEqual(3, b.rindex(l, -2, None))
737 self.assertEqual(2, b.rindex(l, None, -2))
738 self.assertEqual(0, b.rindex(h, None, None))
739
740 self.assertEqual(2, b.count(l, None))
741 self.assertEqual(1, b.count(l, -2, None))
742 self.assertEqual(1, b.count(l, None, -2))
743 self.assertEqual(0, b.count(x, None, None))
744
745 self.assertEqual(True, b.endswith(o, None))
746 self.assertEqual(True, b.endswith(o, -2, None))
747 self.assertEqual(True, b.endswith(l, None, -2))
748 self.assertEqual(False, b.endswith(x, None, None))
749
750 self.assertEqual(True, b.startswith(h, None))
751 self.assertEqual(True, b.startswith(l, -2, None))
752 self.assertEqual(True, b.startswith(h, None, -2))
753 self.assertEqual(False, b.startswith(x, None, None))
754
Antoine Pitrouac65d962011-10-20 23:54:17 +0200755 def test_integer_arguments_out_of_byte_range(self):
756 b = self.type2test(b'hello')
757
758 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
759 self.assertRaises(ValueError, method, -1)
760 self.assertRaises(ValueError, method, 256)
761 self.assertRaises(ValueError, method, 9999)
762
Jesus Ceaac451502011-04-20 17:09:23 +0200763 def test_find_etc_raise_correct_error_messages(self):
764 # issue 11828
765 b = self.type2test(b'hello')
766 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300767 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200768 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300769 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200770 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300771 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200772 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300773 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200774 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300775 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200776 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300777 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200778 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300779 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200780 x, None, None, None)
781
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300782 def test_free_after_iterating(self):
783 test.support.check_free_after_iterating(self, iter, self.type2test)
784 test.support.check_free_after_iterating(self, reversed, self.type2test)
785
Martin Panter1b6c6da2016-08-27 08:35:02 +0000786 def test_translate(self):
787 b = self.type2test(b'hello')
788 rosetta = bytearray(range(256))
789 rosetta[ord('o')] = ord('e')
790
791 self.assertRaises(TypeError, b.translate)
792 self.assertRaises(TypeError, b.translate, None, None)
793 self.assertRaises(ValueError, b.translate, bytes(range(255)))
794
795 c = b.translate(rosetta, b'hello')
796 self.assertEqual(b, b'hello')
797 self.assertIsInstance(c, self.type2test)
798
799 c = b.translate(rosetta)
800 d = b.translate(rosetta, b'')
801 self.assertEqual(c, d)
802 self.assertEqual(c, b'helle')
803
804 c = b.translate(rosetta, b'l')
805 self.assertEqual(c, b'hee')
806 c = b.translate(None, b'e')
807 self.assertEqual(c, b'hllo')
808
809 # test delete as a keyword argument
810 c = b.translate(rosetta, delete=b'')
811 self.assertEqual(c, b'helle')
812 c = b.translate(rosetta, delete=b'l')
813 self.assertEqual(c, b'hee')
814 c = b.translate(None, delete=b'e')
815 self.assertEqual(c, b'hllo')
816
Christian Heimes510711d2008-01-30 11:57:58 +0000817
Ezio Melotti0dceb562013-01-10 07:43:26 +0200818class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000819 type2test = bytes
820
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400821 def test_getitem_error(self):
822 msg = "byte indices must be integers or slices"
823 with self.assertRaisesRegex(TypeError, msg):
824 b'python'['a']
825
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000826 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200827 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000828 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000829 self.assertRaises(TypeError, f.readinto, b"")
830
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000831 def test_custom(self):
832 class A:
833 def __bytes__(self):
834 return b'abc'
835 self.assertEqual(bytes(A()), b'abc')
836 class A: pass
837 self.assertRaises(TypeError, bytes, A())
838 class A:
839 def __bytes__(self):
840 return None
841 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600842 class A:
843 def __bytes__(self):
844 return b'a'
845 def __index__(self):
846 return 42
847 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200848 # Issue #25766
849 class A(str):
850 def __bytes__(self):
851 return b'abc'
852 self.assertEqual(bytes(A('\u20ac')), b'abc')
853 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200854 # Issue #24731
855 class A:
856 def __bytes__(self):
857 return OtherBytesSubclass(b'abc')
858 self.assertEqual(bytes(A()), b'abc')
859 self.assertIs(type(bytes(A())), OtherBytesSubclass)
860 self.assertEqual(BytesSubclass(A()), b'abc')
861 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000862
Victor Stinner29e762c2011-01-05 03:33:28 +0000863 # Test PyBytes_FromFormat()
864 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200865 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200866 _testcapi = test.support.import_module('_testcapi')
867 from ctypes import pythonapi, py_object
868 from ctypes import (
869 c_int, c_uint,
870 c_long, c_ulong,
871 c_size_t, c_ssize_t,
872 c_char_p)
873
Victor Stinner29e762c2011-01-05 03:33:28 +0000874 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
875 PyBytes_FromFormat.restype = py_object
876
Victor Stinner03dab782015-10-14 00:21:35 +0200877 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000878 self.assertEqual(PyBytes_FromFormat(b'format'),
879 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200880 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
881 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000882
Victor Stinner03dab782015-10-14 00:21:35 +0200883 # test formatters
884 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
885 b'c=\0')
886 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
887 b'c=@')
888 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
889 b'c=\xff')
890 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
891 c_int(1), c_long(2),
892 c_size_t(3)),
893 b'd=1 ld=2 zd=3')
894 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
895 c_int(-1), c_long(-2),
896 c_size_t(-3)),
897 b'd=-1 ld=-2 zd=-3')
898 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
899 c_uint(123), c_ulong(456),
900 c_size_t(789)),
901 b'u=123 lu=456 zu=789')
902 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
903 b'i=123')
904 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
905 b'i=-123')
906 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
907 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200908
909 sizeof_ptr = ctypes.sizeof(c_char_p)
910
911 if os.name == 'nt':
912 # Windows (MSCRT)
913 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
914 def ptr_formatter(ptr):
915 return (ptr_format % ptr)
916 else:
917 # UNIX (glibc)
918 def ptr_formatter(ptr):
919 return '%#x' % ptr
920
Victor Stinner7ab986d2015-10-14 02:55:12 +0200921 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200922 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
923 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200924 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
925 b's=cstr')
926
927 # test minimum and maximum integer values
928 size_max = c_size_t(-1).value
929 for formatstr, ctypes_type, value, py_formatter in (
930 (b'%d', c_int, _testcapi.INT_MIN, str),
931 (b'%d', c_int, _testcapi.INT_MAX, str),
932 (b'%ld', c_long, _testcapi.LONG_MIN, str),
933 (b'%ld', c_long, _testcapi.LONG_MAX, str),
934 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
935 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
936 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
937 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200938 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200939 ):
940 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
941 py_formatter(value).encode('ascii')),
942
943 # width and precision (width is currently ignored)
944 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
945 b'a')
946 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
947 b'abc')
948
949 # '%%' formatter
950 self.assertEqual(PyBytes_FromFormat(b'%%'),
951 b'%')
952 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
953 b'[%]')
954 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
955 b'%_')
956 self.assertEqual(PyBytes_FromFormat(b'%%s'),
957 b'%s')
958
959 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000960 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200961 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
962 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000963
Victor Stinner03dab782015-10-14 00:21:35 +0200964 # Issue #19969: %c must raise OverflowError for values
965 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100966 self.assertRaises(OverflowError,
967 PyBytes_FromFormat, b'%c', c_int(-1))
968 self.assertRaises(OverflowError,
969 PyBytes_FromFormat, b'%c', c_int(256))
970
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700971 def test_bytes_blocking(self):
972 class IterationBlocked(list):
973 __bytes__ = None
974 i = [0, 1, 2, 3]
975 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
976 self.assertRaises(TypeError, bytes, IterationBlocked(i))
977
978 # At least in CPython, because bytes.__new__ and the C API
979 # PyBytes_FromObject have different fallback rules, integer
980 # fallback is handled specially, so test separately.
981 class IntBlocked(int):
982 __bytes__ = None
983 self.assertEqual(bytes(3), b'\0\0\0')
984 self.assertRaises(TypeError, bytes, IntBlocked(3))
985
986 # While there is no separately-defined rule for handling bytes
987 # subclasses differently from other buffer-interface classes,
988 # an implementation may well special-case them (as CPython 2.x
989 # str did), so test them separately.
990 class BytesSubclassBlocked(bytes):
991 __bytes__ = None
992 self.assertEqual(bytes(b'ab'), b'ab')
993 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
994
995 class BufferBlocked(bytearray):
996 __bytes__ = None
997 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
998 self.assertEqual(bytes(ba), b'ab')
999 self.assertRaises(TypeError, bytes, bb)
1000
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001001
Ezio Melotti0dceb562013-01-10 07:43:26 +02001002class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001003 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001004
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001005 def test_getitem_error(self):
1006 msg = "bytearray indices must be integers or slices"
1007 with self.assertRaisesRegex(TypeError, msg):
1008 bytearray(b'python')['a']
1009
1010 def test_setitem_error(self):
1011 msg = "bytearray indices must be integers or slices"
1012 with self.assertRaisesRegex(TypeError, msg):
1013 b = bytearray(b'python')
1014 b['a'] = "python"
1015
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001016 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001017 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001018
Guido van Rossum254348e2007-11-21 19:29:53 +00001019 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001020 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001021 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001022 tfn = tempfile.mktemp()
1023 try:
1024 # Prepare
1025 with open(tfn, "wb") as f:
1026 f.write(short_sample)
1027 # Test readinto
1028 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001029 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001030 n = f.readinto(b)
1031 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001032 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001033 # Test writing in binary mode
1034 with open(tfn, "wb") as f:
1035 f.write(b)
1036 with open(tfn, "rb") as f:
1037 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001038 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001039 finally:
1040 try:
1041 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001042 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001043 pass
1044
Neal Norwitz6968b052007-02-27 19:02:19 +00001045 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001046 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001047 self.assertEqual(b.reverse(), None)
1048 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001049 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001050 b.reverse()
1051 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001052 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001053 b.reverse()
1054 self.assertFalse(b)
1055
Eli Bendersky4db28d32011-03-03 18:21:02 +00001056 def test_clear(self):
1057 b = bytearray(b'python')
1058 b.clear()
1059 self.assertEqual(b, b'')
1060
1061 b = bytearray(b'')
1062 b.clear()
1063 self.assertEqual(b, b'')
1064
1065 b = bytearray(b'')
1066 b.append(ord('r'))
1067 b.clear()
1068 b.append(ord('p'))
1069 self.assertEqual(b, b'p')
1070
1071 def test_copy(self):
1072 b = bytearray(b'abc')
1073 bb = b.copy()
1074 self.assertEqual(bb, b'abc')
1075
1076 b = bytearray(b'')
1077 bb = b.copy()
1078 self.assertEqual(bb, b'')
1079
1080 # test that it's indeed a copy and not a reference
1081 b = bytearray(b'abc')
1082 bb = b.copy()
1083 self.assertEqual(b, bb)
1084 self.assertIsNot(b, bb)
1085 bb.append(ord('d'))
1086 self.assertEqual(bb, b'abcd')
1087 self.assertEqual(b, b'abc')
1088
Guido van Rossumd624f182006-04-24 13:47:05 +00001089 def test_regexps(self):
1090 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001091 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001092 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001093 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001094
1095 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001096 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001097 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001098 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001099 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001100 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001101 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001102 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001103 try:
1104 b[3] = 0
1105 self.fail("Didn't raise IndexError")
1106 except IndexError:
1107 pass
1108 try:
1109 b[-10] = 0
1110 self.fail("Didn't raise IndexError")
1111 except IndexError:
1112 pass
1113 try:
1114 b[0] = 256
1115 self.fail("Didn't raise ValueError")
1116 except ValueError:
1117 pass
1118 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001119 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001120 self.fail("Didn't raise ValueError")
1121 except ValueError:
1122 pass
1123 try:
1124 b[0] = None
1125 self.fail("Didn't raise TypeError")
1126 except TypeError:
1127 pass
1128
1129 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001130 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001131 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001132 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001133 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001134 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001135 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001136 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001137
1138 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001140 self.assertEqual(list(b), list(range(10)))
1141
Guido van Rossum254348e2007-11-21 19:29:53 +00001142 b[0:5] = bytearray([1, 1, 1, 1, 1])
1143 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001144
1145 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001146 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001147
Guido van Rossum254348e2007-11-21 19:29:53 +00001148 b[0:0] = bytearray([0, 1, 2, 3, 4])
1149 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001150
Guido van Rossum254348e2007-11-21 19:29:53 +00001151 b[-7:-3] = bytearray([100, 101])
1152 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001153
1154 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001155 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001156
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001157 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001158 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 +00001159
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001160 b[3:] = b'foo'
1161 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1162
1163 b[:3] = memoryview(b'foo')
1164 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1165
1166 b[3:4] = []
1167 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1168
1169 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1170 ['a', 'b'], [b'a', b'b'], [[]]]:
1171 with self.assertRaises(TypeError):
1172 b[3:4] = elem
1173
1174 for elem in [[254, 255, 256], [-256, 9000]]:
1175 with self.assertRaises(ValueError):
1176 b[3:4] = elem
1177
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001178 def test_setslice_extend(self):
1179 # Exercise the resizing logic (see issue #19087)
1180 b = bytearray(range(100))
1181 self.assertEqual(list(b), list(range(100)))
1182 del b[:10]
1183 self.assertEqual(list(b), list(range(10, 100)))
1184 b.extend(range(100, 110))
1185 self.assertEqual(list(b), list(range(10, 110)))
1186
Antoine Pitrou25454112015-05-19 20:52:27 +02001187 def test_fifo_overrun(self):
1188 # Test for issue #23985, a buffer overrun when implementing a FIFO
1189 # Build Python in pydebug mode for best results.
1190 b = bytearray(10)
1191 b.pop() # Defeat expanding buffer off-by-one quirk
1192 del b[:1] # Advance start pointer without reallocating
1193 b += bytes(2) # Append exactly the number of deleted bytes
1194 del b # Free memory buffer, allowing pydebug verification
1195
1196 def test_del_expand(self):
1197 # Reducing the size should not expand the buffer (issue #23985)
1198 b = bytearray(10)
1199 size = sys.getsizeof(b)
1200 del b[:1]
1201 self.assertLessEqual(sys.getsizeof(b), size)
1202
Thomas Wouters376446d2006-12-19 08:30:14 +00001203 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001204 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001205 for start in indices:
1206 for stop in indices:
1207 # Skip invalid step 0
1208 for step in indices[1:]:
1209 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001210 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001211 # Make sure we have a slice of exactly the right length,
1212 # but with different data.
1213 data = L[start:stop:step]
1214 data.reverse()
1215 L[start:stop:step] = data
1216 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001217 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001218
Thomas Wouters376446d2006-12-19 08:30:14 +00001219 del L[start:stop:step]
1220 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001221 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001222
Guido van Rossumd624f182006-04-24 13:47:05 +00001223 def test_setslice_trap(self):
1224 # This test verifies that we correctly handle assigning self
1225 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001226 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001227 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001228 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001229
Guido van Rossum13e57212006-04-27 22:54:26 +00001230 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001231 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001232 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001233 b += b"def"
1234 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001235 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001236 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001237 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001238 self.assertEqual(b, b"abcdefxyz")
1239 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001240 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001241 except TypeError:
1242 pass
1243 else:
1244 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001245
1246 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001247 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001248 b1 = b
1249 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001250 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001251 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001252 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001253
1254 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001255 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001256 b1 = b
1257 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001258 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001259 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001260 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001261
Guido van Rossum20188312006-05-05 15:15:40 +00001262 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001263 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001264 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001265 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001266 seq = [alloc]
1267 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001268 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001269 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001270 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001271 if alloc not in seq:
1272 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001273
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001274 def test_init_alloc(self):
1275 b = bytearray()
1276 def g():
1277 for i in range(1, 100):
1278 yield i
1279 a = list(b)
1280 self.assertEqual(a, list(range(1, len(a)+1)))
1281 self.assertEqual(len(b), len(a))
1282 self.assertLessEqual(len(b), i)
1283 alloc = b.__alloc__()
1284 self.assertGreater(alloc, len(b)) # including trailing null byte
1285 b.__init__(g())
1286 self.assertEqual(list(b), list(range(1, 100)))
1287 self.assertEqual(len(b), 99)
1288 alloc = b.__alloc__()
1289 self.assertGreater(alloc, len(b))
1290
Neal Norwitz6968b052007-02-27 19:02:19 +00001291 def test_extend(self):
1292 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001293 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001294 a.extend(a)
1295 self.assertEqual(a, orig + orig)
1296 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001297 a = bytearray(b'')
1298 # Test iterators that don't have a __length_hint__
1299 a.extend(map(int, orig * 25))
1300 a.extend(int(x) for x in orig * 25)
1301 self.assertEqual(a, orig * 50)
1302 self.assertEqual(a[-5:], orig)
1303 a = bytearray(b'')
1304 a.extend(iter(map(int, orig * 50)))
1305 self.assertEqual(a, orig * 50)
1306 self.assertEqual(a[-5:], orig)
1307 a = bytearray(b'')
1308 a.extend(list(map(int, orig * 50)))
1309 self.assertEqual(a, orig * 50)
1310 self.assertEqual(a[-5:], orig)
1311 a = bytearray(b'')
1312 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1313 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1314 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001315 a = bytearray(b'')
1316 a.extend([Indexable(ord('a'))])
1317 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001318
Neal Norwitz6968b052007-02-27 19:02:19 +00001319 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001320 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001321 b.remove(ord('l'))
1322 self.assertEqual(b, b'helo')
1323 b.remove(ord('l'))
1324 self.assertEqual(b, b'heo')
1325 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1326 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001327 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001328 # remove first and last
1329 b.remove(ord('o'))
1330 b.remove(ord('h'))
1331 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001332 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001333 b.remove(Indexable(ord('e')))
1334 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001335
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001336 # test values outside of the ascii range: (0, 127)
1337 c = bytearray([126, 127, 128, 129])
1338 c.remove(127)
1339 self.assertEqual(c, bytes([126, 128, 129]))
1340 c.remove(129)
1341 self.assertEqual(c, bytes([126, 128]))
1342
Neal Norwitz6968b052007-02-27 19:02:19 +00001343 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001344 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001345 self.assertEqual(b.pop(), ord('d'))
1346 self.assertEqual(b.pop(0), ord('w'))
1347 self.assertEqual(b.pop(-2), ord('r'))
1348 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001349 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001350 # test for issue #6846
1351 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001352
1353 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001354 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001355
Neal Norwitz6968b052007-02-27 19:02:19 +00001356 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001357 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001358 b.append(ord('o'))
1359 self.assertEqual(b, b'hello')
1360 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001361 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001362 b.append(ord('A'))
1363 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001364 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001365 b = bytearray()
1366 b.append(Indexable(ord('A')))
1367 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001368
1369 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001370 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001371 b.insert(1, ord('i'))
1372 b.insert(4, ord('i'))
1373 b.insert(-2, ord('i'))
1374 b.insert(1000, ord('i'))
1375 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001376 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001377 b = bytearray()
1378 b.insert(0, Indexable(ord('A')))
1379 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001380
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001381 def test_copied(self):
1382 # Issue 4348. Make sure that operations that don't mutate the array
1383 # copy the bytes.
1384 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001385 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001386
1387 t = bytearray([i for i in range(256)])
1388 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001389 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001390
Guido van Rossum254348e2007-11-21 19:29:53 +00001391 def test_partition_bytearray_doesnt_share_nullstring(self):
1392 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001393 self.assertEqual(b, b"")
1394 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001395 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001396 b += b"!"
1397 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001398 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001399 self.assertEqual(b, b"")
1400 self.assertEqual(c, b"")
1401 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001402 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001403 self.assertEqual(b, b"")
1404 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001405 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001406 b += b"!"
1407 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001408 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001409 self.assertEqual(b, b"")
1410 self.assertEqual(c, b"")
1411
Antoine Pitrou5504e892008-12-06 21:27:53 +00001412 def test_resize_forbidden(self):
1413 # #4509: can't resize a bytearray when there are buffer exports, even
1414 # if it wouldn't reallocate the underlying buffer.
1415 # Furthermore, no destructive changes to the buffer may be applied
1416 # before raising the error.
1417 b = bytearray(range(10))
1418 v = memoryview(b)
1419 def resize(n):
1420 b[1:-1] = range(n + 1, 2*n - 1)
1421 resize(10)
1422 orig = b[:]
1423 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001424 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001425 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001426 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001427 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001428 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001429 # Other operations implying resize
1430 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001431 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001432 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001433 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001434 def delitem():
1435 del b[1]
1436 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001437 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001438 # deleting a non-contiguous slice
1439 def delslice():
1440 b[1:-1:2] = b""
1441 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001442 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001443
Stefan Krah650c1e82015-02-03 21:43:23 +01001444 @test.support.cpython_only
1445 def test_obsolete_write_lock(self):
1446 from _testcapi import getbuffer_with_null_view
1447 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001448
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001449 def test_iterator_pickling2(self):
1450 orig = bytearray(b'abc')
1451 data = list(b'qwerty')
1452 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1453 # initial iterator
1454 itorig = iter(orig)
1455 d = pickle.dumps((itorig, orig), proto)
1456 it, b = pickle.loads(d)
1457 b[:] = data
1458 self.assertEqual(type(it), type(itorig))
1459 self.assertEqual(list(it), data)
1460
1461 # running iterator
1462 next(itorig)
1463 d = pickle.dumps((itorig, orig), proto)
1464 it, b = pickle.loads(d)
1465 b[:] = data
1466 self.assertEqual(type(it), type(itorig))
1467 self.assertEqual(list(it), data[1:])
1468
1469 # empty iterator
1470 for i in range(1, len(orig)):
1471 next(itorig)
1472 d = pickle.dumps((itorig, orig), proto)
1473 it, b = pickle.loads(d)
1474 b[:] = data
1475 self.assertEqual(type(it), type(itorig))
1476 self.assertEqual(list(it), data[len(orig):])
1477
1478 # exhausted iterator
1479 self.assertRaises(StopIteration, next, itorig)
1480 d = pickle.dumps((itorig, orig), proto)
1481 it, b = pickle.loads(d)
1482 b[:] = data
1483 self.assertEqual(list(it), [])
1484
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001485 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001486
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001487 def test_iterator_length_hint(self):
1488 # Issue 27443: __length_hint__ can return negative integer
1489 ba = bytearray(b'ab')
1490 it = iter(ba)
1491 next(it)
1492 ba.clear()
1493 # Shouldn't raise an error
1494 self.assertEqual(list(it), [])
1495
1496
Christian Heimes510711d2008-01-30 11:57:58 +00001497class AssortedBytesTest(unittest.TestCase):
1498 #
1499 # Test various combinations of bytes and bytearray
1500 #
1501
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001502 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001503 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001504 for f in str, repr:
1505 self.assertEqual(f(bytearray()), "bytearray(b'')")
1506 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1507 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1508 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1509 self.assertEqual(f(b"abc"), "b'abc'")
1510 self.assertEqual(f(b"'"), '''b"'"''') # '''
1511 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001512
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001513 @check_bytes_warnings
1514 def test_format(self):
1515 for b in b'abc', bytearray(b'abc'):
1516 self.assertEqual(format(b), str(b))
1517 self.assertEqual(format(b, ''), str(b))
1518 with self.assertRaisesRegex(TypeError,
1519 r'\b%s\b' % re.escape(type(b).__name__)):
1520 format(b, 's')
1521
Christian Heimes510711d2008-01-30 11:57:58 +00001522 def test_compare_bytes_to_bytearray(self):
1523 self.assertEqual(b"abc" == bytes(b"abc"), True)
1524 self.assertEqual(b"ab" != bytes(b"abc"), True)
1525 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1526 self.assertEqual(b"ab" < bytes(b"abc"), True)
1527 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1528 self.assertEqual(b"abc" > bytes(b"ab"), True)
1529
1530 self.assertEqual(b"abc" != bytes(b"abc"), False)
1531 self.assertEqual(b"ab" == bytes(b"abc"), False)
1532 self.assertEqual(b"ab" > bytes(b"abc"), False)
1533 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1534 self.assertEqual(b"abc" < bytes(b"ab"), False)
1535 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1536
1537 self.assertEqual(bytes(b"abc") == b"abc", True)
1538 self.assertEqual(bytes(b"ab") != b"abc", True)
1539 self.assertEqual(bytes(b"ab") <= b"abc", True)
1540 self.assertEqual(bytes(b"ab") < b"abc", True)
1541 self.assertEqual(bytes(b"abc") >= b"ab", True)
1542 self.assertEqual(bytes(b"abc") > b"ab", True)
1543
1544 self.assertEqual(bytes(b"abc") != b"abc", False)
1545 self.assertEqual(bytes(b"ab") == b"abc", False)
1546 self.assertEqual(bytes(b"ab") > b"abc", False)
1547 self.assertEqual(bytes(b"ab") >= b"abc", False)
1548 self.assertEqual(bytes(b"abc") < b"ab", False)
1549 self.assertEqual(bytes(b"abc") <= b"ab", False)
1550
Stefan Krah6e572b82013-01-26 13:06:36 +01001551 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001552 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001553 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001554 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001555 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001556 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001557
1558 def test_from_bytearray(self):
1559 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1560 buf = memoryview(sample)
1561 b = bytearray(buf)
1562 self.assertEqual(b, bytearray(sample))
1563
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001564 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001565 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001566 self.assertEqual(str(b''), "b''")
1567 self.assertEqual(str(b'x'), "b'x'")
1568 self.assertEqual(str(b'\x80'), "b'\\x80'")
1569 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1570 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1571 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001572
1573 def test_literal(self):
1574 tests = [
1575 (b"Wonderful spam", "Wonderful spam"),
1576 (br"Wonderful spam too", "Wonderful spam too"),
1577 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1578 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1579 ]
1580 for b, s in tests:
1581 self.assertEqual(b, bytearray(s, 'latin-1'))
1582 for c in range(128, 256):
1583 self.assertRaises(SyntaxError, eval,
1584 'b"%s"' % chr(c))
1585
Christian Heimes510711d2008-01-30 11:57:58 +00001586 def test_split_bytearray(self):
1587 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1588
1589 def test_rsplit_bytearray(self):
1590 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1591
Georg Brandleb2c9642008-05-30 12:05:02 +00001592 def test_return_self(self):
1593 # bytearray.replace must always return a new bytearray
1594 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001595 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001596
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001597 @unittest.skipUnless(sys.flags.bytes_warning,
1598 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001599 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001600 def bytes_warning():
1601 return test.support.check_warnings(('', BytesWarning))
1602 with bytes_warning():
1603 b'' == ''
1604 with bytes_warning():
1605 '' == b''
1606 with bytes_warning():
1607 b'' != ''
1608 with bytes_warning():
1609 '' != b''
1610 with bytes_warning():
1611 bytearray(b'') == ''
1612 with bytes_warning():
1613 '' == bytearray(b'')
1614 with bytes_warning():
1615 bytearray(b'') != ''
1616 with bytes_warning():
1617 '' != bytearray(b'')
1618 with bytes_warning():
1619 b'\0' == 0
1620 with bytes_warning():
1621 0 == b'\0'
1622 with bytes_warning():
1623 b'\0' != 0
1624 with bytes_warning():
1625 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001626
Guido van Rossumd624f182006-04-24 13:47:05 +00001627 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001628 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001629 # __reversed__? (optimization)
1630
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001631 # XXX More string methods? (Those that don't use character properties)
1632
Neal Norwitz6968b052007-02-27 19:02:19 +00001633 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001634 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001635 # Unfortunately they are all bundled with tests that
1636 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001637
Guido van Rossum254348e2007-11-21 19:29:53 +00001638 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001639 # the rest that make sense (the code can be cleaned up to use modern
1640 # unittest methods at the same time).
1641
Martin Panter152a19c2016-04-06 06:37:17 +00001642class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001643 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001644 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001645
1646 def test_returns_new_copy(self):
1647 val = self.marshal(b'1234')
1648 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001649 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001650 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1651 method = getattr(val, methname)
1652 newval = method(3)
1653 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001654 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001655 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001656 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1657 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1658 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1659 newval = eval(expr)
1660 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001661 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001662 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001663 sep = self.marshal(b'')
1664 newval = sep.join([val])
1665 self.assertEqual(val, newval)
1666 self.assertIsNot(val, newval)
1667
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001668
Christian Heimes510711d2008-01-30 11:57:58 +00001669class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001670 def fixtype(self, obj):
1671 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001672 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001673 return super().fixtype(obj)
1674
Martin Panter152a19c2016-04-06 06:37:17 +00001675 contains_bytes = True
1676
Ezio Melotti0dceb562013-01-10 07:43:26 +02001677class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001678 type2test = bytearray
1679
Ezio Melotti0dceb562013-01-10 07:43:26 +02001680class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001681 type2test = bytes
1682
Georg Brandlc7885542007-03-06 19:16:20 +00001683
Ezio Melotti0dceb562013-01-10 07:43:26 +02001684class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001685
1686 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001687 self.assertTrue(issubclass(self.type2test, self.basetype))
1688 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001689
1690 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001691 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001692
1693 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001694 self.assertTrue(_a == _a)
1695 self.assertTrue(_a != _b)
1696 self.assertTrue(_a < _b)
1697 self.assertTrue(_a <= _b)
1698 self.assertTrue(_b >= _a)
1699 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001700 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001701
1702 # test concat of subclass instances
1703 self.assertEqual(a + b, _a + _b)
1704 self.assertEqual(a + b, a + _b)
1705 self.assertEqual(a + b, _a + b)
1706
1707 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001708 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001709
1710 def test_join(self):
1711 # Make sure join returns a NEW object for single item sequences
1712 # involving a subclass.
1713 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001714 s1 = self.type2test(b"abcd")
1715 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001716 self.assertIsNot(s1, s2)
1717 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001718
1719 # Test reverse, calling join on subclass
1720 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001721 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001722
1723 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001724 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001725 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001726 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001727 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001728 b = pickle.loads(pickle.dumps(a, proto))
1729 self.assertNotEqual(id(a), id(b))
1730 self.assertEqual(a, b)
1731 self.assertEqual(a.x, b.x)
1732 self.assertEqual(a.y, b.y)
1733 self.assertEqual(type(a), type(b))
1734 self.assertEqual(type(a.y), type(b.y))
1735
1736 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001737 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001738 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001739 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001740 for copy_method in (copy.copy, copy.deepcopy):
1741 b = copy_method(a)
1742 self.assertNotEqual(id(a), id(b))
1743 self.assertEqual(a, b)
1744 self.assertEqual(a.x, b.x)
1745 self.assertEqual(a.y, b.y)
1746 self.assertEqual(type(a), type(b))
1747 self.assertEqual(type(a.y), type(b.y))
1748
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001749 def test_fromhex(self):
1750 b = self.type2test.fromhex('1a2B30')
1751 self.assertEqual(b, b'\x1a\x2b\x30')
1752 self.assertIs(type(b), self.type2test)
1753
1754 class B1(self.basetype):
1755 def __new__(cls, value):
1756 me = self.basetype.__new__(cls, value)
1757 me.foo = 'bar'
1758 return me
1759
1760 b = B1.fromhex('1a2B30')
1761 self.assertEqual(b, b'\x1a\x2b\x30')
1762 self.assertIs(type(b), B1)
1763 self.assertEqual(b.foo, 'bar')
1764
1765 class B2(self.basetype):
1766 def __init__(me, *args, **kwargs):
1767 if self.basetype is not bytes:
1768 self.basetype.__init__(me, *args, **kwargs)
1769 me.foo = 'bar'
1770
1771 b = B2.fromhex('1a2B30')
1772 self.assertEqual(b, b'\x1a\x2b\x30')
1773 self.assertIs(type(b), B2)
1774 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001775
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001776
1777class ByteArraySubclass(bytearray):
1778 pass
1779
1780class BytesSubclass(bytes):
1781 pass
1782
Serhiy Storchaka15095802015-11-25 15:47:01 +02001783class OtherBytesSubclass(bytes):
1784 pass
1785
Ezio Melotti0dceb562013-01-10 07:43:26 +02001786class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001787 basetype = bytearray
1788 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001789
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001790 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001791 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001792 def __init__(me, newarg=1, *args, **kwargs):
1793 bytearray.__init__(me, *args, **kwargs)
1794 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001795 x = subclass(4, source=b"abcd")
1796 self.assertEqual(x, b"abcd")
1797 x = subclass(newarg=4, source=b"abcd")
1798 self.assertEqual(x, b"abcd")
1799
1800
Ezio Melotti0dceb562013-01-10 07:43:26 +02001801class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001802 basetype = bytes
1803 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001804
1805
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001806if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001807 unittest.main()