blob: 30000bd9905aa6405b15bf0ba73cdc9e81cf0195 [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
Barry Warsaw9e9dcd62008-10-17 01:50:37 +000012import operator
Guido van Rossum0ad08122007-04-11 04:37:43 +000013import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000014import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000015import unittest
Guido van Rossum98297ee2007-11-06 21:34:58 +000016import warnings
Benjamin Petersonee8712c2008-05-20 21:35:26 +000017import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000018import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000019import test.buffer_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000020
Georg Brandl9a54d7c2008-07-16 23:15:30 +000021class Indexable:
22 def __init__(self, value=0):
23 self.value = value
24 def __index__(self):
25 return self.value
26
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000027
Christian Heimes510711d2008-01-30 11:57:58 +000028class BaseBytesTest(unittest.TestCase):
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000029
Guido van Rossum98297ee2007-11-06 21:34:58 +000030 def setUp(self):
31 self.warning_filters = warnings.filters[:]
32
33 def tearDown(self):
34 warnings.filters = self.warning_filters
35
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000036 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000037 b = self.type2test()
38 self.assertEqual(type(b), self.type2test)
39 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000040
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000041 def test_copy(self):
42 a = self.type2test(b"abcd")
43 for copy_method in (copy.copy, copy.deepcopy):
44 b = copy_method(a)
45 self.assertEqual(a, b)
46 self.assertEqual(type(a), type(b))
47
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000049 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000050 self.assertEqual(len(b), 0)
51 self.assertRaises(IndexError, lambda: b[0])
52 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000053 self.assertRaises(IndexError, lambda: b[sys.maxsize])
54 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000055 self.assertRaises(IndexError, lambda: b[10**100])
56 self.assertRaises(IndexError, lambda: b[-1])
57 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000058 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
59 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
60 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000061 self.assertRaises(IndexError, lambda: b[-10**100])
62
63 def test_from_list(self):
64 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000065 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000066 self.assertEqual(len(b), 256)
67 self.assertEqual(list(b), ints)
68
69 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000070 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
71 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000072 self.assertEqual(list(b), [0, 1, 254, 255])
Georg Brandl9a54d7c2008-07-16 23:15:30 +000073 self.assertRaises(ValueError, bytearray, [Indexable(-1)])
74 self.assertRaises(ValueError, bytearray, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000075
76 def test_from_ssize(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000077 self.assertEqual(bytearray(0), b'')
78 self.assertEqual(bytearray(1), b'\x00')
79 self.assertEqual(bytearray(5), b'\x00\x00\x00\x00\x00')
80 self.assertRaises(ValueError, bytearray, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000081
Guido van Rossum254348e2007-11-21 19:29:53 +000082 self.assertEqual(bytearray('0', 'ascii'), b'0')
83 self.assertEqual(bytearray(b'0'), b'0')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000084
85 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000086 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000087 class C:
88 pass
Christian Heimes510711d2008-01-30 11:57:58 +000089 self.assertRaises(TypeError, self.type2test, ["0"])
90 self.assertRaises(TypeError, self.type2test, [0.0])
91 self.assertRaises(TypeError, self.type2test, [None])
92 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000093
94 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000095 self.assertRaises(ValueError, self.type2test, [-1])
96 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
97 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
98 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
99 self.assertRaises(ValueError, self.type2test, [-10**100])
100 self.assertRaises(ValueError, self.type2test, [256])
101 self.assertRaises(ValueError, self.type2test, [257])
102 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
103 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
104 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000105
106 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000107 b1 = self.type2test([1, 2, 3])
108 b2 = self.type2test([1, 2, 3])
109 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000110
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000111 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000112 self.assertTrue(b2 != b3)
113 self.assertTrue(b1 <= b2)
114 self.assertTrue(b1 <= b3)
115 self.assertTrue(b1 < b3)
116 self.assertTrue(b1 >= b2)
117 self.assertTrue(b3 >= b2)
118 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000119
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000120 self.assertFalse(b1 != b2)
121 self.assertFalse(b2 == b3)
122 self.assertFalse(b1 > b2)
123 self.assertFalse(b1 > b3)
124 self.assertFalse(b1 >= b3)
125 self.assertFalse(b1 < b2)
126 self.assertFalse(b3 < b2)
127 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000128
Guido van Rossum343e97f2007-04-09 00:43:24 +0000129 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000130 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000131 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000132 # Test this for all expected byte orders and Unicode character sizes
Christian Heimes510711d2008-01-30 11:57:58 +0000133 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
134 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", False)
135 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
136 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", False)
137 self.assertEqual(self.type2test() == str(), False)
138 self.assertEqual(self.type2test() != str(), True)
139
140 def test_reversed(self):
141 input = list(map(ord, "Hello"))
142 b = self.type2test(input)
143 output = list(reversed(b))
144 input.reverse()
145 self.assertEqual(output, input)
146
147 def test_getslice(self):
148 def by(s):
149 return self.type2test(map(ord, s))
150 b = by("Hello, world")
151
152 self.assertEqual(b[:5], by("Hello"))
153 self.assertEqual(b[1:5], by("ello"))
154 self.assertEqual(b[5:7], by(", "))
155 self.assertEqual(b[7:], by("world"))
156 self.assertEqual(b[7:12], by("world"))
157 self.assertEqual(b[7:100], by("world"))
158
159 self.assertEqual(b[:-7], by("Hello"))
160 self.assertEqual(b[-11:-7], by("ello"))
161 self.assertEqual(b[-7:-5], by(", "))
162 self.assertEqual(b[-5:], by("world"))
163 self.assertEqual(b[-5:12], by("world"))
164 self.assertEqual(b[-5:100], by("world"))
165 self.assertEqual(b[-100:5], by("Hello"))
166
167 def test_extended_getslice(self):
168 # Test extended slicing by comparing with list slicing.
169 L = list(range(255))
170 b = self.type2test(L)
171 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
172 for start in indices:
173 for stop in indices:
174 # Skip step 0 (invalid)
175 for step in indices[1:]:
176 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
177
178 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000179 sample = "Hello world\n\u1234\u5678\u9abc"
Christian Heimes510711d2008-01-30 11:57:58 +0000180 for enc in ("utf8", "utf16"):
181 b = self.type2test(sample, enc)
182 self.assertEqual(b, self.type2test(sample.encode(enc)))
183 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
184 b = self.type2test(sample, "latin1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000185 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000186
187 def test_decode(self):
188 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
189 for enc in ("utf8", "utf16"):
190 b = self.type2test(sample, enc)
191 self.assertEqual(b.decode(enc), sample)
192 sample = "Hello world\n\x80\x81\xfe\xff"
193 b = self.type2test(sample, "latin1")
194 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
195 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
Benjamin Peterson308d6372009-09-18 21:42:35 +0000196 self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
197 "Hello world\n")
Christian Heimes510711d2008-01-30 11:57:58 +0000198
199 def test_from_int(self):
200 b = self.type2test(0)
201 self.assertEqual(b, self.type2test())
202 b = self.type2test(10)
203 self.assertEqual(b, self.type2test([0]*10))
204 b = self.type2test(10000)
205 self.assertEqual(b, self.type2test([0]*10000))
206
207 def test_concat(self):
208 b1 = self.type2test(b"abc")
209 b2 = self.type2test(b"def")
210 self.assertEqual(b1 + b2, b"abcdef")
211 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
212 self.assertEqual(bytes(b"def") + b1, b"defabc")
213 self.assertRaises(TypeError, lambda: b1 + "def")
214 self.assertRaises(TypeError, lambda: "abc" + b2)
215
216 def test_repeat(self):
217 for b in b"abc", self.type2test(b"abc"):
218 self.assertEqual(b * 3, b"abcabcabc")
219 self.assertEqual(b * 0, b"")
220 self.assertEqual(b * -1, b"")
221 self.assertRaises(TypeError, lambda: b * 3.14)
222 self.assertRaises(TypeError, lambda: 3.14 * b)
223 # XXX Shouldn't bytes and bytearray agree on what to raise?
224 self.assertRaises((OverflowError, MemoryError),
225 lambda: b * sys.maxsize)
226
227 def test_repeat_1char(self):
228 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
229
230 def test_contains(self):
231 b = self.type2test(b"abc")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000232 self.assertTrue(ord('a') in b)
233 self.assertTrue(int(ord('a')) in b)
234 self.assertFalse(200 in b)
235 self.assertFalse(200 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000236 self.assertRaises(ValueError, lambda: 300 in b)
237 self.assertRaises(ValueError, lambda: -1 in b)
238 self.assertRaises(TypeError, lambda: None in b)
239 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
240 self.assertRaises(TypeError, lambda: "a" in b)
241 for f in bytes, bytearray:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000242 self.assertTrue(f(b"") in b)
243 self.assertTrue(f(b"a") in b)
244 self.assertTrue(f(b"b") in b)
245 self.assertTrue(f(b"c") in b)
246 self.assertTrue(f(b"ab") in b)
247 self.assertTrue(f(b"bc") in b)
248 self.assertTrue(f(b"abc") in b)
249 self.assertFalse(f(b"ac") in b)
250 self.assertFalse(f(b"d") in b)
251 self.assertFalse(f(b"dab") in b)
252 self.assertFalse(f(b"abd") in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000253
254 def test_fromhex(self):
255 self.assertRaises(TypeError, self.type2test.fromhex)
256 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Christian Heimes4f066122008-01-30 15:02:52 +0000257 self.assertEquals(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000258 b = bytearray([0x1a, 0x2b, 0x30])
259 self.assertEquals(self.type2test.fromhex('1a2B30'), b)
260 self.assertEquals(self.type2test.fromhex(' 1A 2B 30 '), b)
261 self.assertEquals(self.type2test.fromhex('0000'), b'\0\0')
262 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
263 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
264 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
265 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
266 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
267 self.assertRaises(ValueError, self.type2test.fromhex, '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
280 def test_index(self):
281 b = self.type2test(b'parrot')
282 self.assertEqual(b.index('p'), 0)
283 self.assertEqual(b.index('rr'), 2)
284 self.assertEqual(b.index('t'), 5)
285 self.assertRaises(ValueError, lambda: b.index('w'))
286
287 def test_count(self):
288 b = self.type2test(b'mississippi')
289 self.assertEqual(b.count(b'i'), 4)
290 self.assertEqual(b.count(b'ss'), 2)
291 self.assertEqual(b.count(b'w'), 0)
292
293 def test_startswith(self):
294 b = self.type2test(b'hello')
295 self.assertFalse(self.type2test().startswith(b"anything"))
296 self.assertTrue(b.startswith(b"hello"))
297 self.assertTrue(b.startswith(b"hel"))
298 self.assertTrue(b.startswith(b"h"))
299 self.assertFalse(b.startswith(b"hellow"))
300 self.assertFalse(b.startswith(b"ha"))
301
302 def test_endswith(self):
303 b = self.type2test(b'hello')
304 self.assertFalse(bytearray().endswith(b"anything"))
305 self.assertTrue(b.endswith(b"hello"))
306 self.assertTrue(b.endswith(b"llo"))
307 self.assertTrue(b.endswith(b"o"))
308 self.assertFalse(b.endswith(b"whello"))
309 self.assertFalse(b.endswith(b"no"))
310
311 def test_find(self):
312 b = self.type2test(b'mississippi')
313 self.assertEqual(b.find(b'ss'), 2)
314 self.assertEqual(b.find(b'ss', 3), 5)
315 self.assertEqual(b.find(b'ss', 1, 7), 2)
316 self.assertEqual(b.find(b'ss', 1, 3), -1)
317 self.assertEqual(b.find(b'w'), -1)
318 self.assertEqual(b.find(b'mississippian'), -1)
319
320 def test_rfind(self):
321 b = self.type2test(b'mississippi')
322 self.assertEqual(b.rfind(b'ss'), 5)
323 self.assertEqual(b.rfind(b'ss', 3), 5)
324 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
325 self.assertEqual(b.rfind(b'w'), -1)
326 self.assertEqual(b.rfind(b'mississippian'), -1)
327
328 def test_index(self):
329 b = self.type2test(b'world')
330 self.assertEqual(b.index(b'w'), 0)
331 self.assertEqual(b.index(b'orl'), 1)
332 self.assertRaises(ValueError, b.index, b'worm')
333 self.assertRaises(ValueError, b.index, b'ldo')
334
335 def test_rindex(self):
336 # XXX could be more rigorous
337 b = self.type2test(b'world')
338 self.assertEqual(b.rindex(b'w'), 0)
339 self.assertEqual(b.rindex(b'orl'), 1)
340 self.assertRaises(ValueError, b.rindex, b'worm')
341 self.assertRaises(ValueError, b.rindex, b'ldo')
342
343 def test_replace(self):
344 b = self.type2test(b'mississippi')
345 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
346 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
347
348 def test_split(self):
349 b = self.type2test(b'mississippi')
350 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
351 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
352 self.assertEqual(b.split(b'w'), [b])
353
354 def test_split_whitespace(self):
355 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
356 b'arf\fbarf', b'arf\vbarf'):
357 b = self.type2test(b)
358 self.assertEqual(b.split(), [b'arf', b'barf'])
359 self.assertEqual(b.split(None), [b'arf', b'barf'])
360 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
361 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
362 b = self.type2test(b)
363 self.assertEqual(b.split(), [b])
364 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
365 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
366 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
367 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
368
369 def test_split_string_error(self):
370 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
371
372 def test_rsplit(self):
373 b = self.type2test(b'mississippi')
374 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
375 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
376 self.assertEqual(b.rsplit(b'w'), [b])
377
378 def test_rsplit_whitespace(self):
379 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
380 b'arf\fbarf', b'arf\vbarf'):
381 b = self.type2test(b)
382 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
383 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
384 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
385 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
386 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
387 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
388 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
389
390 def test_rsplit_string_error(self):
391 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
392
393 def test_rsplit_unicodewhitespace(self):
394 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
395 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
396 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
397
398 def test_partition(self):
399 b = self.type2test(b'mississippi')
400 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
401 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
402
403 def test_rpartition(self):
404 b = self.type2test(b'mississippi')
405 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
406 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
407
408 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000409 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000410 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
411 b = self.type2test(b)
412 ps = pickle.dumps(b, proto)
413 q = pickle.loads(ps)
414 self.assertEqual(b, q)
415
416 def test_strip(self):
417 b = self.type2test(b'mississippi')
418 self.assertEqual(b.strip(b'i'), b'mississipp')
419 self.assertEqual(b.strip(b'm'), b'ississippi')
420 self.assertEqual(b.strip(b'pi'), b'mississ')
421 self.assertEqual(b.strip(b'im'), b'ssissipp')
422 self.assertEqual(b.strip(b'pim'), b'ssiss')
423 self.assertEqual(b.strip(b), b'')
424
425 def test_lstrip(self):
426 b = self.type2test(b'mississippi')
427 self.assertEqual(b.lstrip(b'i'), b'mississippi')
428 self.assertEqual(b.lstrip(b'm'), b'ississippi')
429 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
430 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
431 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
432
433 def test_rstrip(self):
434 b = self.type2test(b'mississippi')
435 self.assertEqual(b.rstrip(b'i'), b'mississipp')
436 self.assertEqual(b.rstrip(b'm'), b'mississippi')
437 self.assertEqual(b.rstrip(b'pi'), b'mississ')
438 self.assertEqual(b.rstrip(b'im'), b'mississipp')
439 self.assertEqual(b.rstrip(b'pim'), b'mississ')
440
441 def test_strip_whitespace(self):
442 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
443 self.assertEqual(b.strip(), b'abc')
444 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
445 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
446
447 def test_strip_bytearray(self):
448 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
449 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
450 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
451
452 def test_strip_string_error(self):
453 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
454 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
455 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
456
457 def test_ord(self):
458 b = self.type2test(b'\0A\x7f\x80\xff')
459 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
460 [0, 65, 127, 128, 255])
461
Georg Brandlabc38772009-04-12 15:51:51 +0000462 def test_maketrans(self):
463 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
Georg Brandlabc38772009-04-12 15:51:51 +0000464 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000465 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
466 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000467 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
468 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
469
Christian Heimes510711d2008-01-30 11:57:58 +0000470
471class BytesTest(BaseBytesTest):
472 type2test = bytes
473
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000474 def test_buffer_is_readonly(self):
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000475 fd = os.dup(sys.stdin.fileno())
476 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000477 self.assertRaises(TypeError, f.readinto, b"")
478
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000479 def test_custom(self):
480 class A:
481 def __bytes__(self):
482 return b'abc'
483 self.assertEqual(bytes(A()), b'abc')
484 class A: pass
485 self.assertRaises(TypeError, bytes, A())
486 class A:
487 def __bytes__(self):
488 return None
489 self.assertRaises(TypeError, bytes, A())
490
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000491
Christian Heimes510711d2008-01-30 11:57:58 +0000492class ByteArrayTest(BaseBytesTest):
493 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000494
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000495 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000496 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000497
Guido van Rossum254348e2007-11-21 19:29:53 +0000498 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000499 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000500 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000501 tfn = tempfile.mktemp()
502 try:
503 # Prepare
504 with open(tfn, "wb") as f:
505 f.write(short_sample)
506 # Test readinto
507 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000508 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000509 n = f.readinto(b)
510 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000511 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000512 # Test writing in binary mode
513 with open(tfn, "wb") as f:
514 f.write(b)
515 with open(tfn, "rb") as f:
516 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000517 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000518 finally:
519 try:
520 os.remove(tfn)
521 except os.error:
522 pass
523
Neal Norwitz6968b052007-02-27 19:02:19 +0000524 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000525 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000526 self.assertEqual(b.reverse(), None)
527 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000528 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000529 b.reverse()
530 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000531 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000532 b.reverse()
533 self.assertFalse(b)
534
Guido van Rossumd624f182006-04-24 13:47:05 +0000535 def test_regexps(self):
536 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000537 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000538 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000539 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000540
541 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000542 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000543 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000544 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000545 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000546 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000547 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000548 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000549 try:
550 b[3] = 0
551 self.fail("Didn't raise IndexError")
552 except IndexError:
553 pass
554 try:
555 b[-10] = 0
556 self.fail("Didn't raise IndexError")
557 except IndexError:
558 pass
559 try:
560 b[0] = 256
561 self.fail("Didn't raise ValueError")
562 except ValueError:
563 pass
564 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000565 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000566 self.fail("Didn't raise ValueError")
567 except ValueError:
568 pass
569 try:
570 b[0] = None
571 self.fail("Didn't raise TypeError")
572 except TypeError:
573 pass
574
575 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000576 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000577 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000578 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000579 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000580 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000581 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000582 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000583
584 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000585 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000586 self.assertEqual(list(b), list(range(10)))
587
Guido van Rossum254348e2007-11-21 19:29:53 +0000588 b[0:5] = bytearray([1, 1, 1, 1, 1])
589 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000590
591 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000592 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000593
Guido van Rossum254348e2007-11-21 19:29:53 +0000594 b[0:0] = bytearray([0, 1, 2, 3, 4])
595 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000596
Guido van Rossum254348e2007-11-21 19:29:53 +0000597 b[-7:-3] = bytearray([100, 101])
598 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000599
600 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000601 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000602
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000603 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000604 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 +0000605
Thomas Wouters376446d2006-12-19 08:30:14 +0000606 def test_extended_set_del_slice(self):
607 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
608 for start in indices:
609 for stop in indices:
610 # Skip invalid step 0
611 for step in indices[1:]:
612 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000613 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000614 # Make sure we have a slice of exactly the right length,
615 # but with different data.
616 data = L[start:stop:step]
617 data.reverse()
618 L[start:stop:step] = data
619 b[start:stop:step] = data
Guido van Rossum254348e2007-11-21 19:29:53 +0000620 self.assertEquals(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000621
Thomas Wouters376446d2006-12-19 08:30:14 +0000622 del L[start:stop:step]
623 del b[start:stop:step]
Guido van Rossum254348e2007-11-21 19:29:53 +0000624 self.assertEquals(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000625
Guido van Rossumd624f182006-04-24 13:47:05 +0000626 def test_setslice_trap(self):
627 # This test verifies that we correctly handle assigning self
628 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000629 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000630 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000631 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000632
Guido van Rossum13e57212006-04-27 22:54:26 +0000633 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000634 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000635 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000636 b += b"def"
637 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000638 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000639 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000640 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000641 self.assertEqual(b, b"abcdefxyz")
642 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000643 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000644 except TypeError:
645 pass
646 else:
647 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000648
649 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000650 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000651 b1 = b
652 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000653 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000654 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000655 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000656
657 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000658 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000659 b1 = b
660 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000661 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000662 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000663 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000664
Guido van Rossum20188312006-05-05 15:15:40 +0000665 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000666 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000667 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000668 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +0000669 seq = [alloc]
670 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000671 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000672 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000673 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +0000674 if alloc not in seq:
675 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000676
Neal Norwitz6968b052007-02-27 19:02:19 +0000677 def test_extend(self):
678 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000679 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000680 a.extend(a)
681 self.assertEqual(a, orig + orig)
682 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000683 a = bytearray(b'')
684 # Test iterators that don't have a __length_hint__
685 a.extend(map(int, orig * 25))
686 a.extend(int(x) for x in orig * 25)
687 self.assertEqual(a, orig * 50)
688 self.assertEqual(a[-5:], orig)
689 a = bytearray(b'')
690 a.extend(iter(map(int, orig * 50)))
691 self.assertEqual(a, orig * 50)
692 self.assertEqual(a[-5:], orig)
693 a = bytearray(b'')
694 a.extend(list(map(int, orig * 50)))
695 self.assertEqual(a, orig * 50)
696 self.assertEqual(a[-5:], orig)
697 a = bytearray(b'')
698 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
699 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
700 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000701 a = bytearray(b'')
702 a.extend([Indexable(ord('a'))])
703 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000704
Neal Norwitz6968b052007-02-27 19:02:19 +0000705 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000706 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000707 b.remove(ord('l'))
708 self.assertEqual(b, b'helo')
709 b.remove(ord('l'))
710 self.assertEqual(b, b'heo')
711 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
712 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000713 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000714 # remove first and last
715 b.remove(ord('o'))
716 b.remove(ord('h'))
717 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000718 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000719 b.remove(Indexable(ord('e')))
720 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +0000721
722 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000723 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000724 self.assertEqual(b.pop(), ord('d'))
725 self.assertEqual(b.pop(0), ord('w'))
726 self.assertEqual(b.pop(-2), ord('r'))
727 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000728 self.assertRaises(OverflowError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +0000729 # test for issue #6846
730 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +0000731
732 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000733 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000734
Neal Norwitz6968b052007-02-27 19:02:19 +0000735 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000736 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000737 b.append(ord('o'))
738 self.assertEqual(b, b'hello')
739 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000740 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000741 b.append(ord('A'))
742 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000743 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000744 b = bytearray()
745 b.append(Indexable(ord('A')))
746 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000747
748 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000749 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000750 b.insert(1, ord('i'))
751 b.insert(4, ord('i'))
752 b.insert(-2, ord('i'))
753 b.insert(1000, ord('i'))
754 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000755 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000756 b = bytearray()
757 b.insert(0, Indexable(ord('A')))
758 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000759
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000760 def test_copied(self):
761 # Issue 4348. Make sure that operations that don't mutate the array
762 # copy the bytes.
763 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +0000764 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000765
766 t = bytearray([i for i in range(256)])
767 x = bytearray(b'')
768 self.assertFalse(x is x.translate(t))
769
Guido van Rossum254348e2007-11-21 19:29:53 +0000770 def test_partition_bytearray_doesnt_share_nullstring(self):
771 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000772 self.assertEqual(b, b"")
773 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000774 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000775 b += b"!"
776 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000777 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000778 self.assertEqual(b, b"")
779 self.assertEqual(c, b"")
780 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000781 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000782 self.assertEqual(b, b"")
783 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000784 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000785 b += b"!"
786 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000787 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000788 self.assertEqual(b, b"")
789 self.assertEqual(c, b"")
790
Antoine Pitrou5504e892008-12-06 21:27:53 +0000791 def test_resize_forbidden(self):
792 # #4509: can't resize a bytearray when there are buffer exports, even
793 # if it wouldn't reallocate the underlying buffer.
794 # Furthermore, no destructive changes to the buffer may be applied
795 # before raising the error.
796 b = bytearray(range(10))
797 v = memoryview(b)
798 def resize(n):
799 b[1:-1] = range(n + 1, 2*n - 1)
800 resize(10)
801 orig = b[:]
802 self.assertRaises(BufferError, resize, 11)
803 self.assertEquals(b, orig)
804 self.assertRaises(BufferError, resize, 9)
805 self.assertEquals(b, orig)
806 self.assertRaises(BufferError, resize, 0)
807 self.assertEquals(b, orig)
808 # Other operations implying resize
809 self.assertRaises(BufferError, b.pop, 0)
810 self.assertEquals(b, orig)
811 self.assertRaises(BufferError, b.remove, b[1])
812 self.assertEquals(b, orig)
813 def delitem():
814 del b[1]
815 self.assertRaises(BufferError, delitem)
816 self.assertEquals(b, orig)
817 # deleting a non-contiguous slice
818 def delslice():
819 b[1:-1:2] = b""
820 self.assertRaises(BufferError, delslice)
821 self.assertEquals(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000822
Christian Heimes510711d2008-01-30 11:57:58 +0000823class AssortedBytesTest(unittest.TestCase):
824 #
825 # Test various combinations of bytes and bytearray
826 #
827
828 def setUp(self):
829 self.warning_filters = warnings.filters[:]
830
831 def tearDown(self):
832 warnings.filters = self.warning_filters
833
834 def test_repr_str(self):
835 warnings.simplefilter('ignore', BytesWarning)
836 for f in str, repr:
837 self.assertEqual(f(bytearray()), "bytearray(b'')")
838 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
839 self.assertEqual(f(bytearray([0, 1, 254, 255])),
840 "bytearray(b'\\x00\\x01\\xfe\\xff')")
841 self.assertEqual(f(b"abc"), "b'abc'")
842 self.assertEqual(f(b"'"), '''b"'"''') # '''
843 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
844
845 def test_compare_bytes_to_bytearray(self):
846 self.assertEqual(b"abc" == bytes(b"abc"), True)
847 self.assertEqual(b"ab" != bytes(b"abc"), True)
848 self.assertEqual(b"ab" <= bytes(b"abc"), True)
849 self.assertEqual(b"ab" < bytes(b"abc"), True)
850 self.assertEqual(b"abc" >= bytes(b"ab"), True)
851 self.assertEqual(b"abc" > bytes(b"ab"), True)
852
853 self.assertEqual(b"abc" != bytes(b"abc"), False)
854 self.assertEqual(b"ab" == bytes(b"abc"), False)
855 self.assertEqual(b"ab" > bytes(b"abc"), False)
856 self.assertEqual(b"ab" >= bytes(b"abc"), False)
857 self.assertEqual(b"abc" < bytes(b"ab"), False)
858 self.assertEqual(b"abc" <= bytes(b"ab"), False)
859
860 self.assertEqual(bytes(b"abc") == b"abc", True)
861 self.assertEqual(bytes(b"ab") != b"abc", True)
862 self.assertEqual(bytes(b"ab") <= b"abc", True)
863 self.assertEqual(bytes(b"ab") < b"abc", True)
864 self.assertEqual(bytes(b"abc") >= b"ab", True)
865 self.assertEqual(bytes(b"abc") > b"ab", True)
866
867 self.assertEqual(bytes(b"abc") != b"abc", False)
868 self.assertEqual(bytes(b"ab") == b"abc", False)
869 self.assertEqual(bytes(b"ab") > b"abc", False)
870 self.assertEqual(bytes(b"ab") >= b"abc", False)
871 self.assertEqual(bytes(b"abc") < b"ab", False)
872 self.assertEqual(bytes(b"abc") <= b"ab", False)
873
874 def test_doc(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000875 self.assertTrue(bytearray.__doc__ != None)
876 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
877 self.assertTrue(bytes.__doc__ != None)
878 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +0000879
880 def test_from_bytearray(self):
881 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
882 buf = memoryview(sample)
883 b = bytearray(buf)
884 self.assertEqual(b, bytearray(sample))
885
886 def test_to_str(self):
887 warnings.simplefilter('ignore', BytesWarning)
888 self.assertEqual(str(b''), "b''")
889 self.assertEqual(str(b'x'), "b'x'")
890 self.assertEqual(str(b'\x80'), "b'\\x80'")
891 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
892 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
893 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
894
895 def test_literal(self):
896 tests = [
897 (b"Wonderful spam", "Wonderful spam"),
898 (br"Wonderful spam too", "Wonderful spam too"),
899 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
900 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
901 ]
902 for b, s in tests:
903 self.assertEqual(b, bytearray(s, 'latin-1'))
904 for c in range(128, 256):
905 self.assertRaises(SyntaxError, eval,
906 'b"%s"' % chr(c))
907
908 def test_translate(self):
909 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +0000910 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +0000911 rosetta = bytearray(range(0, 256))
912 rosetta[ord('o')] = ord('e')
913 c = b.translate(rosetta, b'l')
914 self.assertEqual(b, b'hello')
915 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +0000916 c = ba.translate(rosetta, b'l')
917 self.assertEqual(ba, b'hello')
918 self.assertEqual(c, b'hee')
919 c = b.translate(None, b'e')
920 self.assertEqual(c, b'hllo')
921 c = ba.translate(None, b'e')
922 self.assertEqual(c, b'hllo')
923 self.assertRaises(TypeError, b.translate, None, None)
924 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +0000925
926 def test_split_bytearray(self):
927 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
928
929 def test_rsplit_bytearray(self):
930 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
931
Georg Brandleb2c9642008-05-30 12:05:02 +0000932 def test_return_self(self):
933 # bytearray.replace must always return a new bytearray
934 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000935 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +0000936
Barry Warsaw9e9dcd62008-10-17 01:50:37 +0000937 def test_compare(self):
938 if sys.flags.bytes_warning:
939 warnings.simplefilter('error', BytesWarning)
940 self.assertRaises(BytesWarning, operator.eq, b'', '')
941 self.assertRaises(BytesWarning, operator.ne, b'', '')
942 self.assertRaises(BytesWarning, operator.eq, bytearray(b''), '')
943 self.assertRaises(BytesWarning, operator.ne, bytearray(b''), '')
944 else:
Antoine Pitrouc9e92162009-11-01 15:59:11 +0000945 # self.skipTest("BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +0000946 pass
947
Guido van Rossumd624f182006-04-24 13:47:05 +0000948 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000949 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000950 # __reversed__? (optimization)
951
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000952 # XXX More string methods? (Those that don't use character properties)
953
Neal Norwitz6968b052007-02-27 19:02:19 +0000954 # There are tests in string_tests.py that are more
955 # comprehensive for things like split, partition, etc.
956 # Unfortunately they are all bundled with tests that
957 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000958
Guido van Rossum254348e2007-11-21 19:29:53 +0000959 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000960 # the rest that make sense (the code can be cleaned up to use modern
961 # unittest methods at the same time).
962
Guido van Rossum254348e2007-11-21 19:29:53 +0000963class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000964 test.buffer_tests.MixinBytesBufferCommonTests):
965 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +0000966 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000967
968 def test_returns_new_copy(self):
969 val = self.marshal(b'1234')
970 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +0000971 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000972 for methname in ('zfill', 'rjust', 'ljust', 'center'):
973 method = getattr(val, methname)
974 newval = method(3)
975 self.assertEqual(val, newval)
976 self.assertTrue(val is not newval,
977 methname+' returned self on a mutable object')
978
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000979
Christian Heimes510711d2008-01-30 11:57:58 +0000980class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +0000981
Guido van Rossum9c627722007-08-27 18:31:48 +0000982 def fixtype(self, obj):
983 if isinstance(obj, str):
984 return obj.encode("utf-8")
985 return super().fixtype(obj)
986
Georg Brandlc7885542007-03-06 19:16:20 +0000987 # Currently the bytes containment testing uses a single integer
988 # value. This may not be the final design, but until then the
989 # bytes section with in a bytes containment not valid
990 def test_contains(self):
991 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000992 def test_expandtabs(self):
993 pass
994 def test_upper(self):
995 pass
996 def test_lower(self):
997 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000998
Christian Heimes510711d2008-01-30 11:57:58 +0000999class ByteArrayAsStringTest(FixedStringTest):
1000 type2test = bytearray
1001
1002class BytesAsStringTest(FixedStringTest):
1003 type2test = bytes
1004
Georg Brandlc7885542007-03-06 19:16:20 +00001005
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001006class SubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001007
1008 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001009 self.assertTrue(issubclass(self.subclass2test, self.type2test))
1010 self.assertTrue(isinstance(self.subclass2test(), self.type2test))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001011
1012 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001013 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001014
1015 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001016 self.assertTrue(_a == _a)
1017 self.assertTrue(_a != _b)
1018 self.assertTrue(_a < _b)
1019 self.assertTrue(_a <= _b)
1020 self.assertTrue(_b >= _a)
1021 self.assertTrue(_b > _a)
1022 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001023
1024 # test concat of subclass instances
1025 self.assertEqual(a + b, _a + _b)
1026 self.assertEqual(a + b, a + _b)
1027 self.assertEqual(a + b, _a + b)
1028
1029 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001030 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001031
1032 def test_join(self):
1033 # Make sure join returns a NEW object for single item sequences
1034 # involving a subclass.
1035 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001036 s1 = self.subclass2test(b"abcd")
1037 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001038 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001039 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001040
1041 # Test reverse, calling join on subclass
1042 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001043 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001044
1045 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001046 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001047 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001048 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001049 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001050 b = pickle.loads(pickle.dumps(a, proto))
1051 self.assertNotEqual(id(a), id(b))
1052 self.assertEqual(a, b)
1053 self.assertEqual(a.x, b.x)
1054 self.assertEqual(a.y, b.y)
1055 self.assertEqual(type(a), type(b))
1056 self.assertEqual(type(a.y), type(b.y))
1057
1058 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001059 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001060 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001061 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001062 for copy_method in (copy.copy, copy.deepcopy):
1063 b = copy_method(a)
1064 self.assertNotEqual(id(a), id(b))
1065 self.assertEqual(a, b)
1066 self.assertEqual(a.x, b.x)
1067 self.assertEqual(a.y, b.y)
1068 self.assertEqual(type(a), type(b))
1069 self.assertEqual(type(a.y), type(b.y))
1070
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001071
1072class ByteArraySubclass(bytearray):
1073 pass
1074
1075class BytesSubclass(bytes):
1076 pass
1077
1078class ByteArraySubclassTest(SubclassTest):
1079 type2test = bytearray
1080 subclass2test = ByteArraySubclass
1081
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001082 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001083 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001084 def __init__(me, newarg=1, *args, **kwargs):
1085 bytearray.__init__(me, *args, **kwargs)
1086 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001087 x = subclass(4, source=b"abcd")
1088 self.assertEqual(x, b"abcd")
1089 x = subclass(newarg=4, source=b"abcd")
1090 self.assertEqual(x, b"abcd")
1091
1092
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001093class BytesSubclassTest(SubclassTest):
1094 type2test = bytes
1095 subclass2test = BytesSubclass
1096
1097
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001098def test_main():
Antoine Pitrou403ce782009-10-14 17:14:16 +00001099 test.support.run_unittest(
1100 BytesTest, AssortedBytesTest, BytesAsStringTest,
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001101 ByteArrayTest, ByteArrayAsStringTest, BytesSubclassTest,
1102 ByteArraySubclassTest, BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001103
1104if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001105 test_main()