blob: 81d2dad3d21bdb3b42a3b3ce2d9144939d54451f [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
3XXX This is a mess. Common tests should be moved to buffer_tests.py,
4which itself ought to be unified with string_tests.py (and the latter
5should be modernized).
6"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
Guido van Rossumd624f182006-04-24 13:47:05 +00008import os
9import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000010import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000011import copy
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Guido van Rossum98297ee2007-11-06 21:34:58 +000015import warnings
Benjamin Petersonee8712c2008-05-20 21:35:26 +000016import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000018import test.buffer_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000019
Georg Brandl9a54d7c2008-07-16 23:15:30 +000020class Indexable:
21 def __init__(self, value=0):
22 self.value = value
23 def __index__(self):
24 return self.value
25
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000026
Christian Heimes510711d2008-01-30 11:57:58 +000027class BaseBytesTest(unittest.TestCase):
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000028
Guido van Rossum98297ee2007-11-06 21:34:58 +000029 def setUp(self):
30 self.warning_filters = warnings.filters[:]
31
32 def tearDown(self):
33 warnings.filters = self.warning_filters
34
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000035 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000036 b = self.type2test()
37 self.assertEqual(type(b), self.type2test)
38 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000039
40 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000041 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042 self.assertEqual(len(b), 0)
43 self.assertRaises(IndexError, lambda: b[0])
44 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000045 self.assertRaises(IndexError, lambda: b[sys.maxsize])
46 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000047 self.assertRaises(IndexError, lambda: b[10**100])
48 self.assertRaises(IndexError, lambda: b[-1])
49 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000050 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
51 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
52 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000053 self.assertRaises(IndexError, lambda: b[-10**100])
54
55 def test_from_list(self):
56 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000057 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058 self.assertEqual(len(b), 256)
59 self.assertEqual(list(b), ints)
60
61 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000062 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
63 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000064 self.assertEqual(list(b), [0, 1, 254, 255])
Georg Brandl9a54d7c2008-07-16 23:15:30 +000065 self.assertRaises(ValueError, bytearray, [Indexable(-1)])
66 self.assertRaises(ValueError, bytearray, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000067
68 def test_from_ssize(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000069 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)
Guido van Rossum98297ee2007-11-06 21:34:58 +000073
Guido van Rossum254348e2007-11-21 19:29:53 +000074 self.assertEqual(bytearray('0', 'ascii'), b'0')
75 self.assertEqual(bytearray(b'0'), b'0')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000076
77 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000078 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000079 class C:
80 pass
Christian Heimes510711d2008-01-30 11:57:58 +000081 self.assertRaises(TypeError, self.type2test, ["0"])
82 self.assertRaises(TypeError, self.type2test, [0.0])
83 self.assertRaises(TypeError, self.type2test, [None])
84 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000085
86 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000087 self.assertRaises(ValueError, self.type2test, [-1])
88 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
89 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
90 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
91 self.assertRaises(ValueError, self.type2test, [-10**100])
92 self.assertRaises(ValueError, self.type2test, [256])
93 self.assertRaises(ValueError, self.type2test, [257])
94 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
95 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
96 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000097
98 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +000099 b1 = self.type2test([1, 2, 3])
100 b2 = self.type2test([1, 2, 3])
101 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000102
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000103 self.assertEqual(b1, b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000104 self.failUnless(b2 != b3)
105 self.failUnless(b1 <= b2)
106 self.failUnless(b1 <= b3)
107 self.failUnless(b1 < b3)
108 self.failUnless(b1 >= b2)
109 self.failUnless(b3 >= b2)
110 self.failUnless(b3 > b2)
111
112 self.failIf(b1 != b2)
113 self.failIf(b2 == b3)
114 self.failIf(b1 > b2)
115 self.failIf(b1 > b3)
116 self.failIf(b1 >= b3)
117 self.failIf(b1 < b2)
118 self.failIf(b3 < b2)
119 self.failIf(b3 <= b2)
120
Guido van Rossum343e97f2007-04-09 00:43:24 +0000121 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000122 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000123 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000124 # Test this for all expected byte orders and Unicode character sizes
Christian Heimes510711d2008-01-30 11:57:58 +0000125 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
126 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", False)
127 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
128 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", False)
129 self.assertEqual(self.type2test() == str(), False)
130 self.assertEqual(self.type2test() != str(), True)
131
132 def test_reversed(self):
133 input = list(map(ord, "Hello"))
134 b = self.type2test(input)
135 output = list(reversed(b))
136 input.reverse()
137 self.assertEqual(output, input)
138
139 def test_getslice(self):
140 def by(s):
141 return self.type2test(map(ord, s))
142 b = by("Hello, world")
143
144 self.assertEqual(b[:5], by("Hello"))
145 self.assertEqual(b[1:5], by("ello"))
146 self.assertEqual(b[5:7], by(", "))
147 self.assertEqual(b[7:], by("world"))
148 self.assertEqual(b[7:12], by("world"))
149 self.assertEqual(b[7:100], by("world"))
150
151 self.assertEqual(b[:-7], by("Hello"))
152 self.assertEqual(b[-11:-7], by("ello"))
153 self.assertEqual(b[-7:-5], by(", "))
154 self.assertEqual(b[-5:], by("world"))
155 self.assertEqual(b[-5:12], by("world"))
156 self.assertEqual(b[-5:100], by("world"))
157 self.assertEqual(b[-100:5], by("Hello"))
158
159 def test_extended_getslice(self):
160 # Test extended slicing by comparing with list slicing.
161 L = list(range(255))
162 b = self.type2test(L)
163 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
164 for start in indices:
165 for stop in indices:
166 # Skip step 0 (invalid)
167 for step in indices[1:]:
168 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
169
170 def test_encoding(self):
171 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
172 for enc in ("utf8", "utf16"):
173 b = self.type2test(sample, enc)
174 self.assertEqual(b, self.type2test(sample.encode(enc)))
175 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
176 b = self.type2test(sample, "latin1", "ignore")
177 self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
178
179 def test_decode(self):
180 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
181 for enc in ("utf8", "utf16"):
182 b = self.type2test(sample, enc)
183 self.assertEqual(b.decode(enc), sample)
184 sample = "Hello world\n\x80\x81\xfe\xff"
185 b = self.type2test(sample, "latin1")
186 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
187 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
188
189 def test_from_int(self):
190 b = self.type2test(0)
191 self.assertEqual(b, self.type2test())
192 b = self.type2test(10)
193 self.assertEqual(b, self.type2test([0]*10))
194 b = self.type2test(10000)
195 self.assertEqual(b, self.type2test([0]*10000))
196
197 def test_concat(self):
198 b1 = self.type2test(b"abc")
199 b2 = self.type2test(b"def")
200 self.assertEqual(b1 + b2, b"abcdef")
201 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
202 self.assertEqual(bytes(b"def") + b1, b"defabc")
203 self.assertRaises(TypeError, lambda: b1 + "def")
204 self.assertRaises(TypeError, lambda: "abc" + b2)
205
206 def test_repeat(self):
207 for b in b"abc", self.type2test(b"abc"):
208 self.assertEqual(b * 3, b"abcabcabc")
209 self.assertEqual(b * 0, b"")
210 self.assertEqual(b * -1, b"")
211 self.assertRaises(TypeError, lambda: b * 3.14)
212 self.assertRaises(TypeError, lambda: 3.14 * b)
213 # XXX Shouldn't bytes and bytearray agree on what to raise?
214 self.assertRaises((OverflowError, MemoryError),
215 lambda: b * sys.maxsize)
216
217 def test_repeat_1char(self):
218 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
219
220 def test_contains(self):
221 b = self.type2test(b"abc")
222 self.failUnless(ord('a') in b)
223 self.failUnless(int(ord('a')) in b)
224 self.failIf(200 in b)
225 self.failIf(200 in b)
226 self.assertRaises(ValueError, lambda: 300 in b)
227 self.assertRaises(ValueError, lambda: -1 in b)
228 self.assertRaises(TypeError, lambda: None in b)
229 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
230 self.assertRaises(TypeError, lambda: "a" in b)
231 for f in bytes, bytearray:
232 self.failUnless(f(b"") in b)
233 self.failUnless(f(b"a") in b)
234 self.failUnless(f(b"b") in b)
235 self.failUnless(f(b"c") in b)
236 self.failUnless(f(b"ab") in b)
237 self.failUnless(f(b"bc") in b)
238 self.failUnless(f(b"abc") in b)
239 self.failIf(f(b"ac") in b)
240 self.failIf(f(b"d") in b)
241 self.failIf(f(b"dab") in b)
242 self.failIf(f(b"abd") in b)
243
244 def test_fromhex(self):
245 self.assertRaises(TypeError, self.type2test.fromhex)
246 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Christian Heimes4f066122008-01-30 15:02:52 +0000247 self.assertEquals(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000248 b = bytearray([0x1a, 0x2b, 0x30])
249 self.assertEquals(self.type2test.fromhex('1a2B30'), b)
250 self.assertEquals(self.type2test.fromhex(' 1A 2B 30 '), b)
251 self.assertEquals(self.type2test.fromhex('0000'), b'\0\0')
252 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
253 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
254 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
255 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
256 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
257 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
258
259 def test_join(self):
260 self.assertEqual(self.type2test(b"").join([]), b"")
261 self.assertEqual(self.type2test(b"").join([b""]), b"")
262 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
263 lst = list(map(self.type2test, lst))
264 self.assertEqual(self.type2test(b"").join(lst), b"abc")
265 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
266 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
267 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
268 # XXX more...
269
270 def test_index(self):
271 b = self.type2test(b'parrot')
272 self.assertEqual(b.index('p'), 0)
273 self.assertEqual(b.index('rr'), 2)
274 self.assertEqual(b.index('t'), 5)
275 self.assertRaises(ValueError, lambda: b.index('w'))
276
277 def test_count(self):
278 b = self.type2test(b'mississippi')
279 self.assertEqual(b.count(b'i'), 4)
280 self.assertEqual(b.count(b'ss'), 2)
281 self.assertEqual(b.count(b'w'), 0)
282
283 def test_startswith(self):
284 b = self.type2test(b'hello')
285 self.assertFalse(self.type2test().startswith(b"anything"))
286 self.assertTrue(b.startswith(b"hello"))
287 self.assertTrue(b.startswith(b"hel"))
288 self.assertTrue(b.startswith(b"h"))
289 self.assertFalse(b.startswith(b"hellow"))
290 self.assertFalse(b.startswith(b"ha"))
291
292 def test_endswith(self):
293 b = self.type2test(b'hello')
294 self.assertFalse(bytearray().endswith(b"anything"))
295 self.assertTrue(b.endswith(b"hello"))
296 self.assertTrue(b.endswith(b"llo"))
297 self.assertTrue(b.endswith(b"o"))
298 self.assertFalse(b.endswith(b"whello"))
299 self.assertFalse(b.endswith(b"no"))
300
301 def test_find(self):
302 b = self.type2test(b'mississippi')
303 self.assertEqual(b.find(b'ss'), 2)
304 self.assertEqual(b.find(b'ss', 3), 5)
305 self.assertEqual(b.find(b'ss', 1, 7), 2)
306 self.assertEqual(b.find(b'ss', 1, 3), -1)
307 self.assertEqual(b.find(b'w'), -1)
308 self.assertEqual(b.find(b'mississippian'), -1)
309
310 def test_rfind(self):
311 b = self.type2test(b'mississippi')
312 self.assertEqual(b.rfind(b'ss'), 5)
313 self.assertEqual(b.rfind(b'ss', 3), 5)
314 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
315 self.assertEqual(b.rfind(b'w'), -1)
316 self.assertEqual(b.rfind(b'mississippian'), -1)
317
318 def test_index(self):
319 b = self.type2test(b'world')
320 self.assertEqual(b.index(b'w'), 0)
321 self.assertEqual(b.index(b'orl'), 1)
322 self.assertRaises(ValueError, b.index, b'worm')
323 self.assertRaises(ValueError, b.index, b'ldo')
324
325 def test_rindex(self):
326 # XXX could be more rigorous
327 b = self.type2test(b'world')
328 self.assertEqual(b.rindex(b'w'), 0)
329 self.assertEqual(b.rindex(b'orl'), 1)
330 self.assertRaises(ValueError, b.rindex, b'worm')
331 self.assertRaises(ValueError, b.rindex, b'ldo')
332
333 def test_replace(self):
334 b = self.type2test(b'mississippi')
335 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
336 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
337
338 def test_split(self):
339 b = self.type2test(b'mississippi')
340 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
341 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
342 self.assertEqual(b.split(b'w'), [b])
343
344 def test_split_whitespace(self):
345 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
346 b'arf\fbarf', b'arf\vbarf'):
347 b = self.type2test(b)
348 self.assertEqual(b.split(), [b'arf', b'barf'])
349 self.assertEqual(b.split(None), [b'arf', b'barf'])
350 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
351 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
352 b = self.type2test(b)
353 self.assertEqual(b.split(), [b])
354 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
355 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
356 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
357 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
358
359 def test_split_string_error(self):
360 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
361
362 def test_rsplit(self):
363 b = self.type2test(b'mississippi')
364 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
365 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
366 self.assertEqual(b.rsplit(b'w'), [b])
367
368 def test_rsplit_whitespace(self):
369 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
370 b'arf\fbarf', b'arf\vbarf'):
371 b = self.type2test(b)
372 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
373 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
374 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
375 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
376 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
377 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
378 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
379
380 def test_rsplit_string_error(self):
381 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
382
383 def test_rsplit_unicodewhitespace(self):
384 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
385 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
386 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
387
388 def test_partition(self):
389 b = self.type2test(b'mississippi')
390 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
391 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
392
393 def test_rpartition(self):
394 b = self.type2test(b'mississippi')
395 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
396 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
397
398 def test_pickling(self):
399 for proto in range(pickle.HIGHEST_PROTOCOL):
400 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
401 b = self.type2test(b)
402 ps = pickle.dumps(b, proto)
403 q = pickle.loads(ps)
404 self.assertEqual(b, q)
405
406 def test_strip(self):
407 b = self.type2test(b'mississippi')
408 self.assertEqual(b.strip(b'i'), b'mississipp')
409 self.assertEqual(b.strip(b'm'), b'ississippi')
410 self.assertEqual(b.strip(b'pi'), b'mississ')
411 self.assertEqual(b.strip(b'im'), b'ssissipp')
412 self.assertEqual(b.strip(b'pim'), b'ssiss')
413 self.assertEqual(b.strip(b), b'')
414
415 def test_lstrip(self):
416 b = self.type2test(b'mississippi')
417 self.assertEqual(b.lstrip(b'i'), b'mississippi')
418 self.assertEqual(b.lstrip(b'm'), b'ississippi')
419 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
420 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
421 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
422
423 def test_rstrip(self):
424 b = self.type2test(b'mississippi')
425 self.assertEqual(b.rstrip(b'i'), b'mississipp')
426 self.assertEqual(b.rstrip(b'm'), b'mississippi')
427 self.assertEqual(b.rstrip(b'pi'), b'mississ')
428 self.assertEqual(b.rstrip(b'im'), b'mississipp')
429 self.assertEqual(b.rstrip(b'pim'), b'mississ')
430
431 def test_strip_whitespace(self):
432 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
433 self.assertEqual(b.strip(), b'abc')
434 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
435 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
436
437 def test_strip_bytearray(self):
438 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
439 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
440 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
441
442 def test_strip_string_error(self):
443 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
444 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
445 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
446
447 def test_ord(self):
448 b = self.type2test(b'\0A\x7f\x80\xff')
449 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
450 [0, 65, 127, 128, 255])
451
452
453class BytesTest(BaseBytesTest):
454 type2test = bytes
455
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000456 def test_buffer_is_readonly(self):
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000457 fd = os.dup(sys.stdin.fileno())
458 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000459 self.assertRaises(TypeError, f.readinto, b"")
460
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000461 def test_custom(self):
462 class A:
463 def __bytes__(self):
464 return b'abc'
465 self.assertEqual(bytes(A()), b'abc')
466 class A: pass
467 self.assertRaises(TypeError, bytes, A())
468 class A:
469 def __bytes__(self):
470 return None
471 self.assertRaises(TypeError, bytes, A())
472
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000473
Christian Heimes510711d2008-01-30 11:57:58 +0000474class ByteArrayTest(BaseBytesTest):
475 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000476
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000477 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000478 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000479
Guido van Rossum254348e2007-11-21 19:29:53 +0000480 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000481 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000482 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000483 tfn = tempfile.mktemp()
484 try:
485 # Prepare
486 with open(tfn, "wb") as f:
487 f.write(short_sample)
488 # Test readinto
489 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000490 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000491 n = f.readinto(b)
492 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000493 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000494 # Test writing in binary mode
495 with open(tfn, "wb") as f:
496 f.write(b)
497 with open(tfn, "rb") as f:
498 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000499 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000500 finally:
501 try:
502 os.remove(tfn)
503 except os.error:
504 pass
505
Neal Norwitz6968b052007-02-27 19:02:19 +0000506 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000507 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000508 self.assertEqual(b.reverse(), None)
509 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000510 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000511 b.reverse()
512 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000513 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000514 b.reverse()
515 self.assertFalse(b)
516
Guido van Rossumd624f182006-04-24 13:47:05 +0000517 def test_regexps(self):
518 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000519 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000520 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000521 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000522
523 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000524 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000525 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000526 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000527 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000528 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000529 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000530 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000531 try:
532 b[3] = 0
533 self.fail("Didn't raise IndexError")
534 except IndexError:
535 pass
536 try:
537 b[-10] = 0
538 self.fail("Didn't raise IndexError")
539 except IndexError:
540 pass
541 try:
542 b[0] = 256
543 self.fail("Didn't raise ValueError")
544 except ValueError:
545 pass
546 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000547 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000548 self.fail("Didn't raise ValueError")
549 except ValueError:
550 pass
551 try:
552 b[0] = None
553 self.fail("Didn't raise TypeError")
554 except TypeError:
555 pass
556
557 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000558 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000559 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000560 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000561 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000562 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000563 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000564 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000565
566 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000567 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000568 self.assertEqual(list(b), list(range(10)))
569
Guido van Rossum254348e2007-11-21 19:29:53 +0000570 b[0:5] = bytearray([1, 1, 1, 1, 1])
571 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000572
573 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000574 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000575
Guido van Rossum254348e2007-11-21 19:29:53 +0000576 b[0:0] = bytearray([0, 1, 2, 3, 4])
577 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000578
Guido van Rossum254348e2007-11-21 19:29:53 +0000579 b[-7:-3] = bytearray([100, 101])
580 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000581
582 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000583 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000584
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000585 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000586 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000587
Thomas Wouters376446d2006-12-19 08:30:14 +0000588 def test_extended_set_del_slice(self):
589 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
590 for start in indices:
591 for stop in indices:
592 # Skip invalid step 0
593 for step in indices[1:]:
594 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000595 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000596 # Make sure we have a slice of exactly the right length,
597 # but with different data.
598 data = L[start:stop:step]
599 data.reverse()
600 L[start:stop:step] = data
601 b[start:stop:step] = data
Guido van Rossum254348e2007-11-21 19:29:53 +0000602 self.assertEquals(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000603
Thomas Wouters376446d2006-12-19 08:30:14 +0000604 del L[start:stop:step]
605 del b[start:stop:step]
Guido van Rossum254348e2007-11-21 19:29:53 +0000606 self.assertEquals(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000607
Guido van Rossumd624f182006-04-24 13:47:05 +0000608 def test_setslice_trap(self):
609 # This test verifies that we correctly handle assigning self
610 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000611 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000612 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000613 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000614
Guido van Rossum13e57212006-04-27 22:54:26 +0000615 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000616 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000617 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000618 b += b"def"
619 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000620 self.assertEqual(b, b1)
621 self.failUnless(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000622 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000623 self.assertEqual(b, b"abcdefxyz")
624 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000625 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000626 except TypeError:
627 pass
628 else:
629 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000630
631 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000632 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000633 b1 = b
634 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000635 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000636 self.assertEqual(b, b1)
637 self.failUnless(b is b1)
638
639 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000640 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000641 b1 = b
642 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000643 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000644 self.assertEqual(b, b1)
645 self.failUnless(b is b1)
646
Guido van Rossum20188312006-05-05 15:15:40 +0000647 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000648 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000649 alloc = b.__alloc__()
650 self.assert_(alloc >= 0)
651 seq = [alloc]
652 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000653 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000654 alloc = b.__alloc__()
655 self.assert_(alloc >= len(b))
656 if alloc not in seq:
657 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000658
Neal Norwitz6968b052007-02-27 19:02:19 +0000659 def test_extend(self):
660 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000661 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000662 a.extend(a)
663 self.assertEqual(a, orig + orig)
664 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000665 a = bytearray(b'')
666 # Test iterators that don't have a __length_hint__
667 a.extend(map(int, orig * 25))
668 a.extend(int(x) for x in orig * 25)
669 self.assertEqual(a, orig * 50)
670 self.assertEqual(a[-5:], orig)
671 a = bytearray(b'')
672 a.extend(iter(map(int, orig * 50)))
673 self.assertEqual(a, orig * 50)
674 self.assertEqual(a[-5:], orig)
675 a = bytearray(b'')
676 a.extend(list(map(int, orig * 50)))
677 self.assertEqual(a, orig * 50)
678 self.assertEqual(a[-5:], orig)
679 a = bytearray(b'')
680 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
681 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
682 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000683 a = bytearray(b'')
684 a.extend([Indexable(ord('a'))])
685 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000686
Neal Norwitz6968b052007-02-27 19:02:19 +0000687 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000688 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000689 b.remove(ord('l'))
690 self.assertEqual(b, b'helo')
691 b.remove(ord('l'))
692 self.assertEqual(b, b'heo')
693 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
694 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000695 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000696 # remove first and last
697 b.remove(ord('o'))
698 b.remove(ord('h'))
699 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000700 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000701 b.remove(Indexable(ord('e')))
702 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +0000703
704 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000705 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000706 self.assertEqual(b.pop(), ord('d'))
707 self.assertEqual(b.pop(0), ord('w'))
708 self.assertEqual(b.pop(-2), ord('r'))
709 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000710 self.assertRaises(OverflowError, lambda: bytearray().pop())
Neal Norwitz6968b052007-02-27 19:02:19 +0000711
712 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000713 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000714
Neal Norwitz6968b052007-02-27 19:02:19 +0000715 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000716 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000717 b.append(ord('o'))
718 self.assertEqual(b, b'hello')
719 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000720 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000721 b.append(ord('A'))
722 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000723 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000724 b = bytearray()
725 b.append(Indexable(ord('A')))
726 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000727
728 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000729 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000730 b.insert(1, ord('i'))
731 b.insert(4, ord('i'))
732 b.insert(-2, ord('i'))
733 b.insert(1000, ord('i'))
734 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000735 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000736 b = bytearray()
737 b.insert(0, Indexable(ord('A')))
738 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000739
Guido van Rossum254348e2007-11-21 19:29:53 +0000740 def test_partition_bytearray_doesnt_share_nullstring(self):
741 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000742 self.assertEqual(b, b"")
743 self.assertEqual(c, b"")
744 self.assert_(b is not c)
745 b += b"!"
746 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000747 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000748 self.assertEqual(b, b"")
749 self.assertEqual(c, b"")
750 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000751 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000752 self.assertEqual(b, b"")
753 self.assertEqual(c, b"")
754 self.assert_(b is not c)
755 b += b"!"
756 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000757 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000758 self.assertEqual(b, b"")
759 self.assertEqual(c, b"")
760
761
Christian Heimes510711d2008-01-30 11:57:58 +0000762class AssortedBytesTest(unittest.TestCase):
763 #
764 # Test various combinations of bytes and bytearray
765 #
766
767 def setUp(self):
768 self.warning_filters = warnings.filters[:]
769
770 def tearDown(self):
771 warnings.filters = self.warning_filters
772
773 def test_repr_str(self):
774 warnings.simplefilter('ignore', BytesWarning)
775 for f in str, repr:
776 self.assertEqual(f(bytearray()), "bytearray(b'')")
777 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
778 self.assertEqual(f(bytearray([0, 1, 254, 255])),
779 "bytearray(b'\\x00\\x01\\xfe\\xff')")
780 self.assertEqual(f(b"abc"), "b'abc'")
781 self.assertEqual(f(b"'"), '''b"'"''') # '''
782 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
783
784 def test_compare_bytes_to_bytearray(self):
785 self.assertEqual(b"abc" == bytes(b"abc"), True)
786 self.assertEqual(b"ab" != bytes(b"abc"), True)
787 self.assertEqual(b"ab" <= bytes(b"abc"), True)
788 self.assertEqual(b"ab" < bytes(b"abc"), True)
789 self.assertEqual(b"abc" >= bytes(b"ab"), True)
790 self.assertEqual(b"abc" > bytes(b"ab"), True)
791
792 self.assertEqual(b"abc" != bytes(b"abc"), False)
793 self.assertEqual(b"ab" == bytes(b"abc"), False)
794 self.assertEqual(b"ab" > bytes(b"abc"), False)
795 self.assertEqual(b"ab" >= bytes(b"abc"), False)
796 self.assertEqual(b"abc" < bytes(b"ab"), False)
797 self.assertEqual(b"abc" <= bytes(b"ab"), False)
798
799 self.assertEqual(bytes(b"abc") == b"abc", True)
800 self.assertEqual(bytes(b"ab") != b"abc", True)
801 self.assertEqual(bytes(b"ab") <= b"abc", True)
802 self.assertEqual(bytes(b"ab") < b"abc", True)
803 self.assertEqual(bytes(b"abc") >= b"ab", True)
804 self.assertEqual(bytes(b"abc") > b"ab", True)
805
806 self.assertEqual(bytes(b"abc") != b"abc", False)
807 self.assertEqual(bytes(b"ab") == b"abc", False)
808 self.assertEqual(bytes(b"ab") > b"abc", False)
809 self.assertEqual(bytes(b"ab") >= b"abc", False)
810 self.assertEqual(bytes(b"abc") < b"ab", False)
811 self.assertEqual(bytes(b"abc") <= b"ab", False)
812
813 def test_doc(self):
814 self.failUnless(bytearray.__doc__ != None)
815 self.failUnless(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
816 self.failUnless(bytes.__doc__ != None)
817 self.failUnless(bytes.__doc__.startswith("bytes("), bytes.__doc__)
818
819 def test_from_bytearray(self):
820 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
821 buf = memoryview(sample)
822 b = bytearray(buf)
823 self.assertEqual(b, bytearray(sample))
824
825 def test_to_str(self):
826 warnings.simplefilter('ignore', BytesWarning)
827 self.assertEqual(str(b''), "b''")
828 self.assertEqual(str(b'x'), "b'x'")
829 self.assertEqual(str(b'\x80'), "b'\\x80'")
830 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
831 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
832 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
833
834 def test_literal(self):
835 tests = [
836 (b"Wonderful spam", "Wonderful spam"),
837 (br"Wonderful spam too", "Wonderful spam too"),
838 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
839 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
840 ]
841 for b, s in tests:
842 self.assertEqual(b, bytearray(s, 'latin-1'))
843 for c in range(128, 256):
844 self.assertRaises(SyntaxError, eval,
845 'b"%s"' % chr(c))
846
847 def test_translate(self):
848 b = b'hello'
849 rosetta = bytearray(range(0, 256))
850 rosetta[ord('o')] = ord('e')
851 c = b.translate(rosetta, b'l')
852 self.assertEqual(b, b'hello')
853 self.assertEqual(c, b'hee')
854
855 def test_split_bytearray(self):
856 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
857
858 def test_rsplit_bytearray(self):
859 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
860
Georg Brandleb2c9642008-05-30 12:05:02 +0000861 def test_return_self(self):
862 # bytearray.replace must always return a new bytearray
863 b = bytearray()
864 self.failIf(b.replace(b'', b'') is b)
865
Guido van Rossumd624f182006-04-24 13:47:05 +0000866 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000867 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000868 # __reversed__? (optimization)
869
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000870 # XXX More string methods? (Those that don't use character properties)
871
Neal Norwitz6968b052007-02-27 19:02:19 +0000872 # There are tests in string_tests.py that are more
873 # comprehensive for things like split, partition, etc.
874 # Unfortunately they are all bundled with tests that
875 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000876
Guido van Rossum254348e2007-11-21 19:29:53 +0000877 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000878 # the rest that make sense (the code can be cleaned up to use modern
879 # unittest methods at the same time).
880
Guido van Rossum254348e2007-11-21 19:29:53 +0000881class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000882 test.buffer_tests.MixinBytesBufferCommonTests):
883 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +0000884 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000885
886 def test_returns_new_copy(self):
887 val = self.marshal(b'1234')
888 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +0000889 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000890 for methname in ('zfill', 'rjust', 'ljust', 'center'):
891 method = getattr(val, methname)
892 newval = method(3)
893 self.assertEqual(val, newval)
894 self.assertTrue(val is not newval,
895 methname+' returned self on a mutable object')
896
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000897
Christian Heimes510711d2008-01-30 11:57:58 +0000898class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +0000899
Guido van Rossum9c627722007-08-27 18:31:48 +0000900 def fixtype(self, obj):
901 if isinstance(obj, str):
902 return obj.encode("utf-8")
903 return super().fixtype(obj)
904
Georg Brandlc7885542007-03-06 19:16:20 +0000905 # Currently the bytes containment testing uses a single integer
906 # value. This may not be the final design, but until then the
907 # bytes section with in a bytes containment not valid
908 def test_contains(self):
909 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000910 def test_expandtabs(self):
911 pass
912 def test_upper(self):
913 pass
914 def test_lower(self):
915 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000916
Christian Heimes510711d2008-01-30 11:57:58 +0000917class ByteArrayAsStringTest(FixedStringTest):
918 type2test = bytearray
919
920class BytesAsStringTest(FixedStringTest):
921 type2test = bytes
922
Georg Brandlc7885542007-03-06 19:16:20 +0000923
Guido van Rossum254348e2007-11-21 19:29:53 +0000924class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000925 pass
926
Guido van Rossum254348e2007-11-21 19:29:53 +0000927class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000928
929 def test_basic(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000930 self.assert_(issubclass(ByteArraySubclass, bytearray))
931 self.assert_(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000932
933 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +0000934 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000935
936 # test comparison operators with subclass instances
937 self.assert_(_a == _a)
938 self.assert_(_a != _b)
939 self.assert_(_a < _b)
940 self.assert_(_a <= _b)
941 self.assert_(_b >= _a)
942 self.assert_(_b > _a)
943 self.assert_(_a is not a)
944
945 # test concat of subclass instances
946 self.assertEqual(a + b, _a + _b)
947 self.assertEqual(a + b, a + _b)
948 self.assertEqual(a + b, _a + b)
949
950 # test repeat
951 self.assert_(a*5 == _a*5)
952
953 def test_join(self):
954 # Make sure join returns a NEW object for single item sequences
955 # involving a subclass.
956 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +0000957 s1 = ByteArraySubclass(b"abcd")
958 s2 = bytearray().join([s1])
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000959 self.assert_(s1 is not s2)
Guido van Rossum254348e2007-11-21 19:29:53 +0000960 self.assert_(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000961
962 # Test reverse, calling join on subclass
963 s3 = s1.join([b"abcd"])
Guido van Rossum254348e2007-11-21 19:29:53 +0000964 self.assert_(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000965
966 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000967 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000968 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000969 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000970 for proto in range(pickle.HIGHEST_PROTOCOL):
971 b = pickle.loads(pickle.dumps(a, proto))
972 self.assertNotEqual(id(a), id(b))
973 self.assertEqual(a, b)
974 self.assertEqual(a.x, b.x)
975 self.assertEqual(a.y, b.y)
976 self.assertEqual(type(a), type(b))
977 self.assertEqual(type(a.y), type(b.y))
978
979 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000980 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000981 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000982 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000983 for copy_method in (copy.copy, copy.deepcopy):
984 b = copy_method(a)
985 self.assertNotEqual(id(a), id(b))
986 self.assertEqual(a, b)
987 self.assertEqual(a.x, b.x)
988 self.assertEqual(a.y, b.y)
989 self.assertEqual(type(a), type(b))
990 self.assertEqual(type(a.y), type(b.y))
991
992 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000993 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000994 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +0000995 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000996 x = subclass(4, source=b"abcd")
997 self.assertEqual(x, b"abcd")
998 x = subclass(newarg=4, source=b"abcd")
999 self.assertEqual(x, b"abcd")
1000
1001
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001002def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001003 test.support.run_unittest(BytesTest)
1004 test.support.run_unittest(ByteArrayTest)
1005 test.support.run_unittest(AssortedBytesTest)
1006 test.support.run_unittest(BytesAsStringTest)
1007 test.support.run_unittest(ByteArrayAsStringTest)
1008 test.support.run_unittest(ByteArraySubclassTest)
1009 test.support.run_unittest(BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001010
1011if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001012 test_main()