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