blob: 23a411e3693045840fc9ca4b69ed538fd6bf08d1 [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
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000012import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000013import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000014import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000015import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +000016import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000018import test.buffer_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000019
Florent Xiclunaedf5f0d2010-09-03 20:00: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.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 Brandl9a54d7c2008-07-16 23:15:30 +000034class Indexable:
35 def __init__(self, value=0):
36 self.value = value
37 def __index__(self):
38 return self.value
39
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000040
Ezio Melotti0dceb562013-01-10 07:43:26 +020041class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042
43 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000044 b = self.type2test()
45 self.assertEqual(type(b), self.type2test)
46 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000047
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000048 def test_copy(self):
49 a = self.type2test(b"abcd")
50 for copy_method in (copy.copy, copy.deepcopy):
51 b = copy_method(a)
52 self.assertEqual(a, b)
53 self.assertEqual(type(a), type(b))
54
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000055 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000056 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000057 self.assertEqual(len(b), 0)
58 self.assertRaises(IndexError, lambda: b[0])
59 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000060 self.assertRaises(IndexError, lambda: b[sys.maxsize])
61 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000062 self.assertRaises(IndexError, lambda: b[10**100])
63 self.assertRaises(IndexError, lambda: b[-1])
64 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000065 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
66 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
67 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000068 self.assertRaises(IndexError, lambda: b[-10**100])
69
70 def test_from_list(self):
71 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000072 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000073 self.assertEqual(len(b), 256)
74 self.assertEqual(list(b), ints)
75
76 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000077 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
78 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000079 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000080 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
81 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000082
83 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000084 self.assertEqual(self.type2test(0), b'')
85 self.assertEqual(self.type2test(1), b'\x00')
86 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
87 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000088
Benjamin Peterson4c045832010-04-16 22:35:32 +000089 self.assertEqual(self.type2test('0', 'ascii'), b'0')
90 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000091 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000092
93 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000094 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000095 class C:
96 pass
Christian Heimes510711d2008-01-30 11:57:58 +000097 self.assertRaises(TypeError, self.type2test, ["0"])
98 self.assertRaises(TypeError, self.type2test, [0.0])
99 self.assertRaises(TypeError, self.type2test, [None])
100 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000101
102 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000103 self.assertRaises(ValueError, self.type2test, [-1])
104 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
105 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
106 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
107 self.assertRaises(ValueError, self.type2test, [-10**100])
108 self.assertRaises(ValueError, self.type2test, [256])
109 self.assertRaises(ValueError, self.type2test, [257])
110 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
111 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
112 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000113
114 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000115 b1 = self.type2test([1, 2, 3])
116 b2 = self.type2test([1, 2, 3])
117 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000118
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000119 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000120 self.assertTrue(b2 != b3)
121 self.assertTrue(b1 <= b2)
122 self.assertTrue(b1 <= b3)
123 self.assertTrue(b1 < b3)
124 self.assertTrue(b1 >= b2)
125 self.assertTrue(b3 >= b2)
126 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000127
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000128 self.assertFalse(b1 != b2)
129 self.assertFalse(b2 == b3)
130 self.assertFalse(b1 > b2)
131 self.assertFalse(b1 > b3)
132 self.assertFalse(b1 >= b3)
133 self.assertFalse(b1 < b2)
134 self.assertFalse(b3 < b2)
135 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000137 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000138 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000139 # Byte comparisons with unicode should always fail!
140 # Test this for all expected byte orders and Unicode character
141 # sizes.
142 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
143 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
144 False)
145 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
146 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
147 False)
148 self.assertEqual(self.type2test() == str(), False)
149 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000150
151 def test_reversed(self):
152 input = list(map(ord, "Hello"))
153 b = self.type2test(input)
154 output = list(reversed(b))
155 input.reverse()
156 self.assertEqual(output, input)
157
158 def test_getslice(self):
159 def by(s):
160 return self.type2test(map(ord, s))
161 b = by("Hello, world")
162
163 self.assertEqual(b[:5], by("Hello"))
164 self.assertEqual(b[1:5], by("ello"))
165 self.assertEqual(b[5:7], by(", "))
166 self.assertEqual(b[7:], by("world"))
167 self.assertEqual(b[7:12], by("world"))
168 self.assertEqual(b[7:100], by("world"))
169
170 self.assertEqual(b[:-7], by("Hello"))
171 self.assertEqual(b[-11:-7], by("ello"))
172 self.assertEqual(b[-7:-5], by(", "))
173 self.assertEqual(b[-5:], by("world"))
174 self.assertEqual(b[-5:12], by("world"))
175 self.assertEqual(b[-5:100], by("world"))
176 self.assertEqual(b[-100:5], by("Hello"))
177
178 def test_extended_getslice(self):
179 # Test extended slicing by comparing with list slicing.
180 L = list(range(255))
181 b = self.type2test(L)
182 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
183 for start in indices:
184 for stop in indices:
185 # Skip step 0 (invalid)
186 for step in indices[1:]:
187 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
188
189 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000190 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000191 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000192 b = self.type2test(sample, enc)
193 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000194 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
195 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000196 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000197
198 def test_decode(self):
199 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000200 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000201 b = self.type2test(sample, enc)
202 self.assertEqual(b.decode(enc), sample)
203 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000204 b = self.type2test(sample, "latin-1")
205 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
206 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
207 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000208 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000209 # Default encoding is utf-8
210 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000211
212 def test_from_int(self):
213 b = self.type2test(0)
214 self.assertEqual(b, self.type2test())
215 b = self.type2test(10)
216 self.assertEqual(b, self.type2test([0]*10))
217 b = self.type2test(10000)
218 self.assertEqual(b, self.type2test([0]*10000))
219
220 def test_concat(self):
221 b1 = self.type2test(b"abc")
222 b2 = self.type2test(b"def")
223 self.assertEqual(b1 + b2, b"abcdef")
224 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
225 self.assertEqual(bytes(b"def") + b1, b"defabc")
226 self.assertRaises(TypeError, lambda: b1 + "def")
227 self.assertRaises(TypeError, lambda: "abc" + b2)
228
229 def test_repeat(self):
230 for b in b"abc", self.type2test(b"abc"):
231 self.assertEqual(b * 3, b"abcabcabc")
232 self.assertEqual(b * 0, b"")
233 self.assertEqual(b * -1, b"")
234 self.assertRaises(TypeError, lambda: b * 3.14)
235 self.assertRaises(TypeError, lambda: 3.14 * b)
236 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000237 with self.assertRaises((OverflowError, MemoryError)):
238 c = b * sys.maxsize
239 with self.assertRaises((OverflowError, MemoryError)):
240 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000241
242 def test_repeat_1char(self):
243 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
244
245 def test_contains(self):
246 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000247 self.assertIn(ord('a'), b)
248 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000249 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000250 self.assertRaises(ValueError, lambda: 300 in b)
251 self.assertRaises(ValueError, lambda: -1 in b)
252 self.assertRaises(TypeError, lambda: None in b)
253 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
254 self.assertRaises(TypeError, lambda: "a" in b)
255 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000256 self.assertIn(f(b""), b)
257 self.assertIn(f(b"a"), b)
258 self.assertIn(f(b"b"), b)
259 self.assertIn(f(b"c"), b)
260 self.assertIn(f(b"ab"), b)
261 self.assertIn(f(b"bc"), b)
262 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000263 self.assertNotIn(f(b"ac"), b)
264 self.assertNotIn(f(b"d"), b)
265 self.assertNotIn(f(b"dab"), b)
266 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000267
268 def test_fromhex(self):
269 self.assertRaises(TypeError, self.type2test.fromhex)
270 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000271 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000272 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000273 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
274 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
275 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000276 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
277 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
278 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
279 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
280 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
281 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
282
283 def test_join(self):
284 self.assertEqual(self.type2test(b"").join([]), b"")
285 self.assertEqual(self.type2test(b"").join([b""]), b"")
286 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
287 lst = list(map(self.type2test, lst))
288 self.assertEqual(self.type2test(b"").join(lst), b"abc")
289 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
290 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200291 dot_join = self.type2test(b".:").join
292 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
293 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
294 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
295 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
296 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
297 # Stress it with many items
298 seq = [b"abc"] * 1000
299 expected = b"abc" + b".:abc" * 999
300 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400301 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200302 # Error handling and cleanup when some item in the middle of the
303 # sequence has the wrong type.
304 with self.assertRaises(TypeError):
305 dot_join([bytearray(b"ab"), "cd", b"ef"])
306 with self.assertRaises(TypeError):
307 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000308
Christian Heimes510711d2008-01-30 11:57:58 +0000309 def test_count(self):
310 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200311 i = 105
312 p = 112
313 w = 119
314
Christian Heimes510711d2008-01-30 11:57:58 +0000315 self.assertEqual(b.count(b'i'), 4)
316 self.assertEqual(b.count(b'ss'), 2)
317 self.assertEqual(b.count(b'w'), 0)
318
Antoine Pitrouac65d962011-10-20 23:54:17 +0200319 self.assertEqual(b.count(i), 4)
320 self.assertEqual(b.count(w), 0)
321
322 self.assertEqual(b.count(b'i', 6), 2)
323 self.assertEqual(b.count(b'p', 6), 2)
324 self.assertEqual(b.count(b'i', 1, 3), 1)
325 self.assertEqual(b.count(b'p', 7, 9), 1)
326
327 self.assertEqual(b.count(i, 6), 2)
328 self.assertEqual(b.count(p, 6), 2)
329 self.assertEqual(b.count(i, 1, 3), 1)
330 self.assertEqual(b.count(p, 7, 9), 1)
331
Christian Heimes510711d2008-01-30 11:57:58 +0000332 def test_startswith(self):
333 b = self.type2test(b'hello')
334 self.assertFalse(self.type2test().startswith(b"anything"))
335 self.assertTrue(b.startswith(b"hello"))
336 self.assertTrue(b.startswith(b"hel"))
337 self.assertTrue(b.startswith(b"h"))
338 self.assertFalse(b.startswith(b"hellow"))
339 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300340 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300341 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300342 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300343 self.assertIn('bytes', exc)
344 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000345
346 def test_endswith(self):
347 b = self.type2test(b'hello')
348 self.assertFalse(bytearray().endswith(b"anything"))
349 self.assertTrue(b.endswith(b"hello"))
350 self.assertTrue(b.endswith(b"llo"))
351 self.assertTrue(b.endswith(b"o"))
352 self.assertFalse(b.endswith(b"whello"))
353 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300354 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300355 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300356 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300357 self.assertIn('bytes', exc)
358 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000359
360 def test_find(self):
361 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200362 i = 105
363 w = 119
364
Christian Heimes510711d2008-01-30 11:57:58 +0000365 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000366 self.assertEqual(b.find(b'w'), -1)
367 self.assertEqual(b.find(b'mississippian'), -1)
368
Antoine Pitrouac65d962011-10-20 23:54:17 +0200369 self.assertEqual(b.find(i), 1)
370 self.assertEqual(b.find(w), -1)
371
372 self.assertEqual(b.find(b'ss', 3), 5)
373 self.assertEqual(b.find(b'ss', 1, 7), 2)
374 self.assertEqual(b.find(b'ss', 1, 3), -1)
375
376 self.assertEqual(b.find(i, 6), 7)
377 self.assertEqual(b.find(i, 1, 3), 1)
378 self.assertEqual(b.find(w, 1, 3), -1)
379
Victor Stinnerf8eac002011-12-18 01:17:41 +0100380 for index in (-1, 256, sys.maxsize + 1):
381 self.assertRaisesRegex(
382 ValueError, r'byte must be in range\(0, 256\)',
383 b.find, index)
384
Christian Heimes510711d2008-01-30 11:57:58 +0000385 def test_rfind(self):
386 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200387 i = 105
388 w = 119
389
Christian Heimes510711d2008-01-30 11:57:58 +0000390 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000391 self.assertEqual(b.rfind(b'w'), -1)
392 self.assertEqual(b.rfind(b'mississippian'), -1)
393
Antoine Pitrouac65d962011-10-20 23:54:17 +0200394 self.assertEqual(b.rfind(i), 10)
395 self.assertEqual(b.rfind(w), -1)
396
397 self.assertEqual(b.rfind(b'ss', 3), 5)
398 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
399
400 self.assertEqual(b.rfind(i, 1, 3), 1)
401 self.assertEqual(b.rfind(i, 3, 9), 7)
402 self.assertEqual(b.rfind(w, 1, 3), -1)
403
Christian Heimes510711d2008-01-30 11:57:58 +0000404 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200405 b = self.type2test(b'mississippi')
406 i = 105
407 w = 119
408
409 self.assertEqual(b.index(b'ss'), 2)
410 self.assertRaises(ValueError, b.index, b'w')
411 self.assertRaises(ValueError, b.index, b'mississippian')
412
413 self.assertEqual(b.index(i), 1)
414 self.assertRaises(ValueError, b.index, w)
415
416 self.assertEqual(b.index(b'ss', 3), 5)
417 self.assertEqual(b.index(b'ss', 1, 7), 2)
418 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
419
420 self.assertEqual(b.index(i, 6), 7)
421 self.assertEqual(b.index(i, 1, 3), 1)
422 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000423
424 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200425 b = self.type2test(b'mississippi')
426 i = 105
427 w = 119
428
429 self.assertEqual(b.rindex(b'ss'), 5)
430 self.assertRaises(ValueError, b.rindex, b'w')
431 self.assertRaises(ValueError, b.rindex, b'mississippian')
432
433 self.assertEqual(b.rindex(i), 10)
434 self.assertRaises(ValueError, b.rindex, w)
435
436 self.assertEqual(b.rindex(b'ss', 3), 5)
437 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
438
439 self.assertEqual(b.rindex(i, 1, 3), 1)
440 self.assertEqual(b.rindex(i, 3, 9), 7)
441 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000442
443 def test_replace(self):
444 b = self.type2test(b'mississippi')
445 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
446 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
447
448 def test_split(self):
449 b = self.type2test(b'mississippi')
450 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
451 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
452 self.assertEqual(b.split(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200453 # with keyword args
454 b = self.type2test(b'a|b|c|d')
455 self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
456 self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
457 self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
458 self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
459 b = self.type2test(b'a b c d')
460 self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
Christian Heimes510711d2008-01-30 11:57:58 +0000461
462 def test_split_whitespace(self):
463 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
464 b'arf\fbarf', b'arf\vbarf'):
465 b = self.type2test(b)
466 self.assertEqual(b.split(), [b'arf', b'barf'])
467 self.assertEqual(b.split(None), [b'arf', b'barf'])
468 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
469 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
470 b = self.type2test(b)
471 self.assertEqual(b.split(), [b])
472 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
473 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
474 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
475 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
476
477 def test_split_string_error(self):
478 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
479
Antoine Pitrouf8453022010-01-12 22:05:42 +0000480 def test_split_unicodewhitespace(self):
481 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
482 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
483
Christian Heimes510711d2008-01-30 11:57:58 +0000484 def test_rsplit(self):
485 b = self.type2test(b'mississippi')
486 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
487 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
488 self.assertEqual(b.rsplit(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200489 # with keyword args
490 b = self.type2test(b'a|b|c|d')
491 self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
492 self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
493 self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
494 self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
495 b = self.type2test(b'a b c d')
496 self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
Christian Heimes510711d2008-01-30 11:57:58 +0000497
498 def test_rsplit_whitespace(self):
499 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
500 b'arf\fbarf', b'arf\vbarf'):
501 b = self.type2test(b)
502 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
503 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
504 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
505 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
506 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
507 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
508 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
509
510 def test_rsplit_string_error(self):
511 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
512
513 def test_rsplit_unicodewhitespace(self):
514 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000515 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
516
517 def test_partition(self):
518 b = self.type2test(b'mississippi')
519 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000520 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000521
522 def test_rpartition(self):
523 b = self.type2test(b'mississippi')
524 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
525 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000526 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000527
528 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000529 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000530 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
531 b = self.type2test(b)
532 ps = pickle.dumps(b, proto)
533 q = pickle.loads(ps)
534 self.assertEqual(b, q)
535
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000536 def test_iterator_pickling(self):
537 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
538 it = itorg = iter(self.type2test(b))
539 data = list(self.type2test(b))
540 d = pickle.dumps(it)
541 it = pickle.loads(d)
542 self.assertEqual(type(itorg), type(it))
543 self.assertEqual(list(it), data)
544
545 it = pickle.loads(d)
546 try:
547 next(it)
548 except StopIteration:
549 continue
550 d = pickle.dumps(it)
551 it = pickle.loads(d)
552 self.assertEqual(list(it), data[1:])
553
Christian Heimes510711d2008-01-30 11:57:58 +0000554 def test_strip(self):
555 b = self.type2test(b'mississippi')
556 self.assertEqual(b.strip(b'i'), b'mississipp')
557 self.assertEqual(b.strip(b'm'), b'ississippi')
558 self.assertEqual(b.strip(b'pi'), b'mississ')
559 self.assertEqual(b.strip(b'im'), b'ssissipp')
560 self.assertEqual(b.strip(b'pim'), b'ssiss')
561 self.assertEqual(b.strip(b), b'')
562
563 def test_lstrip(self):
564 b = self.type2test(b'mississippi')
565 self.assertEqual(b.lstrip(b'i'), b'mississippi')
566 self.assertEqual(b.lstrip(b'm'), b'ississippi')
567 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
568 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
569 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
570
571 def test_rstrip(self):
572 b = self.type2test(b'mississippi')
573 self.assertEqual(b.rstrip(b'i'), b'mississipp')
574 self.assertEqual(b.rstrip(b'm'), b'mississippi')
575 self.assertEqual(b.rstrip(b'pi'), b'mississ')
576 self.assertEqual(b.rstrip(b'im'), b'mississipp')
577 self.assertEqual(b.rstrip(b'pim'), b'mississ')
578
579 def test_strip_whitespace(self):
580 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
581 self.assertEqual(b.strip(), b'abc')
582 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
583 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
584
585 def test_strip_bytearray(self):
586 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
587 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
588 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
589
590 def test_strip_string_error(self):
591 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
592 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
593 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
594
Eli Bendersky906b88f2011-07-29 07:05:08 +0300595 def test_center(self):
596 # Fill character can be either bytes or bytearray (issue 12380)
597 b = self.type2test(b'abc')
598 for fill_type in (bytes, bytearray):
599 self.assertEqual(b.center(7, fill_type(b'-')),
600 self.type2test(b'--abc--'))
601
602 def test_ljust(self):
603 # Fill character can be either bytes or bytearray (issue 12380)
604 b = self.type2test(b'abc')
605 for fill_type in (bytes, bytearray):
606 self.assertEqual(b.ljust(7, fill_type(b'-')),
607 self.type2test(b'abc----'))
608
609 def test_rjust(self):
610 # Fill character can be either bytes or bytearray (issue 12380)
611 b = self.type2test(b'abc')
612 for fill_type in (bytes, bytearray):
613 self.assertEqual(b.rjust(7, fill_type(b'-')),
614 self.type2test(b'----abc'))
615
Christian Heimes510711d2008-01-30 11:57:58 +0000616 def test_ord(self):
617 b = self.type2test(b'\0A\x7f\x80\xff')
618 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
619 [0, 65, 127, 128, 255])
620
Georg Brandlabc38772009-04-12 15:51:51 +0000621 def test_maketrans(self):
622 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
Georg Brandlabc38772009-04-12 15:51:51 +0000623 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000624 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
625 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000626 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
627 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
628
Jesus Ceaac451502011-04-20 17:09:23 +0200629 def test_none_arguments(self):
630 # issue 11828
631 b = self.type2test(b'hello')
632 l = self.type2test(b'l')
633 h = self.type2test(b'h')
634 x = self.type2test(b'x')
635 o = self.type2test(b'o')
636
637 self.assertEqual(2, b.find(l, None))
638 self.assertEqual(3, b.find(l, -2, None))
639 self.assertEqual(2, b.find(l, None, -2))
640 self.assertEqual(0, b.find(h, None, None))
641
642 self.assertEqual(3, b.rfind(l, None))
643 self.assertEqual(3, b.rfind(l, -2, None))
644 self.assertEqual(2, b.rfind(l, None, -2))
645 self.assertEqual(0, b.rfind(h, None, None))
646
647 self.assertEqual(2, b.index(l, None))
648 self.assertEqual(3, b.index(l, -2, None))
649 self.assertEqual(2, b.index(l, None, -2))
650 self.assertEqual(0, b.index(h, None, None))
651
652 self.assertEqual(3, b.rindex(l, None))
653 self.assertEqual(3, b.rindex(l, -2, None))
654 self.assertEqual(2, b.rindex(l, None, -2))
655 self.assertEqual(0, b.rindex(h, None, None))
656
657 self.assertEqual(2, b.count(l, None))
658 self.assertEqual(1, b.count(l, -2, None))
659 self.assertEqual(1, b.count(l, None, -2))
660 self.assertEqual(0, b.count(x, None, None))
661
662 self.assertEqual(True, b.endswith(o, None))
663 self.assertEqual(True, b.endswith(o, -2, None))
664 self.assertEqual(True, b.endswith(l, None, -2))
665 self.assertEqual(False, b.endswith(x, None, None))
666
667 self.assertEqual(True, b.startswith(h, None))
668 self.assertEqual(True, b.startswith(l, -2, None))
669 self.assertEqual(True, b.startswith(h, None, -2))
670 self.assertEqual(False, b.startswith(x, None, None))
671
Antoine Pitrouac65d962011-10-20 23:54:17 +0200672 def test_integer_arguments_out_of_byte_range(self):
673 b = self.type2test(b'hello')
674
675 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
676 self.assertRaises(ValueError, method, -1)
677 self.assertRaises(ValueError, method, 256)
678 self.assertRaises(ValueError, method, 9999)
679
Jesus Ceaac451502011-04-20 17:09:23 +0200680 def test_find_etc_raise_correct_error_messages(self):
681 # issue 11828
682 b = self.type2test(b'hello')
683 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300684 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200685 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300686 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200687 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300688 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200689 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300690 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200691 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300692 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200693 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300694 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200695 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300696 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200697 x, None, None, None)
698
Christian Heimes510711d2008-01-30 11:57:58 +0000699
Ezio Melotti0dceb562013-01-10 07:43:26 +0200700class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000701 type2test = bytes
702
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400703 def test_getitem_error(self):
704 msg = "byte indices must be integers or slices"
705 with self.assertRaisesRegex(TypeError, msg):
706 b'python'['a']
707
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000708 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200709 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000710 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000711 self.assertRaises(TypeError, f.readinto, b"")
712
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000713 def test_custom(self):
714 class A:
715 def __bytes__(self):
716 return b'abc'
717 self.assertEqual(bytes(A()), b'abc')
718 class A: pass
719 self.assertRaises(TypeError, bytes, A())
720 class A:
721 def __bytes__(self):
722 return None
723 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600724 class A:
725 def __bytes__(self):
726 return b'a'
727 def __index__(self):
728 return 42
729 self.assertEqual(bytes(A()), b'a')
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000730
Victor Stinner29e762c2011-01-05 03:33:28 +0000731 # Test PyBytes_FromFormat()
732 def test_from_format(self):
733 test.support.import_module('ctypes')
734 from ctypes import pythonapi, py_object, c_int, c_char_p
735 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
736 PyBytes_FromFormat.restype = py_object
737
738 self.assertEqual(PyBytes_FromFormat(b'format'),
739 b'format')
740
741 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
742 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
743 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
744 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
745 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
746
747 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
748 b'c:\xff')
749 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
750 b's:cstr')
751
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100752 # Issue #19969
753 self.assertRaises(OverflowError,
754 PyBytes_FromFormat, b'%c', c_int(-1))
755 self.assertRaises(OverflowError,
756 PyBytes_FromFormat, b'%c', c_int(256))
757
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000758
Ezio Melotti0dceb562013-01-10 07:43:26 +0200759class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000760 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000761
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400762 def test_getitem_error(self):
763 msg = "bytearray indices must be integers or slices"
764 with self.assertRaisesRegex(TypeError, msg):
765 bytearray(b'python')['a']
766
767 def test_setitem_error(self):
768 msg = "bytearray indices must be integers or slices"
769 with self.assertRaisesRegex(TypeError, msg):
770 b = bytearray(b'python')
771 b['a'] = "python"
772
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000773 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000774 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000775
Guido van Rossum254348e2007-11-21 19:29:53 +0000776 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000777 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000778 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000779 tfn = tempfile.mktemp()
780 try:
781 # Prepare
782 with open(tfn, "wb") as f:
783 f.write(short_sample)
784 # Test readinto
785 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000786 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000787 n = f.readinto(b)
788 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000789 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000790 # Test writing in binary mode
791 with open(tfn, "wb") as f:
792 f.write(b)
793 with open(tfn, "rb") as f:
794 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000795 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000796 finally:
797 try:
798 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200799 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000800 pass
801
Neal Norwitz6968b052007-02-27 19:02:19 +0000802 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000803 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000804 self.assertEqual(b.reverse(), None)
805 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000806 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000807 b.reverse()
808 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000809 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000810 b.reverse()
811 self.assertFalse(b)
812
Eli Bendersky4db28d32011-03-03 18:21:02 +0000813 def test_clear(self):
814 b = bytearray(b'python')
815 b.clear()
816 self.assertEqual(b, b'')
817
818 b = bytearray(b'')
819 b.clear()
820 self.assertEqual(b, b'')
821
822 b = bytearray(b'')
823 b.append(ord('r'))
824 b.clear()
825 b.append(ord('p'))
826 self.assertEqual(b, b'p')
827
828 def test_copy(self):
829 b = bytearray(b'abc')
830 bb = b.copy()
831 self.assertEqual(bb, b'abc')
832
833 b = bytearray(b'')
834 bb = b.copy()
835 self.assertEqual(bb, b'')
836
837 # test that it's indeed a copy and not a reference
838 b = bytearray(b'abc')
839 bb = b.copy()
840 self.assertEqual(b, bb)
841 self.assertIsNot(b, bb)
842 bb.append(ord('d'))
843 self.assertEqual(bb, b'abcd')
844 self.assertEqual(b, b'abc')
845
Guido van Rossumd624f182006-04-24 13:47:05 +0000846 def test_regexps(self):
847 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000848 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000849 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000850 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000851
852 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000853 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000854 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000855 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000856 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000857 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000858 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000859 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000860 try:
861 b[3] = 0
862 self.fail("Didn't raise IndexError")
863 except IndexError:
864 pass
865 try:
866 b[-10] = 0
867 self.fail("Didn't raise IndexError")
868 except IndexError:
869 pass
870 try:
871 b[0] = 256
872 self.fail("Didn't raise ValueError")
873 except ValueError:
874 pass
875 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000876 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000877 self.fail("Didn't raise ValueError")
878 except ValueError:
879 pass
880 try:
881 b[0] = None
882 self.fail("Didn't raise TypeError")
883 except TypeError:
884 pass
885
886 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000887 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000888 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000889 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000890 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000891 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000892 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000893 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000894
895 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000896 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000897 self.assertEqual(list(b), list(range(10)))
898
Guido van Rossum254348e2007-11-21 19:29:53 +0000899 b[0:5] = bytearray([1, 1, 1, 1, 1])
900 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000901
902 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000903 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000904
Guido van Rossum254348e2007-11-21 19:29:53 +0000905 b[0:0] = bytearray([0, 1, 2, 3, 4])
906 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000907
Guido van Rossum254348e2007-11-21 19:29:53 +0000908 b[-7:-3] = bytearray([100, 101])
909 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000910
911 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000912 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000913
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000914 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000915 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 +0000916
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200917 b[3:] = b'foo'
918 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
919
920 b[:3] = memoryview(b'foo')
921 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
922
923 b[3:4] = []
924 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
925
926 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
927 ['a', 'b'], [b'a', b'b'], [[]]]:
928 with self.assertRaises(TypeError):
929 b[3:4] = elem
930
931 for elem in [[254, 255, 256], [-256, 9000]]:
932 with self.assertRaises(ValueError):
933 b[3:4] = elem
934
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200935 def test_setslice_extend(self):
936 # Exercise the resizing logic (see issue #19087)
937 b = bytearray(range(100))
938 self.assertEqual(list(b), list(range(100)))
939 del b[:10]
940 self.assertEqual(list(b), list(range(10, 100)))
941 b.extend(range(100, 110))
942 self.assertEqual(list(b), list(range(10, 110)))
943
Thomas Wouters376446d2006-12-19 08:30:14 +0000944 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +0000945 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000946 for start in indices:
947 for stop in indices:
948 # Skip invalid step 0
949 for step in indices[1:]:
950 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000951 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000952 # Make sure we have a slice of exactly the right length,
953 # but with different data.
954 data = L[start:stop:step]
955 data.reverse()
956 L[start:stop:step] = data
957 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +0000958 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000959
Thomas Wouters376446d2006-12-19 08:30:14 +0000960 del L[start:stop:step]
961 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000962 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000963
Guido van Rossumd624f182006-04-24 13:47:05 +0000964 def test_setslice_trap(self):
965 # This test verifies that we correctly handle assigning self
966 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000967 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000968 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000969 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000970
Guido van Rossum13e57212006-04-27 22:54:26 +0000971 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000972 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000973 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000974 b += b"def"
975 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000976 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000977 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000978 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000979 self.assertEqual(b, b"abcdefxyz")
980 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000981 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000982 except TypeError:
983 pass
984 else:
985 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000986
987 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000988 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000989 b1 = b
990 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000991 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000992 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000993 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000994
995 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000996 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000997 b1 = b
998 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000999 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001000 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001001 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001002
Guido van Rossum20188312006-05-05 15:15:40 +00001003 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001004 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001005 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001006 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001007 seq = [alloc]
1008 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001009 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001010 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001011 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +00001012 if alloc not in seq:
1013 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001014
Neal Norwitz6968b052007-02-27 19:02:19 +00001015 def test_extend(self):
1016 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001017 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001018 a.extend(a)
1019 self.assertEqual(a, orig + orig)
1020 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001021 a = bytearray(b'')
1022 # Test iterators that don't have a __length_hint__
1023 a.extend(map(int, orig * 25))
1024 a.extend(int(x) for x in orig * 25)
1025 self.assertEqual(a, orig * 50)
1026 self.assertEqual(a[-5:], orig)
1027 a = bytearray(b'')
1028 a.extend(iter(map(int, orig * 50)))
1029 self.assertEqual(a, orig * 50)
1030 self.assertEqual(a[-5:], orig)
1031 a = bytearray(b'')
1032 a.extend(list(map(int, orig * 50)))
1033 self.assertEqual(a, orig * 50)
1034 self.assertEqual(a[-5:], orig)
1035 a = bytearray(b'')
1036 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1037 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1038 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001039 a = bytearray(b'')
1040 a.extend([Indexable(ord('a'))])
1041 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001042
Neal Norwitz6968b052007-02-27 19:02:19 +00001043 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001044 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001045 b.remove(ord('l'))
1046 self.assertEqual(b, b'helo')
1047 b.remove(ord('l'))
1048 self.assertEqual(b, b'heo')
1049 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1050 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001051 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001052 # remove first and last
1053 b.remove(ord('o'))
1054 b.remove(ord('h'))
1055 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001056 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001057 b.remove(Indexable(ord('e')))
1058 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001059
1060 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001061 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001062 self.assertEqual(b.pop(), ord('d'))
1063 self.assertEqual(b.pop(0), ord('w'))
1064 self.assertEqual(b.pop(-2), ord('r'))
1065 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001066 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001067 # test for issue #6846
1068 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001069
1070 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001071 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001072
Neal Norwitz6968b052007-02-27 19:02:19 +00001073 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001074 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001075 b.append(ord('o'))
1076 self.assertEqual(b, b'hello')
1077 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001078 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001079 b.append(ord('A'))
1080 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001081 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001082 b = bytearray()
1083 b.append(Indexable(ord('A')))
1084 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001085
1086 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001087 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001088 b.insert(1, ord('i'))
1089 b.insert(4, ord('i'))
1090 b.insert(-2, ord('i'))
1091 b.insert(1000, ord('i'))
1092 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001093 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001094 b = bytearray()
1095 b.insert(0, Indexable(ord('A')))
1096 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001097
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001098 def test_copied(self):
1099 # Issue 4348. Make sure that operations that don't mutate the array
1100 # copy the bytes.
1101 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001102 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001103
1104 t = bytearray([i for i in range(256)])
1105 x = bytearray(b'')
1106 self.assertFalse(x is x.translate(t))
1107
Guido van Rossum254348e2007-11-21 19:29:53 +00001108 def test_partition_bytearray_doesnt_share_nullstring(self):
1109 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001110 self.assertEqual(b, b"")
1111 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001112 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001113 b += b"!"
1114 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001115 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001116 self.assertEqual(b, b"")
1117 self.assertEqual(c, b"")
1118 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001119 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001120 self.assertEqual(b, b"")
1121 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001122 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001123 b += b"!"
1124 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001125 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001126 self.assertEqual(b, b"")
1127 self.assertEqual(c, b"")
1128
Antoine Pitrou5504e892008-12-06 21:27:53 +00001129 def test_resize_forbidden(self):
1130 # #4509: can't resize a bytearray when there are buffer exports, even
1131 # if it wouldn't reallocate the underlying buffer.
1132 # Furthermore, no destructive changes to the buffer may be applied
1133 # before raising the error.
1134 b = bytearray(range(10))
1135 v = memoryview(b)
1136 def resize(n):
1137 b[1:-1] = range(n + 1, 2*n - 1)
1138 resize(10)
1139 orig = b[:]
1140 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001141 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001142 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001143 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001144 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001145 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001146 # Other operations implying resize
1147 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001148 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001149 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001150 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001151 def delitem():
1152 del b[1]
1153 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001154 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001155 # deleting a non-contiguous slice
1156 def delslice():
1157 b[1:-1:2] = b""
1158 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001159 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001160
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001161
Christian Heimes510711d2008-01-30 11:57:58 +00001162class AssortedBytesTest(unittest.TestCase):
1163 #
1164 # Test various combinations of bytes and bytearray
1165 #
1166
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001167 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001168 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001169 for f in str, repr:
1170 self.assertEqual(f(bytearray()), "bytearray(b'')")
1171 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1172 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1173 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1174 self.assertEqual(f(b"abc"), "b'abc'")
1175 self.assertEqual(f(b"'"), '''b"'"''') # '''
1176 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001177
1178 def test_compare_bytes_to_bytearray(self):
1179 self.assertEqual(b"abc" == bytes(b"abc"), True)
1180 self.assertEqual(b"ab" != bytes(b"abc"), True)
1181 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1182 self.assertEqual(b"ab" < bytes(b"abc"), True)
1183 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1184 self.assertEqual(b"abc" > bytes(b"ab"), True)
1185
1186 self.assertEqual(b"abc" != bytes(b"abc"), False)
1187 self.assertEqual(b"ab" == bytes(b"abc"), False)
1188 self.assertEqual(b"ab" > bytes(b"abc"), False)
1189 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1190 self.assertEqual(b"abc" < bytes(b"ab"), False)
1191 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1192
1193 self.assertEqual(bytes(b"abc") == b"abc", True)
1194 self.assertEqual(bytes(b"ab") != b"abc", True)
1195 self.assertEqual(bytes(b"ab") <= b"abc", True)
1196 self.assertEqual(bytes(b"ab") < b"abc", True)
1197 self.assertEqual(bytes(b"abc") >= b"ab", True)
1198 self.assertEqual(bytes(b"abc") > b"ab", True)
1199
1200 self.assertEqual(bytes(b"abc") != b"abc", False)
1201 self.assertEqual(bytes(b"ab") == b"abc", False)
1202 self.assertEqual(bytes(b"ab") > b"abc", False)
1203 self.assertEqual(bytes(b"ab") >= b"abc", False)
1204 self.assertEqual(bytes(b"abc") < b"ab", False)
1205 self.assertEqual(bytes(b"abc") <= b"ab", False)
1206
Stefan Krah6e572b82013-01-26 13:06:36 +01001207 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001208 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001209 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001210 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001211 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001212 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001213
1214 def test_from_bytearray(self):
1215 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1216 buf = memoryview(sample)
1217 b = bytearray(buf)
1218 self.assertEqual(b, bytearray(sample))
1219
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001220 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001221 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001222 self.assertEqual(str(b''), "b''")
1223 self.assertEqual(str(b'x'), "b'x'")
1224 self.assertEqual(str(b'\x80'), "b'\\x80'")
1225 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1226 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1227 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001228
1229 def test_literal(self):
1230 tests = [
1231 (b"Wonderful spam", "Wonderful spam"),
1232 (br"Wonderful spam too", "Wonderful spam too"),
1233 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1234 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1235 ]
1236 for b, s in tests:
1237 self.assertEqual(b, bytearray(s, 'latin-1'))
1238 for c in range(128, 256):
1239 self.assertRaises(SyntaxError, eval,
1240 'b"%s"' % chr(c))
1241
1242 def test_translate(self):
1243 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001244 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001245 rosetta = bytearray(range(0, 256))
1246 rosetta[ord('o')] = ord('e')
1247 c = b.translate(rosetta, b'l')
1248 self.assertEqual(b, b'hello')
1249 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001250 c = ba.translate(rosetta, b'l')
1251 self.assertEqual(ba, b'hello')
1252 self.assertEqual(c, b'hee')
1253 c = b.translate(None, b'e')
1254 self.assertEqual(c, b'hllo')
1255 c = ba.translate(None, b'e')
1256 self.assertEqual(c, b'hllo')
1257 self.assertRaises(TypeError, b.translate, None, None)
1258 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001259
1260 def test_split_bytearray(self):
1261 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1262
1263 def test_rsplit_bytearray(self):
1264 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1265
Georg Brandleb2c9642008-05-30 12:05:02 +00001266 def test_return_self(self):
1267 # bytearray.replace must always return a new bytearray
1268 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001269 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001270
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001271 def test_compare(self):
1272 if sys.flags.bytes_warning:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001273 def bytes_warning():
1274 return test.support.check_warnings(('', BytesWarning))
1275 with bytes_warning():
1276 b'' == ''
1277 with bytes_warning():
1278 b'' != ''
1279 with bytes_warning():
1280 bytearray(b'') == ''
1281 with bytes_warning():
1282 bytearray(b'') != ''
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001283 else:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001284 self.skipTest("BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001285
Guido van Rossumd624f182006-04-24 13:47:05 +00001286 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001287 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001288 # __reversed__? (optimization)
1289
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001290 # XXX More string methods? (Those that don't use character properties)
1291
Neal Norwitz6968b052007-02-27 19:02:19 +00001292 # There are tests in string_tests.py that are more
1293 # comprehensive for things like split, partition, etc.
1294 # Unfortunately they are all bundled with tests that
1295 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001296
Guido van Rossum254348e2007-11-21 19:29:53 +00001297 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001298 # the rest that make sense (the code can be cleaned up to use modern
1299 # unittest methods at the same time).
1300
Guido van Rossum254348e2007-11-21 19:29:53 +00001301class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001302 test.buffer_tests.MixinBytesBufferCommonTests):
1303 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001304 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001305
1306 def test_returns_new_copy(self):
1307 val = self.marshal(b'1234')
1308 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001309 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001310 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1311 method = getattr(val, methname)
1312 newval = method(3)
1313 self.assertEqual(val, newval)
1314 self.assertTrue(val is not newval,
1315 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001316 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1317 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1318 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1319 newval = eval(expr)
1320 self.assertEqual(val, newval)
1321 self.assertTrue(val is not newval,
1322 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001323 sep = self.marshal(b'')
1324 newval = sep.join([val])
1325 self.assertEqual(val, newval)
1326 self.assertIsNot(val, newval)
1327
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001328
Christian Heimes510711d2008-01-30 11:57:58 +00001329class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +00001330
Guido van Rossum9c627722007-08-27 18:31:48 +00001331 def fixtype(self, obj):
1332 if isinstance(obj, str):
1333 return obj.encode("utf-8")
1334 return super().fixtype(obj)
1335
Georg Brandlc7885542007-03-06 19:16:20 +00001336 # Currently the bytes containment testing uses a single integer
1337 # value. This may not be the final design, but until then the
1338 # bytes section with in a bytes containment not valid
1339 def test_contains(self):
1340 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001341 def test_expandtabs(self):
1342 pass
1343 def test_upper(self):
1344 pass
1345 def test_lower(self):
1346 pass
Georg Brandlc7885542007-03-06 19:16:20 +00001347
Ezio Melotti0dceb562013-01-10 07:43:26 +02001348class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001349 type2test = bytearray
Antoine Pitrouac65d962011-10-20 23:54:17 +02001350 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001351
Ezio Melotti0dceb562013-01-10 07:43:26 +02001352class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001353 type2test = bytes
Antoine Pitrouac65d962011-10-20 23:54:17 +02001354 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001355
Georg Brandlc7885542007-03-06 19:16:20 +00001356
Ezio Melotti0dceb562013-01-10 07:43:26 +02001357class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001358
1359 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001360 self.assertTrue(issubclass(self.subclass2test, self.type2test))
Ezio Melottie9615932010-01-24 19:26:24 +00001361 self.assertIsInstance(self.subclass2test(), self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001362
1363 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001364 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001365
1366 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001367 self.assertTrue(_a == _a)
1368 self.assertTrue(_a != _b)
1369 self.assertTrue(_a < _b)
1370 self.assertTrue(_a <= _b)
1371 self.assertTrue(_b >= _a)
1372 self.assertTrue(_b > _a)
1373 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001374
1375 # test concat of subclass instances
1376 self.assertEqual(a + b, _a + _b)
1377 self.assertEqual(a + b, a + _b)
1378 self.assertEqual(a + b, _a + b)
1379
1380 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001381 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001382
1383 def test_join(self):
1384 # Make sure join returns a NEW object for single item sequences
1385 # involving a subclass.
1386 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001387 s1 = self.subclass2test(b"abcd")
1388 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001389 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001390 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001391
1392 # Test reverse, calling join on subclass
1393 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001394 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001395
1396 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001397 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001398 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001399 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001400 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001401 b = pickle.loads(pickle.dumps(a, proto))
1402 self.assertNotEqual(id(a), id(b))
1403 self.assertEqual(a, b)
1404 self.assertEqual(a.x, b.x)
1405 self.assertEqual(a.y, b.y)
1406 self.assertEqual(type(a), type(b))
1407 self.assertEqual(type(a.y), type(b.y))
1408
1409 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001410 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001411 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001412 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001413 for copy_method in (copy.copy, copy.deepcopy):
1414 b = copy_method(a)
1415 self.assertNotEqual(id(a), id(b))
1416 self.assertEqual(a, b)
1417 self.assertEqual(a.x, b.x)
1418 self.assertEqual(a.y, b.y)
1419 self.assertEqual(type(a), type(b))
1420 self.assertEqual(type(a.y), type(b.y))
1421
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001422
1423class ByteArraySubclass(bytearray):
1424 pass
1425
1426class BytesSubclass(bytes):
1427 pass
1428
Ezio Melotti0dceb562013-01-10 07:43:26 +02001429class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001430 type2test = bytearray
1431 subclass2test = ByteArraySubclass
1432
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001433 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001434 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001435 def __init__(me, newarg=1, *args, **kwargs):
1436 bytearray.__init__(me, *args, **kwargs)
1437 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001438 x = subclass(4, source=b"abcd")
1439 self.assertEqual(x, b"abcd")
1440 x = subclass(newarg=4, source=b"abcd")
1441 self.assertEqual(x, b"abcd")
1442
1443
Ezio Melotti0dceb562013-01-10 07:43:26 +02001444class BytesSubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001445 type2test = bytes
1446 subclass2test = BytesSubclass
1447
1448
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001449if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001450 unittest.main()