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