blob: 0177749e212d94e6ac611dc1431a055056e3e691 [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
Antoine Pitroucc231542014-11-02 18:40:09 +010016
Benjamin Petersonee8712c2008-05-20 21:35:26 +000017import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000018import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000019import test.buffer_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010020from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000021
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000022
23if sys.flags.bytes_warning:
24 def check_bytes_warnings(func):
25 @functools.wraps(func)
26 def wrapper(*args, **kw):
27 with test.support.check_warnings(('', BytesWarning)):
28 return func(*args, **kw)
29 return wrapper
30else:
31 # no-op
32 def check_bytes_warnings(func):
33 return func
34
35
Georg Brandl9a54d7c2008-07-16 23:15:30 +000036class Indexable:
37 def __init__(self, value=0):
38 self.value = value
39 def __index__(self):
40 return self.value
41
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042
Ezio Melotti0dceb562013-01-10 07:43:26 +020043class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000044
45 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000046 b = self.type2test()
47 self.assertEqual(type(b), self.type2test)
48 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000049
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000050 def test_copy(self):
51 a = self.type2test(b"abcd")
52 for copy_method in (copy.copy, copy.deepcopy):
53 b = copy_method(a)
54 self.assertEqual(a, b)
55 self.assertEqual(type(a), type(b))
56
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000057 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000058 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000059 self.assertEqual(len(b), 0)
60 self.assertRaises(IndexError, lambda: b[0])
61 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000062 self.assertRaises(IndexError, lambda: b[sys.maxsize])
63 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000064 self.assertRaises(IndexError, lambda: b[10**100])
65 self.assertRaises(IndexError, lambda: b[-1])
66 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000067 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
69 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000070 self.assertRaises(IndexError, lambda: b[-10**100])
71
72 def test_from_list(self):
73 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000074 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000075 self.assertEqual(len(b), 256)
76 self.assertEqual(list(b), ints)
77
78 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000079 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
80 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000081 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000082 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
83 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000084
85 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000086 self.assertEqual(self.type2test(0), b'')
87 self.assertEqual(self.type2test(1), b'\x00')
88 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
89 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000090
Benjamin Peterson4c045832010-04-16 22:35:32 +000091 self.assertEqual(self.type2test('0', 'ascii'), b'0')
92 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000093 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000094
95 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000096 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000097 class C:
98 pass
Christian Heimes510711d2008-01-30 11:57:58 +000099 self.assertRaises(TypeError, self.type2test, ["0"])
100 self.assertRaises(TypeError, self.type2test, [0.0])
101 self.assertRaises(TypeError, self.type2test, [None])
102 self.assertRaises(TypeError, self.type2test, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000103
104 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000105 self.assertRaises(ValueError, self.type2test, [-1])
106 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
107 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
108 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
109 self.assertRaises(ValueError, self.type2test, [-10**100])
110 self.assertRaises(ValueError, self.type2test, [256])
111 self.assertRaises(ValueError, self.type2test, [257])
112 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
113 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
114 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000115
Antoine Pitroucc231542014-11-02 18:40:09 +0100116 @bigaddrspacetest
117 def test_constructor_overflow(self):
118 size = MAX_Py_ssize_t
119 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
120 try:
121 # Should either pass or raise an error (e.g. on debug builds with
122 # additional malloc() overhead), but shouldn't crash.
123 bytearray(size - 4)
124 except (OverflowError, MemoryError):
125 pass
126
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000127 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000128 b1 = self.type2test([1, 2, 3])
129 b2 = self.type2test([1, 2, 3])
130 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000131
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000132 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000133 self.assertTrue(b2 != b3)
134 self.assertTrue(b1 <= b2)
135 self.assertTrue(b1 <= b3)
136 self.assertTrue(b1 < b3)
137 self.assertTrue(b1 >= b2)
138 self.assertTrue(b3 >= b2)
139 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000141 self.assertFalse(b1 != b2)
142 self.assertFalse(b2 == b3)
143 self.assertFalse(b1 > b2)
144 self.assertFalse(b1 > b3)
145 self.assertFalse(b1 >= b3)
146 self.assertFalse(b1 < b2)
147 self.assertFalse(b3 < b2)
148 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000149
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000150 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000151 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000152 # Byte comparisons with unicode should always fail!
153 # Test this for all expected byte orders and Unicode character
154 # sizes.
155 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
156 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
157 False)
158 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
159 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
160 False)
161 self.assertEqual(self.type2test() == str(), False)
162 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000163
164 def test_reversed(self):
165 input = list(map(ord, "Hello"))
166 b = self.type2test(input)
167 output = list(reversed(b))
168 input.reverse()
169 self.assertEqual(output, input)
170
171 def test_getslice(self):
172 def by(s):
173 return self.type2test(map(ord, s))
174 b = by("Hello, world")
175
176 self.assertEqual(b[:5], by("Hello"))
177 self.assertEqual(b[1:5], by("ello"))
178 self.assertEqual(b[5:7], by(", "))
179 self.assertEqual(b[7:], by("world"))
180 self.assertEqual(b[7:12], by("world"))
181 self.assertEqual(b[7:100], by("world"))
182
183 self.assertEqual(b[:-7], by("Hello"))
184 self.assertEqual(b[-11:-7], by("ello"))
185 self.assertEqual(b[-7:-5], by(", "))
186 self.assertEqual(b[-5:], by("world"))
187 self.assertEqual(b[-5:12], by("world"))
188 self.assertEqual(b[-5:100], by("world"))
189 self.assertEqual(b[-100:5], by("Hello"))
190
191 def test_extended_getslice(self):
192 # Test extended slicing by comparing with list slicing.
193 L = list(range(255))
194 b = self.type2test(L)
195 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
196 for start in indices:
197 for stop in indices:
198 # Skip step 0 (invalid)
199 for step in indices[1:]:
200 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
201
202 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000203 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000204 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000205 b = self.type2test(sample, enc)
206 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000207 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
208 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000209 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000210
211 def test_decode(self):
212 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000213 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000214 b = self.type2test(sample, enc)
215 self.assertEqual(b.decode(enc), sample)
216 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000217 b = self.type2test(sample, "latin-1")
218 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
219 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
220 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000221 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000222 # Default encoding is utf-8
223 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000224
225 def test_from_int(self):
226 b = self.type2test(0)
227 self.assertEqual(b, self.type2test())
228 b = self.type2test(10)
229 self.assertEqual(b, self.type2test([0]*10))
230 b = self.type2test(10000)
231 self.assertEqual(b, self.type2test([0]*10000))
232
233 def test_concat(self):
234 b1 = self.type2test(b"abc")
235 b2 = self.type2test(b"def")
236 self.assertEqual(b1 + b2, b"abcdef")
237 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
238 self.assertEqual(bytes(b"def") + b1, b"defabc")
239 self.assertRaises(TypeError, lambda: b1 + "def")
240 self.assertRaises(TypeError, lambda: "abc" + b2)
241
242 def test_repeat(self):
243 for b in b"abc", self.type2test(b"abc"):
244 self.assertEqual(b * 3, b"abcabcabc")
245 self.assertEqual(b * 0, b"")
246 self.assertEqual(b * -1, b"")
247 self.assertRaises(TypeError, lambda: b * 3.14)
248 self.assertRaises(TypeError, lambda: 3.14 * b)
249 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000250 with self.assertRaises((OverflowError, MemoryError)):
251 c = b * sys.maxsize
252 with self.assertRaises((OverflowError, MemoryError)):
253 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000254
255 def test_repeat_1char(self):
256 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
257
258 def test_contains(self):
259 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000260 self.assertIn(ord('a'), b)
261 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000262 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000263 self.assertRaises(ValueError, lambda: 300 in b)
264 self.assertRaises(ValueError, lambda: -1 in b)
265 self.assertRaises(TypeError, lambda: None in b)
266 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
267 self.assertRaises(TypeError, lambda: "a" in b)
268 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000269 self.assertIn(f(b""), b)
270 self.assertIn(f(b"a"), b)
271 self.assertIn(f(b"b"), b)
272 self.assertIn(f(b"c"), b)
273 self.assertIn(f(b"ab"), b)
274 self.assertIn(f(b"bc"), b)
275 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000276 self.assertNotIn(f(b"ac"), b)
277 self.assertNotIn(f(b"d"), b)
278 self.assertNotIn(f(b"dab"), b)
279 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000280
281 def test_fromhex(self):
282 self.assertRaises(TypeError, self.type2test.fromhex)
283 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000284 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000285 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000286 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
287 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
288 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000289 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
290 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
291 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
292 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
293 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
294 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
295
296 def test_join(self):
297 self.assertEqual(self.type2test(b"").join([]), b"")
298 self.assertEqual(self.type2test(b"").join([b""]), b"")
299 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
300 lst = list(map(self.type2test, lst))
301 self.assertEqual(self.type2test(b"").join(lst), b"abc")
302 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
303 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200304 dot_join = self.type2test(b".:").join
305 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
306 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
307 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
308 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
309 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
310 # Stress it with many items
311 seq = [b"abc"] * 1000
312 expected = b"abc" + b".:abc" * 999
313 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400314 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200315 # Error handling and cleanup when some item in the middle of the
316 # sequence has the wrong type.
317 with self.assertRaises(TypeError):
318 dot_join([bytearray(b"ab"), "cd", b"ef"])
319 with self.assertRaises(TypeError):
320 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000321
Christian Heimes510711d2008-01-30 11:57:58 +0000322 def test_count(self):
323 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200324 i = 105
325 p = 112
326 w = 119
327
Christian Heimes510711d2008-01-30 11:57:58 +0000328 self.assertEqual(b.count(b'i'), 4)
329 self.assertEqual(b.count(b'ss'), 2)
330 self.assertEqual(b.count(b'w'), 0)
331
Antoine Pitrouac65d962011-10-20 23:54:17 +0200332 self.assertEqual(b.count(i), 4)
333 self.assertEqual(b.count(w), 0)
334
335 self.assertEqual(b.count(b'i', 6), 2)
336 self.assertEqual(b.count(b'p', 6), 2)
337 self.assertEqual(b.count(b'i', 1, 3), 1)
338 self.assertEqual(b.count(b'p', 7, 9), 1)
339
340 self.assertEqual(b.count(i, 6), 2)
341 self.assertEqual(b.count(p, 6), 2)
342 self.assertEqual(b.count(i, 1, 3), 1)
343 self.assertEqual(b.count(p, 7, 9), 1)
344
Christian Heimes510711d2008-01-30 11:57:58 +0000345 def test_startswith(self):
346 b = self.type2test(b'hello')
347 self.assertFalse(self.type2test().startswith(b"anything"))
348 self.assertTrue(b.startswith(b"hello"))
349 self.assertTrue(b.startswith(b"hel"))
350 self.assertTrue(b.startswith(b"h"))
351 self.assertFalse(b.startswith(b"hellow"))
352 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300353 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300354 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300355 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300356 self.assertIn('bytes', exc)
357 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000358
359 def test_endswith(self):
360 b = self.type2test(b'hello')
361 self.assertFalse(bytearray().endswith(b"anything"))
362 self.assertTrue(b.endswith(b"hello"))
363 self.assertTrue(b.endswith(b"llo"))
364 self.assertTrue(b.endswith(b"o"))
365 self.assertFalse(b.endswith(b"whello"))
366 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300367 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300368 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300369 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300370 self.assertIn('bytes', exc)
371 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000372
373 def test_find(self):
374 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200375 i = 105
376 w = 119
377
Christian Heimes510711d2008-01-30 11:57:58 +0000378 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000379 self.assertEqual(b.find(b'w'), -1)
380 self.assertEqual(b.find(b'mississippian'), -1)
381
Antoine Pitrouac65d962011-10-20 23:54:17 +0200382 self.assertEqual(b.find(i), 1)
383 self.assertEqual(b.find(w), -1)
384
385 self.assertEqual(b.find(b'ss', 3), 5)
386 self.assertEqual(b.find(b'ss', 1, 7), 2)
387 self.assertEqual(b.find(b'ss', 1, 3), -1)
388
389 self.assertEqual(b.find(i, 6), 7)
390 self.assertEqual(b.find(i, 1, 3), 1)
391 self.assertEqual(b.find(w, 1, 3), -1)
392
Victor Stinnerf8eac002011-12-18 01:17:41 +0100393 for index in (-1, 256, sys.maxsize + 1):
394 self.assertRaisesRegex(
395 ValueError, r'byte must be in range\(0, 256\)',
396 b.find, index)
397
Christian Heimes510711d2008-01-30 11:57:58 +0000398 def test_rfind(self):
399 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200400 i = 105
401 w = 119
402
Christian Heimes510711d2008-01-30 11:57:58 +0000403 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000404 self.assertEqual(b.rfind(b'w'), -1)
405 self.assertEqual(b.rfind(b'mississippian'), -1)
406
Antoine Pitrouac65d962011-10-20 23:54:17 +0200407 self.assertEqual(b.rfind(i), 10)
408 self.assertEqual(b.rfind(w), -1)
409
410 self.assertEqual(b.rfind(b'ss', 3), 5)
411 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
412
413 self.assertEqual(b.rfind(i, 1, 3), 1)
414 self.assertEqual(b.rfind(i, 3, 9), 7)
415 self.assertEqual(b.rfind(w, 1, 3), -1)
416
Christian Heimes510711d2008-01-30 11:57:58 +0000417 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200418 b = self.type2test(b'mississippi')
419 i = 105
420 w = 119
421
422 self.assertEqual(b.index(b'ss'), 2)
423 self.assertRaises(ValueError, b.index, b'w')
424 self.assertRaises(ValueError, b.index, b'mississippian')
425
426 self.assertEqual(b.index(i), 1)
427 self.assertRaises(ValueError, b.index, w)
428
429 self.assertEqual(b.index(b'ss', 3), 5)
430 self.assertEqual(b.index(b'ss', 1, 7), 2)
431 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
432
433 self.assertEqual(b.index(i, 6), 7)
434 self.assertEqual(b.index(i, 1, 3), 1)
435 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000436
437 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200438 b = self.type2test(b'mississippi')
439 i = 105
440 w = 119
441
442 self.assertEqual(b.rindex(b'ss'), 5)
443 self.assertRaises(ValueError, b.rindex, b'w')
444 self.assertRaises(ValueError, b.rindex, b'mississippian')
445
446 self.assertEqual(b.rindex(i), 10)
447 self.assertRaises(ValueError, b.rindex, w)
448
449 self.assertEqual(b.rindex(b'ss', 3), 5)
450 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
451
452 self.assertEqual(b.rindex(i, 1, 3), 1)
453 self.assertEqual(b.rindex(i, 3, 9), 7)
454 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000455
456 def test_replace(self):
457 b = self.type2test(b'mississippi')
458 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
459 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
460
461 def test_split(self):
462 b = self.type2test(b'mississippi')
463 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
464 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
465 self.assertEqual(b.split(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200466 # with keyword args
467 b = self.type2test(b'a|b|c|d')
468 self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
469 self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
470 self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
471 self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
472 b = self.type2test(b'a b c d')
473 self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
Christian Heimes510711d2008-01-30 11:57:58 +0000474
475 def test_split_whitespace(self):
476 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
477 b'arf\fbarf', b'arf\vbarf'):
478 b = self.type2test(b)
479 self.assertEqual(b.split(), [b'arf', b'barf'])
480 self.assertEqual(b.split(None), [b'arf', b'barf'])
481 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
482 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
483 b = self.type2test(b)
484 self.assertEqual(b.split(), [b])
485 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
486 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
487 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
488 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
489
490 def test_split_string_error(self):
491 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
492
Antoine Pitrouf8453022010-01-12 22:05:42 +0000493 def test_split_unicodewhitespace(self):
494 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
495 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
496
Christian Heimes510711d2008-01-30 11:57:58 +0000497 def test_rsplit(self):
498 b = self.type2test(b'mississippi')
499 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
500 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
501 self.assertEqual(b.rsplit(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200502 # with keyword args
503 b = self.type2test(b'a|b|c|d')
504 self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
505 self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
506 self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
507 self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
508 b = self.type2test(b'a b c d')
509 self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
Christian Heimes510711d2008-01-30 11:57:58 +0000510
511 def test_rsplit_whitespace(self):
512 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
513 b'arf\fbarf', b'arf\vbarf'):
514 b = self.type2test(b)
515 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
516 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
517 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
518 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
519 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
520 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
521 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
522
523 def test_rsplit_string_error(self):
524 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
525
526 def test_rsplit_unicodewhitespace(self):
527 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000528 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
529
530 def test_partition(self):
531 b = self.type2test(b'mississippi')
532 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000533 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000534
535 def test_rpartition(self):
536 b = self.type2test(b'mississippi')
537 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
538 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000539 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000540
541 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000542 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000543 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
544 b = self.type2test(b)
545 ps = pickle.dumps(b, proto)
546 q = pickle.loads(ps)
547 self.assertEqual(b, q)
548
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000549 def test_iterator_pickling(self):
550 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
551 it = itorg = iter(self.type2test(b))
552 data = list(self.type2test(b))
553 d = pickle.dumps(it)
554 it = pickle.loads(d)
555 self.assertEqual(type(itorg), type(it))
556 self.assertEqual(list(it), data)
557
558 it = pickle.loads(d)
559 try:
560 next(it)
561 except StopIteration:
562 continue
563 d = pickle.dumps(it)
564 it = pickle.loads(d)
565 self.assertEqual(list(it), data[1:])
566
Christian Heimes510711d2008-01-30 11:57:58 +0000567 def test_strip(self):
568 b = self.type2test(b'mississippi')
569 self.assertEqual(b.strip(b'i'), b'mississipp')
570 self.assertEqual(b.strip(b'm'), b'ississippi')
571 self.assertEqual(b.strip(b'pi'), b'mississ')
572 self.assertEqual(b.strip(b'im'), b'ssissipp')
573 self.assertEqual(b.strip(b'pim'), b'ssiss')
574 self.assertEqual(b.strip(b), b'')
575
576 def test_lstrip(self):
577 b = self.type2test(b'mississippi')
578 self.assertEqual(b.lstrip(b'i'), b'mississippi')
579 self.assertEqual(b.lstrip(b'm'), b'ississippi')
580 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
581 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
582 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
583
584 def test_rstrip(self):
585 b = self.type2test(b'mississippi')
586 self.assertEqual(b.rstrip(b'i'), b'mississipp')
587 self.assertEqual(b.rstrip(b'm'), b'mississippi')
588 self.assertEqual(b.rstrip(b'pi'), b'mississ')
589 self.assertEqual(b.rstrip(b'im'), b'mississipp')
590 self.assertEqual(b.rstrip(b'pim'), b'mississ')
591
592 def test_strip_whitespace(self):
593 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
594 self.assertEqual(b.strip(), b'abc')
595 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
596 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
597
598 def test_strip_bytearray(self):
599 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
600 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
601 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
602
603 def test_strip_string_error(self):
604 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
605 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
606 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
607
Eli Bendersky906b88f2011-07-29 07:05:08 +0300608 def test_center(self):
609 # Fill character can be either bytes or bytearray (issue 12380)
610 b = self.type2test(b'abc')
611 for fill_type in (bytes, bytearray):
612 self.assertEqual(b.center(7, fill_type(b'-')),
613 self.type2test(b'--abc--'))
614
615 def test_ljust(self):
616 # Fill character can be either bytes or bytearray (issue 12380)
617 b = self.type2test(b'abc')
618 for fill_type in (bytes, bytearray):
619 self.assertEqual(b.ljust(7, fill_type(b'-')),
620 self.type2test(b'abc----'))
621
622 def test_rjust(self):
623 # Fill character can be either bytes or bytearray (issue 12380)
624 b = self.type2test(b'abc')
625 for fill_type in (bytes, bytearray):
626 self.assertEqual(b.rjust(7, fill_type(b'-')),
627 self.type2test(b'----abc'))
628
Christian Heimes510711d2008-01-30 11:57:58 +0000629 def test_ord(self):
630 b = self.type2test(b'\0A\x7f\x80\xff')
631 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
632 [0, 65, 127, 128, 255])
633
Georg Brandlabc38772009-04-12 15:51:51 +0000634 def test_maketrans(self):
635 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 +0000636 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000637 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'
638 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000639 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
640 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
641
Jesus Ceaac451502011-04-20 17:09:23 +0200642 def test_none_arguments(self):
643 # issue 11828
644 b = self.type2test(b'hello')
645 l = self.type2test(b'l')
646 h = self.type2test(b'h')
647 x = self.type2test(b'x')
648 o = self.type2test(b'o')
649
650 self.assertEqual(2, b.find(l, None))
651 self.assertEqual(3, b.find(l, -2, None))
652 self.assertEqual(2, b.find(l, None, -2))
653 self.assertEqual(0, b.find(h, None, None))
654
655 self.assertEqual(3, b.rfind(l, None))
656 self.assertEqual(3, b.rfind(l, -2, None))
657 self.assertEqual(2, b.rfind(l, None, -2))
658 self.assertEqual(0, b.rfind(h, None, None))
659
660 self.assertEqual(2, b.index(l, None))
661 self.assertEqual(3, b.index(l, -2, None))
662 self.assertEqual(2, b.index(l, None, -2))
663 self.assertEqual(0, b.index(h, None, None))
664
665 self.assertEqual(3, b.rindex(l, None))
666 self.assertEqual(3, b.rindex(l, -2, None))
667 self.assertEqual(2, b.rindex(l, None, -2))
668 self.assertEqual(0, b.rindex(h, None, None))
669
670 self.assertEqual(2, b.count(l, None))
671 self.assertEqual(1, b.count(l, -2, None))
672 self.assertEqual(1, b.count(l, None, -2))
673 self.assertEqual(0, b.count(x, None, None))
674
675 self.assertEqual(True, b.endswith(o, None))
676 self.assertEqual(True, b.endswith(o, -2, None))
677 self.assertEqual(True, b.endswith(l, None, -2))
678 self.assertEqual(False, b.endswith(x, None, None))
679
680 self.assertEqual(True, b.startswith(h, None))
681 self.assertEqual(True, b.startswith(l, -2, None))
682 self.assertEqual(True, b.startswith(h, None, -2))
683 self.assertEqual(False, b.startswith(x, None, None))
684
Antoine Pitrouac65d962011-10-20 23:54:17 +0200685 def test_integer_arguments_out_of_byte_range(self):
686 b = self.type2test(b'hello')
687
688 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
689 self.assertRaises(ValueError, method, -1)
690 self.assertRaises(ValueError, method, 256)
691 self.assertRaises(ValueError, method, 9999)
692
Jesus Ceaac451502011-04-20 17:09:23 +0200693 def test_find_etc_raise_correct_error_messages(self):
694 # issue 11828
695 b = self.type2test(b'hello')
696 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300697 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200698 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300699 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200700 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300701 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200702 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300703 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200704 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300705 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200706 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300707 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200708 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300709 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200710 x, None, None, None)
711
Christian Heimes510711d2008-01-30 11:57:58 +0000712
Ezio Melotti0dceb562013-01-10 07:43:26 +0200713class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000714 type2test = bytes
715
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000716 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200717 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000718 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000719 self.assertRaises(TypeError, f.readinto, b"")
720
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000721 def test_custom(self):
722 class A:
723 def __bytes__(self):
724 return b'abc'
725 self.assertEqual(bytes(A()), b'abc')
726 class A: pass
727 self.assertRaises(TypeError, bytes, A())
728 class A:
729 def __bytes__(self):
730 return None
731 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600732 class A:
733 def __bytes__(self):
734 return b'a'
735 def __index__(self):
736 return 42
737 self.assertEqual(bytes(A()), b'a')
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000738
Victor Stinner29e762c2011-01-05 03:33:28 +0000739 # Test PyBytes_FromFormat()
740 def test_from_format(self):
741 test.support.import_module('ctypes')
742 from ctypes import pythonapi, py_object, c_int, c_char_p
743 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
744 PyBytes_FromFormat.restype = py_object
745
746 self.assertEqual(PyBytes_FromFormat(b'format'),
747 b'format')
748
749 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
750 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
751 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
752 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
753 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
754
755 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
756 b'c:\xff')
757 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
758 b's:cstr')
759
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100760 # Issue #19969
761 self.assertRaises(OverflowError,
762 PyBytes_FromFormat, b'%c', c_int(-1))
763 self.assertRaises(OverflowError,
764 PyBytes_FromFormat, b'%c', c_int(256))
765
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000766
Ezio Melotti0dceb562013-01-10 07:43:26 +0200767class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000768 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000769
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000770 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000771 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000772
Guido van Rossum254348e2007-11-21 19:29:53 +0000773 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000774 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000775 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000776 tfn = tempfile.mktemp()
777 try:
778 # Prepare
779 with open(tfn, "wb") as f:
780 f.write(short_sample)
781 # Test readinto
782 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000783 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000784 n = f.readinto(b)
785 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000786 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000787 # Test writing in binary mode
788 with open(tfn, "wb") as f:
789 f.write(b)
790 with open(tfn, "rb") as f:
791 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000792 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000793 finally:
794 try:
795 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200796 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000797 pass
798
Neal Norwitz6968b052007-02-27 19:02:19 +0000799 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000800 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000801 self.assertEqual(b.reverse(), None)
802 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000803 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000804 b.reverse()
805 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000806 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000807 b.reverse()
808 self.assertFalse(b)
809
Eli Bendersky4db28d32011-03-03 18:21:02 +0000810 def test_clear(self):
811 b = bytearray(b'python')
812 b.clear()
813 self.assertEqual(b, b'')
814
815 b = bytearray(b'')
816 b.clear()
817 self.assertEqual(b, b'')
818
819 b = bytearray(b'')
820 b.append(ord('r'))
821 b.clear()
822 b.append(ord('p'))
823 self.assertEqual(b, b'p')
824
825 def test_copy(self):
826 b = bytearray(b'abc')
827 bb = b.copy()
828 self.assertEqual(bb, b'abc')
829
830 b = bytearray(b'')
831 bb = b.copy()
832 self.assertEqual(bb, b'')
833
834 # test that it's indeed a copy and not a reference
835 b = bytearray(b'abc')
836 bb = b.copy()
837 self.assertEqual(b, bb)
838 self.assertIsNot(b, bb)
839 bb.append(ord('d'))
840 self.assertEqual(bb, b'abcd')
841 self.assertEqual(b, b'abc')
842
Guido van Rossumd624f182006-04-24 13:47:05 +0000843 def test_regexps(self):
844 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000845 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000846 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000847 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000848
849 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000850 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000851 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000852 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000853 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000854 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000855 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000856 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000857 try:
858 b[3] = 0
859 self.fail("Didn't raise IndexError")
860 except IndexError:
861 pass
862 try:
863 b[-10] = 0
864 self.fail("Didn't raise IndexError")
865 except IndexError:
866 pass
867 try:
868 b[0] = 256
869 self.fail("Didn't raise ValueError")
870 except ValueError:
871 pass
872 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000873 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000874 self.fail("Didn't raise ValueError")
875 except ValueError:
876 pass
877 try:
878 b[0] = None
879 self.fail("Didn't raise TypeError")
880 except TypeError:
881 pass
882
883 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000884 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000885 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000886 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000887 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000888 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000889 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000890 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000891
892 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000893 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000894 self.assertEqual(list(b), list(range(10)))
895
Guido van Rossum254348e2007-11-21 19:29:53 +0000896 b[0:5] = bytearray([1, 1, 1, 1, 1])
897 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000898
899 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000900 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000901
Guido van Rossum254348e2007-11-21 19:29:53 +0000902 b[0:0] = bytearray([0, 1, 2, 3, 4])
903 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000904
Guido van Rossum254348e2007-11-21 19:29:53 +0000905 b[-7:-3] = bytearray([100, 101])
906 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000907
908 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000909 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000910
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000911 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000912 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 +0000913
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200914 b[3:] = b'foo'
915 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
916
917 b[:3] = memoryview(b'foo')
918 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
919
920 b[3:4] = []
921 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
922
923 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
924 ['a', 'b'], [b'a', b'b'], [[]]]:
925 with self.assertRaises(TypeError):
926 b[3:4] = elem
927
928 for elem in [[254, 255, 256], [-256, 9000]]:
929 with self.assertRaises(ValueError):
930 b[3:4] = elem
931
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200932 def test_setslice_extend(self):
933 # Exercise the resizing logic (see issue #19087)
934 b = bytearray(range(100))
935 self.assertEqual(list(b), list(range(100)))
936 del b[:10]
937 self.assertEqual(list(b), list(range(10, 100)))
938 b.extend(range(100, 110))
939 self.assertEqual(list(b), list(range(10, 110)))
940
Thomas Wouters376446d2006-12-19 08:30:14 +0000941 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +0000942 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000943 for start in indices:
944 for stop in indices:
945 # Skip invalid step 0
946 for step in indices[1:]:
947 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000948 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000949 # Make sure we have a slice of exactly the right length,
950 # but with different data.
951 data = L[start:stop:step]
952 data.reverse()
953 L[start:stop:step] = data
954 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +0000955 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000956
Thomas Wouters376446d2006-12-19 08:30:14 +0000957 del L[start:stop:step]
958 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +0000959 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000960
Guido van Rossumd624f182006-04-24 13:47:05 +0000961 def test_setslice_trap(self):
962 # This test verifies that we correctly handle assigning self
963 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000964 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000965 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000966 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000967
Guido van Rossum13e57212006-04-27 22:54:26 +0000968 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000969 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000970 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000971 b += b"def"
972 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000973 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000974 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000975 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000976 self.assertEqual(b, b"abcdefxyz")
977 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000978 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000979 except TypeError:
980 pass
981 else:
982 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000983
984 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000985 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000986 b1 = b
987 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000988 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000989 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000990 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000991
992 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000993 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000994 b1 = b
995 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000996 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000997 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000998 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +0000999
Guido van Rossum20188312006-05-05 15:15:40 +00001000 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001001 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001002 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001003 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001004 seq = [alloc]
1005 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001006 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001007 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001008 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +00001009 if alloc not in seq:
1010 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001011
Neal Norwitz6968b052007-02-27 19:02:19 +00001012 def test_extend(self):
1013 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001014 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001015 a.extend(a)
1016 self.assertEqual(a, orig + orig)
1017 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001018 a = bytearray(b'')
1019 # Test iterators that don't have a __length_hint__
1020 a.extend(map(int, orig * 25))
1021 a.extend(int(x) for x in orig * 25)
1022 self.assertEqual(a, orig * 50)
1023 self.assertEqual(a[-5:], orig)
1024 a = bytearray(b'')
1025 a.extend(iter(map(int, orig * 50)))
1026 self.assertEqual(a, orig * 50)
1027 self.assertEqual(a[-5:], orig)
1028 a = bytearray(b'')
1029 a.extend(list(map(int, orig * 50)))
1030 self.assertEqual(a, orig * 50)
1031 self.assertEqual(a[-5:], orig)
1032 a = bytearray(b'')
1033 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1034 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1035 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001036 a = bytearray(b'')
1037 a.extend([Indexable(ord('a'))])
1038 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001039
Neal Norwitz6968b052007-02-27 19:02:19 +00001040 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001041 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001042 b.remove(ord('l'))
1043 self.assertEqual(b, b'helo')
1044 b.remove(ord('l'))
1045 self.assertEqual(b, b'heo')
1046 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1047 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001048 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001049 # remove first and last
1050 b.remove(ord('o'))
1051 b.remove(ord('h'))
1052 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001053 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001054 b.remove(Indexable(ord('e')))
1055 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001056
1057 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001058 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001059 self.assertEqual(b.pop(), ord('d'))
1060 self.assertEqual(b.pop(0), ord('w'))
1061 self.assertEqual(b.pop(-2), ord('r'))
1062 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001063 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001064 # test for issue #6846
1065 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001066
1067 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001068 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001069
Neal Norwitz6968b052007-02-27 19:02:19 +00001070 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001071 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001072 b.append(ord('o'))
1073 self.assertEqual(b, b'hello')
1074 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001075 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001076 b.append(ord('A'))
1077 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001078 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001079 b = bytearray()
1080 b.append(Indexable(ord('A')))
1081 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001082
1083 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001084 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001085 b.insert(1, ord('i'))
1086 b.insert(4, ord('i'))
1087 b.insert(-2, ord('i'))
1088 b.insert(1000, ord('i'))
1089 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001090 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001091 b = bytearray()
1092 b.insert(0, Indexable(ord('A')))
1093 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001094
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001095 def test_copied(self):
1096 # Issue 4348. Make sure that operations that don't mutate the array
1097 # copy the bytes.
1098 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001099 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001100
1101 t = bytearray([i for i in range(256)])
1102 x = bytearray(b'')
1103 self.assertFalse(x is x.translate(t))
1104
Guido van Rossum254348e2007-11-21 19:29:53 +00001105 def test_partition_bytearray_doesnt_share_nullstring(self):
1106 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001107 self.assertEqual(b, b"")
1108 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001109 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001110 b += b"!"
1111 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001112 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001113 self.assertEqual(b, b"")
1114 self.assertEqual(c, b"")
1115 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001116 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001117 self.assertEqual(b, b"")
1118 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001119 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001120 b += b"!"
1121 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001122 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001123 self.assertEqual(b, b"")
1124 self.assertEqual(c, b"")
1125
Antoine Pitrou5504e892008-12-06 21:27:53 +00001126 def test_resize_forbidden(self):
1127 # #4509: can't resize a bytearray when there are buffer exports, even
1128 # if it wouldn't reallocate the underlying buffer.
1129 # Furthermore, no destructive changes to the buffer may be applied
1130 # before raising the error.
1131 b = bytearray(range(10))
1132 v = memoryview(b)
1133 def resize(n):
1134 b[1:-1] = range(n + 1, 2*n - 1)
1135 resize(10)
1136 orig = b[:]
1137 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001138 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001139 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001140 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001141 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001142 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001143 # Other operations implying resize
1144 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001145 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001146 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001147 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001148 def delitem():
1149 del b[1]
1150 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001151 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001152 # deleting a non-contiguous slice
1153 def delslice():
1154 b[1:-1:2] = b""
1155 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001156 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001157
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001158
Christian Heimes510711d2008-01-30 11:57:58 +00001159class AssortedBytesTest(unittest.TestCase):
1160 #
1161 # Test various combinations of bytes and bytearray
1162 #
1163
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001164 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001165 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001166 for f in str, repr:
1167 self.assertEqual(f(bytearray()), "bytearray(b'')")
1168 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1169 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1170 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1171 self.assertEqual(f(b"abc"), "b'abc'")
1172 self.assertEqual(f(b"'"), '''b"'"''') # '''
1173 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001174
1175 def test_compare_bytes_to_bytearray(self):
1176 self.assertEqual(b"abc" == bytes(b"abc"), True)
1177 self.assertEqual(b"ab" != bytes(b"abc"), True)
1178 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1179 self.assertEqual(b"ab" < bytes(b"abc"), True)
1180 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1181 self.assertEqual(b"abc" > bytes(b"ab"), True)
1182
1183 self.assertEqual(b"abc" != bytes(b"abc"), False)
1184 self.assertEqual(b"ab" == bytes(b"abc"), False)
1185 self.assertEqual(b"ab" > bytes(b"abc"), False)
1186 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1187 self.assertEqual(b"abc" < bytes(b"ab"), False)
1188 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1189
1190 self.assertEqual(bytes(b"abc") == b"abc", True)
1191 self.assertEqual(bytes(b"ab") != b"abc", True)
1192 self.assertEqual(bytes(b"ab") <= b"abc", True)
1193 self.assertEqual(bytes(b"ab") < b"abc", True)
1194 self.assertEqual(bytes(b"abc") >= b"ab", True)
1195 self.assertEqual(bytes(b"abc") > b"ab", True)
1196
1197 self.assertEqual(bytes(b"abc") != b"abc", False)
1198 self.assertEqual(bytes(b"ab") == b"abc", False)
1199 self.assertEqual(bytes(b"ab") > b"abc", False)
1200 self.assertEqual(bytes(b"ab") >= b"abc", False)
1201 self.assertEqual(bytes(b"abc") < b"ab", False)
1202 self.assertEqual(bytes(b"abc") <= b"ab", False)
1203
Stefan Krah6e572b82013-01-26 13:06:36 +01001204 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001205 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001206 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001207 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001208 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001209 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001210
1211 def test_from_bytearray(self):
1212 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1213 buf = memoryview(sample)
1214 b = bytearray(buf)
1215 self.assertEqual(b, bytearray(sample))
1216
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001217 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001218 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001219 self.assertEqual(str(b''), "b''")
1220 self.assertEqual(str(b'x'), "b'x'")
1221 self.assertEqual(str(b'\x80'), "b'\\x80'")
1222 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1223 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1224 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001225
1226 def test_literal(self):
1227 tests = [
1228 (b"Wonderful spam", "Wonderful spam"),
1229 (br"Wonderful spam too", "Wonderful spam too"),
1230 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1231 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1232 ]
1233 for b, s in tests:
1234 self.assertEqual(b, bytearray(s, 'latin-1'))
1235 for c in range(128, 256):
1236 self.assertRaises(SyntaxError, eval,
1237 'b"%s"' % chr(c))
1238
1239 def test_translate(self):
1240 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001241 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001242 rosetta = bytearray(range(0, 256))
1243 rosetta[ord('o')] = ord('e')
1244 c = b.translate(rosetta, b'l')
1245 self.assertEqual(b, b'hello')
1246 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001247 c = ba.translate(rosetta, b'l')
1248 self.assertEqual(ba, b'hello')
1249 self.assertEqual(c, b'hee')
1250 c = b.translate(None, b'e')
1251 self.assertEqual(c, b'hllo')
1252 c = ba.translate(None, b'e')
1253 self.assertEqual(c, b'hllo')
1254 self.assertRaises(TypeError, b.translate, None, None)
1255 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001256
1257 def test_split_bytearray(self):
1258 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1259
1260 def test_rsplit_bytearray(self):
1261 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1262
Georg Brandleb2c9642008-05-30 12:05:02 +00001263 def test_return_self(self):
1264 # bytearray.replace must always return a new bytearray
1265 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001266 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001267
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001268 def test_compare(self):
1269 if sys.flags.bytes_warning:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001270 def bytes_warning():
1271 return test.support.check_warnings(('', BytesWarning))
1272 with bytes_warning():
1273 b'' == ''
1274 with bytes_warning():
1275 b'' != ''
1276 with bytes_warning():
1277 bytearray(b'') == ''
1278 with bytes_warning():
1279 bytearray(b'') != ''
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001280 else:
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001281 self.skipTest("BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001282
Guido van Rossumd624f182006-04-24 13:47:05 +00001283 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001284 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001285 # __reversed__? (optimization)
1286
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001287 # XXX More string methods? (Those that don't use character properties)
1288
Neal Norwitz6968b052007-02-27 19:02:19 +00001289 # There are tests in string_tests.py that are more
1290 # comprehensive for things like split, partition, etc.
1291 # Unfortunately they are all bundled with tests that
1292 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001293
Guido van Rossum254348e2007-11-21 19:29:53 +00001294 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001295 # the rest that make sense (the code can be cleaned up to use modern
1296 # unittest methods at the same time).
1297
Guido van Rossum254348e2007-11-21 19:29:53 +00001298class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001299 test.buffer_tests.MixinBytesBufferCommonTests):
1300 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001301 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001302
1303 def test_returns_new_copy(self):
1304 val = self.marshal(b'1234')
1305 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001306 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001307 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1308 method = getattr(val, methname)
1309 newval = method(3)
1310 self.assertEqual(val, newval)
1311 self.assertTrue(val is not newval,
1312 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001313 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1314 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1315 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1316 newval = eval(expr)
1317 self.assertEqual(val, newval)
1318 self.assertTrue(val is not newval,
1319 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001320 sep = self.marshal(b'')
1321 newval = sep.join([val])
1322 self.assertEqual(val, newval)
1323 self.assertIsNot(val, newval)
1324
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001325
Christian Heimes510711d2008-01-30 11:57:58 +00001326class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +00001327
Guido van Rossum9c627722007-08-27 18:31:48 +00001328 def fixtype(self, obj):
1329 if isinstance(obj, str):
1330 return obj.encode("utf-8")
1331 return super().fixtype(obj)
1332
Georg Brandlc7885542007-03-06 19:16:20 +00001333 # Currently the bytes containment testing uses a single integer
1334 # value. This may not be the final design, but until then the
1335 # bytes section with in a bytes containment not valid
1336 def test_contains(self):
1337 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001338 def test_expandtabs(self):
1339 pass
1340 def test_upper(self):
1341 pass
1342 def test_lower(self):
1343 pass
Georg Brandlc7885542007-03-06 19:16:20 +00001344
Ezio Melotti0dceb562013-01-10 07:43:26 +02001345class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001346 type2test = bytearray
Antoine Pitrouac65d962011-10-20 23:54:17 +02001347 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001348
Ezio Melotti0dceb562013-01-10 07:43:26 +02001349class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001350 type2test = bytes
Antoine Pitrouac65d962011-10-20 23:54:17 +02001351 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001352
Georg Brandlc7885542007-03-06 19:16:20 +00001353
Ezio Melotti0dceb562013-01-10 07:43:26 +02001354class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001355
1356 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001357 self.assertTrue(issubclass(self.subclass2test, self.type2test))
Ezio Melottie9615932010-01-24 19:26:24 +00001358 self.assertIsInstance(self.subclass2test(), self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001359
1360 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001361 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001362
1363 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001364 self.assertTrue(_a == _a)
1365 self.assertTrue(_a != _b)
1366 self.assertTrue(_a < _b)
1367 self.assertTrue(_a <= _b)
1368 self.assertTrue(_b >= _a)
1369 self.assertTrue(_b > _a)
1370 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001371
1372 # test concat of subclass instances
1373 self.assertEqual(a + b, _a + _b)
1374 self.assertEqual(a + b, a + _b)
1375 self.assertEqual(a + b, _a + b)
1376
1377 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001378 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001379
1380 def test_join(self):
1381 # Make sure join returns a NEW object for single item sequences
1382 # involving a subclass.
1383 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001384 s1 = self.subclass2test(b"abcd")
1385 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001386 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001387 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001388
1389 # Test reverse, calling join on subclass
1390 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001391 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001392
1393 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001394 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001395 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001396 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001397 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001398 b = pickle.loads(pickle.dumps(a, proto))
1399 self.assertNotEqual(id(a), id(b))
1400 self.assertEqual(a, b)
1401 self.assertEqual(a.x, b.x)
1402 self.assertEqual(a.y, b.y)
1403 self.assertEqual(type(a), type(b))
1404 self.assertEqual(type(a.y), type(b.y))
1405
1406 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001407 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001408 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001409 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001410 for copy_method in (copy.copy, copy.deepcopy):
1411 b = copy_method(a)
1412 self.assertNotEqual(id(a), id(b))
1413 self.assertEqual(a, b)
1414 self.assertEqual(a.x, b.x)
1415 self.assertEqual(a.y, b.y)
1416 self.assertEqual(type(a), type(b))
1417 self.assertEqual(type(a.y), type(b.y))
1418
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001419
1420class ByteArraySubclass(bytearray):
1421 pass
1422
1423class BytesSubclass(bytes):
1424 pass
1425
Ezio Melotti0dceb562013-01-10 07:43:26 +02001426class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001427 type2test = bytearray
1428 subclass2test = ByteArraySubclass
1429
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001430 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001431 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001432 def __init__(me, newarg=1, *args, **kwargs):
1433 bytearray.__init__(me, *args, **kwargs)
1434 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001435 x = subclass(4, source=b"abcd")
1436 self.assertEqual(x, b"abcd")
1437 x = subclass(newarg=4, source=b"abcd")
1438 self.assertEqual(x, b"abcd")
1439
1440
Ezio Melotti0dceb562013-01-10 07:43:26 +02001441class BytesSubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001442 type2test = bytes
1443 subclass2test = BytesSubclass
1444
1445
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001446if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001447 unittest.main()