blob: 8a8237429d1e86a4351477dbc1699cd53db5e306 [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
3XXX This is a mess. Common tests should be moved to buffer_tests.py,
4which itself ought to be unified with string_tests.py (and the latter
5should be modernized).
6"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
Guido van Rossumd624f182006-04-24 13:47:05 +00008import os
9import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000010import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000011import copy
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Guido van Rossum98297ee2007-11-06 21:34:58 +000015import warnings
Christian Heimes510711d2008-01-30 11:57:58 +000016import functools
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000017import test.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
21
Christian Heimes510711d2008-01-30 11:57:58 +000022class BaseBytesTest(unittest.TestCase):
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000023
Guido van Rossum98297ee2007-11-06 21:34:58 +000024 def setUp(self):
25 self.warning_filters = warnings.filters[:]
26
27 def tearDown(self):
28 warnings.filters = self.warning_filters
29
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000030 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000031 b = self.type2test()
32 self.assertEqual(type(b), self.type2test)
33 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000034
35 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000036 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000037 self.assertEqual(len(b), 0)
38 self.assertRaises(IndexError, lambda: b[0])
39 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000040 self.assertRaises(IndexError, lambda: b[sys.maxsize])
41 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042 self.assertRaises(IndexError, lambda: b[10**100])
43 self.assertRaises(IndexError, lambda: b[-1])
44 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000045 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
46 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
47 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048 self.assertRaises(IndexError, lambda: b[-10**100])
49
50 def test_from_list(self):
51 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000052 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000053 self.assertEqual(len(b), 256)
54 self.assertEqual(list(b), ints)
55
56 def test_from_index(self):
57 class C:
58 def __init__(self, i=0):
59 self.i = i
60 def __index__(self):
61 return self.i
Christian Heimes510711d2008-01-30 11:57:58 +000062 b = self.type2test([C(), C(1), C(254), C(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertEqual(list(b), [0, 1, 254, 255])
Guido van Rossum254348e2007-11-21 19:29:53 +000064 self.assertRaises(ValueError, bytearray, [C(-1)])
65 self.assertRaises(ValueError, bytearray, [C(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000066
67 def test_from_ssize(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000068 self.assertEqual(bytearray(0), b'')
69 self.assertEqual(bytearray(1), b'\x00')
70 self.assertEqual(bytearray(5), b'\x00\x00\x00\x00\x00')
71 self.assertRaises(ValueError, bytearray, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000072
Guido van Rossum254348e2007-11-21 19:29:53 +000073 self.assertEqual(bytearray('0', 'ascii'), b'0')
74 self.assertEqual(bytearray(b'0'), b'0')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000075
76 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000077 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000078 class C:
79 pass
Christian Heimes510711d2008-01-30 11:57:58 +000080 self.assertRaises(TypeError, self.type2test, ["0"])
81 self.assertRaises(TypeError, self.type2test, [0.0])
82 self.assertRaises(TypeError, self.type2test, [None])
83 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000084
85 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000086 self.assertRaises(ValueError, self.type2test, [-1])
87 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
88 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
89 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
90 self.assertRaises(ValueError, self.type2test, [-10**100])
91 self.assertRaises(ValueError, self.type2test, [256])
92 self.assertRaises(ValueError, self.type2test, [257])
93 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
94 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
95 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000096
97 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +000098 b1 = self.type2test([1, 2, 3])
99 b2 = self.type2test([1, 2, 3])
100 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000101
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000102 self.assertEqual(b1, b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000103 self.failUnless(b2 != b3)
104 self.failUnless(b1 <= b2)
105 self.failUnless(b1 <= b3)
106 self.failUnless(b1 < b3)
107 self.failUnless(b1 >= b2)
108 self.failUnless(b3 >= b2)
109 self.failUnless(b3 > b2)
110
111 self.failIf(b1 != b2)
112 self.failIf(b2 == b3)
113 self.failIf(b1 > b2)
114 self.failIf(b1 > b3)
115 self.failIf(b1 >= b3)
116 self.failIf(b1 < b2)
117 self.failIf(b3 < b2)
118 self.failIf(b3 <= b2)
119
Guido van Rossum343e97f2007-04-09 00:43:24 +0000120 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000121 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000122 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000123 # Test this for all expected byte orders and Unicode character sizes
Christian Heimes510711d2008-01-30 11:57:58 +0000124 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
125 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc", False)
126 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
127 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc", False)
128 self.assertEqual(self.type2test() == str(), False)
129 self.assertEqual(self.type2test() != str(), True)
130
131 def test_reversed(self):
132 input = list(map(ord, "Hello"))
133 b = self.type2test(input)
134 output = list(reversed(b))
135 input.reverse()
136 self.assertEqual(output, input)
137
138 def test_getslice(self):
139 def by(s):
140 return self.type2test(map(ord, s))
141 b = by("Hello, world")
142
143 self.assertEqual(b[:5], by("Hello"))
144 self.assertEqual(b[1:5], by("ello"))
145 self.assertEqual(b[5:7], by(", "))
146 self.assertEqual(b[7:], by("world"))
147 self.assertEqual(b[7:12], by("world"))
148 self.assertEqual(b[7:100], by("world"))
149
150 self.assertEqual(b[:-7], by("Hello"))
151 self.assertEqual(b[-11:-7], by("ello"))
152 self.assertEqual(b[-7:-5], by(", "))
153 self.assertEqual(b[-5:], by("world"))
154 self.assertEqual(b[-5:12], by("world"))
155 self.assertEqual(b[-5:100], by("world"))
156 self.assertEqual(b[-100:5], by("Hello"))
157
158 def test_extended_getslice(self):
159 # Test extended slicing by comparing with list slicing.
160 L = list(range(255))
161 b = self.type2test(L)
162 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
163 for start in indices:
164 for stop in indices:
165 # Skip step 0 (invalid)
166 for step in indices[1:]:
167 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
168
169 def test_encoding(self):
170 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
171 for enc in ("utf8", "utf16"):
172 b = self.type2test(sample, enc)
173 self.assertEqual(b, self.type2test(sample.encode(enc)))
174 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
175 b = self.type2test(sample, "latin1", "ignore")
176 self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
177
178 def test_decode(self):
179 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
180 for enc in ("utf8", "utf16"):
181 b = self.type2test(sample, enc)
182 self.assertEqual(b.decode(enc), sample)
183 sample = "Hello world\n\x80\x81\xfe\xff"
184 b = self.type2test(sample, "latin1")
185 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
186 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
187
188 def test_from_int(self):
189 b = self.type2test(0)
190 self.assertEqual(b, self.type2test())
191 b = self.type2test(10)
192 self.assertEqual(b, self.type2test([0]*10))
193 b = self.type2test(10000)
194 self.assertEqual(b, self.type2test([0]*10000))
195
196 def test_concat(self):
197 b1 = self.type2test(b"abc")
198 b2 = self.type2test(b"def")
199 self.assertEqual(b1 + b2, b"abcdef")
200 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
201 self.assertEqual(bytes(b"def") + b1, b"defabc")
202 self.assertRaises(TypeError, lambda: b1 + "def")
203 self.assertRaises(TypeError, lambda: "abc" + b2)
204
205 def test_repeat(self):
206 for b in b"abc", self.type2test(b"abc"):
207 self.assertEqual(b * 3, b"abcabcabc")
208 self.assertEqual(b * 0, b"")
209 self.assertEqual(b * -1, b"")
210 self.assertRaises(TypeError, lambda: b * 3.14)
211 self.assertRaises(TypeError, lambda: 3.14 * b)
212 # XXX Shouldn't bytes and bytearray agree on what to raise?
213 self.assertRaises((OverflowError, MemoryError),
214 lambda: b * sys.maxsize)
215
216 def test_repeat_1char(self):
217 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
218
219 def test_contains(self):
220 b = self.type2test(b"abc")
221 self.failUnless(ord('a') in b)
222 self.failUnless(int(ord('a')) in b)
223 self.failIf(200 in b)
224 self.failIf(200 in b)
225 self.assertRaises(ValueError, lambda: 300 in b)
226 self.assertRaises(ValueError, lambda: -1 in b)
227 self.assertRaises(TypeError, lambda: None in b)
228 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
229 self.assertRaises(TypeError, lambda: "a" in b)
230 for f in bytes, bytearray:
231 self.failUnless(f(b"") in b)
232 self.failUnless(f(b"a") in b)
233 self.failUnless(f(b"b") in b)
234 self.failUnless(f(b"c") in b)
235 self.failUnless(f(b"ab") in b)
236 self.failUnless(f(b"bc") in b)
237 self.failUnless(f(b"abc") in b)
238 self.failIf(f(b"ac") in b)
239 self.failIf(f(b"d") in b)
240 self.failIf(f(b"dab") in b)
241 self.failIf(f(b"abd") in b)
242
243 def test_fromhex(self):
244 self.assertRaises(TypeError, self.type2test.fromhex)
245 self.assertRaises(TypeError, self.type2test.fromhex, 1)
246 # To be fixed
247 if self.type2test != bytes:
248 self.assertEquals(self.type2test.fromhex(''), self.type2test())
249 b = bytearray([0x1a, 0x2b, 0x30])
250 self.assertEquals(self.type2test.fromhex('1a2B30'), b)
251 self.assertEquals(self.type2test.fromhex(' 1A 2B 30 '), b)
252 self.assertEquals(self.type2test.fromhex('0000'), b'\0\0')
253 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
254 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
255 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
256 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
257 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
258 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
259
260 def test_join(self):
261 self.assertEqual(self.type2test(b"").join([]), b"")
262 self.assertEqual(self.type2test(b"").join([b""]), b"")
263 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
264 lst = list(map(self.type2test, lst))
265 self.assertEqual(self.type2test(b"").join(lst), b"abc")
266 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
267 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
268 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
269 # XXX more...
270
271 def test_index(self):
272 b = self.type2test(b'parrot')
273 self.assertEqual(b.index('p'), 0)
274 self.assertEqual(b.index('rr'), 2)
275 self.assertEqual(b.index('t'), 5)
276 self.assertRaises(ValueError, lambda: b.index('w'))
277
278 def test_count(self):
279 b = self.type2test(b'mississippi')
280 self.assertEqual(b.count(b'i'), 4)
281 self.assertEqual(b.count(b'ss'), 2)
282 self.assertEqual(b.count(b'w'), 0)
283
284 def test_startswith(self):
285 b = self.type2test(b'hello')
286 self.assertFalse(self.type2test().startswith(b"anything"))
287 self.assertTrue(b.startswith(b"hello"))
288 self.assertTrue(b.startswith(b"hel"))
289 self.assertTrue(b.startswith(b"h"))
290 self.assertFalse(b.startswith(b"hellow"))
291 self.assertFalse(b.startswith(b"ha"))
292
293 def test_endswith(self):
294 b = self.type2test(b'hello')
295 self.assertFalse(bytearray().endswith(b"anything"))
296 self.assertTrue(b.endswith(b"hello"))
297 self.assertTrue(b.endswith(b"llo"))
298 self.assertTrue(b.endswith(b"o"))
299 self.assertFalse(b.endswith(b"whello"))
300 self.assertFalse(b.endswith(b"no"))
301
302 def test_find(self):
303 b = self.type2test(b'mississippi')
304 self.assertEqual(b.find(b'ss'), 2)
305 self.assertEqual(b.find(b'ss', 3), 5)
306 self.assertEqual(b.find(b'ss', 1, 7), 2)
307 self.assertEqual(b.find(b'ss', 1, 3), -1)
308 self.assertEqual(b.find(b'w'), -1)
309 self.assertEqual(b.find(b'mississippian'), -1)
310
311 def test_rfind(self):
312 b = self.type2test(b'mississippi')
313 self.assertEqual(b.rfind(b'ss'), 5)
314 self.assertEqual(b.rfind(b'ss', 3), 5)
315 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
316 self.assertEqual(b.rfind(b'w'), -1)
317 self.assertEqual(b.rfind(b'mississippian'), -1)
318
319 def test_index(self):
320 b = self.type2test(b'world')
321 self.assertEqual(b.index(b'w'), 0)
322 self.assertEqual(b.index(b'orl'), 1)
323 self.assertRaises(ValueError, b.index, b'worm')
324 self.assertRaises(ValueError, b.index, b'ldo')
325
326 def test_rindex(self):
327 # XXX could be more rigorous
328 b = self.type2test(b'world')
329 self.assertEqual(b.rindex(b'w'), 0)
330 self.assertEqual(b.rindex(b'orl'), 1)
331 self.assertRaises(ValueError, b.rindex, b'worm')
332 self.assertRaises(ValueError, b.rindex, b'ldo')
333
334 def test_replace(self):
335 b = self.type2test(b'mississippi')
336 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
337 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
338
339 def test_split(self):
340 b = self.type2test(b'mississippi')
341 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
342 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
343 self.assertEqual(b.split(b'w'), [b])
344
345 def test_split_whitespace(self):
346 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
347 b'arf\fbarf', b'arf\vbarf'):
348 b = self.type2test(b)
349 self.assertEqual(b.split(), [b'arf', b'barf'])
350 self.assertEqual(b.split(None), [b'arf', b'barf'])
351 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
352 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
353 b = self.type2test(b)
354 self.assertEqual(b.split(), [b])
355 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
356 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
357 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
358 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
359
360 def test_split_string_error(self):
361 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
362
363 def test_rsplit(self):
364 b = self.type2test(b'mississippi')
365 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
366 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
367 self.assertEqual(b.rsplit(b'w'), [b])
368
369 def test_rsplit_whitespace(self):
370 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
371 b'arf\fbarf', b'arf\vbarf'):
372 b = self.type2test(b)
373 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
374 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
375 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
376 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
377 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
378 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
379 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
380
381 def test_rsplit_string_error(self):
382 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
383
384 def test_rsplit_unicodewhitespace(self):
385 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
386 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
387 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
388
389 def test_partition(self):
390 b = self.type2test(b'mississippi')
391 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
392 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
393
394 def test_rpartition(self):
395 b = self.type2test(b'mississippi')
396 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
397 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
398
399 def test_pickling(self):
400 for proto in range(pickle.HIGHEST_PROTOCOL):
401 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
402 b = self.type2test(b)
403 ps = pickle.dumps(b, proto)
404 q = pickle.loads(ps)
405 self.assertEqual(b, q)
406
407 def test_strip(self):
408 b = self.type2test(b'mississippi')
409 self.assertEqual(b.strip(b'i'), b'mississipp')
410 self.assertEqual(b.strip(b'm'), b'ississippi')
411 self.assertEqual(b.strip(b'pi'), b'mississ')
412 self.assertEqual(b.strip(b'im'), b'ssissipp')
413 self.assertEqual(b.strip(b'pim'), b'ssiss')
414 self.assertEqual(b.strip(b), b'')
415
416 def test_lstrip(self):
417 b = self.type2test(b'mississippi')
418 self.assertEqual(b.lstrip(b'i'), b'mississippi')
419 self.assertEqual(b.lstrip(b'm'), b'ississippi')
420 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
421 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
422 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
423
424 def test_rstrip(self):
425 b = self.type2test(b'mississippi')
426 self.assertEqual(b.rstrip(b'i'), b'mississipp')
427 self.assertEqual(b.rstrip(b'm'), b'mississippi')
428 self.assertEqual(b.rstrip(b'pi'), b'mississ')
429 self.assertEqual(b.rstrip(b'im'), b'mississipp')
430 self.assertEqual(b.rstrip(b'pim'), b'mississ')
431
432 def test_strip_whitespace(self):
433 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
434 self.assertEqual(b.strip(), b'abc')
435 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
436 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
437
438 def test_strip_bytearray(self):
439 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
440 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
441 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
442
443 def test_strip_string_error(self):
444 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
445 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
446 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
447
448 def test_ord(self):
449 b = self.type2test(b'\0A\x7f\x80\xff')
450 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
451 [0, 65, 127, 128, 255])
452
453
454class BytesTest(BaseBytesTest):
455 type2test = bytes
456
457class ByteArrayTest(BaseBytesTest):
458 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000459
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000460 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000461 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000462
Guido van Rossum254348e2007-11-21 19:29:53 +0000463 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000464 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000465 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000466 tfn = tempfile.mktemp()
467 try:
468 # Prepare
469 with open(tfn, "wb") as f:
470 f.write(short_sample)
471 # Test readinto
472 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000473 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000474 n = f.readinto(b)
475 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000476 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000477 # Test writing in binary mode
478 with open(tfn, "wb") as f:
479 f.write(b)
480 with open(tfn, "rb") as f:
481 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000482 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000483 finally:
484 try:
485 os.remove(tfn)
486 except os.error:
487 pass
488
Neal Norwitz6968b052007-02-27 19:02:19 +0000489 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000490 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000491 self.assertEqual(b.reverse(), None)
492 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000493 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000494 b.reverse()
495 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000496 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000497 b.reverse()
498 self.assertFalse(b)
499
Guido van Rossumd624f182006-04-24 13:47:05 +0000500 def test_regexps(self):
501 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000502 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000503 b = by("Hello, world")
504 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
505
506 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000507 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000508 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000509 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000510 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000511 self.assertEqual(b, bytearray([1, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000512 class C:
513 def __init__(self, i=0):
514 self.i = i
515 def __index__(self):
516 return self.i
517 b[0] = C(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000518 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000519 try:
520 b[3] = 0
521 self.fail("Didn't raise IndexError")
522 except IndexError:
523 pass
524 try:
525 b[-10] = 0
526 self.fail("Didn't raise IndexError")
527 except IndexError:
528 pass
529 try:
530 b[0] = 256
531 self.fail("Didn't raise ValueError")
532 except ValueError:
533 pass
534 try:
535 b[0] = C(-1)
536 self.fail("Didn't raise ValueError")
537 except ValueError:
538 pass
539 try:
540 b[0] = None
541 self.fail("Didn't raise TypeError")
542 except TypeError:
543 pass
544
545 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000546 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000547 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000548 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000549 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000550 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000551 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000552 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000553
554 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000555 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000556 self.assertEqual(list(b), list(range(10)))
557
Guido van Rossum254348e2007-11-21 19:29:53 +0000558 b[0:5] = bytearray([1, 1, 1, 1, 1])
559 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000560
561 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000562 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000563
Guido van Rossum254348e2007-11-21 19:29:53 +0000564 b[0:0] = bytearray([0, 1, 2, 3, 4])
565 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000566
Guido van Rossum254348e2007-11-21 19:29:53 +0000567 b[-7:-3] = bytearray([100, 101])
568 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000569
570 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000571 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000572
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000573 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000574 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 +0000575
Thomas Wouters376446d2006-12-19 08:30:14 +0000576 def test_extended_set_del_slice(self):
577 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
578 for start in indices:
579 for stop in indices:
580 # Skip invalid step 0
581 for step in indices[1:]:
582 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000583 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000584 # Make sure we have a slice of exactly the right length,
585 # but with different data.
586 data = L[start:stop:step]
587 data.reverse()
588 L[start:stop:step] = data
589 b[start:stop:step] = data
Guido van Rossum254348e2007-11-21 19:29:53 +0000590 self.assertEquals(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000591
Thomas Wouters376446d2006-12-19 08:30:14 +0000592 del L[start:stop:step]
593 del b[start:stop:step]
Guido van Rossum254348e2007-11-21 19:29:53 +0000594 self.assertEquals(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000595
Guido van Rossumd624f182006-04-24 13:47:05 +0000596 def test_setslice_trap(self):
597 # This test verifies that we correctly handle assigning self
598 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000599 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000600 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000601 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000602
Guido van Rossum13e57212006-04-27 22:54:26 +0000603 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000604 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000605 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000606 b += b"def"
607 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000608 self.assertEqual(b, b1)
609 self.failUnless(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000610 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000611 self.assertEqual(b, b"abcdefxyz")
612 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000613 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000614 except TypeError:
615 pass
616 else:
617 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000618
619 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000620 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000621 b1 = b
622 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000623 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000624 self.assertEqual(b, b1)
625 self.failUnless(b is b1)
626
627 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000628 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000629 b1 = b
630 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000631 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000632 self.assertEqual(b, b1)
633 self.failUnless(b is b1)
634
Guido van Rossum20188312006-05-05 15:15:40 +0000635 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000636 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000637 alloc = b.__alloc__()
638 self.assert_(alloc >= 0)
639 seq = [alloc]
640 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000641 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000642 alloc = b.__alloc__()
643 self.assert_(alloc >= len(b))
644 if alloc not in seq:
645 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000646
Neal Norwitz6968b052007-02-27 19:02:19 +0000647 def test_extend(self):
648 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000649 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000650 a.extend(a)
651 self.assertEqual(a, orig + orig)
652 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000653 a = bytearray(b'')
654 # Test iterators that don't have a __length_hint__
655 a.extend(map(int, orig * 25))
656 a.extend(int(x) for x in orig * 25)
657 self.assertEqual(a, orig * 50)
658 self.assertEqual(a[-5:], orig)
659 a = bytearray(b'')
660 a.extend(iter(map(int, orig * 50)))
661 self.assertEqual(a, orig * 50)
662 self.assertEqual(a[-5:], orig)
663 a = bytearray(b'')
664 a.extend(list(map(int, orig * 50)))
665 self.assertEqual(a, orig * 50)
666 self.assertEqual(a[-5:], orig)
667 a = bytearray(b'')
668 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
669 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
670 self.assertEqual(len(a), 0)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000671
Neal Norwitz6968b052007-02-27 19:02:19 +0000672 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000673 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000674 b.remove(ord('l'))
675 self.assertEqual(b, b'helo')
676 b.remove(ord('l'))
677 self.assertEqual(b, b'heo')
678 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
679 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000680 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000681 # remove first and last
682 b.remove(ord('o'))
683 b.remove(ord('h'))
684 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000685 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000686
687 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000688 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000689 self.assertEqual(b.pop(), ord('d'))
690 self.assertEqual(b.pop(0), ord('w'))
691 self.assertEqual(b.pop(-2), ord('r'))
692 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000693 self.assertRaises(OverflowError, lambda: bytearray().pop())
Neal Norwitz6968b052007-02-27 19:02:19 +0000694
695 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000696 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000697
Neal Norwitz6968b052007-02-27 19:02:19 +0000698 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000699 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000700 b.append(ord('o'))
701 self.assertEqual(b, b'hello')
702 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000703 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000704 b.append(ord('A'))
705 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000706 self.assertRaises(TypeError, lambda: b.append(b'o'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000707
708 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000709 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000710 b.insert(1, ord('i'))
711 b.insert(4, ord('i'))
712 b.insert(-2, ord('i'))
713 b.insert(1000, ord('i'))
714 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000715 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000716
Guido van Rossum254348e2007-11-21 19:29:53 +0000717 def test_partition_bytearray_doesnt_share_nullstring(self):
718 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000719 self.assertEqual(b, b"")
720 self.assertEqual(c, b"")
721 self.assert_(b is not c)
722 b += b"!"
723 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000724 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000725 self.assertEqual(b, b"")
726 self.assertEqual(c, b"")
727 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000728 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000729 self.assertEqual(b, b"")
730 self.assertEqual(c, b"")
731 self.assert_(b is not c)
732 b += b"!"
733 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000734 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000735 self.assertEqual(b, b"")
736 self.assertEqual(c, b"")
737
738
Christian Heimes510711d2008-01-30 11:57:58 +0000739class AssortedBytesTest(unittest.TestCase):
740 #
741 # Test various combinations of bytes and bytearray
742 #
743
744 def setUp(self):
745 self.warning_filters = warnings.filters[:]
746
747 def tearDown(self):
748 warnings.filters = self.warning_filters
749
750 def test_repr_str(self):
751 warnings.simplefilter('ignore', BytesWarning)
752 for f in str, repr:
753 self.assertEqual(f(bytearray()), "bytearray(b'')")
754 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
755 self.assertEqual(f(bytearray([0, 1, 254, 255])),
756 "bytearray(b'\\x00\\x01\\xfe\\xff')")
757 self.assertEqual(f(b"abc"), "b'abc'")
758 self.assertEqual(f(b"'"), '''b"'"''') # '''
759 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
760
761 def test_compare_bytes_to_bytearray(self):
762 self.assertEqual(b"abc" == bytes(b"abc"), True)
763 self.assertEqual(b"ab" != bytes(b"abc"), True)
764 self.assertEqual(b"ab" <= bytes(b"abc"), True)
765 self.assertEqual(b"ab" < bytes(b"abc"), True)
766 self.assertEqual(b"abc" >= bytes(b"ab"), True)
767 self.assertEqual(b"abc" > bytes(b"ab"), True)
768
769 self.assertEqual(b"abc" != bytes(b"abc"), False)
770 self.assertEqual(b"ab" == bytes(b"abc"), False)
771 self.assertEqual(b"ab" > bytes(b"abc"), False)
772 self.assertEqual(b"ab" >= bytes(b"abc"), False)
773 self.assertEqual(b"abc" < bytes(b"ab"), False)
774 self.assertEqual(b"abc" <= bytes(b"ab"), False)
775
776 self.assertEqual(bytes(b"abc") == b"abc", True)
777 self.assertEqual(bytes(b"ab") != b"abc", True)
778 self.assertEqual(bytes(b"ab") <= b"abc", True)
779 self.assertEqual(bytes(b"ab") < b"abc", True)
780 self.assertEqual(bytes(b"abc") >= b"ab", True)
781 self.assertEqual(bytes(b"abc") > b"ab", True)
782
783 self.assertEqual(bytes(b"abc") != b"abc", False)
784 self.assertEqual(bytes(b"ab") == b"abc", False)
785 self.assertEqual(bytes(b"ab") > b"abc", False)
786 self.assertEqual(bytes(b"ab") >= b"abc", False)
787 self.assertEqual(bytes(b"abc") < b"ab", False)
788 self.assertEqual(bytes(b"abc") <= b"ab", False)
789
790 def test_doc(self):
791 self.failUnless(bytearray.__doc__ != None)
792 self.failUnless(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
793 self.failUnless(bytes.__doc__ != None)
794 self.failUnless(bytes.__doc__.startswith("bytes("), bytes.__doc__)
795
796 def test_from_bytearray(self):
797 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
798 buf = memoryview(sample)
799 b = bytearray(buf)
800 self.assertEqual(b, bytearray(sample))
801
802 def test_to_str(self):
803 warnings.simplefilter('ignore', BytesWarning)
804 self.assertEqual(str(b''), "b''")
805 self.assertEqual(str(b'x'), "b'x'")
806 self.assertEqual(str(b'\x80'), "b'\\x80'")
807 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
808 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
809 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
810
811 def test_literal(self):
812 tests = [
813 (b"Wonderful spam", "Wonderful spam"),
814 (br"Wonderful spam too", "Wonderful spam too"),
815 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
816 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
817 ]
818 for b, s in tests:
819 self.assertEqual(b, bytearray(s, 'latin-1'))
820 for c in range(128, 256):
821 self.assertRaises(SyntaxError, eval,
822 'b"%s"' % chr(c))
823
824 def test_translate(self):
825 b = b'hello'
826 rosetta = bytearray(range(0, 256))
827 rosetta[ord('o')] = ord('e')
828 c = b.translate(rosetta, b'l')
829 self.assertEqual(b, b'hello')
830 self.assertEqual(c, b'hee')
831
832 def test_split_bytearray(self):
833 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
834
835 def test_rsplit_bytearray(self):
836 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
837
Guido van Rossumd624f182006-04-24 13:47:05 +0000838 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000839 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000840 # __reversed__? (optimization)
841
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000842 # XXX More string methods? (Those that don't use character properties)
843
Neal Norwitz6968b052007-02-27 19:02:19 +0000844 # There are tests in string_tests.py that are more
845 # comprehensive for things like split, partition, etc.
846 # Unfortunately they are all bundled with tests that
847 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000848
Guido van Rossum254348e2007-11-21 19:29:53 +0000849 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000850 # the rest that make sense (the code can be cleaned up to use modern
851 # unittest methods at the same time).
852
Guido van Rossum254348e2007-11-21 19:29:53 +0000853class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000854 test.buffer_tests.MixinBytesBufferCommonTests):
855 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +0000856 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000857
858 def test_returns_new_copy(self):
859 val = self.marshal(b'1234')
860 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +0000861 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000862 for methname in ('zfill', 'rjust', 'ljust', 'center'):
863 method = getattr(val, methname)
864 newval = method(3)
865 self.assertEqual(val, newval)
866 self.assertTrue(val is not newval,
867 methname+' returned self on a mutable object')
868
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000869
Christian Heimes510711d2008-01-30 11:57:58 +0000870class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +0000871
Guido van Rossum9c627722007-08-27 18:31:48 +0000872 def fixtype(self, obj):
873 if isinstance(obj, str):
874 return obj.encode("utf-8")
875 return super().fixtype(obj)
876
Georg Brandlc7885542007-03-06 19:16:20 +0000877 # Currently the bytes containment testing uses a single integer
878 # value. This may not be the final design, but until then the
879 # bytes section with in a bytes containment not valid
880 def test_contains(self):
881 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000882 def test_expandtabs(self):
883 pass
884 def test_upper(self):
885 pass
886 def test_lower(self):
887 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000888
Christian Heimes510711d2008-01-30 11:57:58 +0000889class ByteArrayAsStringTest(FixedStringTest):
890 type2test = bytearray
891
892class BytesAsStringTest(FixedStringTest):
893 type2test = bytes
894
Georg Brandlc7885542007-03-06 19:16:20 +0000895
Guido van Rossum254348e2007-11-21 19:29:53 +0000896class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000897 pass
898
Guido van Rossum254348e2007-11-21 19:29:53 +0000899class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000900
901 def test_basic(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000902 self.assert_(issubclass(ByteArraySubclass, bytearray))
903 self.assert_(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000904
905 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +0000906 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000907
908 # test comparison operators with subclass instances
909 self.assert_(_a == _a)
910 self.assert_(_a != _b)
911 self.assert_(_a < _b)
912 self.assert_(_a <= _b)
913 self.assert_(_b >= _a)
914 self.assert_(_b > _a)
915 self.assert_(_a is not a)
916
917 # test concat of subclass instances
918 self.assertEqual(a + b, _a + _b)
919 self.assertEqual(a + b, a + _b)
920 self.assertEqual(a + b, _a + b)
921
922 # test repeat
923 self.assert_(a*5 == _a*5)
924
925 def test_join(self):
926 # Make sure join returns a NEW object for single item sequences
927 # involving a subclass.
928 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +0000929 s1 = ByteArraySubclass(b"abcd")
930 s2 = bytearray().join([s1])
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000931 self.assert_(s1 is not s2)
Guido van Rossum254348e2007-11-21 19:29:53 +0000932 self.assert_(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000933
934 # Test reverse, calling join on subclass
935 s3 = s1.join([b"abcd"])
Guido van Rossum254348e2007-11-21 19:29:53 +0000936 self.assert_(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000937
938 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000939 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000940 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000941 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000942 for proto in range(pickle.HIGHEST_PROTOCOL):
943 b = pickle.loads(pickle.dumps(a, proto))
944 self.assertNotEqual(id(a), id(b))
945 self.assertEqual(a, b)
946 self.assertEqual(a.x, b.x)
947 self.assertEqual(a.y, b.y)
948 self.assertEqual(type(a), type(b))
949 self.assertEqual(type(a.y), type(b.y))
950
951 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000952 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000953 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000954 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000955 for copy_method in (copy.copy, copy.deepcopy):
956 b = copy_method(a)
957 self.assertNotEqual(id(a), id(b))
958 self.assertEqual(a, b)
959 self.assertEqual(a.x, b.x)
960 self.assertEqual(a.y, b.y)
961 self.assertEqual(type(a), type(b))
962 self.assertEqual(type(a.y), type(b.y))
963
964 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000965 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000966 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +0000967 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000968 x = subclass(4, source=b"abcd")
969 self.assertEqual(x, b"abcd")
970 x = subclass(newarg=4, source=b"abcd")
971 self.assertEqual(x, b"abcd")
972
973
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000974def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000975 test.test_support.run_unittest(BytesTest)
Christian Heimes510711d2008-01-30 11:57:58 +0000976 test.test_support.run_unittest(ByteArrayTest)
977 test.test_support.run_unittest(AssortedBytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000978 test.test_support.run_unittest(BytesAsStringTest)
Christian Heimes510711d2008-01-30 11:57:58 +0000979 test.test_support.run_unittest(ByteArrayAsStringTest)
Guido van Rossum254348e2007-11-21 19:29:53 +0000980 test.test_support.run_unittest(ByteArraySubclassTest)
981 test.test_support.run_unittest(BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000982
983if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000984 test_main()