blob: bdcb88ac6ed9d1fd980b325561ebfce14ae7dbac [file] [log] [blame]
Christian Heimes1a6387e2008-03-26 12:49:49 +00001"""Unit tests for the bytes and bytearray types.
2
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"""
7
8import os
9import re
10import sys
11import copy
Florent Xicluna9b90cd12010-09-13 07:46:37 +000012import functools
Christian Heimes1a6387e2008-03-26 12:49:49 +000013import pickle
14import tempfile
15import unittest
Christian Heimes1a6387e2008-03-26 12:49:49 +000016import test.test_support
17import test.string_tests
18import test.buffer_tests
19
Florent Xicluna9b90cd12010-09-13 07:46:37 +000020
21if sys.flags.bytes_warning:
22 def check_bytes_warnings(func):
23 @functools.wraps(func)
24 def wrapper(*args, **kw):
25 with test.test_support.check_warnings(('', BytesWarning)):
26 return func(*args, **kw)
27 return wrapper
28else:
29 # no-op
30 def check_bytes_warnings(func):
31 return func
32
33
Georg Brandl3e483f62008-07-16 22:57:41 +000034class Indexable:
35 def __init__(self, value=0):
36 self.value = value
37 def __index__(self):
38 return self.value
39
Christian Heimes1a6387e2008-03-26 12:49:49 +000040
41class BaseBytesTest(unittest.TestCase):
42
Christian Heimes1a6387e2008-03-26 12:49:49 +000043 def test_basics(self):
44 b = self.type2test()
45 self.assertEqual(type(b), self.type2test)
46 self.assertEqual(b.__class__, self.type2test)
47
48 def test_empty_sequence(self):
49 b = self.type2test()
50 self.assertEqual(len(b), 0)
51 self.assertRaises(IndexError, lambda: b[0])
52 self.assertRaises(IndexError, lambda: b[1])
53 self.assertRaises(IndexError, lambda: b[sys.maxint])
54 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
55 self.assertRaises(IndexError, lambda: b[10**100])
56 self.assertRaises(IndexError, lambda: b[-1])
57 self.assertRaises(IndexError, lambda: b[-2])
58 self.assertRaises(IndexError, lambda: b[-sys.maxint])
59 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
60 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
61 self.assertRaises(IndexError, lambda: b[-10**100])
62
63 def test_from_list(self):
64 ints = list(range(256))
65 b = self.type2test(i for i in ints)
66 self.assertEqual(len(b), 256)
67 self.assertEqual(list(b), ints)
68
69 def test_from_index(self):
Georg Brandl3e483f62008-07-16 22:57:41 +000070 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
71 Indexable(255)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000072 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson06f06a02010-04-16 22:24:16 +000073 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
74 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Christian Heimes1a6387e2008-03-26 12:49:49 +000075
76 def test_from_ssize(self):
Benjamin Peterson06f06a02010-04-16 22:24:16 +000077 self.assertEqual(self.type2test(0), b'')
78 self.assertEqual(self.type2test(1), b'\x00')
Benjamin Peterson5c4e2922010-04-16 22:25:57 +000079 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
Benjamin Peterson06f06a02010-04-16 22:24:16 +000080 self.assertRaises(ValueError, self.type2test, -1)
Christian Heimes1a6387e2008-03-26 12:49:49 +000081
Benjamin Peterson06f06a02010-04-16 22:24:16 +000082 self.assertEqual(self.type2test('0', 'ascii'), b'0')
83 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson821a8ea2010-04-16 22:35:38 +000084 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Christian Heimes1a6387e2008-03-26 12:49:49 +000085
86 def test_constructor_type_errors(self):
87 self.assertRaises(TypeError, self.type2test, 0.0)
88 class C:
89 pass
Antoine Pitrouefa45f32010-01-12 22:02:10 +000090 # allowed in 2.x
Georg Brandl0a34baf2008-07-16 23:18:51 +000091 #self.assertRaises(TypeError, self.type2test, ["0"])
Christian Heimes1a6387e2008-03-26 12:49:49 +000092 self.assertRaises(TypeError, self.type2test, [0.0])
93 self.assertRaises(TypeError, self.type2test, [None])
94 self.assertRaises(TypeError, self.type2test, [C()])
95
96 def test_constructor_value_errors(self):
97 self.assertRaises(ValueError, self.type2test, [-1])
98 self.assertRaises(ValueError, self.type2test, [-sys.maxint])
99 self.assertRaises(ValueError, self.type2test, [-sys.maxint-1])
100 self.assertRaises(ValueError, self.type2test, [-sys.maxint-2])
101 self.assertRaises(ValueError, self.type2test, [-10**100])
102 self.assertRaises(ValueError, self.type2test, [256])
103 self.assertRaises(ValueError, self.type2test, [257])
104 self.assertRaises(ValueError, self.type2test, [sys.maxint])
105 self.assertRaises(ValueError, self.type2test, [sys.maxint+1])
106 self.assertRaises(ValueError, self.type2test, [10**100])
107
108 def test_compare(self):
109 b1 = self.type2test([1, 2, 3])
110 b2 = self.type2test([1, 2, 3])
111 b3 = self.type2test([1, 3])
112
113 self.assertEqual(b1, b2)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000114 self.assertTrue(b2 != b3)
115 self.assertTrue(b1 <= b2)
116 self.assertTrue(b1 <= b3)
117 self.assertTrue(b1 < b3)
118 self.assertTrue(b1 >= b2)
119 self.assertTrue(b3 >= b2)
120 self.assertTrue(b3 > b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000121
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000122 self.assertFalse(b1 != b2)
123 self.assertFalse(b2 == b3)
124 self.assertFalse(b1 > b2)
125 self.assertFalse(b1 > b3)
126 self.assertFalse(b1 >= b3)
127 self.assertFalse(b1 < b2)
128 self.assertFalse(b3 < b2)
129 self.assertFalse(b3 <= b2)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000130
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000131 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000132 def test_compare_to_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000133 # Byte comparisons with unicode should always fail!
134 # Test this for all expected byte orders and Unicode character sizes
135 self.assertEqual(self.type2test(b"\0a\0b\0c") == u"abc", False)
136 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == u"abc", False)
137 self.assertEqual(self.type2test(b"a\0b\0c\0") == u"abc", False)
138 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == u"abc", False)
139 self.assertEqual(self.type2test() == unicode(), False)
140 self.assertEqual(self.type2test() != unicode(), True)
141
142 def test_reversed(self):
143 input = list(map(ord, "Hello"))
144 b = self.type2test(input)
145 output = list(reversed(b))
146 input.reverse()
147 self.assertEqual(output, input)
148
149 def test_getslice(self):
150 def by(s):
151 return self.type2test(map(ord, s))
152 b = by("Hello, world")
153
154 self.assertEqual(b[:5], by("Hello"))
155 self.assertEqual(b[1:5], by("ello"))
156 self.assertEqual(b[5:7], by(", "))
157 self.assertEqual(b[7:], by("world"))
158 self.assertEqual(b[7:12], by("world"))
159 self.assertEqual(b[7:100], by("world"))
160
161 self.assertEqual(b[:-7], by("Hello"))
162 self.assertEqual(b[-11:-7], by("ello"))
163 self.assertEqual(b[-7:-5], by(", "))
164 self.assertEqual(b[-5:], by("world"))
165 self.assertEqual(b[-5:12], by("world"))
166 self.assertEqual(b[-5:100], by("world"))
167 self.assertEqual(b[-100:5], by("Hello"))
168
169 def test_extended_getslice(self):
170 # Test extended slicing by comparing with list slicing.
171 L = list(range(255))
172 b = self.type2test(L)
173 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
174 for start in indices:
175 for stop in indices:
176 # Skip step 0 (invalid)
177 for step in indices[1:]:
178 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
179
180 def test_encoding(self):
181 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
182 for enc in ("utf8", "utf16"):
183 b = self.type2test(sample, enc)
184 self.assertEqual(b, self.type2test(sample.encode(enc)))
185 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin1")
186 b = self.type2test(sample, "latin1", "ignore")
187 self.assertEqual(b, self.type2test(sample[:-4], "utf-8"))
188
189 def test_decode(self):
190 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
191 for enc in ("utf8", "utf16"):
192 b = self.type2test(sample, enc)
193 self.assertEqual(b.decode(enc), sample)
194 sample = u"Hello world\n\x80\x81\xfe\xff"
195 b = self.type2test(sample, "latin1")
196 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
197 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
Benjamin Petersondc782b52009-09-18 21:46:21 +0000198 self.assertEqual(b.decode(errors="ignore", encoding="utf8"),
199 "Hello world\n")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000200
201 def test_from_int(self):
202 b = self.type2test(0)
203 self.assertEqual(b, self.type2test())
204 b = self.type2test(10)
205 self.assertEqual(b, self.type2test([0]*10))
206 b = self.type2test(10000)
207 self.assertEqual(b, self.type2test([0]*10000))
208
209 def test_concat(self):
210 b1 = self.type2test(b"abc")
211 b2 = self.type2test(b"def")
212 self.assertEqual(b1 + b2, b"abcdef")
213 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
214 self.assertEqual(bytes(b"def") + b1, b"defabc")
215 self.assertRaises(TypeError, lambda: b1 + u"def")
216 self.assertRaises(TypeError, lambda: u"abc" + b2)
217
218 def test_repeat(self):
219 for b in b"abc", self.type2test(b"abc"):
220 self.assertEqual(b * 3, b"abcabcabc")
221 self.assertEqual(b * 0, b"")
222 self.assertEqual(b * -1, b"")
223 self.assertRaises(TypeError, lambda: b * 3.14)
224 self.assertRaises(TypeError, lambda: 3.14 * b)
225 # XXX Shouldn't bytes and bytearray agree on what to raise?
226 self.assertRaises((OverflowError, MemoryError),
Mark Hammond69ed5242008-08-23 00:59:14 +0000227 lambda: b * sys.maxsize)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000228
229 def test_repeat_1char(self):
230 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
231
232 def test_contains(self):
233 b = self.type2test(b"abc")
Ezio Melottiaa980582010-01-23 23:04:36 +0000234 self.assertIn(ord('a'), b)
235 self.assertIn(int(ord('a')), b)
236 self.assertNotIn(200, b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000237 self.assertRaises(ValueError, lambda: 300 in b)
238 self.assertRaises(ValueError, lambda: -1 in b)
239 self.assertRaises(TypeError, lambda: None in b)
240 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
241 self.assertRaises(TypeError, lambda: u"a" in b)
242 for f in bytes, bytearray:
Ezio Melottiaa980582010-01-23 23:04:36 +0000243 self.assertIn(f(b""), b)
244 self.assertIn(f(b"a"), b)
245 self.assertIn(f(b"b"), b)
246 self.assertIn(f(b"c"), b)
247 self.assertIn(f(b"ab"), b)
248 self.assertIn(f(b"bc"), b)
249 self.assertIn(f(b"abc"), b)
250 self.assertNotIn(f(b"ac"), b)
251 self.assertNotIn(f(b"d"), b)
252 self.assertNotIn(f(b"dab"), b)
253 self.assertNotIn(f(b"abd"), b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000254
255 def test_fromhex(self):
256 self.assertRaises(TypeError, self.type2test.fromhex)
257 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melotti2623a372010-11-21 13:34:58 +0000258 self.assertEqual(self.type2test.fromhex(u''), self.type2test())
Christian Heimes1a6387e2008-03-26 12:49:49 +0000259 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melotti2623a372010-11-21 13:34:58 +0000260 self.assertEqual(self.type2test.fromhex(u'1a2B30'), b)
261 self.assertEqual(self.type2test.fromhex(u' 1A 2B 30 '), b)
262 self.assertEqual(self.type2test.fromhex(u'0000'), b'\0\0')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000263 self.assertRaises(ValueError, self.type2test.fromhex, u'a')
264 self.assertRaises(ValueError, self.type2test.fromhex, u'rt')
265 self.assertRaises(ValueError, self.type2test.fromhex, u'1a b cd')
266 self.assertRaises(ValueError, self.type2test.fromhex, u'\x00')
267 self.assertRaises(ValueError, self.type2test.fromhex, u'12 \x00 34')
268
269 def test_join(self):
270 self.assertEqual(self.type2test(b"").join([]), b"")
271 self.assertEqual(self.type2test(b"").join([b""]), b"")
272 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
273 lst = list(map(self.type2test, lst))
274 self.assertEqual(self.type2test(b"").join(lst), b"abc")
275 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
276 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
277 self.assertEqual(self.type2test(b".").join([b"ab", b"cd"]), b"ab.cd")
278 # XXX more...
279
Christian Heimes1a6387e2008-03-26 12:49:49 +0000280 def test_count(self):
281 b = self.type2test(b'mississippi')
282 self.assertEqual(b.count(b'i'), 4)
283 self.assertEqual(b.count(b'ss'), 2)
284 self.assertEqual(b.count(b'w'), 0)
285
286 def test_startswith(self):
287 b = self.type2test(b'hello')
288 self.assertFalse(self.type2test().startswith(b"anything"))
289 self.assertTrue(b.startswith(b"hello"))
290 self.assertTrue(b.startswith(b"hel"))
291 self.assertTrue(b.startswith(b"h"))
292 self.assertFalse(b.startswith(b"hellow"))
293 self.assertFalse(b.startswith(b"ha"))
294
295 def test_endswith(self):
296 b = self.type2test(b'hello')
297 self.assertFalse(bytearray().endswith(b"anything"))
298 self.assertTrue(b.endswith(b"hello"))
299 self.assertTrue(b.endswith(b"llo"))
300 self.assertTrue(b.endswith(b"o"))
301 self.assertFalse(b.endswith(b"whello"))
302 self.assertFalse(b.endswith(b"no"))
303
304 def test_find(self):
305 b = self.type2test(b'mississippi')
306 self.assertEqual(b.find(b'ss'), 2)
307 self.assertEqual(b.find(b'ss', 3), 5)
308 self.assertEqual(b.find(b'ss', 1, 7), 2)
309 self.assertEqual(b.find(b'ss', 1, 3), -1)
310 self.assertEqual(b.find(b'w'), -1)
311 self.assertEqual(b.find(b'mississippian'), -1)
312
313 def test_rfind(self):
314 b = self.type2test(b'mississippi')
315 self.assertEqual(b.rfind(b'ss'), 5)
316 self.assertEqual(b.rfind(b'ss', 3), 5)
317 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
318 self.assertEqual(b.rfind(b'w'), -1)
319 self.assertEqual(b.rfind(b'mississippian'), -1)
320
321 def test_index(self):
322 b = self.type2test(b'world')
323 self.assertEqual(b.index(b'w'), 0)
324 self.assertEqual(b.index(b'orl'), 1)
325 self.assertRaises(ValueError, b.index, b'worm')
326 self.assertRaises(ValueError, b.index, b'ldo')
327
328 def test_rindex(self):
329 # XXX could be more rigorous
330 b = self.type2test(b'world')
331 self.assertEqual(b.rindex(b'w'), 0)
332 self.assertEqual(b.rindex(b'orl'), 1)
333 self.assertRaises(ValueError, b.rindex, b'worm')
334 self.assertRaises(ValueError, b.rindex, b'ldo')
335
336 def test_replace(self):
337 b = self.type2test(b'mississippi')
338 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
339 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
340
341 def test_split(self):
342 b = self.type2test(b'mississippi')
343 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
344 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
345 self.assertEqual(b.split(b'w'), [b])
346
347 def test_split_whitespace(self):
348 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
349 b'arf\fbarf', b'arf\vbarf'):
350 b = self.type2test(b)
351 self.assertEqual(b.split(), [b'arf', b'barf'])
352 self.assertEqual(b.split(None), [b'arf', b'barf'])
353 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
354 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
355 b = self.type2test(b)
356 self.assertEqual(b.split(), [b])
357 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
358 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
359 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
360 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
361
362 def test_split_string_error(self):
363 self.assertRaises(TypeError, self.type2test(b'a b').split, u' ')
364
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000365 def test_split_unicodewhitespace(self):
366 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
367 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
368
Christian Heimes1a6387e2008-03-26 12:49:49 +0000369 def test_rsplit(self):
370 b = self.type2test(b'mississippi')
371 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
372 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
373 self.assertEqual(b.rsplit(b'w'), [b])
374
375 def test_rsplit_whitespace(self):
376 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
377 b'arf\fbarf', b'arf\vbarf'):
378 b = self.type2test(b)
379 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
380 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
381 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
382 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
383 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
384 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
385 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
386
387 def test_rsplit_string_error(self):
388 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, u' ')
389
390 def test_rsplit_unicodewhitespace(self):
391 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes1a6387e2008-03-26 12:49:49 +0000392 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
393
394 def test_partition(self):
395 b = self.type2test(b'mississippi')
396 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000397 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000398
399 def test_rpartition(self):
400 b = self.type2test(b'mississippi')
401 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
402 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000403 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000404
405 def test_pickling(self):
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +0000406 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000407 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
408 b = self.type2test(b)
409 ps = pickle.dumps(b, proto)
410 q = pickle.loads(ps)
411 self.assertEqual(b, q)
412
413 def test_strip(self):
414 b = self.type2test(b'mississippi')
415 self.assertEqual(b.strip(b'i'), b'mississipp')
416 self.assertEqual(b.strip(b'm'), b'ississippi')
417 self.assertEqual(b.strip(b'pi'), b'mississ')
418 self.assertEqual(b.strip(b'im'), b'ssissipp')
419 self.assertEqual(b.strip(b'pim'), b'ssiss')
420 self.assertEqual(b.strip(b), b'')
421
422 def test_lstrip(self):
423 b = self.type2test(b'mississippi')
424 self.assertEqual(b.lstrip(b'i'), b'mississippi')
425 self.assertEqual(b.lstrip(b'm'), b'ississippi')
426 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
427 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
428 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
429
430 def test_rstrip(self):
431 b = self.type2test(b'mississippi')
432 self.assertEqual(b.rstrip(b'i'), b'mississipp')
433 self.assertEqual(b.rstrip(b'm'), b'mississippi')
434 self.assertEqual(b.rstrip(b'pi'), b'mississ')
435 self.assertEqual(b.rstrip(b'im'), b'mississipp')
436 self.assertEqual(b.rstrip(b'pim'), b'mississ')
437
438 def test_strip_whitespace(self):
439 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
440 self.assertEqual(b.strip(), b'abc')
441 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
442 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
443
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000444 def test_strip_bytearray(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000445 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
446 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
447 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
448
449 def test_strip_string_error(self):
450 self.assertRaises(TypeError, self.type2test(b'abc').strip, u'b')
451 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, u'b')
452 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, u'b')
453
454 def test_ord(self):
455 b = self.type2test(b'\0A\x7f\x80\xff')
456 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
457 [0, 65, 127, 128, 255])
458
Jesus Cea44e81682011-04-20 16:39:15 +0200459 def test_none_arguments(self):
460 # issue 11828
461 b = self.type2test(b'hello')
462 l = self.type2test(b'l')
463 h = self.type2test(b'h')
464 x = self.type2test(b'x')
465 o = self.type2test(b'o')
466
467 self.assertEqual(2, b.find(l, None))
468 self.assertEqual(3, b.find(l, -2, None))
469 self.assertEqual(2, b.find(l, None, -2))
470 self.assertEqual(0, b.find(h, None, None))
471
472 self.assertEqual(3, b.rfind(l, None))
473 self.assertEqual(3, b.rfind(l, -2, None))
474 self.assertEqual(2, b.rfind(l, None, -2))
475 self.assertEqual(0, b.rfind(h, None, None))
476
477 self.assertEqual(2, b.index(l, None))
478 self.assertEqual(3, b.index(l, -2, None))
479 self.assertEqual(2, b.index(l, None, -2))
480 self.assertEqual(0, b.index(h, None, None))
481
482 self.assertEqual(3, b.rindex(l, None))
483 self.assertEqual(3, b.rindex(l, -2, None))
484 self.assertEqual(2, b.rindex(l, None, -2))
485 self.assertEqual(0, b.rindex(h, None, None))
486
487 self.assertEqual(2, b.count(l, None))
488 self.assertEqual(1, b.count(l, -2, None))
489 self.assertEqual(1, b.count(l, None, -2))
490 self.assertEqual(0, b.count(x, None, None))
491
492 self.assertEqual(True, b.endswith(o, None))
493 self.assertEqual(True, b.endswith(o, -2, None))
494 self.assertEqual(True, b.endswith(l, None, -2))
495 self.assertEqual(False, b.endswith(x, None, None))
496
497 self.assertEqual(True, b.startswith(h, None))
498 self.assertEqual(True, b.startswith(l, -2, None))
499 self.assertEqual(True, b.startswith(h, None, -2))
500 self.assertEqual(False, b.startswith(x, None, None))
501
502 def test_find_etc_raise_correct_error_messages(self):
503 # issue 11828
504 b = self.type2test(b'hello')
505 x = self.type2test(b'x')
506 self.assertRaisesRegexp(TypeError, r'\bfind\b', b.find,
507 x, None, None, None)
508 self.assertRaisesRegexp(TypeError, r'\brfind\b', b.rfind,
509 x, None, None, None)
510 self.assertRaisesRegexp(TypeError, r'\bindex\b', b.index,
511 x, None, None, None)
512 self.assertRaisesRegexp(TypeError, r'\brindex\b', b.rindex,
513 x, None, None, None)
514 self.assertRaisesRegexp(TypeError, r'\bcount\b', b.count,
515 x, None, None, None)
516 self.assertRaisesRegexp(TypeError, r'\bstartswith\b', b.startswith,
517 x, None, None, None)
518 self.assertRaisesRegexp(TypeError, r'\bendswith\b', b.endswith,
519 x, None, None, None)
520
Serhiy Storchaka14a7d632016-03-30 20:43:06 +0300521 def test_free_after_iterating(self):
522 test.test_support.check_free_after_iterating(self, iter, self.type2test)
523 test.test_support.check_free_after_iterating(self, reversed, self.type2test)
524
Christian Heimes1a6387e2008-03-26 12:49:49 +0000525
526class ByteArrayTest(BaseBytesTest):
527 type2test = bytearray
528
529 def test_nohash(self):
530 self.assertRaises(TypeError, hash, bytearray())
531
532 def test_bytearray_api(self):
533 short_sample = b"Hello world\n"
534 sample = short_sample + b"\0"*(20 - len(short_sample))
535 tfn = tempfile.mktemp()
536 try:
537 # Prepare
538 with open(tfn, "wb") as f:
539 f.write(short_sample)
540 # Test readinto
541 with open(tfn, "rb") as f:
542 b = bytearray(20)
543 n = f.readinto(b)
544 self.assertEqual(n, len(short_sample))
545 # Python 2.x
546 b_sample = (ord(s) for s in sample)
547 self.assertEqual(list(b), list(b_sample))
548 # Test writing in binary mode
549 with open(tfn, "wb") as f:
550 f.write(b)
551 with open(tfn, "rb") as f:
552 self.assertEqual(f.read(), sample)
553 # Text mode is ambiguous; don't test
554 finally:
555 try:
556 os.remove(tfn)
557 except os.error:
558 pass
559
560 def test_reverse(self):
561 b = bytearray(b'hello')
562 self.assertEqual(b.reverse(), None)
563 self.assertEqual(b, b'olleh')
564 b = bytearray(b'hello1') # test even number of items
565 b.reverse()
566 self.assertEqual(b, b'1olleh')
567 b = bytearray()
568 b.reverse()
569 self.assertFalse(b)
570
571 def test_regexps(self):
572 def by(s):
573 return bytearray(map(ord, s))
574 b = by("Hello, world")
575 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
576
577 def test_setitem(self):
578 b = bytearray([1, 2, 3])
579 b[1] = 100
580 self.assertEqual(b, bytearray([1, 100, 3]))
581 b[-1] = 200
582 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl3e483f62008-07-16 22:57:41 +0000583 b[0] = Indexable(10)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000584 self.assertEqual(b, bytearray([10, 100, 200]))
585 try:
586 b[3] = 0
587 self.fail("Didn't raise IndexError")
588 except IndexError:
589 pass
590 try:
591 b[-10] = 0
592 self.fail("Didn't raise IndexError")
593 except IndexError:
594 pass
595 try:
596 b[0] = 256
597 self.fail("Didn't raise ValueError")
598 except ValueError:
599 pass
600 try:
Georg Brandl3e483f62008-07-16 22:57:41 +0000601 b[0] = Indexable(-1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000602 self.fail("Didn't raise ValueError")
603 except ValueError:
604 pass
605 try:
606 b[0] = None
607 self.fail("Didn't raise TypeError")
608 except TypeError:
609 pass
610
611 def test_delitem(self):
612 b = bytearray(range(10))
613 del b[0]
614 self.assertEqual(b, bytearray(range(1, 10)))
615 del b[-1]
616 self.assertEqual(b, bytearray(range(1, 9)))
617 del b[4]
618 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
619
620 def test_setslice(self):
621 b = bytearray(range(10))
622 self.assertEqual(list(b), list(range(10)))
623
624 b[0:5] = bytearray([1, 1, 1, 1, 1])
625 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
626
627 del b[0:-5]
628 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
629
630 b[0:0] = bytearray([0, 1, 2, 3, 4])
631 self.assertEqual(b, bytearray(range(10)))
632
633 b[-7:-3] = bytearray([100, 101])
634 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
635
636 b[3:5] = [3, 4, 5, 6]
637 self.assertEqual(b, bytearray(range(10)))
638
639 b[3:0] = [42, 42, 42]
640 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
641
Ezio Melotti67dc4a82012-11-03 21:10:45 +0200642 b[3:] = b'foo'
643 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
644
645 b[:3] = memoryview(b'foo')
646 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
647
648 b[3:4] = []
649 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
650
651 b[1:] = list(b'uuuu') # this works only on Python2
652 self.assertEqual(b, bytearray([102, 117, 117, 117, 117]))
653
654 for elem in [5, -5, 0, long(10e20), u'str', 2.3, [u'a', u'b'], [[]]]:
655 with self.assertRaises(TypeError):
656 b[3:4] = elem
657
658 for elem in [[254, 255, 256], [-256, 9000]]:
659 with self.assertRaises(ValueError):
660 b[3:4] = elem
661
Christian Heimes1a6387e2008-03-26 12:49:49 +0000662 def test_extended_set_del_slice(self):
Mark Dickinson36ecd672010-01-29 17:11:39 +0000663 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000664 for start in indices:
665 for stop in indices:
666 # Skip invalid step 0
667 for step in indices[1:]:
668 L = list(range(255))
669 b = bytearray(L)
670 # Make sure we have a slice of exactly the right length,
671 # but with different data.
672 data = L[start:stop:step]
673 data.reverse()
674 L[start:stop:step] = data
675 b[start:stop:step] = data
Ezio Melotti2623a372010-11-21 13:34:58 +0000676 self.assertEqual(b, bytearray(L))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000677
678 del L[start:stop:step]
679 del b[start:stop:step]
Ezio Melotti2623a372010-11-21 13:34:58 +0000680 self.assertEqual(b, bytearray(L))
Christian Heimes1a6387e2008-03-26 12:49:49 +0000681
682 def test_setslice_trap(self):
683 # This test verifies that we correctly handle assigning self
684 # to a slice of self (the old Lambert Meertens trap).
685 b = bytearray(range(256))
686 b[8:] = b
687 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
688
689 def test_iconcat(self):
690 b = bytearray(b"abc")
691 b1 = b
692 b += b"def"
693 self.assertEqual(b, b"abcdef")
694 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000695 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000696 b += b"xyz"
697 self.assertEqual(b, b"abcdefxyz")
698 try:
699 b += u""
700 except TypeError:
701 pass
702 else:
703 self.fail("bytes += unicode didn't raise TypeError")
704
705 def test_irepeat(self):
706 b = bytearray(b"abc")
707 b1 = b
708 b *= 3
709 self.assertEqual(b, b"abcabcabc")
710 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000711 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000712
713 def test_irepeat_1char(self):
714 b = bytearray(b"x")
715 b1 = b
716 b *= 100
717 self.assertEqual(b, b"x"*100)
718 self.assertEqual(b, b1)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000719 self.assertTrue(b is b1)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000720
721 def test_alloc(self):
722 b = bytearray()
723 alloc = b.__alloc__()
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000724 self.assertTrue(alloc >= 0)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000725 seq = [alloc]
726 for i in range(100):
727 b += b"x"
728 alloc = b.__alloc__()
Serhiy Storchakaab766352015-06-29 21:13:54 +0300729 self.assertGreater(alloc, len(b)) # including trailing null byte
Christian Heimes1a6387e2008-03-26 12:49:49 +0000730 if alloc not in seq:
731 seq.append(alloc)
732
Serhiy Storchakaab766352015-06-29 21:13:54 +0300733 def test_init_alloc(self):
734 b = bytearray()
735 def g():
736 for i in range(1, 100):
737 yield i
738 a = list(b)
739 self.assertEqual(a, list(range(1, len(a)+1)))
740 self.assertEqual(len(b), len(a))
741 self.assertLessEqual(len(b), i)
742 alloc = b.__alloc__()
743 self.assertGreater(alloc, len(b)) # including trailing null byte
744 b.__init__(g())
745 self.assertEqual(list(b), list(range(1, 100)))
746 self.assertEqual(len(b), 99)
747 alloc = b.__alloc__()
748 self.assertGreater(alloc, len(b))
749
Christian Heimes1a6387e2008-03-26 12:49:49 +0000750 def test_extend(self):
751 orig = b'hello'
752 a = bytearray(orig)
753 a.extend(a)
754 self.assertEqual(a, orig + orig)
755 self.assertEqual(a[5:], orig)
756 a = bytearray(b'')
757 # Test iterators that don't have a __length_hint__
758 a.extend(map(ord, orig * 25))
759 a.extend(ord(x) for x in orig * 25)
760 self.assertEqual(a, orig * 50)
761 self.assertEqual(a[-5:], orig)
762 a = bytearray(b'')
763 a.extend(iter(map(ord, orig * 50)))
764 self.assertEqual(a, orig * 50)
765 self.assertEqual(a[-5:], orig)
766 a = bytearray(b'')
767 a.extend(list(map(ord, orig * 50)))
768 self.assertEqual(a, orig * 50)
769 self.assertEqual(a[-5:], orig)
770 a = bytearray(b'')
771 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
772 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
773 self.assertEqual(len(a), 0)
Georg Brandl3e483f62008-07-16 22:57:41 +0000774 a = bytearray(b'')
775 a.extend([Indexable(ord('a'))])
776 self.assertEqual(a, b'a')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000777
778 def test_remove(self):
779 b = bytearray(b'hello')
780 b.remove(ord('l'))
781 self.assertEqual(b, b'helo')
782 b.remove(ord('l'))
783 self.assertEqual(b, b'heo')
784 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
785 self.assertRaises(ValueError, lambda: b.remove(400))
786 self.assertRaises(TypeError, lambda: b.remove(u'e'))
787 # remove first and last
788 b.remove(ord('o'))
789 b.remove(ord('h'))
790 self.assertEqual(b, b'e')
791 self.assertRaises(TypeError, lambda: b.remove(u'e'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000792 b.remove(Indexable(ord('e')))
793 self.assertEqual(b, b'')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000794
795 def test_pop(self):
796 b = bytearray(b'world')
797 self.assertEqual(b.pop(), ord('d'))
798 self.assertEqual(b.pop(0), ord('w'))
799 self.assertEqual(b.pop(-2), ord('r'))
800 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky680e6eb2011-03-04 06:14:56 +0000801 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinsonc8a7c7c2009-09-06 10:03:31 +0000802 # test for issue #6846
803 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000804
805 def test_nosort(self):
806 self.assertRaises(AttributeError, lambda: bytearray().sort())
807
808 def test_append(self):
809 b = bytearray(b'hell')
810 b.append(ord('o'))
811 self.assertEqual(b, b'hello')
812 self.assertEqual(b.append(100), None)
813 b = bytearray()
814 b.append(ord('A'))
815 self.assertEqual(len(b), 1)
816 self.assertRaises(TypeError, lambda: b.append(u'o'))
Georg Brandl3e483f62008-07-16 22:57:41 +0000817 b = bytearray()
818 b.append(Indexable(ord('A')))
819 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000820
821 def test_insert(self):
822 b = bytearray(b'msssspp')
823 b.insert(1, ord('i'))
824 b.insert(4, ord('i'))
825 b.insert(-2, ord('i'))
826 b.insert(1000, ord('i'))
827 self.assertEqual(b, b'mississippi')
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000828 # allowed in 2.x
Georg Brandl3e483f62008-07-16 22:57:41 +0000829 #self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
830 b = bytearray()
831 b.insert(0, Indexable(ord('A')))
832 self.assertEqual(b, b'A')
Christian Heimes1a6387e2008-03-26 12:49:49 +0000833
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000834 def test_copied(self):
835 # Issue 4348. Make sure that operations that don't mutate the array
836 # copy the bytes.
837 b = bytearray(b'abc')
Benjamin Petersond3b5a792008-11-20 21:44:23 +0000838 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson46cc6d12008-11-19 21:49:09 +0000839
840 t = bytearray([i for i in range(256)])
841 x = bytearray(b'')
842 self.assertFalse(x is x.translate(t))
843
Christian Heimes1a6387e2008-03-26 12:49:49 +0000844 def test_partition_bytearray_doesnt_share_nullstring(self):
845 a, b, c = bytearray(b"x").partition(b"y")
846 self.assertEqual(b, b"")
847 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000848 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000849 b += b"!"
850 self.assertEqual(c, b"")
851 a, b, c = bytearray(b"x").partition(b"y")
852 self.assertEqual(b, b"")
853 self.assertEqual(c, b"")
854 # Same for rpartition
855 b, c, a = bytearray(b"x").rpartition(b"y")
856 self.assertEqual(b, b"")
857 self.assertEqual(c, b"")
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000858 self.assertTrue(b is not c)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000859 b += b"!"
860 self.assertEqual(c, b"")
861 c, b, a = bytearray(b"x").rpartition(b"y")
862 self.assertEqual(b, b"")
863 self.assertEqual(c, b"")
864
Antoine Pitrouefa45f32010-01-12 22:02:10 +0000865 def test_resize_forbidden(self):
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000866 # #4509: can't resize a bytearray when there are buffer exports, even
867 # if it wouldn't reallocate the underlying buffer.
868 # Furthermore, no destructive changes to the buffer may be applied
869 # before raising the error.
870 b = bytearray(range(10))
871 v = memoryview(b)
872 def resize(n):
873 b[1:-1] = range(n + 1, 2*n - 1)
874 resize(10)
875 orig = b[:]
876 self.assertRaises(BufferError, resize, 11)
Ezio Melotti2623a372010-11-21 13:34:58 +0000877 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000878 self.assertRaises(BufferError, resize, 9)
Ezio Melotti2623a372010-11-21 13:34:58 +0000879 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000880 self.assertRaises(BufferError, resize, 0)
Ezio Melotti2623a372010-11-21 13:34:58 +0000881 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000882 # Other operations implying resize
883 self.assertRaises(BufferError, b.pop, 0)
Ezio Melotti2623a372010-11-21 13:34:58 +0000884 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000885 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melotti2623a372010-11-21 13:34:58 +0000886 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000887 def delitem():
888 del b[1]
889 self.assertRaises(BufferError, delitem)
Ezio Melotti2623a372010-11-21 13:34:58 +0000890 self.assertEqual(b, orig)
Antoine Pitrouae5bece2008-12-06 21:29:24 +0000891 # deleting a non-contiguous slice
892 def delslice():
893 b[1:-1:2] = b""
894 self.assertRaises(BufferError, delslice)
Ezio Melotti2623a372010-11-21 13:34:58 +0000895 self.assertEqual(b, orig)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000896
Antoine Pitroue80a6a42010-01-17 12:26:20 +0000897 def test_empty_bytearray(self):
898 # Issue #7561: operations on empty bytearrays could crash in many
899 # situations, due to a fragile implementation of the
900 # PyByteArray_AS_STRING() C macro.
901 self.assertRaises(ValueError, int, bytearray(b''))
902
Serhiy Storchaka0ed38912016-03-30 21:02:00 +0300903 def test_exhausted_iterator(self):
904 a = self.type2test([1, 2, 3])
905 exhit = iter(a)
906 empit = iter(a)
907 for x in exhit: # exhaust the iterator
908 next(empit) # not exhausted
909 a.append(9)
910 self.assertEqual(list(exhit), [])
911 self.assertEqual(list(empit), [9])
912 self.assertEqual(a, self.type2test([1, 2, 3, 9]))
Antoine Pitroue80a6a42010-01-17 12:26:20 +0000913
Christian Heimes1a6387e2008-03-26 12:49:49 +0000914class AssortedBytesTest(unittest.TestCase):
915 #
916 # Test various combinations of bytes and bytearray
917 #
918
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000919 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000920 def test_repr_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000921 for f in str, repr:
922 self.assertEqual(f(bytearray()), "bytearray(b'')")
923 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
924 self.assertEqual(f(bytearray([0, 1, 254, 255])),
925 "bytearray(b'\\x00\\x01\\xfe\\xff')")
926 self.assertEqual(f(b"abc"), "b'abc'")
927 self.assertEqual(f(b"'"), '''b"'"''') # '''
928 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
929
930 def test_compare_bytes_to_bytearray(self):
931 self.assertEqual(b"abc" == bytes(b"abc"), True)
932 self.assertEqual(b"ab" != bytes(b"abc"), True)
933 self.assertEqual(b"ab" <= bytes(b"abc"), True)
934 self.assertEqual(b"ab" < bytes(b"abc"), True)
935 self.assertEqual(b"abc" >= bytes(b"ab"), True)
936 self.assertEqual(b"abc" > bytes(b"ab"), True)
937
938 self.assertEqual(b"abc" != bytes(b"abc"), False)
939 self.assertEqual(b"ab" == bytes(b"abc"), False)
940 self.assertEqual(b"ab" > bytes(b"abc"), False)
941 self.assertEqual(b"ab" >= bytes(b"abc"), False)
942 self.assertEqual(b"abc" < bytes(b"ab"), False)
943 self.assertEqual(b"abc" <= bytes(b"ab"), False)
944
945 self.assertEqual(bytes(b"abc") == b"abc", True)
946 self.assertEqual(bytes(b"ab") != b"abc", True)
947 self.assertEqual(bytes(b"ab") <= b"abc", True)
948 self.assertEqual(bytes(b"ab") < b"abc", True)
949 self.assertEqual(bytes(b"abc") >= b"ab", True)
950 self.assertEqual(bytes(b"abc") > b"ab", True)
951
952 self.assertEqual(bytes(b"abc") != b"abc", False)
953 self.assertEqual(bytes(b"ab") == b"abc", False)
954 self.assertEqual(bytes(b"ab") > b"abc", False)
955 self.assertEqual(bytes(b"ab") >= b"abc", False)
956 self.assertEqual(bytes(b"abc") < b"ab", False)
957 self.assertEqual(bytes(b"abc") <= b"ab", False)
958
Stefan Krah4216aa12013-01-26 13:31:44 +0100959 @test.test_support.requires_docstrings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000960 def test_doc(self):
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000961 self.assertIsNotNone(bytearray.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000962 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xiclunabc27c6a2010-03-19 18:34:55 +0000963 self.assertIsNotNone(bytes.__doc__)
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000964 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000965
966 def test_from_bytearray(self):
967 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
968 buf = memoryview(sample)
969 b = bytearray(buf)
970 self.assertEqual(b, bytearray(sample))
971
Florent Xicluna9b90cd12010-09-13 07:46:37 +0000972 @check_bytes_warnings
Christian Heimes1a6387e2008-03-26 12:49:49 +0000973 def test_to_str(self):
Christian Heimes1a6387e2008-03-26 12:49:49 +0000974 self.assertEqual(str(b''), "b''")
975 self.assertEqual(str(b'x'), "b'x'")
976 self.assertEqual(str(b'\x80'), "b'\\x80'")
977 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
978 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
979 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
980
981 def test_literal(self):
982 tests = [
983 (b"Wonderful spam", "Wonderful spam"),
984 (br"Wonderful spam too", "Wonderful spam too"),
985 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
986 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
987 ]
988 for b, s in tests:
989 self.assertEqual(b, bytearray(s, 'latin-1'))
990 for c in range(128, 256):
991 self.assertRaises(SyntaxError, eval,
992 'b"%s"' % chr(c))
993
994 def test_translate(self):
995 b = b'hello'
Georg Brandl6425a2f2008-12-28 11:54:53 +0000996 ba = bytearray(b)
Christian Heimes1a6387e2008-03-26 12:49:49 +0000997 rosetta = bytearray(range(0, 256))
998 rosetta[ord('o')] = ord('e')
999 c = b.translate(rosetta, b'l')
1000 self.assertEqual(b, b'hello')
1001 self.assertEqual(c, b'hee')
Georg Brandl6425a2f2008-12-28 11:54:53 +00001002 c = ba.translate(rosetta, b'l')
1003 self.assertEqual(ba, b'hello')
1004 self.assertEqual(c, b'hee')
1005 c = b.translate(None, b'e')
1006 self.assertEqual(c, b'hllo')
1007 c = ba.translate(None, b'e')
1008 self.assertEqual(c, b'hllo')
1009 self.assertRaises(TypeError, b.translate, None, None)
1010 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001011
1012 def test_split_bytearray(self):
1013 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1014
1015 def test_rsplit_bytearray(self):
1016 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1017
1018 # Optimizations:
1019 # __iter__? (optimization)
1020 # __reversed__? (optimization)
1021
1022 # XXX More string methods? (Those that don't use character properties)
1023
1024 # There are tests in string_tests.py that are more
1025 # comprehensive for things like split, partition, etc.
1026 # Unfortunately they are all bundled with tests that
1027 # are not appropriate for bytes
1028
1029 # I've started porting some of those into bytearray_tests.py, we should port
1030 # the rest that make sense (the code can be cleaned up to use modern
1031 # unittest methods at the same time).
1032
1033class BytearrayPEP3137Test(unittest.TestCase,
1034 test.buffer_tests.MixinBytesBufferCommonTests):
1035 def marshal(self, x):
1036 return bytearray(x)
1037
1038 def test_returns_new_copy(self):
1039 val = self.marshal(b'1234')
1040 # On immutable types these MAY return a reference to themselves
1041 # but on mutable types like bytearray they MUST return a new copy.
1042 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1043 method = getattr(val, methname)
1044 newval = method(3)
1045 self.assertEqual(val, newval)
1046 self.assertTrue(val is not newval,
1047 methname+' returned self on a mutable object')
Antoine Pitrou5f76d132010-01-13 15:02:13 +00001048 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1049 'val.partition(".")[0]', 'val.rpartition(".")[2]',
1050 'val.splitlines()[0]', 'val.replace("", "")'):
1051 newval = eval(expr)
1052 self.assertEqual(val, newval)
1053 self.assertTrue(val is not newval,
1054 expr+' returned val on a mutable object')
Christian Heimes1a6387e2008-03-26 12:49:49 +00001055
1056class FixedStringTest(test.string_tests.BaseTest):
1057
1058 def fixtype(self, obj):
1059 if isinstance(obj, str):
1060 return obj.encode("utf-8")
1061 return super(FixedStringTest, self).fixtype(obj)
1062
1063 # Currently the bytes containment testing uses a single integer
1064 # value. This may not be the final design, but until then the
1065 # bytes section with in a bytes containment not valid
1066 def test_contains(self):
1067 pass
1068 def test_expandtabs(self):
1069 pass
1070 def test_upper(self):
1071 pass
1072 def test_lower(self):
1073 pass
1074 def test_hash(self):
1075 # XXX check this out
1076 pass
1077
1078
1079class ByteArrayAsStringTest(FixedStringTest):
1080 type2test = bytearray
1081
1082
1083class ByteArraySubclass(bytearray):
1084 pass
1085
1086class ByteArraySubclassTest(unittest.TestCase):
1087
1088 def test_basic(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001089 self.assertTrue(issubclass(ByteArraySubclass, bytearray))
Ezio Melottib0f5adc2010-01-24 16:58:36 +00001090 self.assertIsInstance(ByteArraySubclass(), bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001091
1092 a, b = b"abcd", b"efgh"
1093 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
1094
1095 # test comparison operators with subclass instances
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001096 self.assertTrue(_a == _a)
1097 self.assertTrue(_a != _b)
1098 self.assertTrue(_a < _b)
1099 self.assertTrue(_a <= _b)
1100 self.assertTrue(_b >= _a)
1101 self.assertTrue(_b > _a)
1102 self.assertTrue(_a is not a)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001103
1104 # test concat of subclass instances
1105 self.assertEqual(a + b, _a + _b)
1106 self.assertEqual(a + b, a + _b)
1107 self.assertEqual(a + b, _a + b)
1108
1109 # test repeat
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001110 self.assertTrue(a*5 == _a*5)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001111
1112 def test_join(self):
1113 # Make sure join returns a NEW object for single item sequences
1114 # involving a subclass.
1115 # Make sure that it is of the appropriate type.
1116 s1 = ByteArraySubclass(b"abcd")
1117 s2 = bytearray().join([s1])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001118 self.assertTrue(s1 is not s2)
1119 self.assertTrue(type(s2) is bytearray, type(s2))
Christian Heimes1a6387e2008-03-26 12:49:49 +00001120
1121 # Test reverse, calling join on subclass
1122 s3 = s1.join([b"abcd"])
Benjamin Peterson5c8da862009-06-30 22:57:08 +00001123 self.assertTrue(type(s3) is bytearray)
Christian Heimes1a6387e2008-03-26 12:49:49 +00001124
1125 def test_pickle(self):
1126 a = ByteArraySubclass(b"abcd")
1127 a.x = 10
1128 a.y = ByteArraySubclass(b"efgh")
Hirokazu Yamamoto592c2752008-10-23 00:37:33 +00001129 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes1a6387e2008-03-26 12:49:49 +00001130 b = pickle.loads(pickle.dumps(a, proto))
1131 self.assertNotEqual(id(a), id(b))
1132 self.assertEqual(a, b)
1133 self.assertEqual(a.x, b.x)
1134 self.assertEqual(a.y, b.y)
1135 self.assertEqual(type(a), type(b))
1136 self.assertEqual(type(a.y), type(b.y))
1137
1138 def test_copy(self):
1139 a = ByteArraySubclass(b"abcd")
1140 a.x = 10
1141 a.y = ByteArraySubclass(b"efgh")
1142 for copy_method in (copy.copy, copy.deepcopy):
1143 b = copy_method(a)
1144 self.assertNotEqual(id(a), id(b))
1145 self.assertEqual(a, b)
1146 self.assertEqual(a.x, b.x)
1147 self.assertEqual(a.y, b.y)
1148 self.assertEqual(type(a), type(b))
1149 self.assertEqual(type(a.y), type(b.y))
1150
1151 def test_init_override(self):
1152 class subclass(bytearray):
1153 def __init__(self, newarg=1, *args, **kwargs):
1154 bytearray.__init__(self, *args, **kwargs)
1155 x = subclass(4, source=b"abcd")
1156 self.assertEqual(x, b"abcd")
1157 x = subclass(newarg=4, source=b"abcd")
1158 self.assertEqual(x, b"abcd")
1159
1160def test_main():
1161 #test.test_support.run_unittest(BytesTest)
1162 #test.test_support.run_unittest(AssortedBytesTest)
1163 #test.test_support.run_unittest(BytesAsStringTest)
1164 test.test_support.run_unittest(
1165 ByteArrayTest,
1166 ByteArrayAsStringTest,
1167 ByteArraySubclassTest,
1168 BytearrayPEP3137Test)
1169
1170if __name__ == "__main__":
1171 test_main()