blob: a607bef2584c1634249cfe019c91c86197999c31 [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
Jesus Ceaac451502011-04-20 17:09:23 +0200462 def test_none_arguments(self):
463 # issue 11828
464 b = self.type2test(b'hello')
465 l = self.type2test(b'l')
466 h = self.type2test(b'h')
467 x = self.type2test(b'x')
468 o = self.type2test(b'o')
469
470 self.assertEqual(2, b.find(l, None))
471 self.assertEqual(3, b.find(l, -2, None))
472 self.assertEqual(2, b.find(l, None, -2))
473 self.assertEqual(0, b.find(h, None, None))
474
475 self.assertEqual(3, b.rfind(l, None))
476 self.assertEqual(3, b.rfind(l, -2, None))
477 self.assertEqual(2, b.rfind(l, None, -2))
478 self.assertEqual(0, b.rfind(h, None, None))
479
480 self.assertEqual(2, b.index(l, None))
481 self.assertEqual(3, b.index(l, -2, None))
482 self.assertEqual(2, b.index(l, None, -2))
483 self.assertEqual(0, b.index(h, None, None))
484
485 self.assertEqual(3, b.rindex(l, None))
486 self.assertEqual(3, b.rindex(l, -2, None))
487 self.assertEqual(2, b.rindex(l, None, -2))
488 self.assertEqual(0, b.rindex(h, None, None))
489
490 self.assertEqual(2, b.count(l, None))
491 self.assertEqual(1, b.count(l, -2, None))
492 self.assertEqual(1, b.count(l, None, -2))
493 self.assertEqual(0, b.count(x, None, None))
494
495 self.assertEqual(True, b.endswith(o, None))
496 self.assertEqual(True, b.endswith(o, -2, None))
497 self.assertEqual(True, b.endswith(l, None, -2))
498 self.assertEqual(False, b.endswith(x, None, None))
499
500 self.assertEqual(True, b.startswith(h, None))
501 self.assertEqual(True, b.startswith(l, -2, None))
502 self.assertEqual(True, b.startswith(h, None, -2))
503 self.assertEqual(False, b.startswith(x, None, None))
504
505 def test_find_etc_raise_correct_error_messages(self):
506 # issue 11828
507 b = self.type2test(b'hello')
508 x = self.type2test(b'x')
509 self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find,
510 x, None, None, None)
511 self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind,
512 x, None, None, None)
513 self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index,
514 x, None, None, None)
515 self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex,
516 x, None, None, None)
517 self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count,
518 x, None, None, None)
519 self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith,
520 x, None, None, None)
521 self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith,
522 x, None, None, None)
523
Christian Heimes510711d2008-01-30 11:57:58 +0000524
525class BytesTest(BaseBytesTest):
526 type2test = bytes
527
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000528 def test_buffer_is_readonly(self):
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000529 fd = os.dup(sys.stdin.fileno())
530 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000531 self.assertRaises(TypeError, f.readinto, b"")
532
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000533 def test_custom(self):
534 class A:
535 def __bytes__(self):
536 return b'abc'
537 self.assertEqual(bytes(A()), b'abc')
538 class A: pass
539 self.assertRaises(TypeError, bytes, A())
540 class A:
541 def __bytes__(self):
542 return None
543 self.assertRaises(TypeError, bytes, A())
544
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000545
Christian Heimes510711d2008-01-30 11:57:58 +0000546class ByteArrayTest(BaseBytesTest):
547 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000548
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000549 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000550 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000551
Guido van Rossum254348e2007-11-21 19:29:53 +0000552 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000553 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000554 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000555 tfn = tempfile.mktemp()
556 try:
557 # Prepare
558 with open(tfn, "wb") as f:
559 f.write(short_sample)
560 # Test readinto
561 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000562 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000563 n = f.readinto(b)
564 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000565 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000566 # Test writing in binary mode
567 with open(tfn, "wb") as f:
568 f.write(b)
569 with open(tfn, "rb") as f:
570 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000571 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000572 finally:
573 try:
574 os.remove(tfn)
575 except os.error:
576 pass
577
Neal Norwitz6968b052007-02-27 19:02:19 +0000578 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000579 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000580 self.assertEqual(b.reverse(), None)
581 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000582 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000583 b.reverse()
584 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000585 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000586 b.reverse()
587 self.assertFalse(b)
588
Guido van Rossumd624f182006-04-24 13:47:05 +0000589 def test_regexps(self):
590 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000591 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000592 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000593 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000594
595 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000596 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000597 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000598 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000599 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000600 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000601 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000602 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000603 try:
604 b[3] = 0
605 self.fail("Didn't raise IndexError")
606 except IndexError:
607 pass
608 try:
609 b[-10] = 0
610 self.fail("Didn't raise IndexError")
611 except IndexError:
612 pass
613 try:
614 b[0] = 256
615 self.fail("Didn't raise ValueError")
616 except ValueError:
617 pass
618 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000619 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000620 self.fail("Didn't raise ValueError")
621 except ValueError:
622 pass
623 try:
624 b[0] = None
625 self.fail("Didn't raise TypeError")
626 except TypeError:
627 pass
628
629 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000630 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000631 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000632 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000633 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000634 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000635 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000636 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000637
638 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000639 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000640 self.assertEqual(list(b), list(range(10)))
641
Guido van Rossum254348e2007-11-21 19:29:53 +0000642 b[0:5] = bytearray([1, 1, 1, 1, 1])
643 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000644
645 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000646 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000647
Guido van Rossum254348e2007-11-21 19:29:53 +0000648 b[0:0] = bytearray([0, 1, 2, 3, 4])
649 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000650
Guido van Rossum254348e2007-11-21 19:29:53 +0000651 b[-7:-3] = bytearray([100, 101])
652 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000653
654 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000655 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000656
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000657 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000658 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 +0000659
Thomas Wouters376446d2006-12-19 08:30:14 +0000660 def test_extended_set_del_slice(self):
Mark Dickinsona53f2c92010-01-29 17:29:21 +0000661 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000662 for start in indices:
663 for stop in indices:
664 # Skip invalid step 0
665 for step in indices[1:]:
666 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000667 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000668 # Make sure we have a slice of exactly the right length,
669 # but with different data.
670 data = L[start:stop:step]
671 data.reverse()
672 L[start:stop:step] = data
673 b[start:stop:step] = data
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000674 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000675
Thomas Wouters376446d2006-12-19 08:30:14 +0000676 del L[start:stop:step]
677 del b[start:stop:step]
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000678 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000679
Guido van Rossumd624f182006-04-24 13:47:05 +0000680 def test_setslice_trap(self):
681 # This test verifies that we correctly handle assigning self
682 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000683 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000684 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000685 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000686
Guido van Rossum13e57212006-04-27 22:54:26 +0000687 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000688 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000689 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000690 b += b"def"
691 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000692 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000693 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000694 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000695 self.assertEqual(b, b"abcdefxyz")
696 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000697 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000698 except TypeError:
699 pass
700 else:
701 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000702
703 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000704 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000705 b1 = b
706 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000707 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000708 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000709 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000710
711 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000712 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000713 b1 = b
714 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000715 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000716 self.assertEqual(b, b1)
Georg Brandlab91fde2009-08-13 08:51:18 +0000717 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000718
Guido van Rossum20188312006-05-05 15:15:40 +0000719 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000720 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000721 alloc = b.__alloc__()
Georg Brandlab91fde2009-08-13 08:51:18 +0000722 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +0000723 seq = [alloc]
724 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000725 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000726 alloc = b.__alloc__()
Georg Brandlab91fde2009-08-13 08:51:18 +0000727 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +0000728 if alloc not in seq:
729 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000730
Neal Norwitz6968b052007-02-27 19:02:19 +0000731 def test_extend(self):
732 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000733 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000734 a.extend(a)
735 self.assertEqual(a, orig + orig)
736 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000737 a = bytearray(b'')
738 # Test iterators that don't have a __length_hint__
739 a.extend(map(int, orig * 25))
740 a.extend(int(x) for x in orig * 25)
741 self.assertEqual(a, orig * 50)
742 self.assertEqual(a[-5:], orig)
743 a = bytearray(b'')
744 a.extend(iter(map(int, orig * 50)))
745 self.assertEqual(a, orig * 50)
746 self.assertEqual(a[-5:], orig)
747 a = bytearray(b'')
748 a.extend(list(map(int, orig * 50)))
749 self.assertEqual(a, orig * 50)
750 self.assertEqual(a[-5:], orig)
751 a = bytearray(b'')
752 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
753 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
754 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000755 a = bytearray(b'')
756 a.extend([Indexable(ord('a'))])
757 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000758
Neal Norwitz6968b052007-02-27 19:02:19 +0000759 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000760 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000761 b.remove(ord('l'))
762 self.assertEqual(b, b'helo')
763 b.remove(ord('l'))
764 self.assertEqual(b, b'heo')
765 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
766 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000767 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000768 # remove first and last
769 b.remove(ord('o'))
770 b.remove(ord('h'))
771 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000772 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000773 b.remove(Indexable(ord('e')))
774 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +0000775
776 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000777 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000778 self.assertEqual(b.pop(), ord('d'))
779 self.assertEqual(b.pop(0), ord('w'))
780 self.assertEqual(b.pop(-2), ord('r'))
781 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000782 self.assertRaises(OverflowError, lambda: bytearray().pop())
Mark Dickinson424d75a2009-09-06 10:20:23 +0000783 # test for issue #6846
784 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +0000785
786 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000787 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000788
Neal Norwitz6968b052007-02-27 19:02:19 +0000789 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000790 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000791 b.append(ord('o'))
792 self.assertEqual(b, b'hello')
793 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000794 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000795 b.append(ord('A'))
796 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000797 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000798 b = bytearray()
799 b.append(Indexable(ord('A')))
800 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000801
802 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000803 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000804 b.insert(1, ord('i'))
805 b.insert(4, ord('i'))
806 b.insert(-2, ord('i'))
807 b.insert(1000, ord('i'))
808 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000809 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000810 b = bytearray()
811 b.insert(0, Indexable(ord('A')))
812 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +0000813
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000814 def test_copied(self):
815 # Issue 4348. Make sure that operations that don't mutate the array
816 # copy the bytes.
817 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +0000818 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +0000819
820 t = bytearray([i for i in range(256)])
821 x = bytearray(b'')
822 self.assertFalse(x is x.translate(t))
823
Guido van Rossum254348e2007-11-21 19:29:53 +0000824 def test_partition_bytearray_doesnt_share_nullstring(self):
825 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000826 self.assertEqual(b, b"")
827 self.assertEqual(c, b"")
Georg Brandlab91fde2009-08-13 08:51:18 +0000828 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000829 b += b"!"
830 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000831 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000832 self.assertEqual(b, b"")
833 self.assertEqual(c, b"")
834 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000835 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000836 self.assertEqual(b, b"")
837 self.assertEqual(c, b"")
Georg Brandlab91fde2009-08-13 08:51:18 +0000838 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000839 b += b"!"
840 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000841 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000842 self.assertEqual(b, b"")
843 self.assertEqual(c, b"")
844
Antoine Pitrou5504e892008-12-06 21:27:53 +0000845 def test_resize_forbidden(self):
846 # #4509: can't resize a bytearray when there are buffer exports, even
847 # if it wouldn't reallocate the underlying buffer.
848 # Furthermore, no destructive changes to the buffer may be applied
849 # before raising the error.
850 b = bytearray(range(10))
851 v = memoryview(b)
852 def resize(n):
853 b[1:-1] = range(n + 1, 2*n - 1)
854 resize(10)
855 orig = b[:]
856 self.assertRaises(BufferError, resize, 11)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000857 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000858 self.assertRaises(BufferError, resize, 9)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000859 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000860 self.assertRaises(BufferError, resize, 0)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000861 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000862 # Other operations implying resize
863 self.assertRaises(BufferError, b.pop, 0)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000864 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000865 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000866 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000867 def delitem():
868 del b[1]
869 self.assertRaises(BufferError, delitem)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000870 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +0000871 # deleting a non-contiguous slice
872 def delslice():
873 b[1:-1:2] = b""
874 self.assertRaises(BufferError, delslice)
Ezio Melotti19f2aeb2010-11-21 01:30:29 +0000875 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000876
Antoine Pitrou20d6c152010-01-17 12:43:00 +0000877 def test_empty_bytearray(self):
878 # Issue #7561: operations on empty bytearrays could crash in many
879 # situations, due to a fragile implementation of the
880 # PyByteArray_AS_STRING() C macro.
881 self.assertRaises(ValueError, int, bytearray(b''))
882 self.assertRaises((ValueError, OSError), os.mkdir, bytearray(b''))
883
884
Christian Heimes510711d2008-01-30 11:57:58 +0000885class AssortedBytesTest(unittest.TestCase):
886 #
887 # Test various combinations of bytes and bytearray
888 #
889
890 def setUp(self):
891 self.warning_filters = warnings.filters[:]
892
893 def tearDown(self):
894 warnings.filters = self.warning_filters
895
896 def test_repr_str(self):
897 warnings.simplefilter('ignore', BytesWarning)
898 for f in str, repr:
899 self.assertEqual(f(bytearray()), "bytearray(b'')")
900 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
901 self.assertEqual(f(bytearray([0, 1, 254, 255])),
902 "bytearray(b'\\x00\\x01\\xfe\\xff')")
903 self.assertEqual(f(b"abc"), "b'abc'")
904 self.assertEqual(f(b"'"), '''b"'"''') # '''
905 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
906
907 def test_compare_bytes_to_bytearray(self):
908 self.assertEqual(b"abc" == bytes(b"abc"), True)
909 self.assertEqual(b"ab" != bytes(b"abc"), True)
910 self.assertEqual(b"ab" <= bytes(b"abc"), True)
911 self.assertEqual(b"ab" < bytes(b"abc"), True)
912 self.assertEqual(b"abc" >= bytes(b"ab"), True)
913 self.assertEqual(b"abc" > bytes(b"ab"), True)
914
915 self.assertEqual(b"abc" != bytes(b"abc"), False)
916 self.assertEqual(b"ab" == bytes(b"abc"), False)
917 self.assertEqual(b"ab" > bytes(b"abc"), False)
918 self.assertEqual(b"ab" >= bytes(b"abc"), False)
919 self.assertEqual(b"abc" < bytes(b"ab"), False)
920 self.assertEqual(b"abc" <= bytes(b"ab"), False)
921
922 self.assertEqual(bytes(b"abc") == b"abc", True)
923 self.assertEqual(bytes(b"ab") != b"abc", True)
924 self.assertEqual(bytes(b"ab") <= b"abc", True)
925 self.assertEqual(bytes(b"ab") < b"abc", True)
926 self.assertEqual(bytes(b"abc") >= b"ab", True)
927 self.assertEqual(bytes(b"abc") > b"ab", True)
928
929 self.assertEqual(bytes(b"abc") != b"abc", False)
930 self.assertEqual(bytes(b"ab") == b"abc", False)
931 self.assertEqual(bytes(b"ab") > b"abc", False)
932 self.assertEqual(bytes(b"ab") >= b"abc", False)
933 self.assertEqual(bytes(b"abc") < b"ab", False)
934 self.assertEqual(bytes(b"abc") <= b"ab", False)
935
936 def test_doc(self):
Georg Brandlab91fde2009-08-13 08:51:18 +0000937 self.assertTrue(bytearray.__doc__ != None)
938 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
939 self.assertTrue(bytes.__doc__ != None)
940 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +0000941
942 def test_from_bytearray(self):
943 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
944 buf = memoryview(sample)
945 b = bytearray(buf)
946 self.assertEqual(b, bytearray(sample))
947
948 def test_to_str(self):
949 warnings.simplefilter('ignore', BytesWarning)
950 self.assertEqual(str(b''), "b''")
951 self.assertEqual(str(b'x'), "b'x'")
952 self.assertEqual(str(b'\x80'), "b'\\x80'")
953 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
954 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
955 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
956
957 def test_literal(self):
958 tests = [
959 (b"Wonderful spam", "Wonderful spam"),
960 (br"Wonderful spam too", "Wonderful spam too"),
961 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
962 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
963 ]
964 for b, s in tests:
965 self.assertEqual(b, bytearray(s, 'latin-1'))
966 for c in range(128, 256):
967 self.assertRaises(SyntaxError, eval,
968 'b"%s"' % chr(c))
969
970 def test_translate(self):
971 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +0000972 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +0000973 rosetta = bytearray(range(0, 256))
974 rosetta[ord('o')] = ord('e')
975 c = b.translate(rosetta, b'l')
976 self.assertEqual(b, b'hello')
977 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +0000978 c = ba.translate(rosetta, b'l')
979 self.assertEqual(ba, b'hello')
980 self.assertEqual(c, b'hee')
981 c = b.translate(None, b'e')
982 self.assertEqual(c, b'hllo')
983 c = ba.translate(None, b'e')
984 self.assertEqual(c, b'hllo')
985 self.assertRaises(TypeError, b.translate, None, None)
986 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +0000987
988 def test_split_bytearray(self):
989 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
990
991 def test_rsplit_bytearray(self):
992 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
993
Georg Brandleb2c9642008-05-30 12:05:02 +0000994 def test_return_self(self):
995 # bytearray.replace must always return a new bytearray
996 b = bytearray()
Georg Brandlab91fde2009-08-13 08:51:18 +0000997 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +0000998
Barry Warsaw9e9dcd62008-10-17 01:50:37 +0000999 def test_compare(self):
1000 if sys.flags.bytes_warning:
1001 warnings.simplefilter('error', BytesWarning)
1002 self.assertRaises(BytesWarning, operator.eq, b'', '')
1003 self.assertRaises(BytesWarning, operator.ne, b'', '')
1004 self.assertRaises(BytesWarning, operator.eq, bytearray(b''), '')
1005 self.assertRaises(BytesWarning, operator.ne, bytearray(b''), '')
1006 else:
Antoine Pitrou344ec442009-11-01 16:04:09 +00001007 # self.skipTest("BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001008 pass
1009
Guido van Rossumd624f182006-04-24 13:47:05 +00001010 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001011 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001012 # __reversed__? (optimization)
1013
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001014 # XXX More string methods? (Those that don't use character properties)
1015
Neal Norwitz6968b052007-02-27 19:02:19 +00001016 # There are tests in string_tests.py that are more
1017 # comprehensive for things like split, partition, etc.
1018 # Unfortunately they are all bundled with tests that
1019 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001020
Guido van Rossum254348e2007-11-21 19:29:53 +00001021 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001022 # the rest that make sense (the code can be cleaned up to use modern
1023 # unittest methods at the same time).
1024
Guido van Rossum254348e2007-11-21 19:29:53 +00001025class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001026 test.buffer_tests.MixinBytesBufferCommonTests):
1027 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001028 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001029
1030 def test_returns_new_copy(self):
1031 val = self.marshal(b'1234')
1032 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001033 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001034 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1035 method = getattr(val, methname)
1036 newval = method(3)
1037 self.assertEqual(val, newval)
1038 self.assertTrue(val is not newval,
1039 methname+' returned self on a mutable object')
1040
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001041
Christian Heimes510711d2008-01-30 11:57:58 +00001042class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +00001043
Guido van Rossum9c627722007-08-27 18:31:48 +00001044 def fixtype(self, obj):
1045 if isinstance(obj, str):
1046 return obj.encode("utf-8")
1047 return super().fixtype(obj)
1048
Georg Brandlc7885542007-03-06 19:16:20 +00001049 # Currently the bytes containment testing uses a single integer
1050 # value. This may not be the final design, but until then the
1051 # bytes section with in a bytes containment not valid
1052 def test_contains(self):
1053 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001054 def test_expandtabs(self):
1055 pass
1056 def test_upper(self):
1057 pass
1058 def test_lower(self):
1059 pass
Georg Brandlc7885542007-03-06 19:16:20 +00001060
Christian Heimes510711d2008-01-30 11:57:58 +00001061class ByteArrayAsStringTest(FixedStringTest):
1062 type2test = bytearray
1063
1064class BytesAsStringTest(FixedStringTest):
1065 type2test = bytes
1066
Georg Brandlc7885542007-03-06 19:16:20 +00001067
Guido van Rossum254348e2007-11-21 19:29:53 +00001068class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001069 pass
1070
Guido van Rossum254348e2007-11-21 19:29:53 +00001071class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001072
1073 def test_basic(self):
Georg Brandlab91fde2009-08-13 08:51:18 +00001074 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
1075 self.assertTrue(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001076
1077 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +00001078 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001079
1080 # test comparison operators with subclass instances
Georg Brandlab91fde2009-08-13 08:51:18 +00001081 self.assertTrue(_a == _a)
1082 self.assertTrue(_a != _b)
1083 self.assertTrue(_a < _b)
1084 self.assertTrue(_a <= _b)
1085 self.assertTrue(_b >= _a)
1086 self.assertTrue(_b > _a)
1087 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001088
1089 # test concat of subclass instances
1090 self.assertEqual(a + b, _a + _b)
1091 self.assertEqual(a + b, a + _b)
1092 self.assertEqual(a + b, _a + b)
1093
1094 # test repeat
Georg Brandlab91fde2009-08-13 08:51:18 +00001095 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001096
1097 def test_join(self):
1098 # Make sure join returns a NEW object for single item sequences
1099 # involving a subclass.
1100 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +00001101 s1 = ByteArraySubclass(b"abcd")
1102 s2 = bytearray().join([s1])
Georg Brandlab91fde2009-08-13 08:51:18 +00001103 self.assertTrue(s1 is not s2)
1104 self.assertTrue(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001105
1106 # Test reverse, calling join on subclass
1107 s3 = s1.join([b"abcd"])
Georg Brandlab91fde2009-08-13 08:51:18 +00001108 self.assertTrue(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001109
1110 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001111 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001112 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001113 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001114 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001115 b = pickle.loads(pickle.dumps(a, proto))
1116 self.assertNotEqual(id(a), id(b))
1117 self.assertEqual(a, b)
1118 self.assertEqual(a.x, b.x)
1119 self.assertEqual(a.y, b.y)
1120 self.assertEqual(type(a), type(b))
1121 self.assertEqual(type(a.y), type(b.y))
1122
1123 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001124 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001125 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +00001126 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001127 for copy_method in (copy.copy, copy.deepcopy):
1128 b = copy_method(a)
1129 self.assertNotEqual(id(a), id(b))
1130 self.assertEqual(a, b)
1131 self.assertEqual(a.x, b.x)
1132 self.assertEqual(a.y, b.y)
1133 self.assertEqual(type(a), type(b))
1134 self.assertEqual(type(a.y), type(b.y))
1135
1136 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001138 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001140 x = subclass(4, source=b"abcd")
1141 self.assertEqual(x, b"abcd")
1142 x = subclass(newarg=4, source=b"abcd")
1143 self.assertEqual(x, b"abcd")
1144
1145
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001146def test_main():
Antoine Pitrou96bb15b2009-10-14 17:18:54 +00001147 test.support.run_unittest(
1148 BytesTest, AssortedBytesTest, BytesAsStringTest,
1149 ByteArrayTest, ByteArrayAsStringTest, ByteArraySubclassTest,
1150 BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001151
1152if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001153 test_main()