blob: 8b964ca89f060a585b5ed546d97656744b86ee6a [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])
Benjamin Peterson0ff8a502010-04-16 23:19:11 +000066 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
67 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000068
69 def test_from_ssize(self):
Benjamin Peterson0ff8a502010-04-16 23:19:11 +000070 self.assertEqual(self.type2test(0), b'')
71 self.assertEqual(self.type2test(1), b'\x00')
72 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
73 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000074
Benjamin Peterson0ff8a502010-04-16 23:19:11 +000075 self.assertEqual(self.type2test('0', 'ascii'), b'0')
76 self.assertEqual(self.type2test(b'0'), b'0')
77 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000078
79 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000080 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000081 class C:
82 pass
Christian Heimes510711d2008-01-30 11:57:58 +000083 self.assertRaises(TypeError, self.type2test, ["0"])
84 self.assertRaises(TypeError, self.type2test, [0.0])
85 self.assertRaises(TypeError, self.type2test, [None])
86 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000087
88 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000089 self.assertRaises(ValueError, self.type2test, [-1])
90 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
91 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
92 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
93 self.assertRaises(ValueError, self.type2test, [-10**100])
94 self.assertRaises(ValueError, self.type2test, [256])
95 self.assertRaises(ValueError, self.type2test, [257])
96 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
97 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
98 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000099
100 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000101 b1 = self.type2test([1, 2, 3])
102 b2 = self.type2test([1, 2, 3])
103 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000104
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000105 self.assertEqual(b1, b2)
Georg Brandlab91fde2009-08-13 08:51:18 +0000106 self.assertTrue(b2 != b3)
107 self.assertTrue(b1 <= b2)
108 self.assertTrue(b1 <= b3)
109 self.assertTrue(b1 < b3)
110 self.assertTrue(b1 >= b2)
111 self.assertTrue(b3 >= b2)
112 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000113
Georg Brandlab91fde2009-08-13 08:51:18 +0000114 self.assertFalse(b1 != b2)
115 self.assertFalse(b2 == b3)
116 self.assertFalse(b1 > b2)
117 self.assertFalse(b1 > b3)
118 self.assertFalse(b1 >= b3)
119 self.assertFalse(b1 < b2)
120 self.assertFalse(b3 < b2)
121 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000122
Guido van Rossum343e97f2007-04-09 00:43:24 +0000123 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000124 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000125 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000126 # Test this for all expected byte orders and Unicode character sizes
Christian Heimes510711d2008-01-30 11:57:58 +0000127 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
128 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", False)
129 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
130 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", False)
131 self.assertEqual(self.type2test() == str(), False)
132 self.assertEqual(self.type2test() != str(), True)
133
134 def test_reversed(self):
135 input = list(map(ord, "Hello"))
136 b = self.type2test(input)
137 output = list(reversed(b))
138 input.reverse()
139 self.assertEqual(output, input)
140
141 def test_getslice(self):
142 def by(s):
143 return self.type2test(map(ord, s))
144 b = by("Hello, world")
145
146 self.assertEqual(b[:5], by("Hello"))
147 self.assertEqual(b[1:5], by("ello"))
148 self.assertEqual(b[5:7], by(", "))
149 self.assertEqual(b[7:], by("world"))
150 self.assertEqual(b[7:12], by("world"))
151 self.assertEqual(b[7:100], by("world"))
152
153 self.assertEqual(b[:-7], by("Hello"))
154 self.assertEqual(b[-11:-7], by("ello"))
155 self.assertEqual(b[-7:-5], by(", "))
156 self.assertEqual(b[-5:], by("world"))
157 self.assertEqual(b[-5:12], by("world"))
158 self.assertEqual(b[-5:100], by("world"))
159 self.assertEqual(b[-100:5], by("Hello"))
160
161 def test_extended_getslice(self):
162 # Test extended slicing by comparing with list slicing.
163 L = list(range(255))
164 b = self.type2test(L)
165 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
166 for start in indices:
167 for stop in indices:
168 # Skip step 0 (invalid)
169 for step in indices[1:]:
170 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
171
172 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000173 sample = "Hello world\n\u1234\u5678\u9abc"
Christian Heimes510711d2008-01-30 11:57:58 +0000174 for enc in ("utf8", "utf16"):
175 b = self.type2test(sample, enc)
176 self.assertEqual(b, self.type2test(sample.encode(enc)))
177 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
178 b = self.type2test(sample, "latin1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000179 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000180
181 def test_decode(self):
182 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
183 for enc in ("utf8", "utf16"):
184 b = self.type2test(sample, enc)
185 self.assertEqual(b.decode(enc), sample)
186 sample = "Hello world\n\x80\x81\xfe\xff"
187 b = self.type2test(sample, "latin1")
188 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
189 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
190
191 def test_from_int(self):
192 b = self.type2test(0)
193 self.assertEqual(b, self.type2test())
194 b = self.type2test(10)
195 self.assertEqual(b, self.type2test([0]*10))
196 b = self.type2test(10000)
197 self.assertEqual(b, self.type2test([0]*10000))
198
199 def test_concat(self):
200 b1 = self.type2test(b"abc")
201 b2 = self.type2test(b"def")
202 self.assertEqual(b1 + b2, b"abcdef")
203 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
204 self.assertEqual(bytes(b"def") + b1, b"defabc")
205 self.assertRaises(TypeError, lambda: b1 + "def")
206 self.assertRaises(TypeError, lambda: "abc" + b2)
207
208 def test_repeat(self):
209 for b in b"abc", self.type2test(b"abc"):
210 self.assertEqual(b * 3, b"abcabcabc")
211 self.assertEqual(b * 0, b"")
212 self.assertEqual(b * -1, b"")
213 self.assertRaises(TypeError, lambda: b * 3.14)
214 self.assertRaises(TypeError, lambda: 3.14 * b)
215 # XXX Shouldn't bytes and bytearray agree on what to raise?
216 self.assertRaises((OverflowError, MemoryError),
217 lambda: b * sys.maxsize)
218
219 def test_repeat_1char(self):
220 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
221
222 def test_contains(self):
223 b = self.type2test(b"abc")
Georg Brandlab91fde2009-08-13 08:51:18 +0000224 self.assertTrue(ord('a') in b)
225 self.assertTrue(int(ord('a')) in b)
226 self.assertFalse(200 in b)
227 self.assertFalse(200 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000228 self.assertRaises(ValueError, lambda: 300 in b)
229 self.assertRaises(ValueError, lambda: -1 in b)
230 self.assertRaises(TypeError, lambda: None in b)
231 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
232 self.assertRaises(TypeError, lambda: "a" in b)
233 for f in bytes, bytearray:
Georg Brandlab91fde2009-08-13 08:51:18 +0000234 self.assertTrue(f(b"") in b)
235 self.assertTrue(f(b"a") in b)
236 self.assertTrue(f(b"b") in b)
237 self.assertTrue(f(b"c") in b)
238 self.assertTrue(f(b"ab") in b)
239 self.assertTrue(f(b"bc") in b)
240 self.assertTrue(f(b"abc") in b)
241 self.assertFalse(f(b"ac") in b)
242 self.assertFalse(f(b"d") in b)
243 self.assertFalse(f(b"dab") in b)
244 self.assertFalse(f(b"abd") in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000245
246 def test_fromhex(self):
247 self.assertRaises(TypeError, self.type2test.fromhex)
248 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000249 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000250 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000251 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
252 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
253 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000254 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
255 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
256 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
257 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
258 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
259 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
260
261 def test_join(self):
262 self.assertEqual(self.type2test(b"").join([]), b"")
263 self.assertEqual(self.type2test(b"").join([b""]), b"")
264 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
265 lst = list(map(self.type2test, lst))
266 self.assertEqual(self.type2test(b"").join(lst), b"abc")
267 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
268 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
269 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
270 # XXX more...
271
272 def test_index(self):
273 b = self.type2test(b'parrot')
274 self.assertEqual(b.index('p'), 0)
275 self.assertEqual(b.index('rr'), 2)
276 self.assertEqual(b.index('t'), 5)
277 self.assertRaises(ValueError, lambda: b.index('w'))
278
279 def test_count(self):
280 b = self.type2test(b'mississippi')
281 self.assertEqual(b.count(b'i'), 4)
282 self.assertEqual(b.count(b'ss'), 2)
283 self.assertEqual(b.count(b'w'), 0)
284
285 def test_startswith(self):
286 b = self.type2test(b'hello')
287 self.assertFalse(self.type2test().startswith(b"anything"))
288 self.assertTrue(b.startswith(b"hello"))
289 self.assertTrue(b.startswith(b"hel"))
290 self.assertTrue(b.startswith(b"h"))
291 self.assertFalse(b.startswith(b"hellow"))
292 self.assertFalse(b.startswith(b"ha"))
293
294 def test_endswith(self):
295 b = self.type2test(b'hello')
296 self.assertFalse(bytearray().endswith(b"anything"))
297 self.assertTrue(b.endswith(b"hello"))
298 self.assertTrue(b.endswith(b"llo"))
299 self.assertTrue(b.endswith(b"o"))
300 self.assertFalse(b.endswith(b"whello"))
301 self.assertFalse(b.endswith(b"no"))
302
303 def test_find(self):
304 b = self.type2test(b'mississippi')
305 self.assertEqual(b.find(b'ss'), 2)
306 self.assertEqual(b.find(b'ss', 3), 5)
307 self.assertEqual(b.find(b'ss', 1, 7), 2)
308 self.assertEqual(b.find(b'ss', 1, 3), -1)
309 self.assertEqual(b.find(b'w'), -1)
310 self.assertEqual(b.find(b'mississippian'), -1)
311
312 def test_rfind(self):
313 b = self.type2test(b'mississippi')
314 self.assertEqual(b.rfind(b'ss'), 5)
315 self.assertEqual(b.rfind(b'ss', 3), 5)
316 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
317 self.assertEqual(b.rfind(b'w'), -1)
318 self.assertEqual(b.rfind(b'mississippian'), -1)
319
320 def test_index(self):
321 b = self.type2test(b'world')
322 self.assertEqual(b.index(b'w'), 0)
323 self.assertEqual(b.index(b'orl'), 1)
324 self.assertRaises(ValueError, b.index, b'worm')
325 self.assertRaises(ValueError, b.index, b'ldo')
326
327 def test_rindex(self):
328 # XXX could be more rigorous
329 b = self.type2test(b'world')
330 self.assertEqual(b.rindex(b'w'), 0)
331 self.assertEqual(b.rindex(b'orl'), 1)
332 self.assertRaises(ValueError, b.rindex, b'worm')
333 self.assertRaises(ValueError, b.rindex, b'ldo')
334
335 def test_replace(self):
336 b = self.type2test(b'mississippi')
337 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
338 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
339
340 def test_split(self):
341 b = self.type2test(b'mississippi')
342 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
343 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
344 self.assertEqual(b.split(b'w'), [b])
345
346 def test_split_whitespace(self):
347 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
348 b'arf\fbarf', b'arf\vbarf'):
349 b = self.type2test(b)
350 self.assertEqual(b.split(), [b'arf', b'barf'])
351 self.assertEqual(b.split(None), [b'arf', b'barf'])
352 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
353 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
354 b = self.type2test(b)
355 self.assertEqual(b.split(), [b])
356 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
357 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
358 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
359 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
360
361 def test_split_string_error(self):
362 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
363
364 def test_rsplit(self):
365 b = self.type2test(b'mississippi')
366 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
367 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
368 self.assertEqual(b.rsplit(b'w'), [b])
369
370 def test_rsplit_whitespace(self):
371 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
372 b'arf\fbarf', b'arf\vbarf'):
373 b = self.type2test(b)
374 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
375 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
376 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
377 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
378 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
379 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
380 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
381
382 def test_rsplit_string_error(self):
383 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
384
385 def test_rsplit_unicodewhitespace(self):
386 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
387 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
388 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
389
390 def test_partition(self):
391 b = self.type2test(b'mississippi')
392 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
393 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
394
395 def test_rpartition(self):
396 b = self.type2test(b'mississippi')
397 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
398 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
399
400 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000401 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000402 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
403 b = self.type2test(b)
404 ps = pickle.dumps(b, proto)
405 q = pickle.loads(ps)
406 self.assertEqual(b, q)
407
408 def test_strip(self):
409 b = self.type2test(b'mississippi')
410 self.assertEqual(b.strip(b'i'), b'mississipp')
411 self.assertEqual(b.strip(b'm'), b'ississippi')
412 self.assertEqual(b.strip(b'pi'), b'mississ')
413 self.assertEqual(b.strip(b'im'), b'ssissipp')
414 self.assertEqual(b.strip(b'pim'), b'ssiss')
415 self.assertEqual(b.strip(b), b'')
416
417 def test_lstrip(self):
418 b = self.type2test(b'mississippi')
419 self.assertEqual(b.lstrip(b'i'), b'mississippi')
420 self.assertEqual(b.lstrip(b'm'), b'ississippi')
421 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
422 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
423 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
424
425 def test_rstrip(self):
426 b = self.type2test(b'mississippi')
427 self.assertEqual(b.rstrip(b'i'), b'mississipp')
428 self.assertEqual(b.rstrip(b'm'), b'mississippi')
429 self.assertEqual(b.rstrip(b'pi'), b'mississ')
430 self.assertEqual(b.rstrip(b'im'), b'mississipp')
431 self.assertEqual(b.rstrip(b'pim'), b'mississ')
432
433 def test_strip_whitespace(self):
434 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
435 self.assertEqual(b.strip(), b'abc')
436 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
437 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
438
439 def test_strip_bytearray(self):
440 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
441 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
442 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
443
444 def test_strip_string_error(self):
445 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
446 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
447 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
448
449 def test_ord(self):
450 b = self.type2test(b'\0A\x7f\x80\xff')
451 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
452 [0, 65, 127, 128, 255])
453
Georg Brandlabc38772009-04-12 15:51:51 +0000454 def test_maketrans(self):
455 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 +0000456 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou96bb15b2009-10-14 17:18:54 +0000457 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'
458 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000459 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
460 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
461
Christian Heimes510711d2008-01-30 11:57:58 +0000462
463class BytesTest(BaseBytesTest):
464 type2test = bytes
465
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000466 def test_buffer_is_readonly(self):
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000467 fd = os.dup(sys.stdin.fileno())
468 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000469 self.assertRaises(TypeError, f.readinto, b"")
470
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000471 def test_custom(self):
472 class A:
473 def __bytes__(self):
474 return b'abc'
475 self.assertEqual(bytes(A()), b'abc')
476 class A: pass
477 self.assertRaises(TypeError, bytes, A())
478 class A:
479 def __bytes__(self):
480 return None
481 self.assertRaises(TypeError, bytes, A())
482
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000483
Christian Heimes510711d2008-01-30 11:57:58 +0000484class ByteArrayTest(BaseBytesTest):
485 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000486
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000487 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000488 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000489
Guido van Rossum254348e2007-11-21 19:29:53 +0000490 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000491 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000492 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000493 tfn = tempfile.mktemp()
494 try:
495 # Prepare
496 with open(tfn, "wb") as f:
497 f.write(short_sample)
498 # Test readinto
499 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000500 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000501 n = f.readinto(b)
502 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000503 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000504 # Test writing in binary mode
505 with open(tfn, "wb") as f:
506 f.write(b)
507 with open(tfn, "rb") as f:
508 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000509 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000510 finally:
511 try:
512 os.remove(tfn)
513 except os.error:
514 pass
515
Neal Norwitz6968b052007-02-27 19:02:19 +0000516 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000517 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000518 self.assertEqual(b.reverse(), None)
519 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000520 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000521 b.reverse()
522 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000523 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000524 b.reverse()
525 self.assertFalse(b)
526
Guido van Rossumd624f182006-04-24 13:47:05 +0000527 def test_regexps(self):
528 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000529 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000530 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000531 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000532
533 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000534 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000535 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000536 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000537 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000538 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000539 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000540 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000541 try:
542 b[3] = 0
543 self.fail("Didn't raise IndexError")
544 except IndexError:
545 pass
546 try:
547 b[-10] = 0
548 self.fail("Didn't raise IndexError")
549 except IndexError:
550 pass
551 try:
552 b[0] = 256
553 self.fail("Didn't raise ValueError")
554 except ValueError:
555 pass
556 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000557 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000558 self.fail("Didn't raise ValueError")
559 except ValueError:
560 pass
561 try:
562 b[0] = None
563 self.fail("Didn't raise TypeError")
564 except TypeError:
565 pass
566
567 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000568 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000569 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000570 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000571 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000572 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000573 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000574 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000575
576 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000577 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000578 self.assertEqual(list(b), list(range(10)))
579
Guido van Rossum254348e2007-11-21 19:29:53 +0000580 b[0:5] = bytearray([1, 1, 1, 1, 1])
581 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000582
583 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000584 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000585
Guido van Rossum254348e2007-11-21 19:29:53 +0000586 b[0:0] = bytearray([0, 1, 2, 3, 4])
587 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000588
Guido van Rossum254348e2007-11-21 19:29:53 +0000589 b[-7:-3] = bytearray([100, 101])
590 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000591
592 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000593 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000594
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000595 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000596 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 +0000597
Thomas Wouters376446d2006-12-19 08:30:14 +0000598 def test_extended_set_del_slice(self):
Mark Dickinsona53f2c92010-01-29 17:29:21 +0000599 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000600 for start in indices:
601 for stop in indices:
602 # Skip invalid step 0
603 for step in indices[1:]:
604 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000605 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000606 # Make sure we have a slice of exactly the right length,
607 # but with different data.
608 data = L[start:stop:step]
609 data.reverse()
610 L[start:stop:step] = data
611 b[start:stop:step] = data
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000612 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000613
Thomas Wouters376446d2006-12-19 08:30:14 +0000614 del L[start:stop:step]
615 del b[start:stop:step]
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000616 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000617
Guido van Rossumd624f182006-04-24 13:47:05 +0000618 def test_setslice_trap(self):
619 # This test verifies that we correctly handle assigning self
620 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000621 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000622 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000623 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000624
Guido van Rossum13e57212006-04-27 22:54:26 +0000625 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000626 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000627 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000628 b += b"def"
629 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000630 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000631 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000632 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000633 self.assertEqual(b, b"abcdefxyz")
634 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000635 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000636 except TypeError:
637 pass
638 else:
639 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000640
641 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000642 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000643 b1 = b
644 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000645 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000646 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000647 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000648
649 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000650 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000651 b1 = b
652 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000653 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000654 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000655 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000656
Guido van Rossum20188312006-05-05 15:15:40 +0000657 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000658 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000659 alloc = b.__alloc__()
Georg Brandlab91fde2009-08-13 08:51:18 +0000660 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +0000661 seq = [alloc]
662 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000663 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000664 alloc = b.__alloc__()
Georg Brandlab91fde2009-08-13 08:51:18 +0000665 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +0000666 if alloc not in seq:
667 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000668
Neal Norwitz6968b052007-02-27 19:02:19 +0000669 def test_extend(self):
670 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000671 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000672 a.extend(a)
673 self.assertEqual(a, orig + orig)
674 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000675 a = bytearray(b'')
676 # Test iterators that don't have a __length_hint__
677 a.extend(map(int, orig * 25))
678 a.extend(int(x) for x in orig * 25)
679 self.assertEqual(a, orig * 50)
680 self.assertEqual(a[-5:], orig)
681 a = bytearray(b'')
682 a.extend(iter(map(int, orig * 50)))
683 self.assertEqual(a, orig * 50)
684 self.assertEqual(a[-5:], orig)
685 a = bytearray(b'')
686 a.extend(list(map(int, orig * 50)))
687 self.assertEqual(a, orig * 50)
688 self.assertEqual(a[-5:], orig)
689 a = bytearray(b'')
690 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
691 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
692 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000693 a = bytearray(b'')
694 a.extend([Indexable(ord('a'))])
695 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000696
Neal Norwitz6968b052007-02-27 19:02:19 +0000697 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000698 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000699 b.remove(ord('l'))
700 self.assertEqual(b, b'helo')
701 b.remove(ord('l'))
702 self.assertEqual(b, b'heo')
703 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
704 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000705 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000706 # remove first and last
707 b.remove(ord('o'))
708 b.remove(ord('h'))
709 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000710 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000711 b.remove(Indexable(ord('e')))
712 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +0000713
714 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000715 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000716 self.assertEqual(b.pop(), ord('d'))
717 self.assertEqual(b.pop(0), ord('w'))
718 self.assertEqual(b.pop(-2), ord('r'))
719 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000720 self.assertRaises(OverflowError, lambda: bytearray().pop())
Mark Dickinson424d75a2009-09-06 10:20:23 +0000721 # test for issue #6846
722 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +0000723
724 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000725 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000726
Neal Norwitz6968b052007-02-27 19:02:19 +0000727 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000728 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000729 b.append(ord('o'))
730 self.assertEqual(b, b'hello')
731 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000732 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000733 b.append(ord('A'))
734 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000735 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000736 b = bytearray()
737 b.append(Indexable(ord('A')))
738 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000739
740 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000741 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000742 b.insert(1, ord('i'))
743 b.insert(4, ord('i'))
744 b.insert(-2, ord('i'))
745 b.insert(1000, ord('i'))
746 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000747 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000748 b = bytearray()
749 b.insert(0, Indexable(ord('A')))
750 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000751
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000752 def test_copied(self):
753 # Issue 4348. Make sure that operations that don't mutate the array
754 # copy the bytes.
755 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +0000756 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000757
758 t = bytearray([i for i in range(256)])
759 x = bytearray(b'')
760 self.assertFalse(x is x.translate(t))
761
Guido van Rossum254348e2007-11-21 19:29:53 +0000762 def test_partition_bytearray_doesnt_share_nullstring(self):
763 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000764 self.assertEqual(b, b"")
765 self.assertEqual(c, b"")
Georg Brandlab91fde2009-08-13 08:51:18 +0000766 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000767 b += b"!"
768 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000769 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000770 self.assertEqual(b, b"")
771 self.assertEqual(c, b"")
772 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000773 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000774 self.assertEqual(b, b"")
775 self.assertEqual(c, b"")
Georg Brandlab91fde2009-08-13 08:51:18 +0000776 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000777 b += b"!"
778 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000779 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000780 self.assertEqual(b, b"")
781 self.assertEqual(c, b"")
782
Antoine Pitrou5504e892008-12-06 21:27:53 +0000783 def test_resize_forbidden(self):
784 # #4509: can't resize a bytearray when there are buffer exports, even
785 # if it wouldn't reallocate the underlying buffer.
786 # Furthermore, no destructive changes to the buffer may be applied
787 # before raising the error.
788 b = bytearray(range(10))
789 v = memoryview(b)
790 def resize(n):
791 b[1:-1] = range(n + 1, 2*n - 1)
792 resize(10)
793 orig = b[:]
794 self.assertRaises(BufferError, resize, 11)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000795 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000796 self.assertRaises(BufferError, resize, 9)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000797 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000798 self.assertRaises(BufferError, resize, 0)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000799 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000800 # Other operations implying resize
801 self.assertRaises(BufferError, b.pop, 0)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000802 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000803 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000804 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000805 def delitem():
806 del b[1]
807 self.assertRaises(BufferError, delitem)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000808 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000809 # deleting a non-contiguous slice
810 def delslice():
811 b[1:-1:2] = b""
812 self.assertRaises(BufferError, delslice)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000813 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000814
Antoine Pitrou20d6c152010-01-17 12:43:00 +0000815 def test_empty_bytearray(self):
816 # Issue #7561: operations on empty bytearrays could crash in many
817 # situations, due to a fragile implementation of the
818 # PyByteArray_AS_STRING() C macro.
819 self.assertRaises(ValueError, int, bytearray(b''))
820 self.assertRaises((ValueError, OSError), os.mkdir, bytearray(b''))
821
822
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):
Georg Brandlab91fde2009-08-13 08:51:18 +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()
Georg Brandlab91fde2009-08-13 08:51:18 +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 Pitrou344ec442009-11-01 16:04:09 +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
Guido van Rossum254348e2007-11-21 19:29:53 +00001006class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001007 pass
1008
Guido van Rossum254348e2007-11-21 19:29:53 +00001009class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001010
1011 def test_basic(self):
Georg Brandlab91fde2009-08-13 08:51:18 +00001012 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
1013 self.assertTrue(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001014
1015 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +00001016 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001017
1018 # test comparison operators with subclass instances
Georg Brandlab91fde2009-08-13 08:51:18 +00001019 self.assertTrue(_a == _a)
1020 self.assertTrue(_a != _b)
1021 self.assertTrue(_a < _b)
1022 self.assertTrue(_a <= _b)
1023 self.assertTrue(_b >= _a)
1024 self.assertTrue(_b > _a)
1025 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001026
1027 # test concat of subclass instances
1028 self.assertEqual(a + b, _a + _b)
1029 self.assertEqual(a + b, a + _b)
1030 self.assertEqual(a + b, _a + b)
1031
1032 # test repeat
Georg Brandlab91fde2009-08-13 08:51:18 +00001033 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001034
1035 def test_join(self):
1036 # Make sure join returns a NEW object for single item sequences
1037 # involving a subclass.
1038 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +00001039 s1 = ByteArraySubclass(b"abcd")
1040 s2 = bytearray().join([s1])
Georg Brandlab91fde2009-08-13 08:51:18 +00001041 self.assertTrue(s1 is not s2)
1042 self.assertTrue(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001043
1044 # Test reverse, calling join on subclass
1045 s3 = s1.join([b"abcd"])
Georg Brandlab91fde2009-08-13 08:51:18 +00001046 self.assertTrue(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001047
1048 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001049 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001050 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001051 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001052 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001053 b = pickle.loads(pickle.dumps(a, proto))
1054 self.assertNotEqual(id(a), id(b))
1055 self.assertEqual(a, b)
1056 self.assertEqual(a.x, b.x)
1057 self.assertEqual(a.y, b.y)
1058 self.assertEqual(type(a), type(b))
1059 self.assertEqual(type(a.y), type(b.y))
1060
1061 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001062 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001063 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001064 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001065 for copy_method in (copy.copy, copy.deepcopy):
1066 b = copy_method(a)
1067 self.assertNotEqual(id(a), id(b))
1068 self.assertEqual(a, b)
1069 self.assertEqual(a.x, b.x)
1070 self.assertEqual(a.y, b.y)
1071 self.assertEqual(type(a), type(b))
1072 self.assertEqual(type(a.y), type(b.y))
1073
1074 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001075 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001076 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +00001077 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001078 x = subclass(4, source=b"abcd")
1079 self.assertEqual(x, b"abcd")
1080 x = subclass(newarg=4, source=b"abcd")
1081 self.assertEqual(x, b"abcd")
1082
1083
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001084def test_main():
Antoine Pitrou96bb15b2009-10-14 17:18:54 +00001085 test.support.run_unittest(
1086 BytesTest, AssortedBytesTest, BytesAsStringTest,
1087 ByteArrayTest, ByteArrayAsStringTest, ByteArraySubclassTest,
1088 BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001089
1090if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001091 test_main()