blob: e39b9ead83318ccbe3a6fb908eae14fc367f92d5 [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
41 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000042 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043 self.assertEqual(len(b), 0)
44 self.assertRaises(IndexError, lambda: b[0])
45 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000046 self.assertRaises(IndexError, lambda: b[sys.maxsize])
47 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048 self.assertRaises(IndexError, lambda: b[10**100])
49 self.assertRaises(IndexError, lambda: b[-1])
50 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000051 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
52 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
53 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000054 self.assertRaises(IndexError, lambda: b[-10**100])
55
56 def test_from_list(self):
57 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000058 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000059 self.assertEqual(len(b), 256)
60 self.assertEqual(list(b), ints)
61
62 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000063 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
64 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000065 self.assertEqual(list(b), [0, 1, 254, 255])
Georg Brandl9a54d7c2008-07-16 23:15:30 +000066 self.assertRaises(ValueError, bytearray, [Indexable(-1)])
67 self.assertRaises(ValueError, bytearray, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000068
69 def test_from_ssize(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000070 self.assertEqual(bytearray(0), b'')
71 self.assertEqual(bytearray(1), b'\x00')
72 self.assertEqual(bytearray(5), b'\x00\x00\x00\x00\x00')
73 self.assertRaises(ValueError, bytearray, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000074
Guido van Rossum254348e2007-11-21 19:29:53 +000075 self.assertEqual(bytearray('0', 'ascii'), b'0')
76 self.assertEqual(bytearray(b'0'), b'0')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000077
78 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000079 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000080 class C:
81 pass
Christian Heimes510711d2008-01-30 11:57:58 +000082 self.assertRaises(TypeError, self.type2test, ["0"])
83 self.assertRaises(TypeError, self.type2test, [0.0])
84 self.assertRaises(TypeError, self.type2test, [None])
85 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000086
87 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000088 self.assertRaises(ValueError, self.type2test, [-1])
89 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
90 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
91 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
92 self.assertRaises(ValueError, self.type2test, [-10**100])
93 self.assertRaises(ValueError, self.type2test, [256])
94 self.assertRaises(ValueError, self.type2test, [257])
95 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
96 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
97 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000098
99 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000100 b1 = self.type2test([1, 2, 3])
101 b2 = self.type2test([1, 2, 3])
102 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000103
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000104 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000105 self.assertTrue(b2 != b3)
106 self.assertTrue(b1 <= b2)
107 self.assertTrue(b1 <= b3)
108 self.assertTrue(b1 < b3)
109 self.assertTrue(b1 >= b2)
110 self.assertTrue(b3 >= b2)
111 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000112
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000113 self.assertFalse(b1 != b2)
114 self.assertFalse(b2 == b3)
115 self.assertFalse(b1 > b2)
116 self.assertFalse(b1 > b3)
117 self.assertFalse(b1 >= b3)
118 self.assertFalse(b1 < b2)
119 self.assertFalse(b3 < b2)
120 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000121
Guido van Rossum343e97f2007-04-09 00:43:24 +0000122 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000123 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000124 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000125 # Test this for all expected byte orders and Unicode character sizes
Christian Heimes510711d2008-01-30 11:57:58 +0000126 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
127 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", False)
128 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
129 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", False)
130 self.assertEqual(self.type2test() == str(), False)
131 self.assertEqual(self.type2test() != str(), True)
132
133 def test_reversed(self):
134 input = list(map(ord, "Hello"))
135 b = self.type2test(input)
136 output = list(reversed(b))
137 input.reverse()
138 self.assertEqual(output, input)
139
140 def test_getslice(self):
141 def by(s):
142 return self.type2test(map(ord, s))
143 b = by("Hello, world")
144
145 self.assertEqual(b[:5], by("Hello"))
146 self.assertEqual(b[1:5], by("ello"))
147 self.assertEqual(b[5:7], by(", "))
148 self.assertEqual(b[7:], by("world"))
149 self.assertEqual(b[7:12], by("world"))
150 self.assertEqual(b[7:100], by("world"))
151
152 self.assertEqual(b[:-7], by("Hello"))
153 self.assertEqual(b[-11:-7], by("ello"))
154 self.assertEqual(b[-7:-5], by(", "))
155 self.assertEqual(b[-5:], by("world"))
156 self.assertEqual(b[-5:12], by("world"))
157 self.assertEqual(b[-5:100], by("world"))
158 self.assertEqual(b[-100:5], by("Hello"))
159
160 def test_extended_getslice(self):
161 # Test extended slicing by comparing with list slicing.
162 L = list(range(255))
163 b = self.type2test(L)
164 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
165 for start in indices:
166 for stop in indices:
167 # Skip step 0 (invalid)
168 for step in indices[1:]:
169 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
170
171 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000172 sample = "Hello world\n\u1234\u5678\u9abc"
Christian Heimes510711d2008-01-30 11:57:58 +0000173 for enc in ("utf8", "utf16"):
174 b = self.type2test(sample, enc)
175 self.assertEqual(b, self.type2test(sample.encode(enc)))
176 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
177 b = self.type2test(sample, "latin1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000178 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000179
180 def test_decode(self):
181 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
182 for enc in ("utf8", "utf16"):
183 b = self.type2test(sample, enc)
184 self.assertEqual(b.decode(enc), sample)
185 sample = "Hello world\n\x80\x81\xfe\xff"
186 b = self.type2test(sample, "latin1")
187 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
188 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
Benjamin Peterson308d6372009-09-18 21:42:35 +0000189 self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
190 "Hello world\n")
Christian Heimes510711d2008-01-30 11:57:58 +0000191
192 def test_from_int(self):
193 b = self.type2test(0)
194 self.assertEqual(b, self.type2test())
195 b = self.type2test(10)
196 self.assertEqual(b, self.type2test([0]*10))
197 b = self.type2test(10000)
198 self.assertEqual(b, self.type2test([0]*10000))
199
200 def test_concat(self):
201 b1 = self.type2test(b"abc")
202 b2 = self.type2test(b"def")
203 self.assertEqual(b1 + b2, b"abcdef")
204 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
205 self.assertEqual(bytes(b"def") + b1, b"defabc")
206 self.assertRaises(TypeError, lambda: b1 + "def")
207 self.assertRaises(TypeError, lambda: "abc" + b2)
208
209 def test_repeat(self):
210 for b in b"abc", self.type2test(b"abc"):
211 self.assertEqual(b * 3, b"abcabcabc")
212 self.assertEqual(b * 0, b"")
213 self.assertEqual(b * -1, b"")
214 self.assertRaises(TypeError, lambda: b * 3.14)
215 self.assertRaises(TypeError, lambda: 3.14 * b)
216 # XXX Shouldn't bytes and bytearray agree on what to raise?
217 self.assertRaises((OverflowError, MemoryError),
218 lambda: b * sys.maxsize)
219
220 def test_repeat_1char(self):
221 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
222
223 def test_contains(self):
224 b = self.type2test(b"abc")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000225 self.assertTrue(ord('a') in b)
226 self.assertTrue(int(ord('a')) in b)
227 self.assertFalse(200 in b)
228 self.assertFalse(200 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000229 self.assertRaises(ValueError, lambda: 300 in b)
230 self.assertRaises(ValueError, lambda: -1 in b)
231 self.assertRaises(TypeError, lambda: None in b)
232 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
233 self.assertRaises(TypeError, lambda: "a" in b)
234 for f in bytes, bytearray:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000235 self.assertTrue(f(b"") in b)
236 self.assertTrue(f(b"a") in b)
237 self.assertTrue(f(b"b") in b)
238 self.assertTrue(f(b"c") in b)
239 self.assertTrue(f(b"ab") in b)
240 self.assertTrue(f(b"bc") in b)
241 self.assertTrue(f(b"abc") in b)
242 self.assertFalse(f(b"ac") in b)
243 self.assertFalse(f(b"d") in b)
244 self.assertFalse(f(b"dab") in b)
245 self.assertFalse(f(b"abd") in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000246
247 def test_fromhex(self):
248 self.assertRaises(TypeError, self.type2test.fromhex)
249 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Christian Heimes4f066122008-01-30 15:02:52 +0000250 self.assertEquals(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000251 b = bytearray([0x1a, 0x2b, 0x30])
252 self.assertEquals(self.type2test.fromhex('1a2B30'), b)
253 self.assertEquals(self.type2test.fromhex(' 1A 2B 30 '), b)
254 self.assertEquals(self.type2test.fromhex('0000'), b'\0\0')
255 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
256 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
257 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
258 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
259 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
260 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
261
262 def test_join(self):
263 self.assertEqual(self.type2test(b"").join([]), b"")
264 self.assertEqual(self.type2test(b"").join([b""]), b"")
265 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
266 lst = list(map(self.type2test, lst))
267 self.assertEqual(self.type2test(b"").join(lst), b"abc")
268 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
269 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
270 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
271 # XXX more...
272
273 def test_index(self):
274 b = self.type2test(b'parrot')
275 self.assertEqual(b.index('p'), 0)
276 self.assertEqual(b.index('rr'), 2)
277 self.assertEqual(b.index('t'), 5)
278 self.assertRaises(ValueError, lambda: b.index('w'))
279
280 def test_count(self):
281 b = self.type2test(b'mississippi')
282 self.assertEqual(b.count(b'i'), 4)
283 self.assertEqual(b.count(b'ss'), 2)
284 self.assertEqual(b.count(b'w'), 0)
285
286 def test_startswith(self):
287 b = self.type2test(b'hello')
288 self.assertFalse(self.type2test().startswith(b"anything"))
289 self.assertTrue(b.startswith(b"hello"))
290 self.assertTrue(b.startswith(b"hel"))
291 self.assertTrue(b.startswith(b"h"))
292 self.assertFalse(b.startswith(b"hellow"))
293 self.assertFalse(b.startswith(b"ha"))
294
295 def test_endswith(self):
296 b = self.type2test(b'hello')
297 self.assertFalse(bytearray().endswith(b"anything"))
298 self.assertTrue(b.endswith(b"hello"))
299 self.assertTrue(b.endswith(b"llo"))
300 self.assertTrue(b.endswith(b"o"))
301 self.assertFalse(b.endswith(b"whello"))
302 self.assertFalse(b.endswith(b"no"))
303
304 def test_find(self):
305 b = self.type2test(b'mississippi')
306 self.assertEqual(b.find(b'ss'), 2)
307 self.assertEqual(b.find(b'ss', 3), 5)
308 self.assertEqual(b.find(b'ss', 1, 7), 2)
309 self.assertEqual(b.find(b'ss', 1, 3), -1)
310 self.assertEqual(b.find(b'w'), -1)
311 self.assertEqual(b.find(b'mississippian'), -1)
312
313 def test_rfind(self):
314 b = self.type2test(b'mississippi')
315 self.assertEqual(b.rfind(b'ss'), 5)
316 self.assertEqual(b.rfind(b'ss', 3), 5)
317 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
318 self.assertEqual(b.rfind(b'w'), -1)
319 self.assertEqual(b.rfind(b'mississippian'), -1)
320
321 def test_index(self):
322 b = self.type2test(b'world')
323 self.assertEqual(b.index(b'w'), 0)
324 self.assertEqual(b.index(b'orl'), 1)
325 self.assertRaises(ValueError, b.index, b'worm')
326 self.assertRaises(ValueError, b.index, b'ldo')
327
328 def test_rindex(self):
329 # XXX could be more rigorous
330 b = self.type2test(b'world')
331 self.assertEqual(b.rindex(b'w'), 0)
332 self.assertEqual(b.rindex(b'orl'), 1)
333 self.assertRaises(ValueError, b.rindex, b'worm')
334 self.assertRaises(ValueError, b.rindex, b'ldo')
335
336 def test_replace(self):
337 b = self.type2test(b'mississippi')
338 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
339 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
340
341 def test_split(self):
342 b = self.type2test(b'mississippi')
343 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
344 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
345 self.assertEqual(b.split(b'w'), [b])
346
347 def test_split_whitespace(self):
348 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
349 b'arf\fbarf', b'arf\vbarf'):
350 b = self.type2test(b)
351 self.assertEqual(b.split(), [b'arf', b'barf'])
352 self.assertEqual(b.split(None), [b'arf', b'barf'])
353 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
354 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
355 b = self.type2test(b)
356 self.assertEqual(b.split(), [b])
357 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
358 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
359 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
360 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
361
362 def test_split_string_error(self):
363 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
364
365 def test_rsplit(self):
366 b = self.type2test(b'mississippi')
367 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
368 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
369 self.assertEqual(b.rsplit(b'w'), [b])
370
371 def test_rsplit_whitespace(self):
372 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
373 b'arf\fbarf', b'arf\vbarf'):
374 b = self.type2test(b)
375 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
376 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
377 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
378 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
379 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
380 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
381 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
382
383 def test_rsplit_string_error(self):
384 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
385
386 def test_rsplit_unicodewhitespace(self):
387 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
388 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
389 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
390
391 def test_partition(self):
392 b = self.type2test(b'mississippi')
393 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
394 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
395
396 def test_rpartition(self):
397 b = self.type2test(b'mississippi')
398 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
399 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
400
401 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000402 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000403 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
404 b = self.type2test(b)
405 ps = pickle.dumps(b, proto)
406 q = pickle.loads(ps)
407 self.assertEqual(b, q)
408
409 def test_strip(self):
410 b = self.type2test(b'mississippi')
411 self.assertEqual(b.strip(b'i'), b'mississipp')
412 self.assertEqual(b.strip(b'm'), b'ississippi')
413 self.assertEqual(b.strip(b'pi'), b'mississ')
414 self.assertEqual(b.strip(b'im'), b'ssissipp')
415 self.assertEqual(b.strip(b'pim'), b'ssiss')
416 self.assertEqual(b.strip(b), b'')
417
418 def test_lstrip(self):
419 b = self.type2test(b'mississippi')
420 self.assertEqual(b.lstrip(b'i'), b'mississippi')
421 self.assertEqual(b.lstrip(b'm'), b'ississippi')
422 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
423 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
424 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
425
426 def test_rstrip(self):
427 b = self.type2test(b'mississippi')
428 self.assertEqual(b.rstrip(b'i'), b'mississipp')
429 self.assertEqual(b.rstrip(b'm'), b'mississippi')
430 self.assertEqual(b.rstrip(b'pi'), b'mississ')
431 self.assertEqual(b.rstrip(b'im'), b'mississipp')
432 self.assertEqual(b.rstrip(b'pim'), b'mississ')
433
434 def test_strip_whitespace(self):
435 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
436 self.assertEqual(b.strip(), b'abc')
437 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
438 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
439
440 def test_strip_bytearray(self):
441 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
442 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
443 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
444
445 def test_strip_string_error(self):
446 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
447 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
448 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
449
450 def test_ord(self):
451 b = self.type2test(b'\0A\x7f\x80\xff')
452 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
453 [0, 65, 127, 128, 255])
454
Georg Brandlabc38772009-04-12 15:51:51 +0000455 def test_maketrans(self):
456 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 +0000457 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000458 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'
459 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000460 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
461 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
462
Christian Heimes510711d2008-01-30 11:57:58 +0000463
464class BytesTest(BaseBytesTest):
465 type2test = bytes
466
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000467 def test_buffer_is_readonly(self):
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000468 fd = os.dup(sys.stdin.fileno())
469 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000470 self.assertRaises(TypeError, f.readinto, b"")
471
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000472 def test_custom(self):
473 class A:
474 def __bytes__(self):
475 return b'abc'
476 self.assertEqual(bytes(A()), b'abc')
477 class A: pass
478 self.assertRaises(TypeError, bytes, A())
479 class A:
480 def __bytes__(self):
481 return None
482 self.assertRaises(TypeError, bytes, A())
483
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000484
Christian Heimes510711d2008-01-30 11:57:58 +0000485class ByteArrayTest(BaseBytesTest):
486 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000487
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000488 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000489 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000490
Guido van Rossum254348e2007-11-21 19:29:53 +0000491 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000492 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000493 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000494 tfn = tempfile.mktemp()
495 try:
496 # Prepare
497 with open(tfn, "wb") as f:
498 f.write(short_sample)
499 # Test readinto
500 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000501 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000502 n = f.readinto(b)
503 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000504 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000505 # Test writing in binary mode
506 with open(tfn, "wb") as f:
507 f.write(b)
508 with open(tfn, "rb") as f:
509 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000510 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000511 finally:
512 try:
513 os.remove(tfn)
514 except os.error:
515 pass
516
Neal Norwitz6968b052007-02-27 19:02:19 +0000517 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000518 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000519 self.assertEqual(b.reverse(), None)
520 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000521 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000522 b.reverse()
523 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000524 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000525 b.reverse()
526 self.assertFalse(b)
527
Guido van Rossumd624f182006-04-24 13:47:05 +0000528 def test_regexps(self):
529 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000530 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000531 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000532 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000533
534 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000535 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000536 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000537 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000538 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000539 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000540 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000541 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000542 try:
543 b[3] = 0
544 self.fail("Didn't raise IndexError")
545 except IndexError:
546 pass
547 try:
548 b[-10] = 0
549 self.fail("Didn't raise IndexError")
550 except IndexError:
551 pass
552 try:
553 b[0] = 256
554 self.fail("Didn't raise ValueError")
555 except ValueError:
556 pass
557 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000558 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000559 self.fail("Didn't raise ValueError")
560 except ValueError:
561 pass
562 try:
563 b[0] = None
564 self.fail("Didn't raise TypeError")
565 except TypeError:
566 pass
567
568 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000569 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000570 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000571 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000572 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000573 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000574 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000575 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000576
577 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000578 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000579 self.assertEqual(list(b), list(range(10)))
580
Guido van Rossum254348e2007-11-21 19:29:53 +0000581 b[0:5] = bytearray([1, 1, 1, 1, 1])
582 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000583
584 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000585 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000586
Guido van Rossum254348e2007-11-21 19:29:53 +0000587 b[0:0] = bytearray([0, 1, 2, 3, 4])
588 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000589
Guido van Rossum254348e2007-11-21 19:29:53 +0000590 b[-7:-3] = bytearray([100, 101])
591 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000592
593 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000594 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000595
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000596 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000597 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 +0000598
Thomas Wouters376446d2006-12-19 08:30:14 +0000599 def test_extended_set_del_slice(self):
600 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
601 for start in indices:
602 for stop in indices:
603 # Skip invalid step 0
604 for step in indices[1:]:
605 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000606 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000607 # Make sure we have a slice of exactly the right length,
608 # but with different data.
609 data = L[start:stop:step]
610 data.reverse()
611 L[start:stop:step] = data
612 b[start:stop:step] = data
Guido van Rossum254348e2007-11-21 19:29:53 +0000613 self.assertEquals(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000614
Thomas Wouters376446d2006-12-19 08:30:14 +0000615 del L[start:stop:step]
616 del b[start:stop:step]
Guido van Rossum254348e2007-11-21 19:29:53 +0000617 self.assertEquals(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000618
Guido van Rossumd624f182006-04-24 13:47:05 +0000619 def test_setslice_trap(self):
620 # This test verifies that we correctly handle assigning self
621 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000622 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000623 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000624 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000625
Guido van Rossum13e57212006-04-27 22:54:26 +0000626 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000627 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000628 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000629 b += b"def"
630 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000631 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000632 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000633 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000634 self.assertEqual(b, b"abcdefxyz")
635 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000636 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000637 except TypeError:
638 pass
639 else:
640 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000641
642 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000643 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000644 b1 = b
645 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000646 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000647 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000648 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000649
650 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000651 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000652 b1 = b
653 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000654 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000655 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000656 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000657
Guido van Rossum20188312006-05-05 15:15:40 +0000658 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000659 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000660 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000661 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +0000662 seq = [alloc]
663 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000664 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000665 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000666 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +0000667 if alloc not in seq:
668 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000669
Neal Norwitz6968b052007-02-27 19:02:19 +0000670 def test_extend(self):
671 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000672 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000673 a.extend(a)
674 self.assertEqual(a, orig + orig)
675 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000676 a = bytearray(b'')
677 # Test iterators that don't have a __length_hint__
678 a.extend(map(int, orig * 25))
679 a.extend(int(x) for x in orig * 25)
680 self.assertEqual(a, orig * 50)
681 self.assertEqual(a[-5:], orig)
682 a = bytearray(b'')
683 a.extend(iter(map(int, orig * 50)))
684 self.assertEqual(a, orig * 50)
685 self.assertEqual(a[-5:], orig)
686 a = bytearray(b'')
687 a.extend(list(map(int, orig * 50)))
688 self.assertEqual(a, orig * 50)
689 self.assertEqual(a[-5:], orig)
690 a = bytearray(b'')
691 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
692 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
693 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000694 a = bytearray(b'')
695 a.extend([Indexable(ord('a'))])
696 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000697
Neal Norwitz6968b052007-02-27 19:02:19 +0000698 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000699 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000700 b.remove(ord('l'))
701 self.assertEqual(b, b'helo')
702 b.remove(ord('l'))
703 self.assertEqual(b, b'heo')
704 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
705 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000706 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000707 # remove first and last
708 b.remove(ord('o'))
709 b.remove(ord('h'))
710 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000711 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000712 b.remove(Indexable(ord('e')))
713 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +0000714
715 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000716 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000717 self.assertEqual(b.pop(), ord('d'))
718 self.assertEqual(b.pop(0), ord('w'))
719 self.assertEqual(b.pop(-2), ord('r'))
720 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000721 self.assertRaises(OverflowError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +0000722 # test for issue #6846
723 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +0000724
725 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000726 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000727
Neal Norwitz6968b052007-02-27 19:02:19 +0000728 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000729 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000730 b.append(ord('o'))
731 self.assertEqual(b, b'hello')
732 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000733 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000734 b.append(ord('A'))
735 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000736 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000737 b = bytearray()
738 b.append(Indexable(ord('A')))
739 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000740
741 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000742 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000743 b.insert(1, ord('i'))
744 b.insert(4, ord('i'))
745 b.insert(-2, ord('i'))
746 b.insert(1000, ord('i'))
747 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000748 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000749 b = bytearray()
750 b.insert(0, Indexable(ord('A')))
751 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000752
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000753 def test_copied(self):
754 # Issue 4348. Make sure that operations that don't mutate the array
755 # copy the bytes.
756 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +0000757 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000758
759 t = bytearray([i for i in range(256)])
760 x = bytearray(b'')
761 self.assertFalse(x is x.translate(t))
762
Guido van Rossum254348e2007-11-21 19:29:53 +0000763 def test_partition_bytearray_doesnt_share_nullstring(self):
764 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000765 self.assertEqual(b, b"")
766 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000767 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000768 b += b"!"
769 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000770 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000771 self.assertEqual(b, b"")
772 self.assertEqual(c, b"")
773 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000774 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000775 self.assertEqual(b, b"")
776 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000777 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000778 b += b"!"
779 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000780 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000781 self.assertEqual(b, b"")
782 self.assertEqual(c, b"")
783
Antoine Pitrou5504e892008-12-06 21:27:53 +0000784 def test_resize_forbidden(self):
785 # #4509: can't resize a bytearray when there are buffer exports, even
786 # if it wouldn't reallocate the underlying buffer.
787 # Furthermore, no destructive changes to the buffer may be applied
788 # before raising the error.
789 b = bytearray(range(10))
790 v = memoryview(b)
791 def resize(n):
792 b[1:-1] = range(n + 1, 2*n - 1)
793 resize(10)
794 orig = b[:]
795 self.assertRaises(BufferError, resize, 11)
796 self.assertEquals(b, orig)
797 self.assertRaises(BufferError, resize, 9)
798 self.assertEquals(b, orig)
799 self.assertRaises(BufferError, resize, 0)
800 self.assertEquals(b, orig)
801 # Other operations implying resize
802 self.assertRaises(BufferError, b.pop, 0)
803 self.assertEquals(b, orig)
804 self.assertRaises(BufferError, b.remove, b[1])
805 self.assertEquals(b, orig)
806 def delitem():
807 del b[1]
808 self.assertRaises(BufferError, delitem)
809 self.assertEquals(b, orig)
810 # deleting a non-contiguous slice
811 def delslice():
812 b[1:-1:2] = b""
813 self.assertRaises(BufferError, delslice)
814 self.assertEquals(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000815
Christian Heimes510711d2008-01-30 11:57:58 +0000816class AssortedBytesTest(unittest.TestCase):
817 #
818 # Test various combinations of bytes and bytearray
819 #
820
821 def setUp(self):
822 self.warning_filters = warnings.filters[:]
823
824 def tearDown(self):
825 warnings.filters = self.warning_filters
826
827 def test_repr_str(self):
828 warnings.simplefilter('ignore', BytesWarning)
829 for f in str, repr:
830 self.assertEqual(f(bytearray()), "bytearray(b'')")
831 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
832 self.assertEqual(f(bytearray([0, 1, 254, 255])),
833 "bytearray(b'\\x00\\x01\\xfe\\xff')")
834 self.assertEqual(f(b"abc"), "b'abc'")
835 self.assertEqual(f(b"'"), '''b"'"''') # '''
836 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
837
838 def test_compare_bytes_to_bytearray(self):
839 self.assertEqual(b"abc" == bytes(b"abc"), True)
840 self.assertEqual(b"ab" != bytes(b"abc"), True)
841 self.assertEqual(b"ab" <= bytes(b"abc"), True)
842 self.assertEqual(b"ab" < bytes(b"abc"), True)
843 self.assertEqual(b"abc" >= bytes(b"ab"), True)
844 self.assertEqual(b"abc" > bytes(b"ab"), True)
845
846 self.assertEqual(b"abc" != bytes(b"abc"), False)
847 self.assertEqual(b"ab" == bytes(b"abc"), False)
848 self.assertEqual(b"ab" > bytes(b"abc"), False)
849 self.assertEqual(b"ab" >= bytes(b"abc"), False)
850 self.assertEqual(b"abc" < bytes(b"ab"), False)
851 self.assertEqual(b"abc" <= bytes(b"ab"), False)
852
853 self.assertEqual(bytes(b"abc") == b"abc", True)
854 self.assertEqual(bytes(b"ab") != b"abc", True)
855 self.assertEqual(bytes(b"ab") <= b"abc", True)
856 self.assertEqual(bytes(b"ab") < b"abc", True)
857 self.assertEqual(bytes(b"abc") >= b"ab", True)
858 self.assertEqual(bytes(b"abc") > b"ab", True)
859
860 self.assertEqual(bytes(b"abc") != b"abc", False)
861 self.assertEqual(bytes(b"ab") == b"abc", False)
862 self.assertEqual(bytes(b"ab") > b"abc", False)
863 self.assertEqual(bytes(b"ab") >= b"abc", False)
864 self.assertEqual(bytes(b"abc") < b"ab", False)
865 self.assertEqual(bytes(b"abc") <= b"ab", False)
866
867 def test_doc(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000868 self.assertTrue(bytearray.__doc__ != None)
869 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
870 self.assertTrue(bytes.__doc__ != None)
871 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +0000872
873 def test_from_bytearray(self):
874 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
875 buf = memoryview(sample)
876 b = bytearray(buf)
877 self.assertEqual(b, bytearray(sample))
878
879 def test_to_str(self):
880 warnings.simplefilter('ignore', BytesWarning)
881 self.assertEqual(str(b''), "b''")
882 self.assertEqual(str(b'x'), "b'x'")
883 self.assertEqual(str(b'\x80'), "b'\\x80'")
884 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
885 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
886 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
887
888 def test_literal(self):
889 tests = [
890 (b"Wonderful spam", "Wonderful spam"),
891 (br"Wonderful spam too", "Wonderful spam too"),
892 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
893 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
894 ]
895 for b, s in tests:
896 self.assertEqual(b, bytearray(s, 'latin-1'))
897 for c in range(128, 256):
898 self.assertRaises(SyntaxError, eval,
899 'b"%s"' % chr(c))
900
901 def test_translate(self):
902 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +0000903 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +0000904 rosetta = bytearray(range(0, 256))
905 rosetta[ord('o')] = ord('e')
906 c = b.translate(rosetta, b'l')
907 self.assertEqual(b, b'hello')
908 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +0000909 c = ba.translate(rosetta, b'l')
910 self.assertEqual(ba, b'hello')
911 self.assertEqual(c, b'hee')
912 c = b.translate(None, b'e')
913 self.assertEqual(c, b'hllo')
914 c = ba.translate(None, b'e')
915 self.assertEqual(c, b'hllo')
916 self.assertRaises(TypeError, b.translate, None, None)
917 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +0000918
919 def test_split_bytearray(self):
920 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
921
922 def test_rsplit_bytearray(self):
923 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
924
Georg Brandleb2c9642008-05-30 12:05:02 +0000925 def test_return_self(self):
926 # bytearray.replace must always return a new bytearray
927 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000928 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +0000929
Barry Warsaw9e9dcd62008-10-17 01:50:37 +0000930 def test_compare(self):
931 if sys.flags.bytes_warning:
932 warnings.simplefilter('error', BytesWarning)
933 self.assertRaises(BytesWarning, operator.eq, b'', '')
934 self.assertRaises(BytesWarning, operator.ne, b'', '')
935 self.assertRaises(BytesWarning, operator.eq, bytearray(b''), '')
936 self.assertRaises(BytesWarning, operator.ne, bytearray(b''), '')
937 else:
938 # raise test.support.TestSkipped("BytesWarning is needed for this test: use -bb option")
939 pass
940
Guido van Rossumd624f182006-04-24 13:47:05 +0000941 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000942 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000943 # __reversed__? (optimization)
944
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000945 # XXX More string methods? (Those that don't use character properties)
946
Neal Norwitz6968b052007-02-27 19:02:19 +0000947 # There are tests in string_tests.py that are more
948 # comprehensive for things like split, partition, etc.
949 # Unfortunately they are all bundled with tests that
950 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000951
Guido van Rossum254348e2007-11-21 19:29:53 +0000952 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000953 # the rest that make sense (the code can be cleaned up to use modern
954 # unittest methods at the same time).
955
Guido van Rossum254348e2007-11-21 19:29:53 +0000956class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000957 test.buffer_tests.MixinBytesBufferCommonTests):
958 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +0000959 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000960
961 def test_returns_new_copy(self):
962 val = self.marshal(b'1234')
963 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +0000964 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000965 for methname in ('zfill', 'rjust', 'ljust', 'center'):
966 method = getattr(val, methname)
967 newval = method(3)
968 self.assertEqual(val, newval)
969 self.assertTrue(val is not newval,
970 methname+' returned self on a mutable object')
971
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000972
Christian Heimes510711d2008-01-30 11:57:58 +0000973class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +0000974
Guido van Rossum9c627722007-08-27 18:31:48 +0000975 def fixtype(self, obj):
976 if isinstance(obj, str):
977 return obj.encode("utf-8")
978 return super().fixtype(obj)
979
Georg Brandlc7885542007-03-06 19:16:20 +0000980 # Currently the bytes containment testing uses a single integer
981 # value. This may not be the final design, but until then the
982 # bytes section with in a bytes containment not valid
983 def test_contains(self):
984 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000985 def test_expandtabs(self):
986 pass
987 def test_upper(self):
988 pass
989 def test_lower(self):
990 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000991
Christian Heimes510711d2008-01-30 11:57:58 +0000992class ByteArrayAsStringTest(FixedStringTest):
993 type2test = bytearray
994
995class BytesAsStringTest(FixedStringTest):
996 type2test = bytes
997
Georg Brandlc7885542007-03-06 19:16:20 +0000998
Guido van Rossum254348e2007-11-21 19:29:53 +0000999class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001000 pass
1001
Guido van Rossum254348e2007-11-21 19:29:53 +00001002class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001003
1004 def test_basic(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001005 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
1006 self.assertTrue(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001007
1008 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +00001009 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001010
1011 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001012 self.assertTrue(_a == _a)
1013 self.assertTrue(_a != _b)
1014 self.assertTrue(_a < _b)
1015 self.assertTrue(_a <= _b)
1016 self.assertTrue(_b >= _a)
1017 self.assertTrue(_b > _a)
1018 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001019
1020 # test concat of subclass instances
1021 self.assertEqual(a + b, _a + _b)
1022 self.assertEqual(a + b, a + _b)
1023 self.assertEqual(a + b, _a + b)
1024
1025 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001026 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001027
1028 def test_join(self):
1029 # Make sure join returns a NEW object for single item sequences
1030 # involving a subclass.
1031 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +00001032 s1 = ByteArraySubclass(b"abcd")
1033 s2 = bytearray().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001034 self.assertTrue(s1 is not s2)
1035 self.assertTrue(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001036
1037 # Test reverse, calling join on subclass
1038 s3 = s1.join([b"abcd"])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001039 self.assertTrue(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001040
1041 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001042 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001043 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001044 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001045 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001046 b = pickle.loads(pickle.dumps(a, proto))
1047 self.assertNotEqual(id(a), id(b))
1048 self.assertEqual(a, b)
1049 self.assertEqual(a.x, b.x)
1050 self.assertEqual(a.y, b.y)
1051 self.assertEqual(type(a), type(b))
1052 self.assertEqual(type(a.y), type(b.y))
1053
1054 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001055 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001056 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001057 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001058 for copy_method in (copy.copy, copy.deepcopy):
1059 b = copy_method(a)
1060 self.assertNotEqual(id(a), id(b))
1061 self.assertEqual(a, b)
1062 self.assertEqual(a.x, b.x)
1063 self.assertEqual(a.y, b.y)
1064 self.assertEqual(type(a), type(b))
1065 self.assertEqual(type(a.y), type(b.y))
1066
1067 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001068 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001069 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +00001070 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001071 x = subclass(4, source=b"abcd")
1072 self.assertEqual(x, b"abcd")
1073 x = subclass(newarg=4, source=b"abcd")
1074 self.assertEqual(x, b"abcd")
1075
1076
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001077def test_main():
Antoine Pitrou403ce782009-10-14 17:14:16 +00001078 test.support.run_unittest(
1079 BytesTest, AssortedBytesTest, BytesAsStringTest,
1080 ByteArrayTest, ByteArrayAsStringTest, ByteArraySubclassTest,
1081 BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001082
1083if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001084 test_main()