blob: 741fcceaf670a7f1f6006e4b8bdd04db0640bbf8 [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
Guido van Rossumd624f182006-04-24 13:47:05 +00007import os
8import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00009import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000010import copy
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000011import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010015
Benjamin Petersonee8712c2008-05-20 21:35:26 +000016import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030018import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010019from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000020
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000021
22if sys.flags.bytes_warning:
23 def check_bytes_warnings(func):
24 @functools.wraps(func)
25 def wrapper(*args, **kw):
26 with test.support.check_warnings(('', BytesWarning)):
27 return func(*args, **kw)
28 return wrapper
29else:
30 # no-op
31 def check_bytes_warnings(func):
32 return func
33
34
Georg Brandl9a54d7c2008-07-16 23:15:30 +000035class Indexable:
36 def __init__(self, value=0):
37 self.value = value
38 def __index__(self):
39 return self.value
40
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000041
Ezio Melotti0dceb562013-01-10 07:43:26 +020042class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043
44 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000045 b = self.type2test()
46 self.assertEqual(type(b), self.type2test)
47 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000049 def test_copy(self):
50 a = self.type2test(b"abcd")
51 for copy_method in (copy.copy, copy.deepcopy):
52 b = copy_method(a)
53 self.assertEqual(a, b)
54 self.assertEqual(type(a), type(b))
55
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000056 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000057 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058 self.assertEqual(len(b), 0)
59 self.assertRaises(IndexError, lambda: b[0])
60 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000061 self.assertRaises(IndexError, lambda: b[sys.maxsize])
62 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertRaises(IndexError, lambda: b[10**100])
64 self.assertRaises(IndexError, lambda: b[-1])
65 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
67 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000069 self.assertRaises(IndexError, lambda: b[-10**100])
70
71 def test_from_list(self):
72 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000073 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertEqual(len(b), 256)
75 self.assertEqual(list(b), ints)
76
77 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000078 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
79 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000080 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000081 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
82 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000083
84 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000085 self.assertEqual(self.type2test(0), b'')
86 self.assertEqual(self.type2test(1), b'\x00')
87 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
88 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000089
Benjamin Peterson4c045832010-04-16 22:35:32 +000090 self.assertEqual(self.type2test('0', 'ascii'), b'0')
91 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000092 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000093
94 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000095 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000096 class C:
97 pass
Christian Heimes510711d2008-01-30 11:57:58 +000098 self.assertRaises(TypeError, self.type2test, ["0"])
99 self.assertRaises(TypeError, self.type2test, [0.0])
100 self.assertRaises(TypeError, self.type2test, [None])
101 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200102 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
103 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
104 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
105 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
106 self.assertRaises(TypeError, self.type2test, '')
107 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
108 self.assertRaises(TypeError, self.type2test, '', b'ascii')
109 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000110
111 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000112 self.assertRaises(ValueError, self.type2test, [-1])
113 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
114 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
115 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
116 self.assertRaises(ValueError, self.type2test, [-10**100])
117 self.assertRaises(ValueError, self.type2test, [256])
118 self.assertRaises(ValueError, self.type2test, [257])
119 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
120 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
121 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000122
Antoine Pitroucc231542014-11-02 18:40:09 +0100123 @bigaddrspacetest
124 def test_constructor_overflow(self):
125 size = MAX_Py_ssize_t
126 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
127 try:
128 # Should either pass or raise an error (e.g. on debug builds with
129 # additional malloc() overhead), but shouldn't crash.
130 bytearray(size - 4)
131 except (OverflowError, MemoryError):
132 pass
133
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000134 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000135 b1 = self.type2test([1, 2, 3])
136 b2 = self.type2test([1, 2, 3])
137 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000138
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000139 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000140 self.assertTrue(b2 != b3)
141 self.assertTrue(b1 <= b2)
142 self.assertTrue(b1 <= b3)
143 self.assertTrue(b1 < b3)
144 self.assertTrue(b1 >= b2)
145 self.assertTrue(b3 >= b2)
146 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000147
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000148 self.assertFalse(b1 != b2)
149 self.assertFalse(b2 == b3)
150 self.assertFalse(b1 > b2)
151 self.assertFalse(b1 > b3)
152 self.assertFalse(b1 >= b3)
153 self.assertFalse(b1 < b2)
154 self.assertFalse(b3 < b2)
155 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000156
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000157 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000158 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000159 # Byte comparisons with unicode should always fail!
160 # Test this for all expected byte orders and Unicode character
161 # sizes.
162 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
163 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
164 False)
165 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
166 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
167 False)
168 self.assertEqual(self.type2test() == str(), False)
169 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000170
171 def test_reversed(self):
172 input = list(map(ord, "Hello"))
173 b = self.type2test(input)
174 output = list(reversed(b))
175 input.reverse()
176 self.assertEqual(output, input)
177
178 def test_getslice(self):
179 def by(s):
180 return self.type2test(map(ord, s))
181 b = by("Hello, world")
182
183 self.assertEqual(b[:5], by("Hello"))
184 self.assertEqual(b[1:5], by("ello"))
185 self.assertEqual(b[5:7], by(", "))
186 self.assertEqual(b[7:], by("world"))
187 self.assertEqual(b[7:12], by("world"))
188 self.assertEqual(b[7:100], by("world"))
189
190 self.assertEqual(b[:-7], by("Hello"))
191 self.assertEqual(b[-11:-7], by("ello"))
192 self.assertEqual(b[-7:-5], by(", "))
193 self.assertEqual(b[-5:], by("world"))
194 self.assertEqual(b[-5:12], by("world"))
195 self.assertEqual(b[-5:100], by("world"))
196 self.assertEqual(b[-100:5], by("Hello"))
197
198 def test_extended_getslice(self):
199 # Test extended slicing by comparing with list slicing.
200 L = list(range(255))
201 b = self.type2test(L)
202 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
203 for start in indices:
204 for stop in indices:
205 # Skip step 0 (invalid)
206 for step in indices[1:]:
207 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
208
209 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000210 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000211 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000212 b = self.type2test(sample, enc)
213 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000214 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
215 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000216 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000217
218 def test_decode(self):
219 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000220 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000221 b = self.type2test(sample, enc)
222 self.assertEqual(b.decode(enc), sample)
223 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000224 b = self.type2test(sample, "latin-1")
225 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
226 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
227 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000228 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000229 # Default encoding is utf-8
230 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000231
232 def test_from_int(self):
233 b = self.type2test(0)
234 self.assertEqual(b, self.type2test())
235 b = self.type2test(10)
236 self.assertEqual(b, self.type2test([0]*10))
237 b = self.type2test(10000)
238 self.assertEqual(b, self.type2test([0]*10000))
239
240 def test_concat(self):
241 b1 = self.type2test(b"abc")
242 b2 = self.type2test(b"def")
243 self.assertEqual(b1 + b2, b"abcdef")
244 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
245 self.assertEqual(bytes(b"def") + b1, b"defabc")
246 self.assertRaises(TypeError, lambda: b1 + "def")
247 self.assertRaises(TypeError, lambda: "abc" + b2)
248
249 def test_repeat(self):
250 for b in b"abc", self.type2test(b"abc"):
251 self.assertEqual(b * 3, b"abcabcabc")
252 self.assertEqual(b * 0, b"")
253 self.assertEqual(b * -1, b"")
254 self.assertRaises(TypeError, lambda: b * 3.14)
255 self.assertRaises(TypeError, lambda: 3.14 * b)
256 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000257 with self.assertRaises((OverflowError, MemoryError)):
258 c = b * sys.maxsize
259 with self.assertRaises((OverflowError, MemoryError)):
260 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000261
262 def test_repeat_1char(self):
263 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
264
265 def test_contains(self):
266 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000267 self.assertIn(ord('a'), b)
268 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000269 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000270 self.assertRaises(ValueError, lambda: 300 in b)
271 self.assertRaises(ValueError, lambda: -1 in b)
272 self.assertRaises(TypeError, lambda: None in b)
273 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
274 self.assertRaises(TypeError, lambda: "a" in b)
275 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000276 self.assertIn(f(b""), b)
277 self.assertIn(f(b"a"), b)
278 self.assertIn(f(b"b"), b)
279 self.assertIn(f(b"c"), b)
280 self.assertIn(f(b"ab"), b)
281 self.assertIn(f(b"bc"), b)
282 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000283 self.assertNotIn(f(b"ac"), b)
284 self.assertNotIn(f(b"d"), b)
285 self.assertNotIn(f(b"dab"), b)
286 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000287
288 def test_fromhex(self):
289 self.assertRaises(TypeError, self.type2test.fromhex)
290 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000291 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000292 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000293 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
294 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
295 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000296 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
297 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
298 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
299 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
300 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
301 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
302
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000303 def test_hex(self):
304 self.assertRaises(TypeError, self.type2test.hex)
305 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000306 self.assertEqual(self.type2test(b"").hex(), "")
307 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
308 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
309 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000310
Christian Heimes510711d2008-01-30 11:57:58 +0000311 def test_join(self):
312 self.assertEqual(self.type2test(b"").join([]), b"")
313 self.assertEqual(self.type2test(b"").join([b""]), b"")
314 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
315 lst = list(map(self.type2test, lst))
316 self.assertEqual(self.type2test(b"").join(lst), b"abc")
317 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
318 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200319 dot_join = self.type2test(b".:").join
320 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
321 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
322 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
323 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
324 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
325 # Stress it with many items
326 seq = [b"abc"] * 1000
327 expected = b"abc" + b".:abc" * 999
328 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400329 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200330 # Error handling and cleanup when some item in the middle of the
331 # sequence has the wrong type.
332 with self.assertRaises(TypeError):
333 dot_join([bytearray(b"ab"), "cd", b"ef"])
334 with self.assertRaises(TypeError):
335 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000336
Christian Heimes510711d2008-01-30 11:57:58 +0000337 def test_count(self):
338 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200339 i = 105
340 p = 112
341 w = 119
342
Christian Heimes510711d2008-01-30 11:57:58 +0000343 self.assertEqual(b.count(b'i'), 4)
344 self.assertEqual(b.count(b'ss'), 2)
345 self.assertEqual(b.count(b'w'), 0)
346
Antoine Pitrouac65d962011-10-20 23:54:17 +0200347 self.assertEqual(b.count(i), 4)
348 self.assertEqual(b.count(w), 0)
349
350 self.assertEqual(b.count(b'i', 6), 2)
351 self.assertEqual(b.count(b'p', 6), 2)
352 self.assertEqual(b.count(b'i', 1, 3), 1)
353 self.assertEqual(b.count(b'p', 7, 9), 1)
354
355 self.assertEqual(b.count(i, 6), 2)
356 self.assertEqual(b.count(p, 6), 2)
357 self.assertEqual(b.count(i, 1, 3), 1)
358 self.assertEqual(b.count(p, 7, 9), 1)
359
Christian Heimes510711d2008-01-30 11:57:58 +0000360 def test_startswith(self):
361 b = self.type2test(b'hello')
362 self.assertFalse(self.type2test().startswith(b"anything"))
363 self.assertTrue(b.startswith(b"hello"))
364 self.assertTrue(b.startswith(b"hel"))
365 self.assertTrue(b.startswith(b"h"))
366 self.assertFalse(b.startswith(b"hellow"))
367 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300368 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300369 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300370 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300371 self.assertIn('bytes', exc)
372 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000373
374 def test_endswith(self):
375 b = self.type2test(b'hello')
376 self.assertFalse(bytearray().endswith(b"anything"))
377 self.assertTrue(b.endswith(b"hello"))
378 self.assertTrue(b.endswith(b"llo"))
379 self.assertTrue(b.endswith(b"o"))
380 self.assertFalse(b.endswith(b"whello"))
381 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300382 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300383 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300384 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300385 self.assertIn('bytes', exc)
386 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000387
388 def test_find(self):
389 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200390 i = 105
391 w = 119
392
Christian Heimes510711d2008-01-30 11:57:58 +0000393 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000394 self.assertEqual(b.find(b'w'), -1)
395 self.assertEqual(b.find(b'mississippian'), -1)
396
Antoine Pitrouac65d962011-10-20 23:54:17 +0200397 self.assertEqual(b.find(i), 1)
398 self.assertEqual(b.find(w), -1)
399
400 self.assertEqual(b.find(b'ss', 3), 5)
401 self.assertEqual(b.find(b'ss', 1, 7), 2)
402 self.assertEqual(b.find(b'ss', 1, 3), -1)
403
404 self.assertEqual(b.find(i, 6), 7)
405 self.assertEqual(b.find(i, 1, 3), 1)
406 self.assertEqual(b.find(w, 1, 3), -1)
407
Victor Stinnerf8eac002011-12-18 01:17:41 +0100408 for index in (-1, 256, sys.maxsize + 1):
409 self.assertRaisesRegex(
410 ValueError, r'byte must be in range\(0, 256\)',
411 b.find, index)
412
Christian Heimes510711d2008-01-30 11:57:58 +0000413 def test_rfind(self):
414 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200415 i = 105
416 w = 119
417
Christian Heimes510711d2008-01-30 11:57:58 +0000418 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000419 self.assertEqual(b.rfind(b'w'), -1)
420 self.assertEqual(b.rfind(b'mississippian'), -1)
421
Antoine Pitrouac65d962011-10-20 23:54:17 +0200422 self.assertEqual(b.rfind(i), 10)
423 self.assertEqual(b.rfind(w), -1)
424
425 self.assertEqual(b.rfind(b'ss', 3), 5)
426 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
427
428 self.assertEqual(b.rfind(i, 1, 3), 1)
429 self.assertEqual(b.rfind(i, 3, 9), 7)
430 self.assertEqual(b.rfind(w, 1, 3), -1)
431
Christian Heimes510711d2008-01-30 11:57:58 +0000432 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200433 b = self.type2test(b'mississippi')
434 i = 105
435 w = 119
436
437 self.assertEqual(b.index(b'ss'), 2)
438 self.assertRaises(ValueError, b.index, b'w')
439 self.assertRaises(ValueError, b.index, b'mississippian')
440
441 self.assertEqual(b.index(i), 1)
442 self.assertRaises(ValueError, b.index, w)
443
444 self.assertEqual(b.index(b'ss', 3), 5)
445 self.assertEqual(b.index(b'ss', 1, 7), 2)
446 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
447
448 self.assertEqual(b.index(i, 6), 7)
449 self.assertEqual(b.index(i, 1, 3), 1)
450 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000451
452 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200453 b = self.type2test(b'mississippi')
454 i = 105
455 w = 119
456
457 self.assertEqual(b.rindex(b'ss'), 5)
458 self.assertRaises(ValueError, b.rindex, b'w')
459 self.assertRaises(ValueError, b.rindex, b'mississippian')
460
461 self.assertEqual(b.rindex(i), 10)
462 self.assertRaises(ValueError, b.rindex, w)
463
464 self.assertEqual(b.rindex(b'ss', 3), 5)
465 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
466
467 self.assertEqual(b.rindex(i, 1, 3), 1)
468 self.assertEqual(b.rindex(i, 3, 9), 7)
469 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000470
Ethan Furmanb95b5612015-01-23 20:05:18 -0800471 def test_mod(self):
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300472 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800473 orig = b
474 b = b % b'world'
475 self.assertEqual(b, b'hello, world!')
476 self.assertEqual(orig, b'hello, %b!')
477 self.assertFalse(b is orig)
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300478 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800479 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200480 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300481 self.assertIs(type(a), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800482
483 def test_imod(self):
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300484 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800485 orig = b
486 b %= b'world'
487 self.assertEqual(b, b'hello, world!')
488 self.assertEqual(orig, b'hello, %b!')
489 self.assertFalse(b is orig)
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300490 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800491 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200492 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Serhiy Storchaka3c149a62016-04-15 14:13:37 +0300493 self.assertIs(type(b), self.type2test)
494
495 def test_rmod(self):
496 with self.assertRaises(TypeError):
497 object() % self.type2test(b'abc')
498 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800499
Christian Heimes510711d2008-01-30 11:57:58 +0000500 def test_replace(self):
501 b = self.type2test(b'mississippi')
502 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
503 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
504
Christian Heimes510711d2008-01-30 11:57:58 +0000505 def test_split_string_error(self):
506 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
507
Antoine Pitrouf8453022010-01-12 22:05:42 +0000508 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000509 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
510 b = self.type2test(b)
511 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000512 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
513 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
514
Christian Heimes510711d2008-01-30 11:57:58 +0000515 def test_rsplit_string_error(self):
516 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
517
518 def test_rsplit_unicodewhitespace(self):
519 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000520 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
521
522 def test_partition(self):
523 b = self.type2test(b'mississippi')
524 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000525 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000526
527 def test_rpartition(self):
528 b = self.type2test(b'mississippi')
529 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
530 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000531 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000532
533 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000534 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000535 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
536 b = self.type2test(b)
537 ps = pickle.dumps(b, proto)
538 q = pickle.loads(ps)
539 self.assertEqual(b, q)
540
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000541 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200542 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
543 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
544 it = itorg = iter(self.type2test(b))
545 data = list(self.type2test(b))
546 d = pickle.dumps(it, proto)
547 it = pickle.loads(d)
548 self.assertEqual(type(itorg), type(it))
549 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000550
Serhiy Storchakabad12572014-12-15 14:03:42 +0200551 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200552 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200553 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200554 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200555 d = pickle.dumps(it, proto)
556 it = pickle.loads(d)
557 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000558
Christian Heimes510711d2008-01-30 11:57:58 +0000559 def test_strip_bytearray(self):
560 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
561 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
562 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
563
564 def test_strip_string_error(self):
565 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
566 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
567 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
568
Eli Bendersky906b88f2011-07-29 07:05:08 +0300569 def test_center(self):
570 # Fill character can be either bytes or bytearray (issue 12380)
571 b = self.type2test(b'abc')
572 for fill_type in (bytes, bytearray):
573 self.assertEqual(b.center(7, fill_type(b'-')),
574 self.type2test(b'--abc--'))
575
576 def test_ljust(self):
577 # Fill character can be either bytes or bytearray (issue 12380)
578 b = self.type2test(b'abc')
579 for fill_type in (bytes, bytearray):
580 self.assertEqual(b.ljust(7, fill_type(b'-')),
581 self.type2test(b'abc----'))
582
583 def test_rjust(self):
584 # Fill character can be either bytes or bytearray (issue 12380)
585 b = self.type2test(b'abc')
586 for fill_type in (bytes, bytearray):
587 self.assertEqual(b.rjust(7, fill_type(b'-')),
588 self.type2test(b'----abc'))
589
Christian Heimes510711d2008-01-30 11:57:58 +0000590 def test_ord(self):
591 b = self.type2test(b'\0A\x7f\x80\xff')
592 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
593 [0, 65, 127, 128, 255])
594
Georg Brandlabc38772009-04-12 15:51:51 +0000595 def test_maketrans(self):
596 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 +0000597 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000598 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'
599 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000600 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
601 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
602
Jesus Ceaac451502011-04-20 17:09:23 +0200603 def test_none_arguments(self):
604 # issue 11828
605 b = self.type2test(b'hello')
606 l = self.type2test(b'l')
607 h = self.type2test(b'h')
608 x = self.type2test(b'x')
609 o = self.type2test(b'o')
610
611 self.assertEqual(2, b.find(l, None))
612 self.assertEqual(3, b.find(l, -2, None))
613 self.assertEqual(2, b.find(l, None, -2))
614 self.assertEqual(0, b.find(h, None, None))
615
616 self.assertEqual(3, b.rfind(l, None))
617 self.assertEqual(3, b.rfind(l, -2, None))
618 self.assertEqual(2, b.rfind(l, None, -2))
619 self.assertEqual(0, b.rfind(h, None, None))
620
621 self.assertEqual(2, b.index(l, None))
622 self.assertEqual(3, b.index(l, -2, None))
623 self.assertEqual(2, b.index(l, None, -2))
624 self.assertEqual(0, b.index(h, None, None))
625
626 self.assertEqual(3, b.rindex(l, None))
627 self.assertEqual(3, b.rindex(l, -2, None))
628 self.assertEqual(2, b.rindex(l, None, -2))
629 self.assertEqual(0, b.rindex(h, None, None))
630
631 self.assertEqual(2, b.count(l, None))
632 self.assertEqual(1, b.count(l, -2, None))
633 self.assertEqual(1, b.count(l, None, -2))
634 self.assertEqual(0, b.count(x, None, None))
635
636 self.assertEqual(True, b.endswith(o, None))
637 self.assertEqual(True, b.endswith(o, -2, None))
638 self.assertEqual(True, b.endswith(l, None, -2))
639 self.assertEqual(False, b.endswith(x, None, None))
640
641 self.assertEqual(True, b.startswith(h, None))
642 self.assertEqual(True, b.startswith(l, -2, None))
643 self.assertEqual(True, b.startswith(h, None, -2))
644 self.assertEqual(False, b.startswith(x, None, None))
645
Antoine Pitrouac65d962011-10-20 23:54:17 +0200646 def test_integer_arguments_out_of_byte_range(self):
647 b = self.type2test(b'hello')
648
649 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
650 self.assertRaises(ValueError, method, -1)
651 self.assertRaises(ValueError, method, 256)
652 self.assertRaises(ValueError, method, 9999)
653
Jesus Ceaac451502011-04-20 17:09:23 +0200654 def test_find_etc_raise_correct_error_messages(self):
655 # issue 11828
656 b = self.type2test(b'hello')
657 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300658 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200659 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300660 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200661 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300662 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200663 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300664 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200665 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300666 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200667 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300668 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200669 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300670 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200671 x, None, None, None)
672
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300673 def test_free_after_iterating(self):
674 test.support.check_free_after_iterating(self, iter, self.type2test)
675 test.support.check_free_after_iterating(self, reversed, self.type2test)
676
Christian Heimes510711d2008-01-30 11:57:58 +0000677
Ezio Melotti0dceb562013-01-10 07:43:26 +0200678class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000679 type2test = bytes
680
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400681 def test_getitem_error(self):
682 msg = "byte indices must be integers or slices"
683 with self.assertRaisesRegex(TypeError, msg):
684 b'python'['a']
685
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000686 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200687 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000688 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000689 self.assertRaises(TypeError, f.readinto, b"")
690
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000691 def test_custom(self):
692 class A:
693 def __bytes__(self):
694 return b'abc'
695 self.assertEqual(bytes(A()), b'abc')
696 class A: pass
697 self.assertRaises(TypeError, bytes, A())
698 class A:
699 def __bytes__(self):
700 return None
701 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600702 class A:
703 def __bytes__(self):
704 return b'a'
705 def __index__(self):
706 return 42
707 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200708 # Issue #25766
709 class A(str):
710 def __bytes__(self):
711 return b'abc'
712 self.assertEqual(bytes(A('\u20ac')), b'abc')
713 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200714 # Issue #24731
715 class A:
716 def __bytes__(self):
717 return OtherBytesSubclass(b'abc')
718 self.assertEqual(bytes(A()), b'abc')
719 self.assertIs(type(bytes(A())), OtherBytesSubclass)
720 self.assertEqual(BytesSubclass(A()), b'abc')
721 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000722
Victor Stinner29e762c2011-01-05 03:33:28 +0000723 # Test PyBytes_FromFormat()
724 def test_from_format(self):
725 test.support.import_module('ctypes')
726 from ctypes import pythonapi, py_object, c_int, c_char_p
727 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
728 PyBytes_FromFormat.restype = py_object
729
730 self.assertEqual(PyBytes_FromFormat(b'format'),
731 b'format')
732
733 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
734 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
735 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
736 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
737 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
738
739 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
740 b'c:\xff')
741 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
742 b's:cstr')
743
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100744 # Issue #19969
745 self.assertRaises(OverflowError,
746 PyBytes_FromFormat, b'%c', c_int(-1))
747 self.assertRaises(OverflowError,
748 PyBytes_FromFormat, b'%c', c_int(256))
749
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000750
Ezio Melotti0dceb562013-01-10 07:43:26 +0200751class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000752 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000753
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400754 def test_getitem_error(self):
755 msg = "bytearray indices must be integers or slices"
756 with self.assertRaisesRegex(TypeError, msg):
757 bytearray(b'python')['a']
758
759 def test_setitem_error(self):
760 msg = "bytearray indices must be integers or slices"
761 with self.assertRaisesRegex(TypeError, msg):
762 b = bytearray(b'python')
763 b['a'] = "python"
764
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000765 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000766 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000767
Guido van Rossum254348e2007-11-21 19:29:53 +0000768 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000769 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000770 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000771 tfn = tempfile.mktemp()
772 try:
773 # Prepare
774 with open(tfn, "wb") as f:
775 f.write(short_sample)
776 # Test readinto
777 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000778 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000779 n = f.readinto(b)
780 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000781 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000782 # Test writing in binary mode
783 with open(tfn, "wb") as f:
784 f.write(b)
785 with open(tfn, "rb") as f:
786 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000787 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000788 finally:
789 try:
790 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200791 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000792 pass
793
Neal Norwitz6968b052007-02-27 19:02:19 +0000794 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000795 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000796 self.assertEqual(b.reverse(), None)
797 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000798 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000799 b.reverse()
800 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000801 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000802 b.reverse()
803 self.assertFalse(b)
804
Eli Bendersky4db28d32011-03-03 18:21:02 +0000805 def test_clear(self):
806 b = bytearray(b'python')
807 b.clear()
808 self.assertEqual(b, b'')
809
810 b = bytearray(b'')
811 b.clear()
812 self.assertEqual(b, b'')
813
814 b = bytearray(b'')
815 b.append(ord('r'))
816 b.clear()
817 b.append(ord('p'))
818 self.assertEqual(b, b'p')
819
820 def test_copy(self):
821 b = bytearray(b'abc')
822 bb = b.copy()
823 self.assertEqual(bb, b'abc')
824
825 b = bytearray(b'')
826 bb = b.copy()
827 self.assertEqual(bb, b'')
828
829 # test that it's indeed a copy and not a reference
830 b = bytearray(b'abc')
831 bb = b.copy()
832 self.assertEqual(b, bb)
833 self.assertIsNot(b, bb)
834 bb.append(ord('d'))
835 self.assertEqual(bb, b'abcd')
836 self.assertEqual(b, b'abc')
837
Guido van Rossumd624f182006-04-24 13:47:05 +0000838 def test_regexps(self):
839 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000840 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000841 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000842 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000843
844 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000845 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000846 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000847 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000848 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000849 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000850 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000851 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000852 try:
853 b[3] = 0
854 self.fail("Didn't raise IndexError")
855 except IndexError:
856 pass
857 try:
858 b[-10] = 0
859 self.fail("Didn't raise IndexError")
860 except IndexError:
861 pass
862 try:
863 b[0] = 256
864 self.fail("Didn't raise ValueError")
865 except ValueError:
866 pass
867 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000868 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000869 self.fail("Didn't raise ValueError")
870 except ValueError:
871 pass
872 try:
873 b[0] = None
874 self.fail("Didn't raise TypeError")
875 except TypeError:
876 pass
877
878 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000879 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000880 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000881 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000882 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000883 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000884 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000885 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000886
887 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000888 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000889 self.assertEqual(list(b), list(range(10)))
890
Guido van Rossum254348e2007-11-21 19:29:53 +0000891 b[0:5] = bytearray([1, 1, 1, 1, 1])
892 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000893
894 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000895 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000896
Guido van Rossum254348e2007-11-21 19:29:53 +0000897 b[0:0] = bytearray([0, 1, 2, 3, 4])
898 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000899
Guido van Rossum254348e2007-11-21 19:29:53 +0000900 b[-7:-3] = bytearray([100, 101])
901 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000902
903 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000904 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000905
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000906 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000907 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 +0000908
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200909 b[3:] = b'foo'
910 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
911
912 b[:3] = memoryview(b'foo')
913 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
914
915 b[3:4] = []
916 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
917
918 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
919 ['a', 'b'], [b'a', b'b'], [[]]]:
920 with self.assertRaises(TypeError):
921 b[3:4] = elem
922
923 for elem in [[254, 255, 256], [-256, 9000]]:
924 with self.assertRaises(ValueError):
925 b[3:4] = elem
926
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200927 def test_setslice_extend(self):
928 # Exercise the resizing logic (see issue #19087)
929 b = bytearray(range(100))
930 self.assertEqual(list(b), list(range(100)))
931 del b[:10]
932 self.assertEqual(list(b), list(range(10, 100)))
933 b.extend(range(100, 110))
934 self.assertEqual(list(b), list(range(10, 110)))
935
Antoine Pitrou25454112015-05-19 20:52:27 +0200936 def test_fifo_overrun(self):
937 # Test for issue #23985, a buffer overrun when implementing a FIFO
938 # Build Python in pydebug mode for best results.
939 b = bytearray(10)
940 b.pop() # Defeat expanding buffer off-by-one quirk
941 del b[:1] # Advance start pointer without reallocating
942 b += bytes(2) # Append exactly the number of deleted bytes
943 del b # Free memory buffer, allowing pydebug verification
944
945 def test_del_expand(self):
946 # Reducing the size should not expand the buffer (issue #23985)
947 b = bytearray(10)
948 size = sys.getsizeof(b)
949 del b[:1]
950 self.assertLessEqual(sys.getsizeof(b), size)
951
Thomas Wouters376446d2006-12-19 08:30:14 +0000952 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +0000953 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000954 for start in indices:
955 for stop in indices:
956 # Skip invalid step 0
957 for step in indices[1:]:
958 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000959 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000960 # Make sure we have a slice of exactly the right length,
961 # but with different data.
962 data = L[start:stop:step]
963 data.reverse()
964 L[start:stop:step] = data
965 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +0000966 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000967
Thomas Wouters376446d2006-12-19 08:30:14 +0000968 del L[start:stop:step]
969 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000970 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000971
Guido van Rossumd624f182006-04-24 13:47:05 +0000972 def test_setslice_trap(self):
973 # This test verifies that we correctly handle assigning self
974 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000975 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000976 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000977 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000978
Guido van Rossum13e57212006-04-27 22:54:26 +0000979 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000980 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000981 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000982 b += b"def"
983 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000984 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000985 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000986 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000987 self.assertEqual(b, b"abcdefxyz")
988 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000989 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000990 except TypeError:
991 pass
992 else:
993 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000994
995 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000996 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000997 b1 = b
998 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000999 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001000 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001002
1003 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001004 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001005 b1 = b
1006 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001007 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001008 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001009 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001010
Guido van Rossum20188312006-05-05 15:15:40 +00001011 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001012 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001013 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001014 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001015 seq = [alloc]
1016 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001017 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001018 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001019 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001020 if alloc not in seq:
1021 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001022
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001023 def test_init_alloc(self):
1024 b = bytearray()
1025 def g():
1026 for i in range(1, 100):
1027 yield i
1028 a = list(b)
1029 self.assertEqual(a, list(range(1, len(a)+1)))
1030 self.assertEqual(len(b), len(a))
1031 self.assertLessEqual(len(b), i)
1032 alloc = b.__alloc__()
1033 self.assertGreater(alloc, len(b)) # including trailing null byte
1034 b.__init__(g())
1035 self.assertEqual(list(b), list(range(1, 100)))
1036 self.assertEqual(len(b), 99)
1037 alloc = b.__alloc__()
1038 self.assertGreater(alloc, len(b))
1039
Neal Norwitz6968b052007-02-27 19:02:19 +00001040 def test_extend(self):
1041 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001042 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001043 a.extend(a)
1044 self.assertEqual(a, orig + orig)
1045 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001046 a = bytearray(b'')
1047 # Test iterators that don't have a __length_hint__
1048 a.extend(map(int, orig * 25))
1049 a.extend(int(x) for x in orig * 25)
1050 self.assertEqual(a, orig * 50)
1051 self.assertEqual(a[-5:], orig)
1052 a = bytearray(b'')
1053 a.extend(iter(map(int, orig * 50)))
1054 self.assertEqual(a, orig * 50)
1055 self.assertEqual(a[-5:], orig)
1056 a = bytearray(b'')
1057 a.extend(list(map(int, orig * 50)))
1058 self.assertEqual(a, orig * 50)
1059 self.assertEqual(a[-5:], orig)
1060 a = bytearray(b'')
1061 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1062 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1063 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001064 a = bytearray(b'')
1065 a.extend([Indexable(ord('a'))])
1066 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001067
Neal Norwitz6968b052007-02-27 19:02:19 +00001068 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001069 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001070 b.remove(ord('l'))
1071 self.assertEqual(b, b'helo')
1072 b.remove(ord('l'))
1073 self.assertEqual(b, b'heo')
1074 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1075 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001076 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001077 # remove first and last
1078 b.remove(ord('o'))
1079 b.remove(ord('h'))
1080 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001081 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001082 b.remove(Indexable(ord('e')))
1083 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001084
1085 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001086 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001087 self.assertEqual(b.pop(), ord('d'))
1088 self.assertEqual(b.pop(0), ord('w'))
1089 self.assertEqual(b.pop(-2), ord('r'))
1090 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001091 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001092 # test for issue #6846
1093 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001094
1095 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001096 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001097
Neal Norwitz6968b052007-02-27 19:02:19 +00001098 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001099 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001100 b.append(ord('o'))
1101 self.assertEqual(b, b'hello')
1102 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001103 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001104 b.append(ord('A'))
1105 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001106 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001107 b = bytearray()
1108 b.append(Indexable(ord('A')))
1109 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001110
1111 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001112 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001113 b.insert(1, ord('i'))
1114 b.insert(4, ord('i'))
1115 b.insert(-2, ord('i'))
1116 b.insert(1000, ord('i'))
1117 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001118 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001119 b = bytearray()
1120 b.insert(0, Indexable(ord('A')))
1121 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001122
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001123 def test_copied(self):
1124 # Issue 4348. Make sure that operations that don't mutate the array
1125 # copy the bytes.
1126 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001127 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001128
1129 t = bytearray([i for i in range(256)])
1130 x = bytearray(b'')
1131 self.assertFalse(x is x.translate(t))
1132
Guido van Rossum254348e2007-11-21 19:29:53 +00001133 def test_partition_bytearray_doesnt_share_nullstring(self):
1134 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001135 self.assertEqual(b, b"")
1136 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001137 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001138 b += b"!"
1139 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001140 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001141 self.assertEqual(b, b"")
1142 self.assertEqual(c, b"")
1143 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001144 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001145 self.assertEqual(b, b"")
1146 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001147 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001148 b += b"!"
1149 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001150 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001151 self.assertEqual(b, b"")
1152 self.assertEqual(c, b"")
1153
Antoine Pitrou5504e892008-12-06 21:27:53 +00001154 def test_resize_forbidden(self):
1155 # #4509: can't resize a bytearray when there are buffer exports, even
1156 # if it wouldn't reallocate the underlying buffer.
1157 # Furthermore, no destructive changes to the buffer may be applied
1158 # before raising the error.
1159 b = bytearray(range(10))
1160 v = memoryview(b)
1161 def resize(n):
1162 b[1:-1] = range(n + 1, 2*n - 1)
1163 resize(10)
1164 orig = b[:]
1165 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001166 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001167 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001168 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001169 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001170 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001171 # Other operations implying resize
1172 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001173 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001174 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001175 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001176 def delitem():
1177 del b[1]
1178 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001179 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001180 # deleting a non-contiguous slice
1181 def delslice():
1182 b[1:-1:2] = b""
1183 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001184 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001185
Stefan Krah650c1e82015-02-03 21:43:23 +01001186 @test.support.cpython_only
1187 def test_obsolete_write_lock(self):
1188 from _testcapi import getbuffer_with_null_view
1189 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001190
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001191 def test_iterator_pickling2(self):
1192 orig = bytearray(b'abc')
1193 data = list(b'qwerty')
1194 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1195 # initial iterator
1196 itorig = iter(orig)
1197 d = pickle.dumps((itorig, orig), proto)
1198 it, b = pickle.loads(d)
1199 b[:] = data
1200 self.assertEqual(type(it), type(itorig))
1201 self.assertEqual(list(it), data)
1202
1203 # running iterator
1204 next(itorig)
1205 d = pickle.dumps((itorig, orig), proto)
1206 it, b = pickle.loads(d)
1207 b[:] = data
1208 self.assertEqual(type(it), type(itorig))
1209 self.assertEqual(list(it), data[1:])
1210
1211 # empty iterator
1212 for i in range(1, len(orig)):
1213 next(itorig)
1214 d = pickle.dumps((itorig, orig), proto)
1215 it, b = pickle.loads(d)
1216 b[:] = data
1217 self.assertEqual(type(it), type(itorig))
1218 self.assertEqual(list(it), data[len(orig):])
1219
1220 # exhausted iterator
1221 self.assertRaises(StopIteration, next, itorig)
1222 d = pickle.dumps((itorig, orig), proto)
1223 it, b = pickle.loads(d)
1224 b[:] = data
1225 self.assertEqual(list(it), [])
1226
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001227 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001228
Christian Heimes510711d2008-01-30 11:57:58 +00001229class AssortedBytesTest(unittest.TestCase):
1230 #
1231 # Test various combinations of bytes and bytearray
1232 #
1233
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001234 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001235 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001236 for f in str, repr:
1237 self.assertEqual(f(bytearray()), "bytearray(b'')")
1238 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1239 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1240 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1241 self.assertEqual(f(b"abc"), "b'abc'")
1242 self.assertEqual(f(b"'"), '''b"'"''') # '''
1243 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001244
1245 def test_compare_bytes_to_bytearray(self):
1246 self.assertEqual(b"abc" == bytes(b"abc"), True)
1247 self.assertEqual(b"ab" != bytes(b"abc"), True)
1248 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1249 self.assertEqual(b"ab" < bytes(b"abc"), True)
1250 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1251 self.assertEqual(b"abc" > bytes(b"ab"), True)
1252
1253 self.assertEqual(b"abc" != bytes(b"abc"), False)
1254 self.assertEqual(b"ab" == bytes(b"abc"), False)
1255 self.assertEqual(b"ab" > bytes(b"abc"), False)
1256 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1257 self.assertEqual(b"abc" < bytes(b"ab"), False)
1258 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1259
1260 self.assertEqual(bytes(b"abc") == b"abc", True)
1261 self.assertEqual(bytes(b"ab") != b"abc", True)
1262 self.assertEqual(bytes(b"ab") <= b"abc", True)
1263 self.assertEqual(bytes(b"ab") < b"abc", True)
1264 self.assertEqual(bytes(b"abc") >= b"ab", True)
1265 self.assertEqual(bytes(b"abc") > b"ab", True)
1266
1267 self.assertEqual(bytes(b"abc") != b"abc", False)
1268 self.assertEqual(bytes(b"ab") == b"abc", False)
1269 self.assertEqual(bytes(b"ab") > b"abc", False)
1270 self.assertEqual(bytes(b"ab") >= b"abc", False)
1271 self.assertEqual(bytes(b"abc") < b"ab", False)
1272 self.assertEqual(bytes(b"abc") <= b"ab", False)
1273
Stefan Krah6e572b82013-01-26 13:06:36 +01001274 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001275 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001276 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001277 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001278 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001279 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001280
1281 def test_from_bytearray(self):
1282 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1283 buf = memoryview(sample)
1284 b = bytearray(buf)
1285 self.assertEqual(b, bytearray(sample))
1286
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001287 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001288 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001289 self.assertEqual(str(b''), "b''")
1290 self.assertEqual(str(b'x'), "b'x'")
1291 self.assertEqual(str(b'\x80'), "b'\\x80'")
1292 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1293 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1294 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001295
1296 def test_literal(self):
1297 tests = [
1298 (b"Wonderful spam", "Wonderful spam"),
1299 (br"Wonderful spam too", "Wonderful spam too"),
1300 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1301 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1302 ]
1303 for b, s in tests:
1304 self.assertEqual(b, bytearray(s, 'latin-1'))
1305 for c in range(128, 256):
1306 self.assertRaises(SyntaxError, eval,
1307 'b"%s"' % chr(c))
1308
1309 def test_translate(self):
1310 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001311 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001312 rosetta = bytearray(range(0, 256))
1313 rosetta[ord('o')] = ord('e')
1314 c = b.translate(rosetta, b'l')
1315 self.assertEqual(b, b'hello')
1316 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001317 c = ba.translate(rosetta, b'l')
1318 self.assertEqual(ba, b'hello')
1319 self.assertEqual(c, b'hee')
1320 c = b.translate(None, b'e')
1321 self.assertEqual(c, b'hllo')
1322 c = ba.translate(None, b'e')
1323 self.assertEqual(c, b'hllo')
1324 self.assertRaises(TypeError, b.translate, None, None)
1325 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001326
1327 def test_split_bytearray(self):
1328 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1329
1330 def test_rsplit_bytearray(self):
1331 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1332
Georg Brandleb2c9642008-05-30 12:05:02 +00001333 def test_return_self(self):
1334 # bytearray.replace must always return a new bytearray
1335 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001336 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001337
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001338 @unittest.skipUnless(sys.flags.bytes_warning,
1339 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001340 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001341 def bytes_warning():
1342 return test.support.check_warnings(('', BytesWarning))
1343 with bytes_warning():
1344 b'' == ''
1345 with bytes_warning():
1346 '' == b''
1347 with bytes_warning():
1348 b'' != ''
1349 with bytes_warning():
1350 '' != b''
1351 with bytes_warning():
1352 bytearray(b'') == ''
1353 with bytes_warning():
1354 '' == bytearray(b'')
1355 with bytes_warning():
1356 bytearray(b'') != ''
1357 with bytes_warning():
1358 '' != bytearray(b'')
1359 with bytes_warning():
1360 b'\0' == 0
1361 with bytes_warning():
1362 0 == b'\0'
1363 with bytes_warning():
1364 b'\0' != 0
1365 with bytes_warning():
1366 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001367
Guido van Rossumd624f182006-04-24 13:47:05 +00001368 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001369 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001370 # __reversed__? (optimization)
1371
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001372 # XXX More string methods? (Those that don't use character properties)
1373
Neal Norwitz6968b052007-02-27 19:02:19 +00001374 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001375 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001376 # Unfortunately they are all bundled with tests that
1377 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001378
Guido van Rossum254348e2007-11-21 19:29:53 +00001379 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001380 # the rest that make sense (the code can be cleaned up to use modern
1381 # unittest methods at the same time).
1382
Martin Panter152a19c2016-04-06 06:37:17 +00001383class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001384 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001385 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001386
1387 def test_returns_new_copy(self):
1388 val = self.marshal(b'1234')
1389 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001390 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001391 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1392 method = getattr(val, methname)
1393 newval = method(3)
1394 self.assertEqual(val, newval)
1395 self.assertTrue(val is not newval,
1396 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001397 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1398 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1399 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1400 newval = eval(expr)
1401 self.assertEqual(val, newval)
1402 self.assertTrue(val is not newval,
1403 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001404 sep = self.marshal(b'')
1405 newval = sep.join([val])
1406 self.assertEqual(val, newval)
1407 self.assertIsNot(val, newval)
1408
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001409
Christian Heimes510711d2008-01-30 11:57:58 +00001410class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001411 def fixtype(self, obj):
1412 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001413 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001414 return super().fixtype(obj)
1415
Martin Panter152a19c2016-04-06 06:37:17 +00001416 contains_bytes = True
1417
Ezio Melotti0dceb562013-01-10 07:43:26 +02001418class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001419 type2test = bytearray
1420
Ezio Melotti0dceb562013-01-10 07:43:26 +02001421class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001422 type2test = bytes
1423
Georg Brandlc7885542007-03-06 19:16:20 +00001424
Ezio Melotti0dceb562013-01-10 07:43:26 +02001425class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001426
1427 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001428 self.assertTrue(issubclass(self.type2test, self.basetype))
1429 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001430
1431 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001432 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001433
1434 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001435 self.assertTrue(_a == _a)
1436 self.assertTrue(_a != _b)
1437 self.assertTrue(_a < _b)
1438 self.assertTrue(_a <= _b)
1439 self.assertTrue(_b >= _a)
1440 self.assertTrue(_b > _a)
1441 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001442
1443 # test concat of subclass instances
1444 self.assertEqual(a + b, _a + _b)
1445 self.assertEqual(a + b, a + _b)
1446 self.assertEqual(a + b, _a + b)
1447
1448 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001449 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001450
1451 def test_join(self):
1452 # Make sure join returns a NEW object for single item sequences
1453 # involving a subclass.
1454 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001455 s1 = self.type2test(b"abcd")
1456 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001457 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001458 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001459
1460 # Test reverse, calling join on subclass
1461 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001462 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001463
1464 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001465 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001466 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001467 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001468 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001469 b = pickle.loads(pickle.dumps(a, proto))
1470 self.assertNotEqual(id(a), id(b))
1471 self.assertEqual(a, b)
1472 self.assertEqual(a.x, b.x)
1473 self.assertEqual(a.y, b.y)
1474 self.assertEqual(type(a), type(b))
1475 self.assertEqual(type(a.y), type(b.y))
1476
1477 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001478 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001479 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001480 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001481 for copy_method in (copy.copy, copy.deepcopy):
1482 b = copy_method(a)
1483 self.assertNotEqual(id(a), id(b))
1484 self.assertEqual(a, b)
1485 self.assertEqual(a.x, b.x)
1486 self.assertEqual(a.y, b.y)
1487 self.assertEqual(type(a), type(b))
1488 self.assertEqual(type(a.y), type(b.y))
1489
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001490 test_fromhex = BaseBytesTest.test_fromhex
1491
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001492
1493class ByteArraySubclass(bytearray):
1494 pass
1495
1496class BytesSubclass(bytes):
1497 pass
1498
Serhiy Storchaka15095802015-11-25 15:47:01 +02001499class OtherBytesSubclass(bytes):
1500 pass
1501
Ezio Melotti0dceb562013-01-10 07:43:26 +02001502class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001503 basetype = bytearray
1504 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001505
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001506 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001507 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001508 def __init__(me, newarg=1, *args, **kwargs):
1509 bytearray.__init__(me, *args, **kwargs)
1510 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001511 x = subclass(4, source=b"abcd")
1512 self.assertEqual(x, b"abcd")
1513 x = subclass(newarg=4, source=b"abcd")
1514 self.assertEqual(x, b"abcd")
1515
1516
Ezio Melotti0dceb562013-01-10 07:43:26 +02001517class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001518 basetype = bytes
1519 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001520
1521
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001522if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001523 unittest.main()