blob: 3f8402c760acd1d2a5f37002261396f40f3f45d0 [file] [log] [blame]
Christian Heimes1a6387e2008-03-26 12:49:49 +00001"""Unit tests for the bytes and bytearray types.
2
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"""
7
8import os
9import re
10import sys
11import copy
12import pickle
13import tempfile
14import unittest
15import warnings
16import test.test_support
17import test.string_tests
18import test.buffer_tests
19
Georg Brandl3e483f62008-07-16 22:57:41 +000020class Indexable:
21 def __init__(self, value=0):
22 self.value = value
23 def __index__(self):
24 return self.value
25
Christian Heimes1a6387e2008-03-26 12:49:49 +000026
27class BaseBytesTest(unittest.TestCase):
28
29 def setUp(self):
30 self.warning_filters = warnings.filters[:]
31
32 def tearDown(self):
33 warnings.filters = self.warning_filters
34
35 def test_basics(self):
36 b = self.type2test()
37 self.assertEqual(type(b), self.type2test)
38 self.assertEqual(b.__class__, self.type2test)
39
40 def test_empty_sequence(self):
41 b = self.type2test()
42 self.assertEqual(len(b), 0)
43 self.assertRaises(IndexError, lambda: b[0])
44 self.assertRaises(IndexError, lambda: b[1])
45 self.assertRaises(IndexError, lambda: b[sys.maxint])
46 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
47 self.assertRaises(IndexError, lambda: b[10**100])
48 self.assertRaises(IndexError, lambda: b[-1])
49 self.assertRaises(IndexError, lambda: b[-2])
50 self.assertRaises(IndexError, lambda: b[-sys.maxint])
51 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
52 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
53 self.assertRaises(IndexError, lambda: b[-10**100])
54
55 def test_from_list(self):
56 ints = list(range(256))
57 b = self.type2test(i for i in ints)
58 self.assertEqual(len(b), 256)
59 self.assertEqual(list(b), ints)
60
61 def test_from_index(self):
Georg Brandl3e483f62008-07-16 22:57:41 +000062 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
63 Indexable(255)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000064 self.assertEqual(list(b), [0, 1, 254, 255])
Georg Brandl3e483f62008-07-16 22:57:41 +000065 self.assertRaises(ValueError, bytearray, [Indexable(-1)])
66 self.assertRaises(ValueError, bytearray, [Indexable(256)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000067
68 def test_from_ssize(self):
69 self.assertEqual(bytearray(0), b'')
70 self.assertEqual(bytearray(1), b'\x00')
71 self.assertEqual(bytearray(5), b'\x00\x00\x00\x00\x00')
72 self.assertRaises(ValueError, bytearray, -1)
73
74 self.assertEqual(bytearray('0', 'ascii'), b'0')
75 self.assertEqual(bytearray(b'0'), b'0')
76
77 def test_constructor_type_errors(self):
78 self.assertRaises(TypeError, self.type2test, 0.0)
79 class C:
80 pass
Antoine Pitrouefa45f32010-01-12 22:02:10 +000081 # allowed in 2.x
Georg Brandl0a34baf2008-07-16 23:18:51 +000082 #self.assertRaises(TypeError, self.type2test, ["0"])
Christian Heimes1a6387e2008-03-26 12:49:49 +000083 self.assertRaises(TypeError, self.type2test, [0.0])
84 self.assertRaises(TypeError, self.type2test, [None])
85 self.assertRaises(TypeError, self.type2test, [C()])
86
87 def test_constructor_value_errors(self):
88 self.assertRaises(ValueError, self.type2test, [-1])
89 self.assertRaises(ValueError, self.type2test, [-sys.maxint])
90 self.assertRaises(ValueError, self.type2test, [-sys.maxint-1])
91 self.assertRaises(ValueError, self.type2test, [-sys.maxint-2])
92 self.assertRaises(ValueError, self.type2test, [-10**100])
93 self.assertRaises(ValueError, self.type2test, [256])
94 self.assertRaises(ValueError, self.type2test, [257])
95 self.assertRaises(ValueError, self.type2test, [sys.maxint])
96 self.assertRaises(ValueError, self.type2test, [sys.maxint+1])
97 self.assertRaises(ValueError, self.type2test, [10**100])
98
99 def test_compare(self):
100 b1 = self.type2test([1, 2, 3])
101 b2 = self.type2test([1, 2, 3])
102 b3 = self.type2test([1, 3])
103
104 self.assertEqual(b1, b2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000105 self.assertTrue(b2 != b3)
106 self.assertTrue(b1 <= b2)
107 self.assertTrue(b1 <= b3)
108 self.assertTrue(b1 < b3)
109 self.assertTrue(b1 >= b2)
110 self.assertTrue(b3 >= b2)
111 self.assertTrue(b3 > b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000112
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000113 self.assertFalse(b1 != b2)
114 self.assertFalse(b2 == b3)
115 self.assertFalse(b1 > b2)
116 self.assertFalse(b1 > b3)
117 self.assertFalse(b1 >= b3)
118 self.assertFalse(b1 < b2)
119 self.assertFalse(b3 < b2)
120 self.assertFalse(b3 <= b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000121
122 def test_compare_to_str(self):
123 warnings.simplefilter('ignore', BytesWarning)
124 # Byte comparisons with unicode should always fail!
125 # Test this for all expected byte orders and Unicode character sizes
126 self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False)
127 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False)
128 self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False)
129 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False)
130 self.assertEqual(self.type2test() == unicode(), False)
131 self.assertEqual(self.type2test() != unicode(), True)
132
133 def test_reversed(self):
134 input = list(map(ord, "Hello"))
135 b = self.type2test(input)
136 output = list(reversed(b))
137 input.reverse()
138 self.assertEqual(output, input)
139
140 def test_getslice(self):
141 def by(s):
142 return self.type2test(map(ord, s))
143 b = by("Hello, world")
144
145 self.assertEqual(b[:5], by("Hello"))
146 self.assertEqual(b[1:5], by("ello"))
147 self.assertEqual(b[5:7], by(", "))
148 self.assertEqual(b[7:], by("world"))
149 self.assertEqual(b[7:12], by("world"))
150 self.assertEqual(b[7:100], by("world"))
151
152 self.assertEqual(b[:-7], by("Hello"))
153 self.assertEqual(b[-11:-7], by("ello"))
154 self.assertEqual(b[-7:-5], by(", "))
155 self.assertEqual(b[-5:], by("world"))
156 self.assertEqual(b[-5:12], by("world"))
157 self.assertEqual(b[-5:100], by("world"))
158 self.assertEqual(b[-100:5], by("Hello"))
159
160 def test_extended_getslice(self):
161 # Test extended slicing by comparing with list slicing.
162 L = list(range(255))
163 b = self.type2test(L)
164 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
165 for start in indices:
166 for stop in indices:
167 # Skip step 0 (invalid)
168 for step in indices[1:]:
169 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
170
171 def test_encoding(self):
172 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
173 for enc in ("utf8", "utf16"):
174 b = self.type2test(sample, enc)
175 self.assertEqual(b, self.type2test(sample.encode(enc)))
176 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
177 b = self.type2test(sample, "latin1", "ignore")
178 self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
179
180 def test_decode(self):
181 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
182 for enc in ("utf8", "utf16"):
183 b = self.type2test(sample, enc)
184 self.assertEqual(b.decode(enc), sample)
185 sample = u"Hello world\n\x80\x81\xfe\xff"
186 b = self.type2test(sample, "latin1")
187 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
188 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
Benjamin Petersondc782b52009-09-18 21:46:21 +0000189 self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
190 "Hello world\n")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000191
192 def test_from_int(self):
193 b = self.type2test(0)
194 self.assertEqual(b, self.type2test())
195 b = self.type2test(10)
196 self.assertEqual(b, self.type2test([0]*10))
197 b = self.type2test(10000)
198 self.assertEqual(b, self.type2test([0]*10000))
199
200 def test_concat(self):
201 b1 = self.type2test(b"abc")
202 b2 = self.type2test(b"def")
203 self.assertEqual(b1 + b2, b"abcdef")
204 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
205 self.assertEqual(bytes(b"def") + b1, b"defabc")
206 self.assertRaises(TypeError, lambda: b1 + u"def")
207 self.assertRaises(TypeError, lambda: u"abc" + b2)
208
209 def test_repeat(self):
210 for b in b"abc", self.type2test(b"abc"):
211 self.assertEqual(b * 3, b"abcabcabc")
212 self.assertEqual(b * 0, b"")
213 self.assertEqual(b * -1, b"")
214 self.assertRaises(TypeError, lambda: b * 3.14)
215 self.assertRaises(TypeError, lambda: 3.14 * b)
216 # XXX Shouldn't bytes and bytearray agree on what to raise?
217 self.assertRaises((OverflowError, MemoryError),
Mark Hammond69ed5242008-08-23 00:59:14 +0000218 lambda: b * sys.maxsize)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000219
220 def test_repeat_1char(self):
221 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
222
223 def test_contains(self):
224 b = self.type2test(b"abc")
Ezio Melottiaa980582010-01-23 23:04:36 +0000225 self.assertIn(ord('a'), b)
226 self.assertIn(int(ord('a')), b)
227 self.assertNotIn(200, b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000228 self.assertRaises(ValueError, lambda: 300 in b)
229 self.assertRaises(ValueError, lambda: -1 in b)
230 self.assertRaises(TypeError, lambda: None in b)
231 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
232 self.assertRaises(TypeError, lambda: u"a" in b)
233 for f in bytes, bytearray:
Ezio Melottiaa980582010-01-23 23:04:36 +0000234 self.assertIn(f(b""), b)
235 self.assertIn(f(b"a"), b)
236 self.assertIn(f(b"b"), b)
237 self.assertIn(f(b"c"), b)
238 self.assertIn(f(b"ab"), b)
239 self.assertIn(f(b"bc"), b)
240 self.assertIn(f(b"abc"), b)
241 self.assertNotIn(f(b"ac"), b)
242 self.assertNotIn(f(b"d"), b)
243 self.assertNotIn(f(b"dab"), b)
244 self.assertNotIn(f(b"abd"), b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000245
246 def test_fromhex(self):
247 self.assertRaises(TypeError, self.type2test.fromhex)
248 self.assertRaises(TypeError, self.type2test.fromhex, 1)
249 self.assertEquals(self.type2test.fromhex(u''), self.type2test())
250 b = bytearray([0x1a, 0x2b, 0x30])
251 self.assertEquals(self.type2test.fromhex(u'1a2B30'), b)
252 self.assertEquals(self.type2test.fromhex(u' 1A 2B 30 '), b)
253 self.assertEquals(self.type2test.fromhex(u'0000'), b'\0\0')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000254 self.assertRaises(ValueError, self.type2test.fromhex, u'a')
255 self.assertRaises(ValueError, self.type2test.fromhex, u'rt')
256 self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd')
257 self.assertRaises(ValueError, self.type2test.fromhex, u'\x00')
258 self.assertRaises(ValueError, self.type2test.fromhex, u'12 \x00 34')
259
260 def test_join(self):
261 self.assertEqual(self.type2test(b"").join([]), b"")
262 self.assertEqual(self.type2test(b"").join([b""]), b"")
263 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
264 lst = list(map(self.type2test, lst))
265 self.assertEqual(self.type2test(b"").join(lst), b"abc")
266 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
267 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
268 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
269 # XXX more...
270
Christian Heimes1a6387e2008-03-26 12:49:49 +0000271 def test_count(self):
272 b = self.type2test(b'mississippi')
273 self.assertEqual(b.count(b'i'), 4)
274 self.assertEqual(b.count(b'ss'), 2)
275 self.assertEqual(b.count(b'w'), 0)
276
277 def test_startswith(self):
278 b = self.type2test(b'hello')
279 self.assertFalse(self.type2test().startswith(b"anything"))
280 self.assertTrue(b.startswith(b"hello"))
281 self.assertTrue(b.startswith(b"hel"))
282 self.assertTrue(b.startswith(b"h"))
283 self.assertFalse(b.startswith(b"hellow"))
284 self.assertFalse(b.startswith(b"ha"))
285
286 def test_endswith(self):
287 b = self.type2test(b'hello')
288 self.assertFalse(bytearray().endswith(b"anything"))
289 self.assertTrue(b.endswith(b"hello"))
290 self.assertTrue(b.endswith(b"llo"))
291 self.assertTrue(b.endswith(b"o"))
292 self.assertFalse(b.endswith(b"whello"))
293 self.assertFalse(b.endswith(b"no"))
294
295 def test_find(self):
296 b = self.type2test(b'mississippi')
297 self.assertEqual(b.find(b'ss'), 2)
298 self.assertEqual(b.find(b'ss', 3), 5)
299 self.assertEqual(b.find(b'ss', 1, 7), 2)
300 self.assertEqual(b.find(b'ss', 1, 3), -1)
301 self.assertEqual(b.find(b'w'), -1)
302 self.assertEqual(b.find(b'mississippian'), -1)
303
304 def test_rfind(self):
305 b = self.type2test(b'mississippi')
306 self.assertEqual(b.rfind(b'ss'), 5)
307 self.assertEqual(b.rfind(b'ss', 3), 5)
308 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
309 self.assertEqual(b.rfind(b'w'), -1)
310 self.assertEqual(b.rfind(b'mississippian'), -1)
311
312 def test_index(self):
313 b = self.type2test(b'world')
314 self.assertEqual(b.index(b'w'), 0)
315 self.assertEqual(b.index(b'orl'), 1)
316 self.assertRaises(ValueError, b.index, b'worm')
317 self.assertRaises(ValueError, b.index, b'ldo')
318
319 def test_rindex(self):
320 # XXX could be more rigorous
321 b = self.type2test(b'world')
322 self.assertEqual(b.rindex(b'w'), 0)
323 self.assertEqual(b.rindex(b'orl'), 1)
324 self.assertRaises(ValueError, b.rindex, b'worm')
325 self.assertRaises(ValueError, b.rindex, b'ldo')
326
327 def test_replace(self):
328 b = self.type2test(b'mississippi')
329 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
330 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
331
332 def test_split(self):
333 b = self.type2test(b'mississippi')
334 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
335 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
336 self.assertEqual(b.split(b'w'), [b])
337
338 def test_split_whitespace(self):
339 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
340 b'arf\fbarf', b'arf\vbarf'):
341 b = self.type2test(b)
342 self.assertEqual(b.split(), [b'arf', b'barf'])
343 self.assertEqual(b.split(None), [b'arf', b'barf'])
344 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
345 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
346 b = self.type2test(b)
347 self.assertEqual(b.split(), [b])
348 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
349 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
350 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
351 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
352
353 def test_split_string_error(self):
354 self.assertRaises(TypeError, self.type2test(b'a b').split, u' ')
355
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000356 def test_split_unicodewhitespace(self):
357 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
358 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
359
Christian Heimes1a6387e2008-03-26 12:49:49 +0000360 def test_rsplit(self):
361 b = self.type2test(b'mississippi')
362 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
363 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
364 self.assertEqual(b.rsplit(b'w'), [b])
365
366 def test_rsplit_whitespace(self):
367 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
368 b'arf\fbarf', b'arf\vbarf'):
369 b = self.type2test(b)
370 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
371 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
372 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
373 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
374 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
375 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
376 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
377
378 def test_rsplit_string_error(self):
379 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ')
380
381 def test_rsplit_unicodewhitespace(self):
382 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000383 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
384
385 def test_partition(self):
386 b = self.type2test(b'mississippi')
387 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000388 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000389
390 def test_rpartition(self):
391 b = self.type2test(b'mississippi')
392 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
393 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000394 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000395
396 def test_pickling(self):
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +0000397 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000398 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
399 b = self.type2test(b)
400 ps = pickle.dumps(b, proto)
401 q = pickle.loads(ps)
402 self.assertEqual(b, q)
403
404 def test_strip(self):
405 b = self.type2test(b'mississippi')
406 self.assertEqual(b.strip(b'i'), b'mississipp')
407 self.assertEqual(b.strip(b'm'), b'ississippi')
408 self.assertEqual(b.strip(b'pi'), b'mississ')
409 self.assertEqual(b.strip(b'im'), b'ssissipp')
410 self.assertEqual(b.strip(b'pim'), b'ssiss')
411 self.assertEqual(b.strip(b), b'')
412
413 def test_lstrip(self):
414 b = self.type2test(b'mississippi')
415 self.assertEqual(b.lstrip(b'i'), b'mississippi')
416 self.assertEqual(b.lstrip(b'm'), b'ississippi')
417 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
418 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
419 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
420
421 def test_rstrip(self):
422 b = self.type2test(b'mississippi')
423 self.assertEqual(b.rstrip(b'i'), b'mississipp')
424 self.assertEqual(b.rstrip(b'm'), b'mississippi')
425 self.assertEqual(b.rstrip(b'pi'), b'mississ')
426 self.assertEqual(b.rstrip(b'im'), b'mississipp')
427 self.assertEqual(b.rstrip(b'pim'), b'mississ')
428
429 def test_strip_whitespace(self):
430 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
431 self.assertEqual(b.strip(), b'abc')
432 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
433 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
434
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000435 def test_strip_bytearray(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000436 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
437 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
438 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
439
440 def test_strip_string_error(self):
441 self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b')
442 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b')
443 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b')
444
445 def test_ord(self):
446 b = self.type2test(b'\0A\x7f\x80\xff')
447 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
448 [0, 65, 127, 128, 255])
449
450
451class ByteArrayTest(BaseBytesTest):
452 type2test = bytearray
453
454 def test_nohash(self):
455 self.assertRaises(TypeError, hash, bytearray())
456
457 def test_bytearray_api(self):
458 short_sample = b"Hello world\n"
459 sample = short_sample + b"\0"*(20 - len(short_sample))
460 tfn = tempfile.mktemp()
461 try:
462 # Prepare
463 with open(tfn, "wb") as f:
464 f.write(short_sample)
465 # Test readinto
466 with open(tfn, "rb") as f:
467 b = bytearray(20)
468 n = f.readinto(b)
469 self.assertEqual(n, len(short_sample))
470 # Python 2.x
471 b_sample = (ord(s) for s in sample)
472 self.assertEqual(list(b), list(b_sample))
473 # Test writing in binary mode
474 with open(tfn, "wb") as f:
475 f.write(b)
476 with open(tfn, "rb") as f:
477 self.assertEqual(f.read(), sample)
478 # Text mode is ambiguous; don't test
479 finally:
480 try:
481 os.remove(tfn)
482 except os.error:
483 pass
484
485 def test_reverse(self):
486 b = bytearray(b'hello')
487 self.assertEqual(b.reverse(), None)
488 self.assertEqual(b, b'olleh')
489 b = bytearray(b'hello1') # test even number of items
490 b.reverse()
491 self.assertEqual(b, b'1olleh')
492 b = bytearray()
493 b.reverse()
494 self.assertFalse(b)
495
496 def test_regexps(self):
497 def by(s):
498 return bytearray(map(ord, s))
499 b = by("Hello, world")
500 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
501
502 def test_setitem(self):
503 b = bytearray([1, 2, 3])
504 b[1] = 100
505 self.assertEqual(b, bytearray([1, 100, 3]))
506 b[-1] = 200
507 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl3e483f62008-07-16 22:57:41 +0000508 b[0] = Indexable(10)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000509 self.assertEqual(b, bytearray([10, 100, 200]))
510 try:
511 b[3] = 0
512 self.fail("Didn't raise IndexError")
513 except IndexError:
514 pass
515 try:
516 b[-10] = 0
517 self.fail("Didn't raise IndexError")
518 except IndexError:
519 pass
520 try:
521 b[0] = 256
522 self.fail("Didn't raise ValueError")
523 except ValueError:
524 pass
525 try:
Georg Brandl3e483f62008-07-16 22:57:41 +0000526 b[0] = Indexable(-1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000527 self.fail("Didn't raise ValueError")
528 except ValueError:
529 pass
530 try:
531 b[0] = None
532 self.fail("Didn't raise TypeError")
533 except TypeError:
534 pass
535
536 def test_delitem(self):
537 b = bytearray(range(10))
538 del b[0]
539 self.assertEqual(b, bytearray(range(1, 10)))
540 del b[-1]
541 self.assertEqual(b, bytearray(range(1, 9)))
542 del b[4]
543 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
544
545 def test_setslice(self):
546 b = bytearray(range(10))
547 self.assertEqual(list(b), list(range(10)))
548
549 b[0:5] = bytearray([1, 1, 1, 1, 1])
550 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
551
552 del b[0:-5]
553 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
554
555 b[0:0] = bytearray([0, 1, 2, 3, 4])
556 self.assertEqual(b, bytearray(range(10)))
557
558 b[-7:-3] = bytearray([100, 101])
559 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
560
561 b[3:5] = [3, 4, 5, 6]
562 self.assertEqual(b, bytearray(range(10)))
563
564 b[3:0] = [42, 42, 42]
565 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
566
567 def test_extended_set_del_slice(self):
Mark Dickinson36ecd672010-01-29 17:11:39 +0000568 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000569 for start in indices:
570 for stop in indices:
571 # Skip invalid step 0
572 for step in indices[1:]:
573 L = list(range(255))
574 b = bytearray(L)
575 # Make sure we have a slice of exactly the right length,
576 # but with different data.
577 data = L[start:stop:step]
578 data.reverse()
579 L[start:stop:step] = data
580 b[start:stop:step] = data
581 self.assertEquals(b, bytearray(L))
582
583 del L[start:stop:step]
584 del b[start:stop:step]
585 self.assertEquals(b, bytearray(L))
586
587 def test_setslice_trap(self):
588 # This test verifies that we correctly handle assigning self
589 # to a slice of self (the old Lambert Meertens trap).
590 b = bytearray(range(256))
591 b[8:] = b
592 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
593
594 def test_iconcat(self):
595 b = bytearray(b"abc")
596 b1 = b
597 b += b"def"
598 self.assertEqual(b, b"abcdef")
599 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000600 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000601 b += b"xyz"
602 self.assertEqual(b, b"abcdefxyz")
603 try:
604 b += u""
605 except TypeError:
606 pass
607 else:
608 self.fail("bytes += unicode didn't raise TypeError")
609
610 def test_irepeat(self):
611 b = bytearray(b"abc")
612 b1 = b
613 b *= 3
614 self.assertEqual(b, b"abcabcabc")
615 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000616 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000617
618 def test_irepeat_1char(self):
619 b = bytearray(b"x")
620 b1 = b
621 b *= 100
622 self.assertEqual(b, b"x"*100)
623 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000624 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000625
626 def test_alloc(self):
627 b = bytearray()
628 alloc = b.__alloc__()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000629 self.assertTrue(alloc >= 0)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000630 seq = [alloc]
631 for i in range(100):
632 b += b"x"
633 alloc = b.__alloc__()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000634 self.assertTrue(alloc >= len(b))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000635 if alloc not in seq:
636 seq.append(alloc)
637
638 def test_extend(self):
639 orig = b'hello'
640 a = bytearray(orig)
641 a.extend(a)
642 self.assertEqual(a, orig + orig)
643 self.assertEqual(a[5:], orig)
644 a = bytearray(b'')
645 # Test iterators that don't have a __length_hint__
646 a.extend(map(ord, orig * 25))
647 a.extend(ord(x) for x in orig * 25)
648 self.assertEqual(a, orig * 50)
649 self.assertEqual(a[-5:], orig)
650 a = bytearray(b'')
651 a.extend(iter(map(ord, orig * 50)))
652 self.assertEqual(a, orig * 50)
653 self.assertEqual(a[-5:], orig)
654 a = bytearray(b'')
655 a.extend(list(map(ord, orig * 50)))
656 self.assertEqual(a, orig * 50)
657 self.assertEqual(a[-5:], orig)
658 a = bytearray(b'')
659 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
660 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
661 self.assertEqual(len(a), 0)
Georg Brandl3e483f62008-07-16 22:57:41 +0000662 a = bytearray(b'')
663 a.extend([Indexable(ord('a'))])
664 self.assertEqual(a, b'a')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000665
666 def test_remove(self):
667 b = bytearray(b'hello')
668 b.remove(ord('l'))
669 self.assertEqual(b, b'helo')
670 b.remove(ord('l'))
671 self.assertEqual(b, b'heo')
672 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
673 self.assertRaises(ValueError, lambda: b.remove(400))
674 self.assertRaises(TypeError, lambda: b.remove(u'e'))
675 # remove first and last
676 b.remove(ord('o'))
677 b.remove(ord('h'))
678 self.assertEqual(b, b'e')
679 self.assertRaises(TypeError, lambda: b.remove(u'e'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000680 b.remove(Indexable(ord('e')))
681 self.assertEqual(b, b'')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000682
683 def test_pop(self):
684 b = bytearray(b'world')
685 self.assertEqual(b.pop(), ord('d'))
686 self.assertEqual(b.pop(0), ord('w'))
687 self.assertEqual(b.pop(-2), ord('r'))
688 self.assertRaises(IndexError, lambda: b.pop(10))
689 self.assertRaises(OverflowError, lambda: bytearray().pop())
Mark Dickinsonc8a7c7c2009-09-06 10:03:31 +0000690 # test for issue #6846
691 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000692
693 def test_nosort(self):
694 self.assertRaises(AttributeError, lambda: bytearray().sort())
695
696 def test_append(self):
697 b = bytearray(b'hell')
698 b.append(ord('o'))
699 self.assertEqual(b, b'hello')
700 self.assertEqual(b.append(100), None)
701 b = bytearray()
702 b.append(ord('A'))
703 self.assertEqual(len(b), 1)
704 self.assertRaises(TypeError, lambda: b.append(u'o'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000705 b = bytearray()
706 b.append(Indexable(ord('A')))
707 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000708
709 def test_insert(self):
710 b = bytearray(b'msssspp')
711 b.insert(1, ord('i'))
712 b.insert(4, ord('i'))
713 b.insert(-2, ord('i'))
714 b.insert(1000, ord('i'))
715 self.assertEqual(b, b'mississippi')
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000716 # allowed in 2.x
Georg Brandl3e483f62008-07-16 22:57:41 +0000717 #self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
718 b = bytearray()
719 b.insert(0, Indexable(ord('A')))
720 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000721
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000722 def test_copied(self):
723 # Issue 4348. Make sure that operations that don't mutate the array
724 # copy the bytes.
725 b = bytearray(b'abc')
Benjamin Petersond3b5a792008-11-20 21:44:23 +0000726 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000727
728 t = bytearray([i for i in range(256)])
729 x = bytearray(b'')
730 self.assertFalse(x is x.translate(t))
731
Christian Heimes1a6387e2008-03-26 12:49:49 +0000732 def test_partition_bytearray_doesnt_share_nullstring(self):
733 a, b, c = bytearray(b"x").partition(b"y")
734 self.assertEqual(b, b"")
735 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000736 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000737 b += b"!"
738 self.assertEqual(c, b"")
739 a, b, c = bytearray(b"x").partition(b"y")
740 self.assertEqual(b, b"")
741 self.assertEqual(c, b"")
742 # Same for rpartition
743 b, c, a = bytearray(b"x").rpartition(b"y")
744 self.assertEqual(b, b"")
745 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000746 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000747 b += b"!"
748 self.assertEqual(c, b"")
749 c, b, a = bytearray(b"x").rpartition(b"y")
750 self.assertEqual(b, b"")
751 self.assertEqual(c, b"")
752
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000753 def test_resize_forbidden(self):
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000754 # #4509: can't resize a bytearray when there are buffer exports, even
755 # if it wouldn't reallocate the underlying buffer.
756 # Furthermore, no destructive changes to the buffer may be applied
757 # before raising the error.
758 b = bytearray(range(10))
759 v = memoryview(b)
760 def resize(n):
761 b[1:-1] = range(n + 1, 2*n - 1)
762 resize(10)
763 orig = b[:]
764 self.assertRaises(BufferError, resize, 11)
765 self.assertEquals(b, orig)
766 self.assertRaises(BufferError, resize, 9)
767 self.assertEquals(b, orig)
768 self.assertRaises(BufferError, resize, 0)
769 self.assertEquals(b, orig)
770 # Other operations implying resize
771 self.assertRaises(BufferError, b.pop, 0)
772 self.assertEquals(b, orig)
773 self.assertRaises(BufferError, b.remove, b[1])
774 self.assertEquals(b, orig)
775 def delitem():
776 del b[1]
777 self.assertRaises(BufferError, delitem)
778 self.assertEquals(b, orig)
779 # deleting a non-contiguous slice
780 def delslice():
781 b[1:-1:2] = b""
782 self.assertRaises(BufferError, delslice)
783 self.assertEquals(b, orig)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000784
Antoine Pitroue80a6a42010-01-17 12:26:20 +0000785 def test_empty_bytearray(self):
786 # Issue #7561: operations on empty bytearrays could crash in many
787 # situations, due to a fragile implementation of the
788 # PyByteArray_AS_STRING() C macro.
789 self.assertRaises(ValueError, int, bytearray(b''))
790
791
Christian Heimes1a6387e2008-03-26 12:49:49 +0000792class AssortedBytesTest(unittest.TestCase):
793 #
794 # Test various combinations of bytes and bytearray
795 #
796
797 def setUp(self):
798 self.warning_filters = warnings.filters[:]
799
800 def tearDown(self):
801 warnings.filters = self.warning_filters
802
803 def test_repr_str(self):
804 warnings.simplefilter('ignore', BytesWarning)
805 for f in str, repr:
806 self.assertEqual(f(bytearray()), "bytearray(b'')")
807 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
808 self.assertEqual(f(bytearray([0, 1, 254, 255])),
809 "bytearray(b'\\x00\\x01\\xfe\\xff')")
810 self.assertEqual(f(b"abc"), "b'abc'")
811 self.assertEqual(f(b"'"), '''b"'"''') # '''
812 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
813
814 def test_compare_bytes_to_bytearray(self):
815 self.assertEqual(b"abc" == bytes(b"abc"), True)
816 self.assertEqual(b"ab" != bytes(b"abc"), True)
817 self.assertEqual(b"ab" <= bytes(b"abc"), True)
818 self.assertEqual(b"ab" < bytes(b"abc"), True)
819 self.assertEqual(b"abc" >= bytes(b"ab"), True)
820 self.assertEqual(b"abc" > bytes(b"ab"), True)
821
822 self.assertEqual(b"abc" != bytes(b"abc"), False)
823 self.assertEqual(b"ab" == bytes(b"abc"), False)
824 self.assertEqual(b"ab" > bytes(b"abc"), False)
825 self.assertEqual(b"ab" >= bytes(b"abc"), False)
826 self.assertEqual(b"abc" < bytes(b"ab"), False)
827 self.assertEqual(b"abc" <= bytes(b"ab"), False)
828
829 self.assertEqual(bytes(b"abc") == b"abc", True)
830 self.assertEqual(bytes(b"ab") != b"abc", True)
831 self.assertEqual(bytes(b"ab") <= b"abc", True)
832 self.assertEqual(bytes(b"ab") < b"abc", True)
833 self.assertEqual(bytes(b"abc") >= b"ab", True)
834 self.assertEqual(bytes(b"abc") > b"ab", True)
835
836 self.assertEqual(bytes(b"abc") != b"abc", False)
837 self.assertEqual(bytes(b"ab") == b"abc", False)
838 self.assertEqual(bytes(b"ab") > b"abc", False)
839 self.assertEqual(bytes(b"ab") >= b"abc", False)
840 self.assertEqual(bytes(b"abc") < b"ab", False)
841 self.assertEqual(bytes(b"abc") <= b"ab", False)
842
843 def test_doc(self):
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000844 self.assertIsNotNone(bytearray.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000845 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000846 self.assertIsNotNone(bytes.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000847 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000848
849 def test_from_bytearray(self):
850 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
851 buf = memoryview(sample)
852 b = bytearray(buf)
853 self.assertEqual(b, bytearray(sample))
854
855 def test_to_str(self):
856 warnings.simplefilter('ignore', BytesWarning)
857 self.assertEqual(str(b''), "b''")
858 self.assertEqual(str(b'x'), "b'x'")
859 self.assertEqual(str(b'\x80'), "b'\\x80'")
860 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
861 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
862 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
863
864 def test_literal(self):
865 tests = [
866 (b"Wonderful spam", "Wonderful spam"),
867 (br"Wonderful spam too", "Wonderful spam too"),
868 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
869 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
870 ]
871 for b, s in tests:
872 self.assertEqual(b, bytearray(s, 'latin-1'))
873 for c in range(128, 256):
874 self.assertRaises(SyntaxError, eval,
875 'b"%s"' % chr(c))
876
877 def test_translate(self):
878 b = b'hello'
Georg Brandl6425a2f2008-12-28 11:54:53 +0000879 ba = bytearray(b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000880 rosetta = bytearray(range(0, 256))
881 rosetta[ord('o')] = ord('e')
882 c = b.translate(rosetta, b'l')
883 self.assertEqual(b, b'hello')
884 self.assertEqual(c, b'hee')
Georg Brandl6425a2f2008-12-28 11:54:53 +0000885 c = ba.translate(rosetta, b'l')
886 self.assertEqual(ba, b'hello')
887 self.assertEqual(c, b'hee')
888 c = b.translate(None, b'e')
889 self.assertEqual(c, b'hllo')
890 c = ba.translate(None, b'e')
891 self.assertEqual(c, b'hllo')
892 self.assertRaises(TypeError, b.translate, None, None)
893 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000894
895 def test_split_bytearray(self):
896 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
897
898 def test_rsplit_bytearray(self):
899 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
900
901 # Optimizations:
902 # __iter__? (optimization)
903 # __reversed__? (optimization)
904
905 # XXX More string methods? (Those that don't use character properties)
906
907 # There are tests in string_tests.py that are more
908 # comprehensive for things like split, partition, etc.
909 # Unfortunately they are all bundled with tests that
910 # are not appropriate for bytes
911
912 # I've started porting some of those into bytearray_tests.py, we should port
913 # the rest that make sense (the code can be cleaned up to use modern
914 # unittest methods at the same time).
915
916class BytearrayPEP3137Test(unittest.TestCase,
917 test.buffer_tests.MixinBytesBufferCommonTests):
918 def marshal(self, x):
919 return bytearray(x)
920
921 def test_returns_new_copy(self):
922 val = self.marshal(b'1234')
923 # On immutable types these MAY return a reference to themselves
924 # but on mutable types like bytearray they MUST return a new copy.
925 for methname in ('zfill', 'rjust', 'ljust', 'center'):
926 method = getattr(val, methname)
927 newval = method(3)
928 self.assertEqual(val, newval)
929 self.assertTrue(val is not newval,
930 methname+' returned self on a mutable object')
Antoine Pitrou5f76d132010-01-13 15:02:13 +0000931 for expr in ('val.split()[0]', 'val.rsplit()[0]',
932 'val.partition(".")[0]', 'val.rpartition(".")[2]',
933 'val.splitlines()[0]', 'val.replace("", "")'):
934 newval = eval(expr)
935 self.assertEqual(val, newval)
936 self.assertTrue(val is not newval,
937 expr+' returned val on a mutable object')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000938
939class FixedStringTest(test.string_tests.BaseTest):
940
941 def fixtype(self, obj):
942 if isinstance(obj, str):
943 return obj.encode("utf-8")
944 return super(FixedStringTest, self).fixtype(obj)
945
946 # Currently the bytes containment testing uses a single integer
947 # value. This may not be the final design, but until then the
948 # bytes section with in a bytes containment not valid
949 def test_contains(self):
950 pass
951 def test_expandtabs(self):
952 pass
953 def test_upper(self):
954 pass
955 def test_lower(self):
956 pass
957 def test_hash(self):
958 # XXX check this out
959 pass
960
961
962class ByteArrayAsStringTest(FixedStringTest):
963 type2test = bytearray
964
965
966class ByteArraySubclass(bytearray):
967 pass
968
969class ByteArraySubclassTest(unittest.TestCase):
970
971 def test_basic(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000972 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000973 self.assertIsInstance(ByteArraySubclass(), bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000974
975 a, b = b"abcd", b"efgh"
976 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
977
978 # test comparison operators with subclass instances
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000979 self.assertTrue(_a == _a)
980 self.assertTrue(_a != _b)
981 self.assertTrue(_a < _b)
982 self.assertTrue(_a <= _b)
983 self.assertTrue(_b >= _a)
984 self.assertTrue(_b > _a)
985 self.assertTrue(_a is not a)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000986
987 # test concat of subclass instances
988 self.assertEqual(a + b, _a + _b)
989 self.assertEqual(a + b, a + _b)
990 self.assertEqual(a + b, _a + b)
991
992 # test repeat
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000993 self.assertTrue(a*5 == _a*5)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000994
995 def test_join(self):
996 # Make sure join returns a NEW object for single item sequences
997 # involving a subclass.
998 # Make sure that it is of the appropriate type.
999 s1 = ByteArraySubclass(b"abcd")
1000 s2 = bytearray().join([s1])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001001 self.assertTrue(s1 is not s2)
1002 self.assertTrue(type(s2) is bytearray, type(s2))
Christian Heimes1a6387e2008-03-26 12:49:49 +00001003
1004 # Test reverse, calling join on subclass
1005 s3 = s1.join([b"abcd"])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001006 self.assertTrue(type(s3) is bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001007
1008 def test_pickle(self):
1009 a = ByteArraySubclass(b"abcd")
1010 a.x = 10
1011 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +00001012 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +00001013 b = pickle.loads(pickle.dumps(a, proto))
1014 self.assertNotEqual(id(a), id(b))
1015 self.assertEqual(a, b)
1016 self.assertEqual(a.x, b.x)
1017 self.assertEqual(a.y, b.y)
1018 self.assertEqual(type(a), type(b))
1019 self.assertEqual(type(a.y), type(b.y))
1020
1021 def test_copy(self):
1022 a = ByteArraySubclass(b"abcd")
1023 a.x = 10
1024 a.y = ByteArraySubclass(b"efgh")
1025 for copy_method in (copy.copy, copy.deepcopy):
1026 b = copy_method(a)
1027 self.assertNotEqual(id(a), id(b))
1028 self.assertEqual(a, b)
1029 self.assertEqual(a.x, b.x)
1030 self.assertEqual(a.y, b.y)
1031 self.assertEqual(type(a), type(b))
1032 self.assertEqual(type(a.y), type(b.y))
1033
1034 def test_init_override(self):
1035 class subclass(bytearray):
1036 def __init__(self, newarg=1, *args, **kwargs):
1037 bytearray.__init__(self, *args, **kwargs)
1038 x = subclass(4, source=b"abcd")
1039 self.assertEqual(x, b"abcd")
1040 x = subclass(newarg=4, source=b"abcd")
1041 self.assertEqual(x, b"abcd")
1042
1043def test_main():
1044 #test.test_support.run_unittest(BytesTest)
1045 #test.test_support.run_unittest(AssortedBytesTest)
1046 #test.test_support.run_unittest(BytesAsStringTest)
1047 test.test_support.run_unittest(
1048 ByteArrayTest,
1049 ByteArrayAsStringTest,
1050 ByteArraySubclassTest,
1051 BytearrayPEP3137Test)
1052
1053if __name__ == "__main__":
1054 test_main()