blob: 1e11437656695b197a277cb51a4f1fcf8bea691f [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
3XXX This is a mess. Common tests should be moved to buffer_tests.py,
4which itself ought to be unified with string_tests.py (and the latter
5should be modernized).
6"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
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
Gregory P. Smith60d241f2007-10-16 06:31:30 +000019import test.buffer_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
72 def test_from_list(self):
73 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000074 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000075 self.assertEqual(len(b), 256)
76 self.assertEqual(list(b), ints)
77
78 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000079 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
80 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000081 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000082 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
83 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000084
85 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000086 self.assertEqual(self.type2test(0), b'')
87 self.assertEqual(self.type2test(1), b'\x00')
88 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
89 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000090
Benjamin Peterson4c045832010-04-16 22:35:32 +000091 self.assertEqual(self.type2test('0', 'ascii'), b'0')
92 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000093 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000094
95 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000096 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000097 class C:
98 pass
Christian Heimes510711d2008-01-30 11:57:58 +000099 self.assertRaises(TypeError, self.type2test, ["0"])
100 self.assertRaises(TypeError, self.type2test, [0.0])
101 self.assertRaises(TypeError, self.type2test, [None])
102 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000103
104 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000105 self.assertRaises(ValueError, self.type2test, [-1])
106 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
107 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
108 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
109 self.assertRaises(ValueError, self.type2test, [-10**100])
110 self.assertRaises(ValueError, self.type2test, [256])
111 self.assertRaises(ValueError, self.type2test, [257])
112 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
113 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
114 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000115
Antoine Pitroucc231542014-11-02 18:40:09 +0100116 @bigaddrspacetest
117 def test_constructor_overflow(self):
118 size = MAX_Py_ssize_t
119 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
120 try:
121 # Should either pass or raise an error (e.g. on debug builds with
122 # additional malloc() overhead), but shouldn't crash.
123 bytearray(size - 4)
124 except (OverflowError, MemoryError):
125 pass
126
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000127 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000128 b1 = self.type2test([1, 2, 3])
129 b2 = self.type2test([1, 2, 3])
130 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000131
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000132 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000133 self.assertTrue(b2 != b3)
134 self.assertTrue(b1 <= b2)
135 self.assertTrue(b1 <= b3)
136 self.assertTrue(b1 < b3)
137 self.assertTrue(b1 >= b2)
138 self.assertTrue(b3 >= b2)
139 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000141 self.assertFalse(b1 != b2)
142 self.assertFalse(b2 == b3)
143 self.assertFalse(b1 > b2)
144 self.assertFalse(b1 > b3)
145 self.assertFalse(b1 >= b3)
146 self.assertFalse(b1 < b2)
147 self.assertFalse(b3 < b2)
148 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000149
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000150 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000151 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000152 # Byte comparisons with unicode should always fail!
153 # Test this for all expected byte orders and Unicode character
154 # sizes.
155 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
156 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
157 False)
158 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
159 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
160 False)
161 self.assertEqual(self.type2test() == str(), False)
162 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000163
164 def test_reversed(self):
165 input = list(map(ord, "Hello"))
166 b = self.type2test(input)
167 output = list(reversed(b))
168 input.reverse()
169 self.assertEqual(output, input)
170
171 def test_getslice(self):
172 def by(s):
173 return self.type2test(map(ord, s))
174 b = by("Hello, world")
175
176 self.assertEqual(b[:5], by("Hello"))
177 self.assertEqual(b[1:5], by("ello"))
178 self.assertEqual(b[5:7], by(", "))
179 self.assertEqual(b[7:], by("world"))
180 self.assertEqual(b[7:12], by("world"))
181 self.assertEqual(b[7:100], by("world"))
182
183 self.assertEqual(b[:-7], by("Hello"))
184 self.assertEqual(b[-11:-7], by("ello"))
185 self.assertEqual(b[-7:-5], by(", "))
186 self.assertEqual(b[-5:], by("world"))
187 self.assertEqual(b[-5:12], by("world"))
188 self.assertEqual(b[-5:100], by("world"))
189 self.assertEqual(b[-100:5], by("Hello"))
190
191 def test_extended_getslice(self):
192 # Test extended slicing by comparing with list slicing.
193 L = list(range(255))
194 b = self.type2test(L)
195 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
196 for start in indices:
197 for stop in indices:
198 # Skip step 0 (invalid)
199 for step in indices[1:]:
200 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
201
202 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000203 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000204 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000205 b = self.type2test(sample, enc)
206 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000207 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
208 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000209 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000210
211 def test_decode(self):
212 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000213 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000214 b = self.type2test(sample, enc)
215 self.assertEqual(b.decode(enc), sample)
216 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000217 b = self.type2test(sample, "latin-1")
218 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
219 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
220 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000221 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000222 # Default encoding is utf-8
223 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000224
225 def test_from_int(self):
226 b = self.type2test(0)
227 self.assertEqual(b, self.type2test())
228 b = self.type2test(10)
229 self.assertEqual(b, self.type2test([0]*10))
230 b = self.type2test(10000)
231 self.assertEqual(b, self.type2test([0]*10000))
232
233 def test_concat(self):
234 b1 = self.type2test(b"abc")
235 b2 = self.type2test(b"def")
236 self.assertEqual(b1 + b2, b"abcdef")
237 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
238 self.assertEqual(bytes(b"def") + b1, b"defabc")
239 self.assertRaises(TypeError, lambda: b1 + "def")
240 self.assertRaises(TypeError, lambda: "abc" + b2)
241
242 def test_repeat(self):
243 for b in b"abc", self.type2test(b"abc"):
244 self.assertEqual(b * 3, b"abcabcabc")
245 self.assertEqual(b * 0, b"")
246 self.assertEqual(b * -1, b"")
247 self.assertRaises(TypeError, lambda: b * 3.14)
248 self.assertRaises(TypeError, lambda: 3.14 * b)
249 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000250 with self.assertRaises((OverflowError, MemoryError)):
251 c = b * sys.maxsize
252 with self.assertRaises((OverflowError, MemoryError)):
253 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000254
255 def test_repeat_1char(self):
256 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
257
258 def test_contains(self):
259 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000260 self.assertIn(ord('a'), b)
261 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000262 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000263 self.assertRaises(ValueError, lambda: 300 in b)
264 self.assertRaises(ValueError, lambda: -1 in b)
265 self.assertRaises(TypeError, lambda: None in b)
266 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
267 self.assertRaises(TypeError, lambda: "a" in b)
268 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000269 self.assertIn(f(b""), b)
270 self.assertIn(f(b"a"), b)
271 self.assertIn(f(b"b"), b)
272 self.assertIn(f(b"c"), b)
273 self.assertIn(f(b"ab"), b)
274 self.assertIn(f(b"bc"), b)
275 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000276 self.assertNotIn(f(b"ac"), b)
277 self.assertNotIn(f(b"d"), b)
278 self.assertNotIn(f(b"dab"), b)
279 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000280
281 def test_fromhex(self):
282 self.assertRaises(TypeError, self.type2test.fromhex)
283 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000284 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000285 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000286 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
287 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
288 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000289 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
290 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
291 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
292 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
293 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
294 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
295
296 def test_join(self):
297 self.assertEqual(self.type2test(b"").join([]), b"")
298 self.assertEqual(self.type2test(b"").join([b""]), b"")
299 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
300 lst = list(map(self.type2test, lst))
301 self.assertEqual(self.type2test(b"").join(lst), b"abc")
302 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
303 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200304 dot_join = self.type2test(b".:").join
305 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
306 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
307 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
308 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
309 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
310 # Stress it with many items
311 seq = [b"abc"] * 1000
312 expected = b"abc" + b".:abc" * 999
313 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400314 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200315 # Error handling and cleanup when some item in the middle of the
316 # sequence has the wrong type.
317 with self.assertRaises(TypeError):
318 dot_join([bytearray(b"ab"), "cd", b"ef"])
319 with self.assertRaises(TypeError):
320 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000321
Christian Heimes510711d2008-01-30 11:57:58 +0000322 def test_count(self):
323 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200324 i = 105
325 p = 112
326 w = 119
327
Christian Heimes510711d2008-01-30 11:57:58 +0000328 self.assertEqual(b.count(b'i'), 4)
329 self.assertEqual(b.count(b'ss'), 2)
330 self.assertEqual(b.count(b'w'), 0)
331
Antoine Pitrouac65d962011-10-20 23:54:17 +0200332 self.assertEqual(b.count(i), 4)
333 self.assertEqual(b.count(w), 0)
334
335 self.assertEqual(b.count(b'i', 6), 2)
336 self.assertEqual(b.count(b'p', 6), 2)
337 self.assertEqual(b.count(b'i', 1, 3), 1)
338 self.assertEqual(b.count(b'p', 7, 9), 1)
339
340 self.assertEqual(b.count(i, 6), 2)
341 self.assertEqual(b.count(p, 6), 2)
342 self.assertEqual(b.count(i, 1, 3), 1)
343 self.assertEqual(b.count(p, 7, 9), 1)
344
Christian Heimes510711d2008-01-30 11:57:58 +0000345 def test_startswith(self):
346 b = self.type2test(b'hello')
347 self.assertFalse(self.type2test().startswith(b"anything"))
348 self.assertTrue(b.startswith(b"hello"))
349 self.assertTrue(b.startswith(b"hel"))
350 self.assertTrue(b.startswith(b"h"))
351 self.assertFalse(b.startswith(b"hellow"))
352 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300353 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300354 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300355 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300356 self.assertIn('bytes', exc)
357 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000358
359 def test_endswith(self):
360 b = self.type2test(b'hello')
361 self.assertFalse(bytearray().endswith(b"anything"))
362 self.assertTrue(b.endswith(b"hello"))
363 self.assertTrue(b.endswith(b"llo"))
364 self.assertTrue(b.endswith(b"o"))
365 self.assertFalse(b.endswith(b"whello"))
366 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300367 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300368 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300369 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300370 self.assertIn('bytes', exc)
371 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000372
373 def test_find(self):
374 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200375 i = 105
376 w = 119
377
Christian Heimes510711d2008-01-30 11:57:58 +0000378 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000379 self.assertEqual(b.find(b'w'), -1)
380 self.assertEqual(b.find(b'mississippian'), -1)
381
Antoine Pitrouac65d962011-10-20 23:54:17 +0200382 self.assertEqual(b.find(i), 1)
383 self.assertEqual(b.find(w), -1)
384
385 self.assertEqual(b.find(b'ss', 3), 5)
386 self.assertEqual(b.find(b'ss', 1, 7), 2)
387 self.assertEqual(b.find(b'ss', 1, 3), -1)
388
389 self.assertEqual(b.find(i, 6), 7)
390 self.assertEqual(b.find(i, 1, 3), 1)
391 self.assertEqual(b.find(w, 1, 3), -1)
392
Victor Stinnerf8eac002011-12-18 01:17:41 +0100393 for index in (-1, 256, sys.maxsize + 1):
394 self.assertRaisesRegex(
395 ValueError, r'byte must be in range\(0, 256\)',
396 b.find, index)
397
Christian Heimes510711d2008-01-30 11:57:58 +0000398 def test_rfind(self):
399 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200400 i = 105
401 w = 119
402
Christian Heimes510711d2008-01-30 11:57:58 +0000403 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000404 self.assertEqual(b.rfind(b'w'), -1)
405 self.assertEqual(b.rfind(b'mississippian'), -1)
406
Antoine Pitrouac65d962011-10-20 23:54:17 +0200407 self.assertEqual(b.rfind(i), 10)
408 self.assertEqual(b.rfind(w), -1)
409
410 self.assertEqual(b.rfind(b'ss', 3), 5)
411 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
412
413 self.assertEqual(b.rfind(i, 1, 3), 1)
414 self.assertEqual(b.rfind(i, 3, 9), 7)
415 self.assertEqual(b.rfind(w, 1, 3), -1)
416
Christian Heimes510711d2008-01-30 11:57:58 +0000417 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200418 b = self.type2test(b'mississippi')
419 i = 105
420 w = 119
421
422 self.assertEqual(b.index(b'ss'), 2)
423 self.assertRaises(ValueError, b.index, b'w')
424 self.assertRaises(ValueError, b.index, b'mississippian')
425
426 self.assertEqual(b.index(i), 1)
427 self.assertRaises(ValueError, b.index, w)
428
429 self.assertEqual(b.index(b'ss', 3), 5)
430 self.assertEqual(b.index(b'ss', 1, 7), 2)
431 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
432
433 self.assertEqual(b.index(i, 6), 7)
434 self.assertEqual(b.index(i, 1, 3), 1)
435 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000436
437 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200438 b = self.type2test(b'mississippi')
439 i = 105
440 w = 119
441
442 self.assertEqual(b.rindex(b'ss'), 5)
443 self.assertRaises(ValueError, b.rindex, b'w')
444 self.assertRaises(ValueError, b.rindex, b'mississippian')
445
446 self.assertEqual(b.rindex(i), 10)
447 self.assertRaises(ValueError, b.rindex, w)
448
449 self.assertEqual(b.rindex(b'ss', 3), 5)
450 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
451
452 self.assertEqual(b.rindex(i, 1, 3), 1)
453 self.assertEqual(b.rindex(i, 3, 9), 7)
454 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000455
456 def test_replace(self):
457 b = self.type2test(b'mississippi')
458 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
459 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
460
461 def test_split(self):
462 b = self.type2test(b'mississippi')
463 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
464 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
465 self.assertEqual(b.split(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200466 # with keyword args
467 b = self.type2test(b'a|b|c|d')
468 self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
469 self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
470 self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
471 self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
472 b = self.type2test(b'a b c d')
473 self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
Christian Heimes510711d2008-01-30 11:57:58 +0000474
475 def test_split_whitespace(self):
476 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
477 b'arf\fbarf', b'arf\vbarf'):
478 b = self.type2test(b)
479 self.assertEqual(b.split(), [b'arf', b'barf'])
480 self.assertEqual(b.split(None), [b'arf', b'barf'])
481 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
482 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
483 b = self.type2test(b)
484 self.assertEqual(b.split(), [b])
485 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
486 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
487 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
488 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
489
490 def test_split_string_error(self):
491 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
492
Antoine Pitrouf8453022010-01-12 22:05:42 +0000493 def test_split_unicodewhitespace(self):
494 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
495 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
496
Christian Heimes510711d2008-01-30 11:57:58 +0000497 def test_rsplit(self):
498 b = self.type2test(b'mississippi')
499 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
500 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
501 self.assertEqual(b.rsplit(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200502 # with keyword args
503 b = self.type2test(b'a|b|c|d')
504 self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
505 self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
506 self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
507 self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
508 b = self.type2test(b'a b c d')
509 self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
Christian Heimes510711d2008-01-30 11:57:58 +0000510
511 def test_rsplit_whitespace(self):
512 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
513 b'arf\fbarf', b'arf\vbarf'):
514 b = self.type2test(b)
515 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
516 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
517 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
518 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
519 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
520 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
521 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
522
523 def test_rsplit_string_error(self):
524 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
525
526 def test_rsplit_unicodewhitespace(self):
527 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000528 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
529
530 def test_partition(self):
531 b = self.type2test(b'mississippi')
532 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000533 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000534
535 def test_rpartition(self):
536 b = self.type2test(b'mississippi')
537 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
538 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000539 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000540
541 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000542 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000543 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
544 b = self.type2test(b)
545 ps = pickle.dumps(b, proto)
546 q = pickle.loads(ps)
547 self.assertEqual(b, q)
548
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000549 def test_iterator_pickling(self):
550 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
551 it = itorg = iter(self.type2test(b))
552 data = list(self.type2test(b))
553 d = pickle.dumps(it)
554 it = pickle.loads(d)
555 self.assertEqual(type(itorg), type(it))
556 self.assertEqual(list(it), data)
557
558 it = pickle.loads(d)
559 try:
560 next(it)
561 except StopIteration:
562 continue
563 d = pickle.dumps(it)
564 it = pickle.loads(d)
565 self.assertEqual(list(it), data[1:])
566
Christian Heimes510711d2008-01-30 11:57:58 +0000567 def test_strip(self):
568 b = self.type2test(b'mississippi')
569 self.assertEqual(b.strip(b'i'), b'mississipp')
570 self.assertEqual(b.strip(b'm'), b'ississippi')
571 self.assertEqual(b.strip(b'pi'), b'mississ')
572 self.assertEqual(b.strip(b'im'), b'ssissipp')
573 self.assertEqual(b.strip(b'pim'), b'ssiss')
574 self.assertEqual(b.strip(b), b'')
575
576 def test_lstrip(self):
577 b = self.type2test(b'mississippi')
578 self.assertEqual(b.lstrip(b'i'), b'mississippi')
579 self.assertEqual(b.lstrip(b'm'), b'ississippi')
580 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
581 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
582 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
583
584 def test_rstrip(self):
585 b = self.type2test(b'mississippi')
586 self.assertEqual(b.rstrip(b'i'), b'mississipp')
587 self.assertEqual(b.rstrip(b'm'), b'mississippi')
588 self.assertEqual(b.rstrip(b'pi'), b'mississ')
589 self.assertEqual(b.rstrip(b'im'), b'mississipp')
590 self.assertEqual(b.rstrip(b'pim'), b'mississ')
591
592 def test_strip_whitespace(self):
593 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
594 self.assertEqual(b.strip(), b'abc')
595 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
596 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
597
598 def test_strip_bytearray(self):
599 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
600 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
601 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
602
603 def test_strip_string_error(self):
604 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
605 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
606 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
607
Eli Bendersky906b88f2011-07-29 07:05:08 +0300608 def test_center(self):
609 # Fill character can be either bytes or bytearray (issue 12380)
610 b = self.type2test(b'abc')
611 for fill_type in (bytes, bytearray):
612 self.assertEqual(b.center(7, fill_type(b'-')),
613 self.type2test(b'--abc--'))
614
615 def test_ljust(self):
616 # Fill character can be either bytes or bytearray (issue 12380)
617 b = self.type2test(b'abc')
618 for fill_type in (bytes, bytearray):
619 self.assertEqual(b.ljust(7, fill_type(b'-')),
620 self.type2test(b'abc----'))
621
622 def test_rjust(self):
623 # Fill character can be either bytes or bytearray (issue 12380)
624 b = self.type2test(b'abc')
625 for fill_type in (bytes, bytearray):
626 self.assertEqual(b.rjust(7, fill_type(b'-')),
627 self.type2test(b'----abc'))
628
Christian Heimes510711d2008-01-30 11:57:58 +0000629 def test_ord(self):
630 b = self.type2test(b'\0A\x7f\x80\xff')
631 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
632 [0, 65, 127, 128, 255])
633
Georg Brandlabc38772009-04-12 15:51:51 +0000634 def test_maketrans(self):
635 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 +0000636 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000637 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'
638 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000639 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
640 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
641
Jesus Ceaac451502011-04-20 17:09:23 +0200642 def test_none_arguments(self):
643 # issue 11828
644 b = self.type2test(b'hello')
645 l = self.type2test(b'l')
646 h = self.type2test(b'h')
647 x = self.type2test(b'x')
648 o = self.type2test(b'o')
649
650 self.assertEqual(2, b.find(l, None))
651 self.assertEqual(3, b.find(l, -2, None))
652 self.assertEqual(2, b.find(l, None, -2))
653 self.assertEqual(0, b.find(h, None, None))
654
655 self.assertEqual(3, b.rfind(l, None))
656 self.assertEqual(3, b.rfind(l, -2, None))
657 self.assertEqual(2, b.rfind(l, None, -2))
658 self.assertEqual(0, b.rfind(h, None, None))
659
660 self.assertEqual(2, b.index(l, None))
661 self.assertEqual(3, b.index(l, -2, None))
662 self.assertEqual(2, b.index(l, None, -2))
663 self.assertEqual(0, b.index(h, None, None))
664
665 self.assertEqual(3, b.rindex(l, None))
666 self.assertEqual(3, b.rindex(l, -2, None))
667 self.assertEqual(2, b.rindex(l, None, -2))
668 self.assertEqual(0, b.rindex(h, None, None))
669
670 self.assertEqual(2, b.count(l, None))
671 self.assertEqual(1, b.count(l, -2, None))
672 self.assertEqual(1, b.count(l, None, -2))
673 self.assertEqual(0, b.count(x, None, None))
674
675 self.assertEqual(True, b.endswith(o, None))
676 self.assertEqual(True, b.endswith(o, -2, None))
677 self.assertEqual(True, b.endswith(l, None, -2))
678 self.assertEqual(False, b.endswith(x, None, None))
679
680 self.assertEqual(True, b.startswith(h, None))
681 self.assertEqual(True, b.startswith(l, -2, None))
682 self.assertEqual(True, b.startswith(h, None, -2))
683 self.assertEqual(False, b.startswith(x, None, None))
684
Antoine Pitrouac65d962011-10-20 23:54:17 +0200685 def test_integer_arguments_out_of_byte_range(self):
686 b = self.type2test(b'hello')
687
688 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
689 self.assertRaises(ValueError, method, -1)
690 self.assertRaises(ValueError, method, 256)
691 self.assertRaises(ValueError, method, 9999)
692
Jesus Ceaac451502011-04-20 17:09:23 +0200693 def test_find_etc_raise_correct_error_messages(self):
694 # issue 11828
695 b = self.type2test(b'hello')
696 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300697 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200698 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300699 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200700 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300701 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200702 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300703 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200704 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300705 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200706 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300707 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200708 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300709 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200710 x, None, None, None)
711
Christian Heimes510711d2008-01-30 11:57:58 +0000712
Ezio Melotti0dceb562013-01-10 07:43:26 +0200713class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000714 type2test = bytes
715
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400716 def test_getitem_error(self):
717 msg = "byte indices must be integers or slices"
718 with self.assertRaisesRegex(TypeError, msg):
719 b'python'['a']
720
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000721 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200722 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000723 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000724 self.assertRaises(TypeError, f.readinto, b"")
725
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000726 def test_custom(self):
727 class A:
728 def __bytes__(self):
729 return b'abc'
730 self.assertEqual(bytes(A()), b'abc')
731 class A: pass
732 self.assertRaises(TypeError, bytes, A())
733 class A:
734 def __bytes__(self):
735 return None
736 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600737 class A:
738 def __bytes__(self):
739 return b'a'
740 def __index__(self):
741 return 42
742 self.assertEqual(bytes(A()), b'a')
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000743
Victor Stinner29e762c2011-01-05 03:33:28 +0000744 # Test PyBytes_FromFormat()
745 def test_from_format(self):
746 test.support.import_module('ctypes')
747 from ctypes import pythonapi, py_object, c_int, c_char_p
748 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
749 PyBytes_FromFormat.restype = py_object
750
751 self.assertEqual(PyBytes_FromFormat(b'format'),
752 b'format')
753
754 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
755 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
756 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
757 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
758 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
759
760 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
761 b'c:\xff')
762 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
763 b's:cstr')
764
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100765 # Issue #19969
766 self.assertRaises(OverflowError,
767 PyBytes_FromFormat, b'%c', c_int(-1))
768 self.assertRaises(OverflowError,
769 PyBytes_FromFormat, b'%c', c_int(256))
770
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000771
Ezio Melotti0dceb562013-01-10 07:43:26 +0200772class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000773 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000774
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400775 def test_getitem_error(self):
776 msg = "bytearray indices must be integers or slices"
777 with self.assertRaisesRegex(TypeError, msg):
778 bytearray(b'python')['a']
779
780 def test_setitem_error(self):
781 msg = "bytearray indices must be integers or slices"
782 with self.assertRaisesRegex(TypeError, msg):
783 b = bytearray(b'python')
784 b['a'] = "python"
785
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000786 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000787 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000788
Guido van Rossum254348e2007-11-21 19:29:53 +0000789 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000790 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000791 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000792 tfn = tempfile.mktemp()
793 try:
794 # Prepare
795 with open(tfn, "wb") as f:
796 f.write(short_sample)
797 # Test readinto
798 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000799 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000800 n = f.readinto(b)
801 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000802 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000803 # Test writing in binary mode
804 with open(tfn, "wb") as f:
805 f.write(b)
806 with open(tfn, "rb") as f:
807 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000808 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000809 finally:
810 try:
811 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200812 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000813 pass
814
Neal Norwitz6968b052007-02-27 19:02:19 +0000815 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000816 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000817 self.assertEqual(b.reverse(), None)
818 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000819 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000820 b.reverse()
821 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000822 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000823 b.reverse()
824 self.assertFalse(b)
825
Eli Bendersky4db28d32011-03-03 18:21:02 +0000826 def test_clear(self):
827 b = bytearray(b'python')
828 b.clear()
829 self.assertEqual(b, b'')
830
831 b = bytearray(b'')
832 b.clear()
833 self.assertEqual(b, b'')
834
835 b = bytearray(b'')
836 b.append(ord('r'))
837 b.clear()
838 b.append(ord('p'))
839 self.assertEqual(b, b'p')
840
841 def test_copy(self):
842 b = bytearray(b'abc')
843 bb = b.copy()
844 self.assertEqual(bb, b'abc')
845
846 b = bytearray(b'')
847 bb = b.copy()
848 self.assertEqual(bb, b'')
849
850 # test that it's indeed a copy and not a reference
851 b = bytearray(b'abc')
852 bb = b.copy()
853 self.assertEqual(b, bb)
854 self.assertIsNot(b, bb)
855 bb.append(ord('d'))
856 self.assertEqual(bb, b'abcd')
857 self.assertEqual(b, b'abc')
858
Guido van Rossumd624f182006-04-24 13:47:05 +0000859 def test_regexps(self):
860 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000861 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000862 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000863 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000864
865 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000866 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000867 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000868 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000869 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000870 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000871 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000872 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000873 try:
874 b[3] = 0
875 self.fail("Didn't raise IndexError")
876 except IndexError:
877 pass
878 try:
879 b[-10] = 0
880 self.fail("Didn't raise IndexError")
881 except IndexError:
882 pass
883 try:
884 b[0] = 256
885 self.fail("Didn't raise ValueError")
886 except ValueError:
887 pass
888 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000889 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000890 self.fail("Didn't raise ValueError")
891 except ValueError:
892 pass
893 try:
894 b[0] = None
895 self.fail("Didn't raise TypeError")
896 except TypeError:
897 pass
898
899 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000900 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000901 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000902 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000903 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000904 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000905 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000906 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000907
908 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000909 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000910 self.assertEqual(list(b), list(range(10)))
911
Guido van Rossum254348e2007-11-21 19:29:53 +0000912 b[0:5] = bytearray([1, 1, 1, 1, 1])
913 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000914
915 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000916 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000917
Guido van Rossum254348e2007-11-21 19:29:53 +0000918 b[0:0] = bytearray([0, 1, 2, 3, 4])
919 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000920
Guido van Rossum254348e2007-11-21 19:29:53 +0000921 b[-7:-3] = bytearray([100, 101])
922 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000923
924 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000925 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000926
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000927 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000928 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 +0000929
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200930 b[3:] = b'foo'
931 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
932
933 b[:3] = memoryview(b'foo')
934 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
935
936 b[3:4] = []
937 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
938
939 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
940 ['a', 'b'], [b'a', b'b'], [[]]]:
941 with self.assertRaises(TypeError):
942 b[3:4] = elem
943
944 for elem in [[254, 255, 256], [-256, 9000]]:
945 with self.assertRaises(ValueError):
946 b[3:4] = elem
947
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200948 def test_setslice_extend(self):
949 # Exercise the resizing logic (see issue #19087)
950 b = bytearray(range(100))
951 self.assertEqual(list(b), list(range(100)))
952 del b[:10]
953 self.assertEqual(list(b), list(range(10, 100)))
954 b.extend(range(100, 110))
955 self.assertEqual(list(b), list(range(10, 110)))
956
Thomas Wouters376446d2006-12-19 08:30:14 +0000957 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +0000958 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000959 for start in indices:
960 for stop in indices:
961 # Skip invalid step 0
962 for step in indices[1:]:
963 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000964 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000965 # Make sure we have a slice of exactly the right length,
966 # but with different data.
967 data = L[start:stop:step]
968 data.reverse()
969 L[start:stop:step] = data
970 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +0000971 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000972
Thomas Wouters376446d2006-12-19 08:30:14 +0000973 del L[start:stop:step]
974 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000975 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000976
Guido van Rossumd624f182006-04-24 13:47:05 +0000977 def test_setslice_trap(self):
978 # This test verifies that we correctly handle assigning self
979 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000980 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000981 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000982 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000983
Guido van Rossum13e57212006-04-27 22:54:26 +0000984 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000985 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000986 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000987 b += b"def"
988 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000989 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000990 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000991 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000992 self.assertEqual(b, b"abcdefxyz")
993 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000994 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000995 except TypeError:
996 pass
997 else:
998 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000999
1000 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001001 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001002 b1 = b
1003 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001004 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001005 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001006 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001007
1008 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001009 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001010 b1 = b
1011 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001012 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001013 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001014 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001015
Guido van Rossum20188312006-05-05 15:15:40 +00001016 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001017 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001018 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001019 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001020 seq = [alloc]
1021 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001022 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001023 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001024 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +00001025 if alloc not in seq:
1026 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001027
Neal Norwitz6968b052007-02-27 19:02:19 +00001028 def test_extend(self):
1029 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001030 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001031 a.extend(a)
1032 self.assertEqual(a, orig + orig)
1033 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001034 a = bytearray(b'')
1035 # Test iterators that don't have a __length_hint__
1036 a.extend(map(int, orig * 25))
1037 a.extend(int(x) for x in orig * 25)
1038 self.assertEqual(a, orig * 50)
1039 self.assertEqual(a[-5:], orig)
1040 a = bytearray(b'')
1041 a.extend(iter(map(int, orig * 50)))
1042 self.assertEqual(a, orig * 50)
1043 self.assertEqual(a[-5:], orig)
1044 a = bytearray(b'')
1045 a.extend(list(map(int, orig * 50)))
1046 self.assertEqual(a, orig * 50)
1047 self.assertEqual(a[-5:], orig)
1048 a = bytearray(b'')
1049 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1050 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1051 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001052 a = bytearray(b'')
1053 a.extend([Indexable(ord('a'))])
1054 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001055
Neal Norwitz6968b052007-02-27 19:02:19 +00001056 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001057 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001058 b.remove(ord('l'))
1059 self.assertEqual(b, b'helo')
1060 b.remove(ord('l'))
1061 self.assertEqual(b, b'heo')
1062 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1063 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001064 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001065 # remove first and last
1066 b.remove(ord('o'))
1067 b.remove(ord('h'))
1068 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001069 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001070 b.remove(Indexable(ord('e')))
1071 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001072
1073 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001074 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001075 self.assertEqual(b.pop(), ord('d'))
1076 self.assertEqual(b.pop(0), ord('w'))
1077 self.assertEqual(b.pop(-2), ord('r'))
1078 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001079 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001080 # test for issue #6846
1081 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001082
1083 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001084 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001085
Neal Norwitz6968b052007-02-27 19:02:19 +00001086 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001087 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001088 b.append(ord('o'))
1089 self.assertEqual(b, b'hello')
1090 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001091 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001092 b.append(ord('A'))
1093 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001094 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001095 b = bytearray()
1096 b.append(Indexable(ord('A')))
1097 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001098
1099 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001100 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001101 b.insert(1, ord('i'))
1102 b.insert(4, ord('i'))
1103 b.insert(-2, ord('i'))
1104 b.insert(1000, ord('i'))
1105 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001106 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001107 b = bytearray()
1108 b.insert(0, Indexable(ord('A')))
1109 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001110
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001111 def test_copied(self):
1112 # Issue 4348. Make sure that operations that don't mutate the array
1113 # copy the bytes.
1114 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001115 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001116
1117 t = bytearray([i for i in range(256)])
1118 x = bytearray(b'')
1119 self.assertFalse(x is x.translate(t))
1120
Guido van Rossum254348e2007-11-21 19:29:53 +00001121 def test_partition_bytearray_doesnt_share_nullstring(self):
1122 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001123 self.assertEqual(b, b"")
1124 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001125 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001126 b += b"!"
1127 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001128 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001129 self.assertEqual(b, b"")
1130 self.assertEqual(c, b"")
1131 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001132 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001133 self.assertEqual(b, b"")
1134 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001135 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001136 b += b"!"
1137 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001138 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001139 self.assertEqual(b, b"")
1140 self.assertEqual(c, b"")
1141
Antoine Pitrou5504e892008-12-06 21:27:53 +00001142 def test_resize_forbidden(self):
1143 # #4509: can't resize a bytearray when there are buffer exports, even
1144 # if it wouldn't reallocate the underlying buffer.
1145 # Furthermore, no destructive changes to the buffer may be applied
1146 # before raising the error.
1147 b = bytearray(range(10))
1148 v = memoryview(b)
1149 def resize(n):
1150 b[1:-1] = range(n + 1, 2*n - 1)
1151 resize(10)
1152 orig = b[:]
1153 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001154 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001155 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001156 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001157 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001158 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001159 # Other operations implying resize
1160 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001161 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001162 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001163 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001164 def delitem():
1165 del b[1]
1166 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001167 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001168 # deleting a non-contiguous slice
1169 def delslice():
1170 b[1:-1:2] = b""
1171 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001172 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001173
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001174
Christian Heimes510711d2008-01-30 11:57:58 +00001175class AssortedBytesTest(unittest.TestCase):
1176 #
1177 # Test various combinations of bytes and bytearray
1178 #
1179
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001180 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001181 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001182 for f in str, repr:
1183 self.assertEqual(f(bytearray()), "bytearray(b'')")
1184 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1185 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1186 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1187 self.assertEqual(f(b"abc"), "b'abc'")
1188 self.assertEqual(f(b"'"), '''b"'"''') # '''
1189 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001190
1191 def test_compare_bytes_to_bytearray(self):
1192 self.assertEqual(b"abc" == bytes(b"abc"), True)
1193 self.assertEqual(b"ab" != bytes(b"abc"), True)
1194 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1195 self.assertEqual(b"ab" < bytes(b"abc"), True)
1196 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1197 self.assertEqual(b"abc" > bytes(b"ab"), True)
1198
1199 self.assertEqual(b"abc" != bytes(b"abc"), False)
1200 self.assertEqual(b"ab" == bytes(b"abc"), False)
1201 self.assertEqual(b"ab" > bytes(b"abc"), False)
1202 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1203 self.assertEqual(b"abc" < bytes(b"ab"), False)
1204 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1205
1206 self.assertEqual(bytes(b"abc") == b"abc", True)
1207 self.assertEqual(bytes(b"ab") != b"abc", True)
1208 self.assertEqual(bytes(b"ab") <= b"abc", True)
1209 self.assertEqual(bytes(b"ab") < b"abc", True)
1210 self.assertEqual(bytes(b"abc") >= b"ab", True)
1211 self.assertEqual(bytes(b"abc") > b"ab", True)
1212
1213 self.assertEqual(bytes(b"abc") != b"abc", False)
1214 self.assertEqual(bytes(b"ab") == b"abc", False)
1215 self.assertEqual(bytes(b"ab") > b"abc", False)
1216 self.assertEqual(bytes(b"ab") >= b"abc", False)
1217 self.assertEqual(bytes(b"abc") < b"ab", False)
1218 self.assertEqual(bytes(b"abc") <= b"ab", False)
1219
Stefan Krah6e572b82013-01-26 13:06:36 +01001220 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001221 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001222 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001223 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001224 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001225 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001226
1227 def test_from_bytearray(self):
1228 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1229 buf = memoryview(sample)
1230 b = bytearray(buf)
1231 self.assertEqual(b, bytearray(sample))
1232
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001233 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001234 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001235 self.assertEqual(str(b''), "b''")
1236 self.assertEqual(str(b'x'), "b'x'")
1237 self.assertEqual(str(b'\x80'), "b'\\x80'")
1238 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1239 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1240 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001241
1242 def test_literal(self):
1243 tests = [
1244 (b"Wonderful spam", "Wonderful spam"),
1245 (br"Wonderful spam too", "Wonderful spam too"),
1246 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1247 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1248 ]
1249 for b, s in tests:
1250 self.assertEqual(b, bytearray(s, 'latin-1'))
1251 for c in range(128, 256):
1252 self.assertRaises(SyntaxError, eval,
1253 'b"%s"' % chr(c))
1254
1255 def test_translate(self):
1256 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001257 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001258 rosetta = bytearray(range(0, 256))
1259 rosetta[ord('o')] = ord('e')
1260 c = b.translate(rosetta, b'l')
1261 self.assertEqual(b, b'hello')
1262 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001263 c = ba.translate(rosetta, b'l')
1264 self.assertEqual(ba, b'hello')
1265 self.assertEqual(c, b'hee')
1266 c = b.translate(None, b'e')
1267 self.assertEqual(c, b'hllo')
1268 c = ba.translate(None, b'e')
1269 self.assertEqual(c, b'hllo')
1270 self.assertRaises(TypeError, b.translate, None, None)
1271 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001272
1273 def test_split_bytearray(self):
1274 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1275
1276 def test_rsplit_bytearray(self):
1277 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1278
Georg Brandleb2c9642008-05-30 12:05:02 +00001279 def test_return_self(self):
1280 # bytearray.replace must always return a new bytearray
1281 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001282 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001283
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001284 def test_compare(self):
1285 if sys.flags.bytes_warning:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001286 def bytes_warning():
1287 return test.support.check_warnings(('', BytesWarning))
1288 with bytes_warning():
1289 b'' == ''
1290 with bytes_warning():
1291 b'' != ''
1292 with bytes_warning():
1293 bytearray(b'') == ''
1294 with bytes_warning():
1295 bytearray(b'') != ''
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001296 else:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001297 self.skipTest("BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001298
Guido van Rossumd624f182006-04-24 13:47:05 +00001299 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001300 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001301 # __reversed__? (optimization)
1302
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001303 # XXX More string methods? (Those that don't use character properties)
1304
Neal Norwitz6968b052007-02-27 19:02:19 +00001305 # There are tests in string_tests.py that are more
1306 # comprehensive for things like split, partition, etc.
1307 # Unfortunately they are all bundled with tests that
1308 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001309
Guido van Rossum254348e2007-11-21 19:29:53 +00001310 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001311 # the rest that make sense (the code can be cleaned up to use modern
1312 # unittest methods at the same time).
1313
Guido van Rossum254348e2007-11-21 19:29:53 +00001314class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001315 test.buffer_tests.MixinBytesBufferCommonTests):
1316 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001317 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001318
1319 def test_returns_new_copy(self):
1320 val = self.marshal(b'1234')
1321 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001322 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001323 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1324 method = getattr(val, methname)
1325 newval = method(3)
1326 self.assertEqual(val, newval)
1327 self.assertTrue(val is not newval,
1328 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001329 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1330 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1331 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1332 newval = eval(expr)
1333 self.assertEqual(val, newval)
1334 self.assertTrue(val is not newval,
1335 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001336 sep = self.marshal(b'')
1337 newval = sep.join([val])
1338 self.assertEqual(val, newval)
1339 self.assertIsNot(val, newval)
1340
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001341
Christian Heimes510711d2008-01-30 11:57:58 +00001342class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +00001343
Guido van Rossum9c627722007-08-27 18:31:48 +00001344 def fixtype(self, obj):
1345 if isinstance(obj, str):
1346 return obj.encode("utf-8")
1347 return super().fixtype(obj)
1348
Georg Brandlc7885542007-03-06 19:16:20 +00001349 # Currently the bytes containment testing uses a single integer
1350 # value. This may not be the final design, but until then the
1351 # bytes section with in a bytes containment not valid
1352 def test_contains(self):
1353 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001354 def test_expandtabs(self):
1355 pass
1356 def test_upper(self):
1357 pass
1358 def test_lower(self):
1359 pass
Georg Brandlc7885542007-03-06 19:16:20 +00001360
Ezio Melotti0dceb562013-01-10 07:43:26 +02001361class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001362 type2test = bytearray
Antoine Pitrouac65d962011-10-20 23:54:17 +02001363 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001364
Ezio Melotti0dceb562013-01-10 07:43:26 +02001365class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001366 type2test = bytes
Antoine Pitrouac65d962011-10-20 23:54:17 +02001367 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001368
Georg Brandlc7885542007-03-06 19:16:20 +00001369
Ezio Melotti0dceb562013-01-10 07:43:26 +02001370class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001371
1372 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001373 self.assertTrue(issubclass(self.subclass2test, self.type2test))
Ezio Melottie9615932010-01-24 19:26:24 +00001374 self.assertIsInstance(self.subclass2test(), self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001375
1376 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001377 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001378
1379 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001380 self.assertTrue(_a == _a)
1381 self.assertTrue(_a != _b)
1382 self.assertTrue(_a < _b)
1383 self.assertTrue(_a <= _b)
1384 self.assertTrue(_b >= _a)
1385 self.assertTrue(_b > _a)
1386 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001387
1388 # test concat of subclass instances
1389 self.assertEqual(a + b, _a + _b)
1390 self.assertEqual(a + b, a + _b)
1391 self.assertEqual(a + b, _a + b)
1392
1393 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001394 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001395
1396 def test_join(self):
1397 # Make sure join returns a NEW object for single item sequences
1398 # involving a subclass.
1399 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001400 s1 = self.subclass2test(b"abcd")
1401 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001402 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001403 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001404
1405 # Test reverse, calling join on subclass
1406 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001407 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001408
1409 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001410 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001411 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001412 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001413 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001414 b = pickle.loads(pickle.dumps(a, proto))
1415 self.assertNotEqual(id(a), id(b))
1416 self.assertEqual(a, b)
1417 self.assertEqual(a.x, b.x)
1418 self.assertEqual(a.y, b.y)
1419 self.assertEqual(type(a), type(b))
1420 self.assertEqual(type(a.y), type(b.y))
1421
1422 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001423 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001424 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001425 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001426 for copy_method in (copy.copy, copy.deepcopy):
1427 b = copy_method(a)
1428 self.assertNotEqual(id(a), id(b))
1429 self.assertEqual(a, b)
1430 self.assertEqual(a.x, b.x)
1431 self.assertEqual(a.y, b.y)
1432 self.assertEqual(type(a), type(b))
1433 self.assertEqual(type(a.y), type(b.y))
1434
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001435
1436class ByteArraySubclass(bytearray):
1437 pass
1438
1439class BytesSubclass(bytes):
1440 pass
1441
Ezio Melotti0dceb562013-01-10 07:43:26 +02001442class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001443 type2test = bytearray
1444 subclass2test = ByteArraySubclass
1445
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001446 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001447 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001448 def __init__(me, newarg=1, *args, **kwargs):
1449 bytearray.__init__(me, *args, **kwargs)
1450 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001451 x = subclass(4, source=b"abcd")
1452 self.assertEqual(x, b"abcd")
1453 x = subclass(newarg=4, source=b"abcd")
1454 self.assertEqual(x, b"abcd")
1455
1456
Ezio Melotti0dceb562013-01-10 07:43:26 +02001457class BytesSubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001458 type2test = bytes
1459 subclass2test = BytesSubclass
1460
1461
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001462if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001463 unittest.main()