blob: 4a70b33bc0b9e37b4ba377c551f3a33e6f7a2140 [file] [log] [blame]
Christian Heimes1a6387e2008-03-26 12:49:49 +00001"""Unit tests for the bytes and bytearray types.
2
Martin Panter86e0d572016-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).
Christian Heimes1a6387e2008-03-26 12:49:49 +00005"""
6
7import os
8import re
9import sys
10import copy
Florent Xicluna9b90cd12010-09-13 07:46:37 +000011import functools
Christian Heimes1a6387e2008-03-26 12:49:49 +000012import pickle
13import tempfile
14import unittest
Christian Heimes1a6387e2008-03-26 12:49:49 +000015import test.test_support
16import test.string_tests
Christian Heimes1a6387e2008-03-26 12:49:49 +000017
Florent Xicluna9b90cd12010-09-13 07:46:37 +000018
19if sys.flags.bytes_warning:
20 def check_bytes_warnings(func):
21 @functools.wraps(func)
22 def wrapper(*args, **kw):
23 with test.test_support.check_warnings(('', BytesWarning)):
24 return func(*args, **kw)
25 return wrapper
26else:
27 # no-op
28 def check_bytes_warnings(func):
29 return func
30
31
Georg Brandl3e483f62008-07-16 22:57:41 +000032class Indexable:
33 def __init__(self, value=0):
34 self.value = value
35 def __index__(self):
36 return self.value
37
Christian Heimes1a6387e2008-03-26 12:49:49 +000038
39class BaseBytesTest(unittest.TestCase):
40
Christian Heimes1a6387e2008-03-26 12:49:49 +000041 def test_basics(self):
42 b = self.type2test()
43 self.assertEqual(type(b), self.type2test)
44 self.assertEqual(b.__class__, self.type2test)
45
46 def test_empty_sequence(self):
47 b = self.type2test()
48 self.assertEqual(len(b), 0)
49 self.assertRaises(IndexError, lambda: b[0])
50 self.assertRaises(IndexError, lambda: b[1])
51 self.assertRaises(IndexError, lambda: b[sys.maxint])
52 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
53 self.assertRaises(IndexError, lambda: b[10**100])
54 self.assertRaises(IndexError, lambda: b[-1])
55 self.assertRaises(IndexError, lambda: b[-2])
56 self.assertRaises(IndexError, lambda: b[-sys.maxint])
57 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
58 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
59 self.assertRaises(IndexError, lambda: b[-10**100])
60
61 def test_from_list(self):
62 ints = list(range(256))
63 b = self.type2test(i for i in ints)
64 self.assertEqual(len(b), 256)
65 self.assertEqual(list(b), ints)
66
67 def test_from_index(self):
Georg Brandl3e483f62008-07-16 22:57:41 +000068 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
69 Indexable(255)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000070 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson06f06a02010-04-16 22:24:16 +000071 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
72 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000073
74 def test_from_ssize(self):
Benjamin Peterson06f06a02010-04-16 22:24:16 +000075 self.assertEqual(self.type2test(0), b'')
76 self.assertEqual(self.type2test(1), b'\x00')
Benjamin Peterson5c4e2922010-04-16 22:25:57 +000077 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
Benjamin Peterson06f06a02010-04-16 22:24:16 +000078 self.assertRaises(ValueError, self.type2test, -1)
Christian Heimes1a6387e2008-03-26 12:49:49 +000079
Benjamin Peterson06f06a02010-04-16 22:24:16 +000080 self.assertEqual(self.type2test('0', 'ascii'), b'0')
81 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson821a8ea2010-04-16 22:35:38 +000082 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Christian Heimes1a6387e2008-03-26 12:49:49 +000083
84 def test_constructor_type_errors(self):
85 self.assertRaises(TypeError, self.type2test, 0.0)
86 class C:
87 pass
Antoine Pitrouefa45f32010-01-12 22:02:10 +000088 # allowed in 2.x
Georg Brandl0a34baf2008-07-16 23:18:51 +000089 #self.assertRaises(TypeError, self.type2test, ["0"])
Christian Heimes1a6387e2008-03-26 12:49:49 +000090 self.assertRaises(TypeError, self.type2test, [0.0])
91 self.assertRaises(TypeError, self.type2test, [None])
92 self.assertRaises(TypeError, self.type2test, [C()])
93
94 def test_constructor_value_errors(self):
95 self.assertRaises(ValueError, self.type2test, [-1])
96 self.assertRaises(ValueError, self.type2test, [-sys.maxint])
97 self.assertRaises(ValueError, self.type2test, [-sys.maxint-1])
98 self.assertRaises(ValueError, self.type2test, [-sys.maxint-2])
99 self.assertRaises(ValueError, self.type2test, [-10**100])
100 self.assertRaises(ValueError, self.type2test, [256])
101 self.assertRaises(ValueError, self.type2test, [257])
102 self.assertRaises(ValueError, self.type2test, [sys.maxint])
103 self.assertRaises(ValueError, self.type2test, [sys.maxint+1])
104 self.assertRaises(ValueError, self.type2test, [10**100])
105
106 def test_compare(self):
107 b1 = self.type2test([1, 2, 3])
108 b2 = self.type2test([1, 2, 3])
109 b3 = self.type2test([1, 3])
110
111 self.assertEqual(b1, b2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000112 self.assertTrue(b2 != b3)
113 self.assertTrue(b1 <= b2)
114 self.assertTrue(b1 <= b3)
115 self.assertTrue(b1 < b3)
116 self.assertTrue(b1 >= b2)
117 self.assertTrue(b3 >= b2)
118 self.assertTrue(b3 > b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000119
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000120 self.assertFalse(b1 != b2)
121 self.assertFalse(b2 == b3)
122 self.assertFalse(b1 > b2)
123 self.assertFalse(b1 > b3)
124 self.assertFalse(b1 >= b3)
125 self.assertFalse(b1 < b2)
126 self.assertFalse(b3 < b2)
127 self.assertFalse(b3 <= b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000128
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000129 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000130 def test_compare_to_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000131 # Byte comparisons with unicode should always fail!
132 # Test this for all expected byte orders and Unicode character sizes
133 self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False)
134 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False)
135 self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False)
136 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False)
137 self.assertEqual(self.type2test() == unicode(), False)
138 self.assertEqual(self.type2test() != unicode(), True)
139
140 def test_reversed(self):
141 input = list(map(ord, "Hello"))
142 b = self.type2test(input)
143 output = list(reversed(b))
144 input.reverse()
145 self.assertEqual(output, input)
146
147 def test_getslice(self):
148 def by(s):
149 return self.type2test(map(ord, s))
150 b = by("Hello, world")
151
152 self.assertEqual(b[:5], by("Hello"))
153 self.assertEqual(b[1:5], by("ello"))
154 self.assertEqual(b[5:7], by(", "))
155 self.assertEqual(b[7:], by("world"))
156 self.assertEqual(b[7:12], by("world"))
157 self.assertEqual(b[7:100], by("world"))
158
159 self.assertEqual(b[:-7], by("Hello"))
160 self.assertEqual(b[-11:-7], by("ello"))
161 self.assertEqual(b[-7:-5], by(", "))
162 self.assertEqual(b[-5:], by("world"))
163 self.assertEqual(b[-5:12], by("world"))
164 self.assertEqual(b[-5:100], by("world"))
165 self.assertEqual(b[-100:5], by("Hello"))
166
167 def test_extended_getslice(self):
168 # Test extended slicing by comparing with list slicing.
169 L = list(range(255))
170 b = self.type2test(L)
171 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
172 for start in indices:
173 for stop in indices:
174 # Skip step 0 (invalid)
175 for step in indices[1:]:
176 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
177
178 def test_encoding(self):
179 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
180 for enc in ("utf8", "utf16"):
181 b = self.type2test(sample, enc)
182 self.assertEqual(b, self.type2test(sample.encode(enc)))
183 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
184 b = self.type2test(sample, "latin1", "ignore")
185 self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
186
187 def test_decode(self):
188 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
189 for enc in ("utf8", "utf16"):
190 b = self.type2test(sample, enc)
191 self.assertEqual(b.decode(enc), sample)
192 sample = u"Hello world\n\x80\x81\xfe\xff"
193 b = self.type2test(sample, "latin1")
194 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
195 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
Benjamin Petersondc782b52009-09-18 21:46:21 +0000196 self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
197 "Hello world\n")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000198
199 def test_from_int(self):
200 b = self.type2test(0)
201 self.assertEqual(b, self.type2test())
202 b = self.type2test(10)
203 self.assertEqual(b, self.type2test([0]*10))
204 b = self.type2test(10000)
205 self.assertEqual(b, self.type2test([0]*10000))
206
207 def test_concat(self):
208 b1 = self.type2test(b"abc")
209 b2 = self.type2test(b"def")
210 self.assertEqual(b1 + b2, b"abcdef")
211 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
212 self.assertEqual(bytes(b"def") + b1, b"defabc")
213 self.assertRaises(TypeError, lambda: b1 + u"def")
214 self.assertRaises(TypeError, lambda: u"abc" + b2)
215
216 def test_repeat(self):
217 for b in b"abc", self.type2test(b"abc"):
218 self.assertEqual(b * 3, b"abcabcabc")
219 self.assertEqual(b * 0, b"")
220 self.assertEqual(b * -1, b"")
221 self.assertRaises(TypeError, lambda: b * 3.14)
222 self.assertRaises(TypeError, lambda: 3.14 * b)
223 # XXX Shouldn't bytes and bytearray agree on what to raise?
224 self.assertRaises((OverflowError, MemoryError),
Mark Hammond69ed5242008-08-23 00:59:14 +0000225 lambda: b * sys.maxsize)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000226
227 def test_repeat_1char(self):
228 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
229
230 def test_contains(self):
231 b = self.type2test(b"abc")
Ezio Melottiaa980582010-01-23 23:04:36 +0000232 self.assertIn(ord('a'), b)
233 self.assertIn(int(ord('a')), b)
234 self.assertNotIn(200, b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000235 self.assertRaises(ValueError, lambda: 300 in b)
236 self.assertRaises(ValueError, lambda: -1 in b)
237 self.assertRaises(TypeError, lambda: None in b)
238 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
239 self.assertRaises(TypeError, lambda: u"a" in b)
240 for f in bytes, bytearray:
Ezio Melottiaa980582010-01-23 23:04:36 +0000241 self.assertIn(f(b""), b)
242 self.assertIn(f(b"a"), b)
243 self.assertIn(f(b"b"), b)
244 self.assertIn(f(b"c"), b)
245 self.assertIn(f(b"ab"), b)
246 self.assertIn(f(b"bc"), b)
247 self.assertIn(f(b"abc"), b)
248 self.assertNotIn(f(b"ac"), b)
249 self.assertNotIn(f(b"d"), b)
250 self.assertNotIn(f(b"dab"), b)
251 self.assertNotIn(f(b"abd"), b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000252
253 def test_fromhex(self):
254 self.assertRaises(TypeError, self.type2test.fromhex)
255 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melotti2623a372010-11-21 13:34:58 +0000256 self.assertEqual(self.type2test.fromhex(u''), self.type2test())
Christian Heimes1a6387e2008-03-26 12:49:49 +0000257 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melotti2623a372010-11-21 13:34:58 +0000258 self.assertEqual(self.type2test.fromhex(u'1a2B30'), b)
259 self.assertEqual(self.type2test.fromhex(u' 1A 2B 30 '), b)
260 self.assertEqual(self.type2test.fromhex(u'0000'), b'\0\0')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000261 self.assertRaises(ValueError, self.type2test.fromhex, u'a')
262 self.assertRaises(ValueError, self.type2test.fromhex, u'rt')
263 self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd')
264 self.assertRaises(ValueError, self.type2test.fromhex, u'\x00')
265 self.assertRaises(ValueError, self.type2test.fromhex, u'12 \x00 34')
266
267 def test_join(self):
268 self.assertEqual(self.type2test(b"").join([]), b"")
269 self.assertEqual(self.type2test(b"").join([b""]), b"")
270 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
271 lst = list(map(self.type2test, lst))
272 self.assertEqual(self.type2test(b"").join(lst), b"abc")
273 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
274 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
275 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
276 # XXX more...
277
Christian Heimes1a6387e2008-03-26 12:49:49 +0000278 def test_count(self):
279 b = self.type2test(b'mississippi')
280 self.assertEqual(b.count(b'i'), 4)
281 self.assertEqual(b.count(b'ss'), 2)
282 self.assertEqual(b.count(b'w'), 0)
283
284 def test_startswith(self):
285 b = self.type2test(b'hello')
286 self.assertFalse(self.type2test().startswith(b"anything"))
287 self.assertTrue(b.startswith(b"hello"))
288 self.assertTrue(b.startswith(b"hel"))
289 self.assertTrue(b.startswith(b"h"))
290 self.assertFalse(b.startswith(b"hellow"))
291 self.assertFalse(b.startswith(b"ha"))
292
293 def test_endswith(self):
294 b = self.type2test(b'hello')
295 self.assertFalse(bytearray().endswith(b"anything"))
296 self.assertTrue(b.endswith(b"hello"))
297 self.assertTrue(b.endswith(b"llo"))
298 self.assertTrue(b.endswith(b"o"))
299 self.assertFalse(b.endswith(b"whello"))
300 self.assertFalse(b.endswith(b"no"))
301
302 def test_find(self):
303 b = self.type2test(b'mississippi')
304 self.assertEqual(b.find(b'ss'), 2)
305 self.assertEqual(b.find(b'ss', 3), 5)
306 self.assertEqual(b.find(b'ss', 1, 7), 2)
307 self.assertEqual(b.find(b'ss', 1, 3), -1)
308 self.assertEqual(b.find(b'w'), -1)
309 self.assertEqual(b.find(b'mississippian'), -1)
310
311 def test_rfind(self):
312 b = self.type2test(b'mississippi')
313 self.assertEqual(b.rfind(b'ss'), 5)
314 self.assertEqual(b.rfind(b'ss', 3), 5)
315 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
316 self.assertEqual(b.rfind(b'w'), -1)
317 self.assertEqual(b.rfind(b'mississippian'), -1)
318
319 def test_index(self):
320 b = self.type2test(b'world')
321 self.assertEqual(b.index(b'w'), 0)
322 self.assertEqual(b.index(b'orl'), 1)
323 self.assertRaises(ValueError, b.index, b'worm')
324 self.assertRaises(ValueError, b.index, b'ldo')
325
326 def test_rindex(self):
327 # XXX could be more rigorous
328 b = self.type2test(b'world')
329 self.assertEqual(b.rindex(b'w'), 0)
330 self.assertEqual(b.rindex(b'orl'), 1)
331 self.assertRaises(ValueError, b.rindex, b'worm')
332 self.assertRaises(ValueError, b.rindex, b'ldo')
333
334 def test_replace(self):
335 b = self.type2test(b'mississippi')
336 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
337 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
338
Christian Heimes1a6387e2008-03-26 12:49:49 +0000339 def test_split_string_error(self):
340 self.assertRaises(TypeError, self.type2test(b'a b').split, u' ')
341
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000342 def test_split_unicodewhitespace(self):
Martin Panterf1669a32016-04-10 09:39:07 +0000343 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
344 b = self.type2test(b)
345 self.assertEqual(b.split(), [b])
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000346 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
347 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
348
Christian Heimes1a6387e2008-03-26 12:49:49 +0000349 def test_rsplit_string_error(self):
350 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ')
351
352 def test_rsplit_unicodewhitespace(self):
353 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000354 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
355
356 def test_partition(self):
357 b = self.type2test(b'mississippi')
358 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000359 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000360
361 def test_rpartition(self):
362 b = self.type2test(b'mississippi')
363 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
364 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000365 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000366
367 def test_pickling(self):
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +0000368 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000369 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
370 b = self.type2test(b)
371 ps = pickle.dumps(b, proto)
372 q = pickle.loads(ps)
373 self.assertEqual(b, q)
374
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000375 def test_strip_bytearray(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000376 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
377 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
378 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
379
380 def test_strip_string_error(self):
381 self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b')
382 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b')
383 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b')
384
385 def test_ord(self):
386 b = self.type2test(b'\0A\x7f\x80\xff')
387 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
388 [0, 65, 127, 128, 255])
389
Jesus Cea44e81682011-04-20 16:39:15 +0200390 def test_none_arguments(self):
391 # issue 11828
392 b = self.type2test(b'hello')
393 l = self.type2test(b'l')
394 h = self.type2test(b'h')
395 x = self.type2test(b'x')
396 o = self.type2test(b'o')
397
398 self.assertEqual(2, b.find(l, None))
399 self.assertEqual(3, b.find(l, -2, None))
400 self.assertEqual(2, b.find(l, None, -2))
401 self.assertEqual(0, b.find(h, None, None))
402
403 self.assertEqual(3, b.rfind(l, None))
404 self.assertEqual(3, b.rfind(l, -2, None))
405 self.assertEqual(2, b.rfind(l, None, -2))
406 self.assertEqual(0, b.rfind(h, None, None))
407
408 self.assertEqual(2, b.index(l, None))
409 self.assertEqual(3, b.index(l, -2, None))
410 self.assertEqual(2, b.index(l, None, -2))
411 self.assertEqual(0, b.index(h, None, None))
412
413 self.assertEqual(3, b.rindex(l, None))
414 self.assertEqual(3, b.rindex(l, -2, None))
415 self.assertEqual(2, b.rindex(l, None, -2))
416 self.assertEqual(0, b.rindex(h, None, None))
417
418 self.assertEqual(2, b.count(l, None))
419 self.assertEqual(1, b.count(l, -2, None))
420 self.assertEqual(1, b.count(l, None, -2))
421 self.assertEqual(0, b.count(x, None, None))
422
423 self.assertEqual(True, b.endswith(o, None))
424 self.assertEqual(True, b.endswith(o, -2, None))
425 self.assertEqual(True, b.endswith(l, None, -2))
426 self.assertEqual(False, b.endswith(x, None, None))
427
428 self.assertEqual(True, b.startswith(h, None))
429 self.assertEqual(True, b.startswith(l, -2, None))
430 self.assertEqual(True, b.startswith(h, None, -2))
431 self.assertEqual(False, b.startswith(x, None, None))
432
433 def test_find_etc_raise_correct_error_messages(self):
434 # issue 11828
435 b = self.type2test(b'hello')
436 x = self.type2test(b'x')
437 self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find,
438 x, None, None, None)
439 self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind,
440 x, None, None, None)
441 self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index,
442 x, None, None, None)
443 self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex,
444 x, None, None, None)
445 self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count,
446 x, None, None, None)
447 self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith,
448 x, None, None, None)
449 self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith,
450 x, None, None, None)
451
Serhiy Storchaka14a7d632016-03-30 20:43:06 +0300452 def test_free_after_iterating(self):
453 test.test_support.check_free_after_iterating(self, iter, self.type2test)
454 test.test_support.check_free_after_iterating(self, reversed, self.type2test)
455
Christian Heimes1a6387e2008-03-26 12:49:49 +0000456
457class ByteArrayTest(BaseBytesTest):
458 type2test = bytearray
459
460 def test_nohash(self):
461 self.assertRaises(TypeError, hash, bytearray())
462
463 def test_bytearray_api(self):
464 short_sample = b"Hello world\n"
465 sample = short_sample + b"\0"*(20 - len(short_sample))
466 tfn = tempfile.mktemp()
467 try:
468 # Prepare
469 with open(tfn, "wb") as f:
470 f.write(short_sample)
471 # Test readinto
472 with open(tfn, "rb") as f:
473 b = bytearray(20)
474 n = f.readinto(b)
475 self.assertEqual(n, len(short_sample))
476 # Python 2.x
477 b_sample = (ord(s) for s in sample)
478 self.assertEqual(list(b), list(b_sample))
479 # Test writing in binary mode
480 with open(tfn, "wb") as f:
481 f.write(b)
482 with open(tfn, "rb") as f:
483 self.assertEqual(f.read(), sample)
484 # Text mode is ambiguous; don't test
485 finally:
486 try:
487 os.remove(tfn)
488 except os.error:
489 pass
490
491 def test_reverse(self):
492 b = bytearray(b'hello')
493 self.assertEqual(b.reverse(), None)
494 self.assertEqual(b, b'olleh')
495 b = bytearray(b'hello1') # test even number of items
496 b.reverse()
497 self.assertEqual(b, b'1olleh')
498 b = bytearray()
499 b.reverse()
500 self.assertFalse(b)
501
502 def test_regexps(self):
503 def by(s):
504 return bytearray(map(ord, s))
505 b = by("Hello, world")
506 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
507
508 def test_setitem(self):
509 b = bytearray([1, 2, 3])
510 b[1] = 100
511 self.assertEqual(b, bytearray([1, 100, 3]))
512 b[-1] = 200
513 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl3e483f62008-07-16 22:57:41 +0000514 b[0] = Indexable(10)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000515 self.assertEqual(b, bytearray([10, 100, 200]))
516 try:
517 b[3] = 0
518 self.fail("Didn't raise IndexError")
519 except IndexError:
520 pass
521 try:
522 b[-10] = 0
523 self.fail("Didn't raise IndexError")
524 except IndexError:
525 pass
526 try:
527 b[0] = 256
528 self.fail("Didn't raise ValueError")
529 except ValueError:
530 pass
531 try:
Georg Brandl3e483f62008-07-16 22:57:41 +0000532 b[0] = Indexable(-1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000533 self.fail("Didn't raise ValueError")
534 except ValueError:
535 pass
536 try:
537 b[0] = None
538 self.fail("Didn't raise TypeError")
539 except TypeError:
540 pass
541
542 def test_delitem(self):
543 b = bytearray(range(10))
544 del b[0]
545 self.assertEqual(b, bytearray(range(1, 10)))
546 del b[-1]
547 self.assertEqual(b, bytearray(range(1, 9)))
548 del b[4]
549 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
550
551 def test_setslice(self):
552 b = bytearray(range(10))
553 self.assertEqual(list(b), list(range(10)))
554
555 b[0:5] = bytearray([1, 1, 1, 1, 1])
556 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
557
558 del b[0:-5]
559 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
560
561 b[0:0] = bytearray([0, 1, 2, 3, 4])
562 self.assertEqual(b, bytearray(range(10)))
563
564 b[-7:-3] = bytearray([100, 101])
565 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
566
567 b[3:5] = [3, 4, 5, 6]
568 self.assertEqual(b, bytearray(range(10)))
569
570 b[3:0] = [42, 42, 42]
571 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
572
Ezio Melotti67dc4a82012-11-03 21:10:45 +0200573 b[3:] = b'foo'
574 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
575
576 b[:3] = memoryview(b'foo')
577 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
578
579 b[3:4] = []
580 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
581
582 b[1:] = list(b'uuuu') # this works only on Python2
583 self.assertEqual(b, bytearray([102, 117, 117, 117, 117]))
584
585 for elem in [5, -5, 0, long(10e20), u'str', 2.3, [u'a', u'b'], [[]]]:
586 with self.assertRaises(TypeError):
587 b[3:4] = elem
588
589 for elem in [[254, 255, 256], [-256, 9000]]:
590 with self.assertRaises(ValueError):
591 b[3:4] = elem
592
Christian Heimes1a6387e2008-03-26 12:49:49 +0000593 def test_extended_set_del_slice(self):
Mark Dickinson36ecd672010-01-29 17:11:39 +0000594 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000595 for start in indices:
596 for stop in indices:
597 # Skip invalid step 0
598 for step in indices[1:]:
599 L = list(range(255))
600 b = bytearray(L)
601 # Make sure we have a slice of exactly the right length,
602 # but with different data.
603 data = L[start:stop:step]
604 data.reverse()
605 L[start:stop:step] = data
606 b[start:stop:step] = data
Ezio Melotti2623a372010-11-21 13:34:58 +0000607 self.assertEqual(b, bytearray(L))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000608
609 del L[start:stop:step]
610 del b[start:stop:step]
Ezio Melotti2623a372010-11-21 13:34:58 +0000611 self.assertEqual(b, bytearray(L))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000612
613 def test_setslice_trap(self):
614 # This test verifies that we correctly handle assigning self
615 # to a slice of self (the old Lambert Meertens trap).
616 b = bytearray(range(256))
617 b[8:] = b
618 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
619
620 def test_iconcat(self):
621 b = bytearray(b"abc")
622 b1 = b
623 b += b"def"
624 self.assertEqual(b, b"abcdef")
625 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000626 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000627 b += b"xyz"
628 self.assertEqual(b, b"abcdefxyz")
629 try:
630 b += u""
631 except TypeError:
632 pass
633 else:
634 self.fail("bytes += unicode didn't raise TypeError")
635
636 def test_irepeat(self):
637 b = bytearray(b"abc")
638 b1 = b
639 b *= 3
640 self.assertEqual(b, b"abcabcabc")
641 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000642 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000643
644 def test_irepeat_1char(self):
645 b = bytearray(b"x")
646 b1 = b
647 b *= 100
648 self.assertEqual(b, b"x"*100)
649 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000650 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000651
652 def test_alloc(self):
653 b = bytearray()
654 alloc = b.__alloc__()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000655 self.assertTrue(alloc >= 0)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000656 seq = [alloc]
657 for i in range(100):
658 b += b"x"
659 alloc = b.__alloc__()
Serhiy Storchakaab766352015-06-29 21:13:54 +0300660 self.assertGreater(alloc, len(b)) # including trailing null byte
Christian Heimes1a6387e2008-03-26 12:49:49 +0000661 if alloc not in seq:
662 seq.append(alloc)
663
Serhiy Storchakaab766352015-06-29 21:13:54 +0300664 def test_init_alloc(self):
665 b = bytearray()
666 def g():
667 for i in range(1, 100):
668 yield i
669 a = list(b)
670 self.assertEqual(a, list(range(1, len(a)+1)))
671 self.assertEqual(len(b), len(a))
672 self.assertLessEqual(len(b), i)
673 alloc = b.__alloc__()
674 self.assertGreater(alloc, len(b)) # including trailing null byte
675 b.__init__(g())
676 self.assertEqual(list(b), list(range(1, 100)))
677 self.assertEqual(len(b), 99)
678 alloc = b.__alloc__()
679 self.assertGreater(alloc, len(b))
680
Christian Heimes1a6387e2008-03-26 12:49:49 +0000681 def test_extend(self):
682 orig = b'hello'
683 a = bytearray(orig)
684 a.extend(a)
685 self.assertEqual(a, orig + orig)
686 self.assertEqual(a[5:], orig)
687 a = bytearray(b'')
688 # Test iterators that don't have a __length_hint__
689 a.extend(map(ord, orig * 25))
690 a.extend(ord(x) for x in orig * 25)
691 self.assertEqual(a, orig * 50)
692 self.assertEqual(a[-5:], orig)
693 a = bytearray(b'')
694 a.extend(iter(map(ord, orig * 50)))
695 self.assertEqual(a, orig * 50)
696 self.assertEqual(a[-5:], orig)
697 a = bytearray(b'')
698 a.extend(list(map(ord, orig * 50)))
699 self.assertEqual(a, orig * 50)
700 self.assertEqual(a[-5:], orig)
701 a = bytearray(b'')
702 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
703 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
704 self.assertEqual(len(a), 0)
Georg Brandl3e483f62008-07-16 22:57:41 +0000705 a = bytearray(b'')
706 a.extend([Indexable(ord('a'))])
707 self.assertEqual(a, b'a')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000708
709 def test_remove(self):
710 b = bytearray(b'hello')
711 b.remove(ord('l'))
712 self.assertEqual(b, b'helo')
713 b.remove(ord('l'))
714 self.assertEqual(b, b'heo')
715 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
716 self.assertRaises(ValueError, lambda: b.remove(400))
717 self.assertRaises(TypeError, lambda: b.remove(u'e'))
718 # remove first and last
719 b.remove(ord('o'))
720 b.remove(ord('h'))
721 self.assertEqual(b, b'e')
722 self.assertRaises(TypeError, lambda: b.remove(u'e'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000723 b.remove(Indexable(ord('e')))
724 self.assertEqual(b, b'')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000725
Serhiy Storchakac742dff2016-05-16 22:15:57 +0300726 # test values outside of the ascii range: (0, 127)
727 c = bytearray([126, 127, 128, 129])
728 c.remove(127)
729 self.assertEqual(c, bytearray([126, 128, 129]))
730 c.remove(129)
731 self.assertEqual(c, bytearray([126, 128]))
732
Christian Heimes1a6387e2008-03-26 12:49:49 +0000733 def test_pop(self):
734 b = bytearray(b'world')
735 self.assertEqual(b.pop(), ord('d'))
736 self.assertEqual(b.pop(0), ord('w'))
737 self.assertEqual(b.pop(-2), ord('r'))
738 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky680e6eb2011-03-04 06:14:56 +0000739 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinsonc8a7c7c2009-09-06 10:03:31 +0000740 # test for issue #6846
741 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000742
743 def test_nosort(self):
744 self.assertRaises(AttributeError, lambda: bytearray().sort())
745
746 def test_append(self):
747 b = bytearray(b'hell')
748 b.append(ord('o'))
749 self.assertEqual(b, b'hello')
750 self.assertEqual(b.append(100), None)
751 b = bytearray()
752 b.append(ord('A'))
753 self.assertEqual(len(b), 1)
754 self.assertRaises(TypeError, lambda: b.append(u'o'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000755 b = bytearray()
756 b.append(Indexable(ord('A')))
757 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000758
759 def test_insert(self):
760 b = bytearray(b'msssspp')
761 b.insert(1, ord('i'))
762 b.insert(4, ord('i'))
763 b.insert(-2, ord('i'))
764 b.insert(1000, ord('i'))
765 self.assertEqual(b, b'mississippi')
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000766 # allowed in 2.x
Georg Brandl3e483f62008-07-16 22:57:41 +0000767 #self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
768 b = bytearray()
769 b.insert(0, Indexable(ord('A')))
770 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000771
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000772 def test_copied(self):
773 # Issue 4348. Make sure that operations that don't mutate the array
774 # copy the bytes.
775 b = bytearray(b'abc')
Benjamin Petersond3b5a792008-11-20 21:44:23 +0000776 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000777
778 t = bytearray([i for i in range(256)])
779 x = bytearray(b'')
780 self.assertFalse(x is x.translate(t))
781
Christian Heimes1a6387e2008-03-26 12:49:49 +0000782 def test_partition_bytearray_doesnt_share_nullstring(self):
783 a, b, c = bytearray(b"x").partition(b"y")
784 self.assertEqual(b, b"")
785 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000786 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000787 b += b"!"
788 self.assertEqual(c, b"")
789 a, b, c = bytearray(b"x").partition(b"y")
790 self.assertEqual(b, b"")
791 self.assertEqual(c, b"")
792 # Same for rpartition
793 b, c, a = bytearray(b"x").rpartition(b"y")
794 self.assertEqual(b, b"")
795 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000796 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000797 b += b"!"
798 self.assertEqual(c, b"")
799 c, b, a = bytearray(b"x").rpartition(b"y")
800 self.assertEqual(b, b"")
801 self.assertEqual(c, b"")
802
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000803 def test_resize_forbidden(self):
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000804 # #4509: can't resize a bytearray when there are buffer exports, even
805 # if it wouldn't reallocate the underlying buffer.
806 # Furthermore, no destructive changes to the buffer may be applied
807 # before raising the error.
808 b = bytearray(range(10))
809 v = memoryview(b)
810 def resize(n):
811 b[1:-1] = range(n + 1, 2*n - 1)
812 resize(10)
813 orig = b[:]
814 self.assertRaises(BufferError, resize, 11)
Ezio Melotti2623a372010-11-21 13:34:58 +0000815 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000816 self.assertRaises(BufferError, resize, 9)
Ezio Melotti2623a372010-11-21 13:34:58 +0000817 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000818 self.assertRaises(BufferError, resize, 0)
Ezio Melotti2623a372010-11-21 13:34:58 +0000819 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000820 # Other operations implying resize
821 self.assertRaises(BufferError, b.pop, 0)
Ezio Melotti2623a372010-11-21 13:34:58 +0000822 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000823 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melotti2623a372010-11-21 13:34:58 +0000824 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000825 def delitem():
826 del b[1]
827 self.assertRaises(BufferError, delitem)
Ezio Melotti2623a372010-11-21 13:34:58 +0000828 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000829 # deleting a non-contiguous slice
830 def delslice():
831 b[1:-1:2] = b""
832 self.assertRaises(BufferError, delslice)
Ezio Melotti2623a372010-11-21 13:34:58 +0000833 self.assertEqual(b, orig)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000834
Antoine Pitroue80a6a42010-01-17 12:26:20 +0000835 def test_empty_bytearray(self):
836 # Issue #7561: operations on empty bytearrays could crash in many
837 # situations, due to a fragile implementation of the
838 # PyByteArray_AS_STRING() C macro.
839 self.assertRaises(ValueError, int, bytearray(b''))
840
Serhiy Storchaka0ed38912016-03-30 21:02:00 +0300841 def test_exhausted_iterator(self):
842 a = self.type2test([1, 2, 3])
843 exhit = iter(a)
844 empit = iter(a)
845 for x in exhit: # exhaust the iterator
846 next(empit) # not exhausted
847 a.append(9)
848 self.assertEqual(list(exhit), [])
849 self.assertEqual(list(empit), [9])
850 self.assertEqual(a, self.type2test([1, 2, 3, 9]))
Antoine Pitroue80a6a42010-01-17 12:26:20 +0000851
Christian Heimes1a6387e2008-03-26 12:49:49 +0000852class AssortedBytesTest(unittest.TestCase):
853 #
854 # Test various combinations of bytes and bytearray
855 #
856
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000857 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000858 def test_repr_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000859 for f in str, repr:
860 self.assertEqual(f(bytearray()), "bytearray(b'')")
861 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
862 self.assertEqual(f(bytearray([0, 1, 254, 255])),
863 "bytearray(b'\\x00\\x01\\xfe\\xff')")
864 self.assertEqual(f(b"abc"), "b'abc'")
865 self.assertEqual(f(b"'"), '''b"'"''') # '''
866 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
867
868 def test_compare_bytes_to_bytearray(self):
869 self.assertEqual(b"abc" == bytes(b"abc"), True)
870 self.assertEqual(b"ab" != bytes(b"abc"), True)
871 self.assertEqual(b"ab" <= bytes(b"abc"), True)
872 self.assertEqual(b"ab" < bytes(b"abc"), True)
873 self.assertEqual(b"abc" >= bytes(b"ab"), True)
874 self.assertEqual(b"abc" > bytes(b"ab"), True)
875
876 self.assertEqual(b"abc" != bytes(b"abc"), False)
877 self.assertEqual(b"ab" == bytes(b"abc"), False)
878 self.assertEqual(b"ab" > bytes(b"abc"), False)
879 self.assertEqual(b"ab" >= bytes(b"abc"), False)
880 self.assertEqual(b"abc" < bytes(b"ab"), False)
881 self.assertEqual(b"abc" <= bytes(b"ab"), False)
882
883 self.assertEqual(bytes(b"abc") == b"abc", True)
884 self.assertEqual(bytes(b"ab") != b"abc", True)
885 self.assertEqual(bytes(b"ab") <= b"abc", True)
886 self.assertEqual(bytes(b"ab") < b"abc", True)
887 self.assertEqual(bytes(b"abc") >= b"ab", True)
888 self.assertEqual(bytes(b"abc") > b"ab", True)
889
890 self.assertEqual(bytes(b"abc") != b"abc", False)
891 self.assertEqual(bytes(b"ab") == b"abc", False)
892 self.assertEqual(bytes(b"ab") > b"abc", False)
893 self.assertEqual(bytes(b"ab") >= b"abc", False)
894 self.assertEqual(bytes(b"abc") < b"ab", False)
895 self.assertEqual(bytes(b"abc") <= b"ab", False)
896
Stefan Krah4216aa12013-01-26 13:31:44 +0100897 @test.test_support.requires_docstrings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000898 def test_doc(self):
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000899 self.assertIsNotNone(bytearray.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000900 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000901 self.assertIsNotNone(bytes.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000902 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000903
904 def test_from_bytearray(self):
905 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
906 buf = memoryview(sample)
907 b = bytearray(buf)
908 self.assertEqual(b, bytearray(sample))
909
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000910 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000911 def test_to_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000912 self.assertEqual(str(b''), "b''")
913 self.assertEqual(str(b'x'), "b'x'")
914 self.assertEqual(str(b'\x80'), "b'\\x80'")
915 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
916 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
917 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
918
919 def test_literal(self):
920 tests = [
921 (b"Wonderful spam", "Wonderful spam"),
922 (br"Wonderful spam too", "Wonderful spam too"),
923 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
924 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
925 ]
926 for b, s in tests:
927 self.assertEqual(b, bytearray(s, 'latin-1'))
928 for c in range(128, 256):
929 self.assertRaises(SyntaxError, eval,
930 'b"%s"' % chr(c))
931
932 def test_translate(self):
933 b = b'hello'
Georg Brandl6425a2f2008-12-28 11:54:53 +0000934 ba = bytearray(b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000935 rosetta = bytearray(range(0, 256))
936 rosetta[ord('o')] = ord('e')
937 c = b.translate(rosetta, b'l')
938 self.assertEqual(b, b'hello')
939 self.assertEqual(c, b'hee')
Georg Brandl6425a2f2008-12-28 11:54:53 +0000940 c = ba.translate(rosetta, b'l')
941 self.assertEqual(ba, b'hello')
942 self.assertEqual(c, b'hee')
943 c = b.translate(None, b'e')
944 self.assertEqual(c, b'hllo')
945 c = ba.translate(None, b'e')
946 self.assertEqual(c, b'hllo')
947 self.assertRaises(TypeError, b.translate, None, None)
948 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000949
950 def test_split_bytearray(self):
951 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
952
953 def test_rsplit_bytearray(self):
954 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
955
956 # Optimizations:
957 # __iter__? (optimization)
958 # __reversed__? (optimization)
959
960 # XXX More string methods? (Those that don't use character properties)
961
962 # There are tests in string_tests.py that are more
Martin Panterf1669a32016-04-10 09:39:07 +0000963 # comprehensive for things like partition, etc.
Christian Heimes1a6387e2008-03-26 12:49:49 +0000964 # Unfortunately they are all bundled with tests that
965 # are not appropriate for bytes
966
967 # I've started porting some of those into bytearray_tests.py, we should port
968 # the rest that make sense (the code can be cleaned up to use modern
969 # unittest methods at the same time).
970
Martin Panter86e0d572016-04-06 06:37:17 +0000971class BytearrayPEP3137Test(unittest.TestCase):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000972 def marshal(self, x):
973 return bytearray(x)
974
975 def test_returns_new_copy(self):
976 val = self.marshal(b'1234')
977 # On immutable types these MAY return a reference to themselves
978 # but on mutable types like bytearray they MUST return a new copy.
979 for methname in ('zfill', 'rjust', 'ljust', 'center'):
980 method = getattr(val, methname)
981 newval = method(3)
982 self.assertEqual(val, newval)
983 self.assertTrue(val is not newval,
984 methname+' returned self on a mutable object')
Antoine Pitrou5f76d132010-01-13 15:02:13 +0000985 for expr in ('val.split()[0]', 'val.rsplit()[0]',
986 'val.partition(".")[0]', 'val.rpartition(".")[2]',
987 'val.splitlines()[0]', 'val.replace("", "")'):
988 newval = eval(expr)
989 self.assertEqual(val, newval)
990 self.assertTrue(val is not newval,
991 expr+' returned val on a mutable object')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000992
Christian Heimes1a6387e2008-03-26 12:49:49 +0000993
Martin Panter86e0d572016-04-06 06:37:17 +0000994class ByteArrayAsStringTest(test.string_tests.CommonTest,
995 test.string_tests.NonStringModuleTest):
996 type2test = bytearray
Christian Heimes1a6387e2008-03-26 12:49:49 +0000997
998 # Currently the bytes containment testing uses a single integer
999 # value. This may not be the final design, but until then the
1000 # bytes section with in a bytes containment not valid
1001 def test_contains(self):
1002 pass
1003 def test_expandtabs(self):
1004 pass
1005 def test_upper(self):
1006 pass
1007 def test_lower(self):
1008 pass
1009 def test_hash(self):
1010 # XXX check this out
1011 pass
1012
1013
Christian Heimes1a6387e2008-03-26 12:49:49 +00001014class ByteArraySubclass(bytearray):
1015 pass
1016
1017class ByteArraySubclassTest(unittest.TestCase):
1018
1019 def test_basic(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001020 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001021 self.assertIsInstance(ByteArraySubclass(), bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001022
1023 a, b = b"abcd", b"efgh"
1024 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
1025
1026 # test comparison operators with subclass instances
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001027 self.assertTrue(_a == _a)
1028 self.assertTrue(_a != _b)
1029 self.assertTrue(_a < _b)
1030 self.assertTrue(_a <= _b)
1031 self.assertTrue(_b >= _a)
1032 self.assertTrue(_b > _a)
1033 self.assertTrue(_a is not a)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001034
1035 # test concat of subclass instances
1036 self.assertEqual(a + b, _a + _b)
1037 self.assertEqual(a + b, a + _b)
1038 self.assertEqual(a + b, _a + b)
1039
1040 # test repeat
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001041 self.assertTrue(a*5 == _a*5)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001042
1043 def test_join(self):
1044 # Make sure join returns a NEW object for single item sequences
1045 # involving a subclass.
1046 # Make sure that it is of the appropriate type.
1047 s1 = ByteArraySubclass(b"abcd")
1048 s2 = bytearray().join([s1])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001049 self.assertTrue(s1 is not s2)
1050 self.assertTrue(type(s2) is bytearray, type(s2))
Christian Heimes1a6387e2008-03-26 12:49:49 +00001051
1052 # Test reverse, calling join on subclass
1053 s3 = s1.join([b"abcd"])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001054 self.assertTrue(type(s3) is bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001055
1056 def test_pickle(self):
1057 a = ByteArraySubclass(b"abcd")
1058 a.x = 10
1059 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +00001060 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +00001061 b = pickle.loads(pickle.dumps(a, proto))
1062 self.assertNotEqual(id(a), id(b))
1063 self.assertEqual(a, b)
1064 self.assertEqual(a.x, b.x)
1065 self.assertEqual(a.y, b.y)
1066 self.assertEqual(type(a), type(b))
1067 self.assertEqual(type(a.y), type(b.y))
1068
1069 def test_copy(self):
1070 a = ByteArraySubclass(b"abcd")
1071 a.x = 10
1072 a.y = ByteArraySubclass(b"efgh")
1073 for copy_method in (copy.copy, copy.deepcopy):
1074 b = copy_method(a)
1075 self.assertNotEqual(id(a), id(b))
1076 self.assertEqual(a, b)
1077 self.assertEqual(a.x, b.x)
1078 self.assertEqual(a.y, b.y)
1079 self.assertEqual(type(a), type(b))
1080 self.assertEqual(type(a.y), type(b.y))
1081
1082 def test_init_override(self):
1083 class subclass(bytearray):
1084 def __init__(self, newarg=1, *args, **kwargs):
1085 bytearray.__init__(self, *args, **kwargs)
1086 x = subclass(4, source=b"abcd")
1087 self.assertEqual(x, b"abcd")
1088 x = subclass(newarg=4, source=b"abcd")
1089 self.assertEqual(x, b"abcd")
1090
1091def test_main():
1092 #test.test_support.run_unittest(BytesTest)
1093 #test.test_support.run_unittest(AssortedBytesTest)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001094 test.test_support.run_unittest(
1095 ByteArrayTest,
1096 ByteArrayAsStringTest,
1097 ByteArraySubclassTest,
1098 BytearrayPEP3137Test)
1099
1100if __name__ == "__main__":
1101 test_main()