blob: b9c5b628c4eb8ed2baa6e9f56a60bdf2ce7de10a [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
Martin Panter152a19c2016-04-06 06:37:17 +00003XXX This is a mess. Common tests should be unified with string_tests.py (and
4the latter should be modernized).
Guido van Rossum98297ee2007-11-06 21:34:58 +00005"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00006
INADA Naokia634e232017-01-06 17:32:01 +09007import array
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
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030019import test.list_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
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030072 def test_from_iterable(self):
73 b = self.type2test(range(256))
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertEqual(len(b), 256)
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030075 self.assertEqual(list(b), list(range(256)))
76
77 # Non-sequence iterable.
78 b = self.type2test({42})
79 self.assertEqual(b, b"*")
80 b = self.type2test({43, 45})
81 self.assertIn(tuple(b), {(43, 45), (45, 43)})
82
83 # Iterator that has a __length_hint__.
84 b = self.type2test(iter(range(256)))
85 self.assertEqual(len(b), 256)
86 self.assertEqual(list(b), list(range(256)))
87
88 # Iterator that doesn't have a __length_hint__.
89 b = self.type2test(i for i in range(256) if i % 2)
90 self.assertEqual(len(b), 128)
91 self.assertEqual(list(b), list(range(256))[1::2])
92
93 # Sequence without __iter__.
94 class S:
95 def __getitem__(self, i):
96 return (1, 2, 3)[i]
97 b = self.type2test(S())
98 self.assertEqual(b, b"\x01\x02\x03")
99
100 def test_from_tuple(self):
101 # There is a special case for tuples.
102 b = self.type2test(tuple(range(256)))
103 self.assertEqual(len(b), 256)
104 self.assertEqual(list(b), list(range(256)))
105 b = self.type2test((1, 2, 3))
106 self.assertEqual(b, b"\x01\x02\x03")
107
108 def test_from_list(self):
109 # There is a special case for lists.
110 b = self.type2test(list(range(256)))
111 self.assertEqual(len(b), 256)
112 self.assertEqual(list(b), list(range(256)))
113 b = self.type2test([1, 2, 3])
114 self.assertEqual(b, b"\x01\x02\x03")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000115
116 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000117 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
118 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000119 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000120 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
121 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000122
INADA Naokia634e232017-01-06 17:32:01 +0900123 def test_from_buffer(self):
124 a = self.type2test(array.array('B', [1, 2, 3]))
125 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300126 a = self.type2test(b"\x01\x02\x03")
127 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900128
Serhiy Storchakae8904212018-10-15 00:02:57 +0300129 # Issues #29159 and #34974.
130 # Fallback when __index__ raises a TypeError
INADA Naokia634e232017-01-06 17:32:01 +0900131 class B(bytes):
132 def __index__(self):
133 raise TypeError
134
135 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
136
Guido van Rossum98297ee2007-11-06 21:34:58 +0000137 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000138 self.assertEqual(self.type2test(0), b'')
139 self.assertEqual(self.type2test(1), b'\x00')
140 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
141 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000142
Benjamin Peterson4c045832010-04-16 22:35:32 +0000143 self.assertEqual(self.type2test('0', 'ascii'), b'0')
144 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000145 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000146
147 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000148 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000149 class C:
150 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000151 self.assertRaises(TypeError, self.type2test, ["0"])
152 self.assertRaises(TypeError, self.type2test, [0.0])
153 self.assertRaises(TypeError, self.type2test, [None])
154 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200155 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
156 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
157 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
158 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
159 self.assertRaises(TypeError, self.type2test, '')
160 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
161 self.assertRaises(TypeError, self.type2test, '', b'ascii')
162 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000163
164 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000165 self.assertRaises(ValueError, self.type2test, [-1])
166 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
167 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
168 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
169 self.assertRaises(ValueError, self.type2test, [-10**100])
170 self.assertRaises(ValueError, self.type2test, [256])
171 self.assertRaises(ValueError, self.type2test, [257])
172 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
173 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
174 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000175
Antoine Pitroucc231542014-11-02 18:40:09 +0100176 @bigaddrspacetest
177 def test_constructor_overflow(self):
178 size = MAX_Py_ssize_t
179 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
180 try:
181 # Should either pass or raise an error (e.g. on debug builds with
182 # additional malloc() overhead), but shouldn't crash.
183 bytearray(size - 4)
184 except (OverflowError, MemoryError):
185 pass
186
Serhiy Storchakae8904212018-10-15 00:02:57 +0300187 def test_constructor_exceptions(self):
188 # Issue #34974: bytes and bytearray constructors replace unexpected
189 # exceptions.
190 class BadInt:
191 def __index__(self):
192 1/0
193 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
194 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
195
196 class BadIterable:
197 def __iter__(self):
198 1/0
199 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
200
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000201 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000202 b1 = self.type2test([1, 2, 3])
203 b2 = self.type2test([1, 2, 3])
204 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000205
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000206 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000207 self.assertTrue(b2 != b3)
208 self.assertTrue(b1 <= b2)
209 self.assertTrue(b1 <= b3)
210 self.assertTrue(b1 < b3)
211 self.assertTrue(b1 >= b2)
212 self.assertTrue(b3 >= b2)
213 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000214
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000215 self.assertFalse(b1 != b2)
216 self.assertFalse(b2 == b3)
217 self.assertFalse(b1 > b2)
218 self.assertFalse(b1 > b3)
219 self.assertFalse(b1 >= b3)
220 self.assertFalse(b1 < b2)
221 self.assertFalse(b3 < b2)
222 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000223
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000224 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000225 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000226 # Byte comparisons with unicode should always fail!
227 # Test this for all expected byte orders and Unicode character
228 # sizes.
229 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
230 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
231 False)
232 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
233 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
234 False)
235 self.assertEqual(self.type2test() == str(), False)
236 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000237
238 def test_reversed(self):
239 input = list(map(ord, "Hello"))
240 b = self.type2test(input)
241 output = list(reversed(b))
242 input.reverse()
243 self.assertEqual(output, input)
244
245 def test_getslice(self):
246 def by(s):
247 return self.type2test(map(ord, s))
248 b = by("Hello, world")
249
250 self.assertEqual(b[:5], by("Hello"))
251 self.assertEqual(b[1:5], by("ello"))
252 self.assertEqual(b[5:7], by(", "))
253 self.assertEqual(b[7:], by("world"))
254 self.assertEqual(b[7:12], by("world"))
255 self.assertEqual(b[7:100], by("world"))
256
257 self.assertEqual(b[:-7], by("Hello"))
258 self.assertEqual(b[-11:-7], by("ello"))
259 self.assertEqual(b[-7:-5], by(", "))
260 self.assertEqual(b[-5:], by("world"))
261 self.assertEqual(b[-5:12], by("world"))
262 self.assertEqual(b[-5:100], by("world"))
263 self.assertEqual(b[-100:5], by("Hello"))
264
265 def test_extended_getslice(self):
266 # Test extended slicing by comparing with list slicing.
267 L = list(range(255))
268 b = self.type2test(L)
269 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
270 for start in indices:
271 for stop in indices:
272 # Skip step 0 (invalid)
273 for step in indices[1:]:
274 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
275
276 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000277 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000278 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000279 b = self.type2test(sample, enc)
280 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000281 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
282 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000283 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000284
285 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300286 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000287 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000288 b = self.type2test(sample, enc)
289 self.assertEqual(b.decode(enc), sample)
290 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000291 b = self.type2test(sample, "latin-1")
292 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
293 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
294 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000295 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000296 # Default encoding is utf-8
297 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000298
299 def test_from_int(self):
300 b = self.type2test(0)
301 self.assertEqual(b, self.type2test())
302 b = self.type2test(10)
303 self.assertEqual(b, self.type2test([0]*10))
304 b = self.type2test(10000)
305 self.assertEqual(b, self.type2test([0]*10000))
306
307 def test_concat(self):
308 b1 = self.type2test(b"abc")
309 b2 = self.type2test(b"def")
310 self.assertEqual(b1 + b2, b"abcdef")
311 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
312 self.assertEqual(bytes(b"def") + b1, b"defabc")
313 self.assertRaises(TypeError, lambda: b1 + "def")
314 self.assertRaises(TypeError, lambda: "abc" + b2)
315
316 def test_repeat(self):
317 for b in b"abc", self.type2test(b"abc"):
318 self.assertEqual(b * 3, b"abcabcabc")
319 self.assertEqual(b * 0, b"")
320 self.assertEqual(b * -1, b"")
321 self.assertRaises(TypeError, lambda: b * 3.14)
322 self.assertRaises(TypeError, lambda: 3.14 * b)
323 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000324 with self.assertRaises((OverflowError, MemoryError)):
325 c = b * sys.maxsize
326 with self.assertRaises((OverflowError, MemoryError)):
327 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000328
329 def test_repeat_1char(self):
330 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
331
332 def test_contains(self):
333 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000334 self.assertIn(ord('a'), b)
335 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000336 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000337 self.assertRaises(ValueError, lambda: 300 in b)
338 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300339 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000340 self.assertRaises(TypeError, lambda: None in b)
341 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
342 self.assertRaises(TypeError, lambda: "a" in b)
343 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000344 self.assertIn(f(b""), b)
345 self.assertIn(f(b"a"), b)
346 self.assertIn(f(b"b"), b)
347 self.assertIn(f(b"c"), b)
348 self.assertIn(f(b"ab"), b)
349 self.assertIn(f(b"bc"), b)
350 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000351 self.assertNotIn(f(b"ac"), b)
352 self.assertNotIn(f(b"d"), b)
353 self.assertNotIn(f(b"dab"), b)
354 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000355
356 def test_fromhex(self):
357 self.assertRaises(TypeError, self.type2test.fromhex)
358 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000359 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000360 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000361 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
362 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200363
364 # check that ASCII whitespace is ignored
365 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
366 for c in "\x09\x0A\x0B\x0C\x0D\x20":
367 self.assertEqual(self.type2test.fromhex(c), self.type2test())
368 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
369 self.assertRaises(ValueError, self.type2test.fromhex, c)
370
Ezio Melottib3aedd42010-11-20 19:04:17 +0000371 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000372 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
373 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
374 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
375 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
376 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
377 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
378
Victor Stinner2bf89932015-10-14 11:25:33 +0200379 for data, pos in (
380 # invalid first hexadecimal character
381 ('12 x4 56', 3),
382 # invalid second hexadecimal character
383 ('12 3x 56', 4),
384 # two invalid hexadecimal characters
385 ('12 xy 56', 3),
386 # test non-ASCII string
387 ('12 3\xff 56', 4),
388 ):
389 with self.assertRaises(ValueError) as cm:
390 self.type2test.fromhex(data)
391 self.assertIn('at position %s' % pos, str(cm.exception))
392
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000393 def test_hex(self):
394 self.assertRaises(TypeError, self.type2test.hex)
395 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000396 self.assertEqual(self.type2test(b"").hex(), "")
397 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
398 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
399 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000400
Christian Heimes510711d2008-01-30 11:57:58 +0000401 def test_join(self):
402 self.assertEqual(self.type2test(b"").join([]), b"")
403 self.assertEqual(self.type2test(b"").join([b""]), b"")
404 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
405 lst = list(map(self.type2test, lst))
406 self.assertEqual(self.type2test(b"").join(lst), b"abc")
407 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
408 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200409 dot_join = self.type2test(b".:").join
410 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
411 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
412 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
413 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
414 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
415 # Stress it with many items
416 seq = [b"abc"] * 1000
417 expected = b"abc" + b".:abc" * 999
418 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400419 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200420 # Error handling and cleanup when some item in the middle of the
421 # sequence has the wrong type.
422 with self.assertRaises(TypeError):
423 dot_join([bytearray(b"ab"), "cd", b"ef"])
424 with self.assertRaises(TypeError):
425 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000426
Christian Heimes510711d2008-01-30 11:57:58 +0000427 def test_count(self):
428 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200429 i = 105
430 p = 112
431 w = 119
432
Christian Heimes510711d2008-01-30 11:57:58 +0000433 self.assertEqual(b.count(b'i'), 4)
434 self.assertEqual(b.count(b'ss'), 2)
435 self.assertEqual(b.count(b'w'), 0)
436
Antoine Pitrouac65d962011-10-20 23:54:17 +0200437 self.assertEqual(b.count(i), 4)
438 self.assertEqual(b.count(w), 0)
439
440 self.assertEqual(b.count(b'i', 6), 2)
441 self.assertEqual(b.count(b'p', 6), 2)
442 self.assertEqual(b.count(b'i', 1, 3), 1)
443 self.assertEqual(b.count(b'p', 7, 9), 1)
444
445 self.assertEqual(b.count(i, 6), 2)
446 self.assertEqual(b.count(p, 6), 2)
447 self.assertEqual(b.count(i, 1, 3), 1)
448 self.assertEqual(b.count(p, 7, 9), 1)
449
Christian Heimes510711d2008-01-30 11:57:58 +0000450 def test_startswith(self):
451 b = self.type2test(b'hello')
452 self.assertFalse(self.type2test().startswith(b"anything"))
453 self.assertTrue(b.startswith(b"hello"))
454 self.assertTrue(b.startswith(b"hel"))
455 self.assertTrue(b.startswith(b"h"))
456 self.assertFalse(b.startswith(b"hellow"))
457 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300458 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300459 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300460 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300461 self.assertIn('bytes', exc)
462 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000463
464 def test_endswith(self):
465 b = self.type2test(b'hello')
466 self.assertFalse(bytearray().endswith(b"anything"))
467 self.assertTrue(b.endswith(b"hello"))
468 self.assertTrue(b.endswith(b"llo"))
469 self.assertTrue(b.endswith(b"o"))
470 self.assertFalse(b.endswith(b"whello"))
471 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300472 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300473 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300474 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300475 self.assertIn('bytes', exc)
476 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000477
478 def test_find(self):
479 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200480 i = 105
481 w = 119
482
Christian Heimes510711d2008-01-30 11:57:58 +0000483 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000484 self.assertEqual(b.find(b'w'), -1)
485 self.assertEqual(b.find(b'mississippian'), -1)
486
Antoine Pitrouac65d962011-10-20 23:54:17 +0200487 self.assertEqual(b.find(i), 1)
488 self.assertEqual(b.find(w), -1)
489
490 self.assertEqual(b.find(b'ss', 3), 5)
491 self.assertEqual(b.find(b'ss', 1, 7), 2)
492 self.assertEqual(b.find(b'ss', 1, 3), -1)
493
494 self.assertEqual(b.find(i, 6), 7)
495 self.assertEqual(b.find(i, 1, 3), 1)
496 self.assertEqual(b.find(w, 1, 3), -1)
497
Victor Stinnerf8eac002011-12-18 01:17:41 +0100498 for index in (-1, 256, sys.maxsize + 1):
499 self.assertRaisesRegex(
500 ValueError, r'byte must be in range\(0, 256\)',
501 b.find, index)
502
Christian Heimes510711d2008-01-30 11:57:58 +0000503 def test_rfind(self):
504 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200505 i = 105
506 w = 119
507
Christian Heimes510711d2008-01-30 11:57:58 +0000508 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000509 self.assertEqual(b.rfind(b'w'), -1)
510 self.assertEqual(b.rfind(b'mississippian'), -1)
511
Antoine Pitrouac65d962011-10-20 23:54:17 +0200512 self.assertEqual(b.rfind(i), 10)
513 self.assertEqual(b.rfind(w), -1)
514
515 self.assertEqual(b.rfind(b'ss', 3), 5)
516 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
517
518 self.assertEqual(b.rfind(i, 1, 3), 1)
519 self.assertEqual(b.rfind(i, 3, 9), 7)
520 self.assertEqual(b.rfind(w, 1, 3), -1)
521
Christian Heimes510711d2008-01-30 11:57:58 +0000522 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200523 b = self.type2test(b'mississippi')
524 i = 105
525 w = 119
526
527 self.assertEqual(b.index(b'ss'), 2)
528 self.assertRaises(ValueError, b.index, b'w')
529 self.assertRaises(ValueError, b.index, b'mississippian')
530
531 self.assertEqual(b.index(i), 1)
532 self.assertRaises(ValueError, b.index, w)
533
534 self.assertEqual(b.index(b'ss', 3), 5)
535 self.assertEqual(b.index(b'ss', 1, 7), 2)
536 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
537
538 self.assertEqual(b.index(i, 6), 7)
539 self.assertEqual(b.index(i, 1, 3), 1)
540 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000541
542 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200543 b = self.type2test(b'mississippi')
544 i = 105
545 w = 119
546
547 self.assertEqual(b.rindex(b'ss'), 5)
548 self.assertRaises(ValueError, b.rindex, b'w')
549 self.assertRaises(ValueError, b.rindex, b'mississippian')
550
551 self.assertEqual(b.rindex(i), 10)
552 self.assertRaises(ValueError, b.rindex, w)
553
554 self.assertEqual(b.rindex(b'ss', 3), 5)
555 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
556
557 self.assertEqual(b.rindex(i, 1, 3), 1)
558 self.assertEqual(b.rindex(i, 3, 9), 7)
559 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000560
Ethan Furmanb95b5612015-01-23 20:05:18 -0800561 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300562 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800563 orig = b
564 b = b % b'world'
565 self.assertEqual(b, b'hello, world!')
566 self.assertEqual(orig, b'hello, %b!')
567 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300568 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800569 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200570 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200571 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800572 # issue 29714
573 b = self.type2test(b'hello,\x00%b!')
574 b = b % b'world'
575 self.assertEqual(b, b'hello,\x00world!')
576 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800577
578 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300579 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800580 orig = b
581 b %= b'world'
582 self.assertEqual(b, b'hello, world!')
583 self.assertEqual(orig, b'hello, %b!')
584 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300585 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800586 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200587 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200588 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800589 # issue 29714
590 b = self.type2test(b'hello,\x00%b!')
591 b %= b'world'
592 self.assertEqual(b, b'hello,\x00world!')
593 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300594
595 def test_rmod(self):
596 with self.assertRaises(TypeError):
597 object() % self.type2test(b'abc')
598 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800599
Christian Heimes510711d2008-01-30 11:57:58 +0000600 def test_replace(self):
601 b = self.type2test(b'mississippi')
602 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
603 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
604
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300605 def test_replace_int_error(self):
606 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
607
Christian Heimes510711d2008-01-30 11:57:58 +0000608 def test_split_string_error(self):
609 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300610 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
611
612 def test_split_int_error(self):
613 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
614 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000615
Antoine Pitrouf8453022010-01-12 22:05:42 +0000616 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000617 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
618 b = self.type2test(b)
619 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000620 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
621 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
622
Christian Heimes510711d2008-01-30 11:57:58 +0000623 def test_rsplit_unicodewhitespace(self):
624 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000625 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
626
627 def test_partition(self):
628 b = self.type2test(b'mississippi')
629 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000630 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000631
632 def test_rpartition(self):
633 b = self.type2test(b'mississippi')
634 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
635 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000636 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000637
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300638 def test_partition_string_error(self):
639 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
640 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
641
642 def test_partition_int_error(self):
643 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
644 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
645
Christian Heimes510711d2008-01-30 11:57:58 +0000646 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000647 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000648 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
649 b = self.type2test(b)
650 ps = pickle.dumps(b, proto)
651 q = pickle.loads(ps)
652 self.assertEqual(b, q)
653
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000654 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200655 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
656 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
657 it = itorg = iter(self.type2test(b))
658 data = list(self.type2test(b))
659 d = pickle.dumps(it, proto)
660 it = pickle.loads(d)
661 self.assertEqual(type(itorg), type(it))
662 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000663
Serhiy Storchakabad12572014-12-15 14:03:42 +0200664 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200665 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200666 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200667 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200668 d = pickle.dumps(it, proto)
669 it = pickle.loads(d)
670 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000671
Christian Heimes510711d2008-01-30 11:57:58 +0000672 def test_strip_bytearray(self):
673 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
674 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
675 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
676
677 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300678 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
679 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
680 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
681
682 def test_strip_int_error(self):
683 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
684 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
685 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000686
Eli Bendersky906b88f2011-07-29 07:05:08 +0300687 def test_center(self):
688 # Fill character can be either bytes or bytearray (issue 12380)
689 b = self.type2test(b'abc')
690 for fill_type in (bytes, bytearray):
691 self.assertEqual(b.center(7, fill_type(b'-')),
692 self.type2test(b'--abc--'))
693
694 def test_ljust(self):
695 # Fill character can be either bytes or bytearray (issue 12380)
696 b = self.type2test(b'abc')
697 for fill_type in (bytes, bytearray):
698 self.assertEqual(b.ljust(7, fill_type(b'-')),
699 self.type2test(b'abc----'))
700
701 def test_rjust(self):
702 # Fill character can be either bytes or bytearray (issue 12380)
703 b = self.type2test(b'abc')
704 for fill_type in (bytes, bytearray):
705 self.assertEqual(b.rjust(7, fill_type(b'-')),
706 self.type2test(b'----abc'))
707
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300708 def test_xjust_int_error(self):
709 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
710 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
711 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
712
Christian Heimes510711d2008-01-30 11:57:58 +0000713 def test_ord(self):
714 b = self.type2test(b'\0A\x7f\x80\xff')
715 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
716 [0, 65, 127, 128, 255])
717
Georg Brandlabc38772009-04-12 15:51:51 +0000718 def test_maketrans(self):
719 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 +0000720 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000721 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'
722 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000723 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
724 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
725
Jesus Ceaac451502011-04-20 17:09:23 +0200726 def test_none_arguments(self):
727 # issue 11828
728 b = self.type2test(b'hello')
729 l = self.type2test(b'l')
730 h = self.type2test(b'h')
731 x = self.type2test(b'x')
732 o = self.type2test(b'o')
733
734 self.assertEqual(2, b.find(l, None))
735 self.assertEqual(3, b.find(l, -2, None))
736 self.assertEqual(2, b.find(l, None, -2))
737 self.assertEqual(0, b.find(h, None, None))
738
739 self.assertEqual(3, b.rfind(l, None))
740 self.assertEqual(3, b.rfind(l, -2, None))
741 self.assertEqual(2, b.rfind(l, None, -2))
742 self.assertEqual(0, b.rfind(h, None, None))
743
744 self.assertEqual(2, b.index(l, None))
745 self.assertEqual(3, b.index(l, -2, None))
746 self.assertEqual(2, b.index(l, None, -2))
747 self.assertEqual(0, b.index(h, None, None))
748
749 self.assertEqual(3, b.rindex(l, None))
750 self.assertEqual(3, b.rindex(l, -2, None))
751 self.assertEqual(2, b.rindex(l, None, -2))
752 self.assertEqual(0, b.rindex(h, None, None))
753
754 self.assertEqual(2, b.count(l, None))
755 self.assertEqual(1, b.count(l, -2, None))
756 self.assertEqual(1, b.count(l, None, -2))
757 self.assertEqual(0, b.count(x, None, None))
758
759 self.assertEqual(True, b.endswith(o, None))
760 self.assertEqual(True, b.endswith(o, -2, None))
761 self.assertEqual(True, b.endswith(l, None, -2))
762 self.assertEqual(False, b.endswith(x, None, None))
763
764 self.assertEqual(True, b.startswith(h, None))
765 self.assertEqual(True, b.startswith(l, -2, None))
766 self.assertEqual(True, b.startswith(h, None, -2))
767 self.assertEqual(False, b.startswith(x, None, None))
768
Antoine Pitrouac65d962011-10-20 23:54:17 +0200769 def test_integer_arguments_out_of_byte_range(self):
770 b = self.type2test(b'hello')
771
772 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
773 self.assertRaises(ValueError, method, -1)
774 self.assertRaises(ValueError, method, 256)
775 self.assertRaises(ValueError, method, 9999)
776
Jesus Ceaac451502011-04-20 17:09:23 +0200777 def test_find_etc_raise_correct_error_messages(self):
778 # issue 11828
779 b = self.type2test(b'hello')
780 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300781 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200782 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300783 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200784 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300785 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200786 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300787 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200788 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300789 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200790 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300791 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200792 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300793 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200794 x, None, None, None)
795
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300796 def test_free_after_iterating(self):
797 test.support.check_free_after_iterating(self, iter, self.type2test)
798 test.support.check_free_after_iterating(self, reversed, self.type2test)
799
Martin Panter1b6c6da2016-08-27 08:35:02 +0000800 def test_translate(self):
801 b = self.type2test(b'hello')
802 rosetta = bytearray(range(256))
803 rosetta[ord('o')] = ord('e')
804
805 self.assertRaises(TypeError, b.translate)
806 self.assertRaises(TypeError, b.translate, None, None)
807 self.assertRaises(ValueError, b.translate, bytes(range(255)))
808
809 c = b.translate(rosetta, b'hello')
810 self.assertEqual(b, b'hello')
811 self.assertIsInstance(c, self.type2test)
812
813 c = b.translate(rosetta)
814 d = b.translate(rosetta, b'')
815 self.assertEqual(c, d)
816 self.assertEqual(c, b'helle')
817
818 c = b.translate(rosetta, b'l')
819 self.assertEqual(c, b'hee')
820 c = b.translate(None, b'e')
821 self.assertEqual(c, b'hllo')
822
823 # test delete as a keyword argument
824 c = b.translate(rosetta, delete=b'')
825 self.assertEqual(c, b'helle')
826 c = b.translate(rosetta, delete=b'l')
827 self.assertEqual(c, b'hee')
828 c = b.translate(None, delete=b'e')
829 self.assertEqual(c, b'hllo')
830
Christian Heimes510711d2008-01-30 11:57:58 +0000831
Ezio Melotti0dceb562013-01-10 07:43:26 +0200832class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000833 type2test = bytes
834
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400835 def test_getitem_error(self):
836 msg = "byte indices must be integers or slices"
837 with self.assertRaisesRegex(TypeError, msg):
838 b'python'['a']
839
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000840 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200841 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000842 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000843 self.assertRaises(TypeError, f.readinto, b"")
844
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000845 def test_custom(self):
846 class A:
847 def __bytes__(self):
848 return b'abc'
849 self.assertEqual(bytes(A()), b'abc')
850 class A: pass
851 self.assertRaises(TypeError, bytes, A())
852 class A:
853 def __bytes__(self):
854 return None
855 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600856 class A:
857 def __bytes__(self):
858 return b'a'
859 def __index__(self):
860 return 42
861 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200862 # Issue #25766
863 class A(str):
864 def __bytes__(self):
865 return b'abc'
866 self.assertEqual(bytes(A('\u20ac')), b'abc')
867 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200868 # Issue #24731
869 class A:
870 def __bytes__(self):
871 return OtherBytesSubclass(b'abc')
872 self.assertEqual(bytes(A()), b'abc')
873 self.assertIs(type(bytes(A())), OtherBytesSubclass)
874 self.assertEqual(BytesSubclass(A()), b'abc')
875 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000876
Victor Stinner29e762c2011-01-05 03:33:28 +0000877 # Test PyBytes_FromFormat()
878 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200879 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200880 _testcapi = test.support.import_module('_testcapi')
881 from ctypes import pythonapi, py_object
882 from ctypes import (
883 c_int, c_uint,
884 c_long, c_ulong,
885 c_size_t, c_ssize_t,
886 c_char_p)
887
Victor Stinner29e762c2011-01-05 03:33:28 +0000888 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
889 PyBytes_FromFormat.restype = py_object
890
Victor Stinner03dab782015-10-14 00:21:35 +0200891 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000892 self.assertEqual(PyBytes_FromFormat(b'format'),
893 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200894 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
895 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000896
Victor Stinner03dab782015-10-14 00:21:35 +0200897 # test formatters
898 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
899 b'c=\0')
900 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
901 b'c=@')
902 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
903 b'c=\xff')
904 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
905 c_int(1), c_long(2),
906 c_size_t(3)),
907 b'd=1 ld=2 zd=3')
908 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
909 c_int(-1), c_long(-2),
910 c_size_t(-3)),
911 b'd=-1 ld=-2 zd=-3')
912 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
913 c_uint(123), c_ulong(456),
914 c_size_t(789)),
915 b'u=123 lu=456 zu=789')
916 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
917 b'i=123')
918 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
919 b'i=-123')
920 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
921 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200922
923 sizeof_ptr = ctypes.sizeof(c_char_p)
924
925 if os.name == 'nt':
926 # Windows (MSCRT)
927 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
928 def ptr_formatter(ptr):
929 return (ptr_format % ptr)
930 else:
931 # UNIX (glibc)
932 def ptr_formatter(ptr):
933 return '%#x' % ptr
934
Victor Stinner7ab986d2015-10-14 02:55:12 +0200935 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200936 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
937 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200938 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
939 b's=cstr')
940
941 # test minimum and maximum integer values
942 size_max = c_size_t(-1).value
943 for formatstr, ctypes_type, value, py_formatter in (
944 (b'%d', c_int, _testcapi.INT_MIN, str),
945 (b'%d', c_int, _testcapi.INT_MAX, str),
946 (b'%ld', c_long, _testcapi.LONG_MIN, str),
947 (b'%ld', c_long, _testcapi.LONG_MAX, str),
948 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
949 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
950 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
951 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200952 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200953 ):
954 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
955 py_formatter(value).encode('ascii')),
956
957 # width and precision (width is currently ignored)
958 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
959 b'a')
960 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
961 b'abc')
962
963 # '%%' formatter
964 self.assertEqual(PyBytes_FromFormat(b'%%'),
965 b'%')
966 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
967 b'[%]')
968 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
969 b'%_')
970 self.assertEqual(PyBytes_FromFormat(b'%%s'),
971 b'%s')
972
973 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000974 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200975 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
976 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000977
Victor Stinner03dab782015-10-14 00:21:35 +0200978 # Issue #19969: %c must raise OverflowError for values
979 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100980 self.assertRaises(OverflowError,
981 PyBytes_FromFormat, b'%c', c_int(-1))
982 self.assertRaises(OverflowError,
983 PyBytes_FromFormat, b'%c', c_int(256))
984
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700985 def test_bytes_blocking(self):
986 class IterationBlocked(list):
987 __bytes__ = None
988 i = [0, 1, 2, 3]
989 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
990 self.assertRaises(TypeError, bytes, IterationBlocked(i))
991
992 # At least in CPython, because bytes.__new__ and the C API
993 # PyBytes_FromObject have different fallback rules, integer
994 # fallback is handled specially, so test separately.
995 class IntBlocked(int):
996 __bytes__ = None
997 self.assertEqual(bytes(3), b'\0\0\0')
998 self.assertRaises(TypeError, bytes, IntBlocked(3))
999
1000 # While there is no separately-defined rule for handling bytes
1001 # subclasses differently from other buffer-interface classes,
1002 # an implementation may well special-case them (as CPython 2.x
1003 # str did), so test them separately.
1004 class BytesSubclassBlocked(bytes):
1005 __bytes__ = None
1006 self.assertEqual(bytes(b'ab'), b'ab')
1007 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1008
1009 class BufferBlocked(bytearray):
1010 __bytes__ = None
1011 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1012 self.assertEqual(bytes(ba), b'ab')
1013 self.assertRaises(TypeError, bytes, bb)
1014
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001015
Ezio Melotti0dceb562013-01-10 07:43:26 +02001016class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001017 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001018
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001019 def test_getitem_error(self):
1020 msg = "bytearray indices must be integers or slices"
1021 with self.assertRaisesRegex(TypeError, msg):
1022 bytearray(b'python')['a']
1023
1024 def test_setitem_error(self):
1025 msg = "bytearray indices must be integers or slices"
1026 with self.assertRaisesRegex(TypeError, msg):
1027 b = bytearray(b'python')
1028 b['a'] = "python"
1029
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001030 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001031 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001032
Guido van Rossum254348e2007-11-21 19:29:53 +00001033 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001034 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001035 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001036 tfn = tempfile.mktemp()
1037 try:
1038 # Prepare
1039 with open(tfn, "wb") as f:
1040 f.write(short_sample)
1041 # Test readinto
1042 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001043 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001044 n = f.readinto(b)
1045 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001046 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001047 # Test writing in binary mode
1048 with open(tfn, "wb") as f:
1049 f.write(b)
1050 with open(tfn, "rb") as f:
1051 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001052 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001053 finally:
1054 try:
1055 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001056 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001057 pass
1058
Neal Norwitz6968b052007-02-27 19:02:19 +00001059 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001060 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001061 self.assertEqual(b.reverse(), None)
1062 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001063 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001064 b.reverse()
1065 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001066 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001067 b.reverse()
1068 self.assertFalse(b)
1069
Eli Bendersky4db28d32011-03-03 18:21:02 +00001070 def test_clear(self):
1071 b = bytearray(b'python')
1072 b.clear()
1073 self.assertEqual(b, b'')
1074
1075 b = bytearray(b'')
1076 b.clear()
1077 self.assertEqual(b, b'')
1078
1079 b = bytearray(b'')
1080 b.append(ord('r'))
1081 b.clear()
1082 b.append(ord('p'))
1083 self.assertEqual(b, b'p')
1084
1085 def test_copy(self):
1086 b = bytearray(b'abc')
1087 bb = b.copy()
1088 self.assertEqual(bb, b'abc')
1089
1090 b = bytearray(b'')
1091 bb = b.copy()
1092 self.assertEqual(bb, b'')
1093
1094 # test that it's indeed a copy and not a reference
1095 b = bytearray(b'abc')
1096 bb = b.copy()
1097 self.assertEqual(b, bb)
1098 self.assertIsNot(b, bb)
1099 bb.append(ord('d'))
1100 self.assertEqual(bb, b'abcd')
1101 self.assertEqual(b, b'abc')
1102
Guido van Rossumd624f182006-04-24 13:47:05 +00001103 def test_regexps(self):
1104 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001105 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001106 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001107 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001108
1109 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001110 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001111 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001112 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001113 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001114 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001115 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001116 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001117 try:
1118 b[3] = 0
1119 self.fail("Didn't raise IndexError")
1120 except IndexError:
1121 pass
1122 try:
1123 b[-10] = 0
1124 self.fail("Didn't raise IndexError")
1125 except IndexError:
1126 pass
1127 try:
1128 b[0] = 256
1129 self.fail("Didn't raise ValueError")
1130 except ValueError:
1131 pass
1132 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001133 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001134 self.fail("Didn't raise ValueError")
1135 except ValueError:
1136 pass
1137 try:
1138 b[0] = None
1139 self.fail("Didn't raise TypeError")
1140 except TypeError:
1141 pass
1142
1143 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001144 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001145 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001146 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001147 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001148 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001149 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001150 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001151
1152 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001153 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001154 self.assertEqual(list(b), list(range(10)))
1155
Guido van Rossum254348e2007-11-21 19:29:53 +00001156 b[0:5] = bytearray([1, 1, 1, 1, 1])
1157 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001158
1159 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001160 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001161
Guido van Rossum254348e2007-11-21 19:29:53 +00001162 b[0:0] = bytearray([0, 1, 2, 3, 4])
1163 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001164
Guido van Rossum254348e2007-11-21 19:29:53 +00001165 b[-7:-3] = bytearray([100, 101])
1166 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001167
1168 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001170
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001171 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001172 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 +00001173
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001174 b[3:] = b'foo'
1175 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1176
1177 b[:3] = memoryview(b'foo')
1178 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1179
1180 b[3:4] = []
1181 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1182
1183 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1184 ['a', 'b'], [b'a', b'b'], [[]]]:
1185 with self.assertRaises(TypeError):
1186 b[3:4] = elem
1187
1188 for elem in [[254, 255, 256], [-256, 9000]]:
1189 with self.assertRaises(ValueError):
1190 b[3:4] = elem
1191
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001192 def test_setslice_extend(self):
1193 # Exercise the resizing logic (see issue #19087)
1194 b = bytearray(range(100))
1195 self.assertEqual(list(b), list(range(100)))
1196 del b[:10]
1197 self.assertEqual(list(b), list(range(10, 100)))
1198 b.extend(range(100, 110))
1199 self.assertEqual(list(b), list(range(10, 110)))
1200
Antoine Pitrou25454112015-05-19 20:52:27 +02001201 def test_fifo_overrun(self):
1202 # Test for issue #23985, a buffer overrun when implementing a FIFO
1203 # Build Python in pydebug mode for best results.
1204 b = bytearray(10)
1205 b.pop() # Defeat expanding buffer off-by-one quirk
1206 del b[:1] # Advance start pointer without reallocating
1207 b += bytes(2) # Append exactly the number of deleted bytes
1208 del b # Free memory buffer, allowing pydebug verification
1209
1210 def test_del_expand(self):
1211 # Reducing the size should not expand the buffer (issue #23985)
1212 b = bytearray(10)
1213 size = sys.getsizeof(b)
1214 del b[:1]
1215 self.assertLessEqual(sys.getsizeof(b), size)
1216
Thomas Wouters376446d2006-12-19 08:30:14 +00001217 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001218 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001219 for start in indices:
1220 for stop in indices:
1221 # Skip invalid step 0
1222 for step in indices[1:]:
1223 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001224 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001225 # Make sure we have a slice of exactly the right length,
1226 # but with different data.
1227 data = L[start:stop:step]
1228 data.reverse()
1229 L[start:stop:step] = data
1230 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001231 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001232
Thomas Wouters376446d2006-12-19 08:30:14 +00001233 del L[start:stop:step]
1234 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001235 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001236
Guido van Rossumd624f182006-04-24 13:47:05 +00001237 def test_setslice_trap(self):
1238 # This test verifies that we correctly handle assigning self
1239 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001240 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001241 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001242 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001243
Guido van Rossum13e57212006-04-27 22:54:26 +00001244 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001245 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001246 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001247 b += b"def"
1248 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001249 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001250 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001251 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001252 self.assertEqual(b, b"abcdefxyz")
1253 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001254 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001255 except TypeError:
1256 pass
1257 else:
1258 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001259
1260 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001261 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001262 b1 = b
1263 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001264 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001265 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001266 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001267
1268 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001269 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001270 b1 = b
1271 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001272 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001273 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001274 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001275
Guido van Rossum20188312006-05-05 15:15:40 +00001276 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001277 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001278 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001279 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001280 seq = [alloc]
1281 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001282 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001283 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001284 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001285 if alloc not in seq:
1286 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001287
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001288 def test_init_alloc(self):
1289 b = bytearray()
1290 def g():
1291 for i in range(1, 100):
1292 yield i
1293 a = list(b)
1294 self.assertEqual(a, list(range(1, len(a)+1)))
1295 self.assertEqual(len(b), len(a))
1296 self.assertLessEqual(len(b), i)
1297 alloc = b.__alloc__()
1298 self.assertGreater(alloc, len(b)) # including trailing null byte
1299 b.__init__(g())
1300 self.assertEqual(list(b), list(range(1, 100)))
1301 self.assertEqual(len(b), 99)
1302 alloc = b.__alloc__()
1303 self.assertGreater(alloc, len(b))
1304
Neal Norwitz6968b052007-02-27 19:02:19 +00001305 def test_extend(self):
1306 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001307 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001308 a.extend(a)
1309 self.assertEqual(a, orig + orig)
1310 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001311 a = bytearray(b'')
1312 # Test iterators that don't have a __length_hint__
1313 a.extend(map(int, orig * 25))
1314 a.extend(int(x) for x in orig * 25)
1315 self.assertEqual(a, orig * 50)
1316 self.assertEqual(a[-5:], orig)
1317 a = bytearray(b'')
1318 a.extend(iter(map(int, orig * 50)))
1319 self.assertEqual(a, orig * 50)
1320 self.assertEqual(a[-5:], orig)
1321 a = bytearray(b'')
1322 a.extend(list(map(int, orig * 50)))
1323 self.assertEqual(a, orig * 50)
1324 self.assertEqual(a[-5:], orig)
1325 a = bytearray(b'')
1326 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1327 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1328 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001329 a = bytearray(b'')
1330 a.extend([Indexable(ord('a'))])
1331 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001332
Neal Norwitz6968b052007-02-27 19:02:19 +00001333 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001334 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001335 b.remove(ord('l'))
1336 self.assertEqual(b, b'helo')
1337 b.remove(ord('l'))
1338 self.assertEqual(b, b'heo')
1339 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1340 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001341 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001342 # remove first and last
1343 b.remove(ord('o'))
1344 b.remove(ord('h'))
1345 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001346 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001347 b.remove(Indexable(ord('e')))
1348 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001349
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001350 # test values outside of the ascii range: (0, 127)
1351 c = bytearray([126, 127, 128, 129])
1352 c.remove(127)
1353 self.assertEqual(c, bytes([126, 128, 129]))
1354 c.remove(129)
1355 self.assertEqual(c, bytes([126, 128]))
1356
Neal Norwitz6968b052007-02-27 19:02:19 +00001357 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001358 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001359 self.assertEqual(b.pop(), ord('d'))
1360 self.assertEqual(b.pop(0), ord('w'))
1361 self.assertEqual(b.pop(-2), ord('r'))
1362 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001363 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001364 # test for issue #6846
1365 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001366
1367 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001368 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001369
Neal Norwitz6968b052007-02-27 19:02:19 +00001370 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001371 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001372 b.append(ord('o'))
1373 self.assertEqual(b, b'hello')
1374 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001375 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001376 b.append(ord('A'))
1377 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001378 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001379 b = bytearray()
1380 b.append(Indexable(ord('A')))
1381 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001382
1383 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001384 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001385 b.insert(1, ord('i'))
1386 b.insert(4, ord('i'))
1387 b.insert(-2, ord('i'))
1388 b.insert(1000, ord('i'))
1389 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001390 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001391 b = bytearray()
1392 b.insert(0, Indexable(ord('A')))
1393 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001394
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001395 def test_copied(self):
1396 # Issue 4348. Make sure that operations that don't mutate the array
1397 # copy the bytes.
1398 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001399 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001400
1401 t = bytearray([i for i in range(256)])
1402 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001403 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001404
Guido van Rossum254348e2007-11-21 19:29:53 +00001405 def test_partition_bytearray_doesnt_share_nullstring(self):
1406 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001407 self.assertEqual(b, b"")
1408 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001409 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001410 b += b"!"
1411 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001412 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001413 self.assertEqual(b, b"")
1414 self.assertEqual(c, b"")
1415 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001416 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001417 self.assertEqual(b, b"")
1418 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001419 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001420 b += b"!"
1421 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001422 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001423 self.assertEqual(b, b"")
1424 self.assertEqual(c, b"")
1425
Antoine Pitrou5504e892008-12-06 21:27:53 +00001426 def test_resize_forbidden(self):
1427 # #4509: can't resize a bytearray when there are buffer exports, even
1428 # if it wouldn't reallocate the underlying buffer.
1429 # Furthermore, no destructive changes to the buffer may be applied
1430 # before raising the error.
1431 b = bytearray(range(10))
1432 v = memoryview(b)
1433 def resize(n):
1434 b[1:-1] = range(n + 1, 2*n - 1)
1435 resize(10)
1436 orig = b[:]
1437 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001438 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001439 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001440 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001441 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001442 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001443 # Other operations implying resize
1444 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001445 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001446 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001447 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001448 def delitem():
1449 del b[1]
1450 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001451 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001452 # deleting a non-contiguous slice
1453 def delslice():
1454 b[1:-1:2] = b""
1455 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001456 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001457
Stefan Krah650c1e82015-02-03 21:43:23 +01001458 @test.support.cpython_only
1459 def test_obsolete_write_lock(self):
1460 from _testcapi import getbuffer_with_null_view
1461 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001462
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001463 def test_iterator_pickling2(self):
1464 orig = bytearray(b'abc')
1465 data = list(b'qwerty')
1466 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1467 # initial iterator
1468 itorig = iter(orig)
1469 d = pickle.dumps((itorig, orig), proto)
1470 it, b = pickle.loads(d)
1471 b[:] = data
1472 self.assertEqual(type(it), type(itorig))
1473 self.assertEqual(list(it), data)
1474
1475 # running iterator
1476 next(itorig)
1477 d = pickle.dumps((itorig, orig), proto)
1478 it, b = pickle.loads(d)
1479 b[:] = data
1480 self.assertEqual(type(it), type(itorig))
1481 self.assertEqual(list(it), data[1:])
1482
1483 # empty iterator
1484 for i in range(1, len(orig)):
1485 next(itorig)
1486 d = pickle.dumps((itorig, orig), proto)
1487 it, b = pickle.loads(d)
1488 b[:] = data
1489 self.assertEqual(type(it), type(itorig))
1490 self.assertEqual(list(it), data[len(orig):])
1491
1492 # exhausted iterator
1493 self.assertRaises(StopIteration, next, itorig)
1494 d = pickle.dumps((itorig, orig), proto)
1495 it, b = pickle.loads(d)
1496 b[:] = data
1497 self.assertEqual(list(it), [])
1498
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001499 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001500
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001501 def test_iterator_length_hint(self):
1502 # Issue 27443: __length_hint__ can return negative integer
1503 ba = bytearray(b'ab')
1504 it = iter(ba)
1505 next(it)
1506 ba.clear()
1507 # Shouldn't raise an error
1508 self.assertEqual(list(it), [])
1509
1510
Christian Heimes510711d2008-01-30 11:57:58 +00001511class AssortedBytesTest(unittest.TestCase):
1512 #
1513 # Test various combinations of bytes and bytearray
1514 #
1515
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001516 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001517 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001518 for f in str, repr:
1519 self.assertEqual(f(bytearray()), "bytearray(b'')")
1520 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1521 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1522 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1523 self.assertEqual(f(b"abc"), "b'abc'")
1524 self.assertEqual(f(b"'"), '''b"'"''') # '''
1525 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001526
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001527 @check_bytes_warnings
1528 def test_format(self):
1529 for b in b'abc', bytearray(b'abc'):
1530 self.assertEqual(format(b), str(b))
1531 self.assertEqual(format(b, ''), str(b))
1532 with self.assertRaisesRegex(TypeError,
1533 r'\b%s\b' % re.escape(type(b).__name__)):
1534 format(b, 's')
1535
Christian Heimes510711d2008-01-30 11:57:58 +00001536 def test_compare_bytes_to_bytearray(self):
1537 self.assertEqual(b"abc" == bytes(b"abc"), True)
1538 self.assertEqual(b"ab" != bytes(b"abc"), True)
1539 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1540 self.assertEqual(b"ab" < bytes(b"abc"), True)
1541 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1542 self.assertEqual(b"abc" > bytes(b"ab"), True)
1543
1544 self.assertEqual(b"abc" != bytes(b"abc"), False)
1545 self.assertEqual(b"ab" == bytes(b"abc"), False)
1546 self.assertEqual(b"ab" > bytes(b"abc"), False)
1547 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1548 self.assertEqual(b"abc" < bytes(b"ab"), False)
1549 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1550
1551 self.assertEqual(bytes(b"abc") == b"abc", True)
1552 self.assertEqual(bytes(b"ab") != b"abc", True)
1553 self.assertEqual(bytes(b"ab") <= b"abc", True)
1554 self.assertEqual(bytes(b"ab") < b"abc", True)
1555 self.assertEqual(bytes(b"abc") >= b"ab", True)
1556 self.assertEqual(bytes(b"abc") > b"ab", True)
1557
1558 self.assertEqual(bytes(b"abc") != b"abc", False)
1559 self.assertEqual(bytes(b"ab") == b"abc", False)
1560 self.assertEqual(bytes(b"ab") > b"abc", False)
1561 self.assertEqual(bytes(b"ab") >= b"abc", False)
1562 self.assertEqual(bytes(b"abc") < b"ab", False)
1563 self.assertEqual(bytes(b"abc") <= b"ab", False)
1564
Stefan Krah6e572b82013-01-26 13:06:36 +01001565 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001566 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001567 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001568 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001569 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001570 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001571
1572 def test_from_bytearray(self):
1573 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1574 buf = memoryview(sample)
1575 b = bytearray(buf)
1576 self.assertEqual(b, bytearray(sample))
1577
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001578 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001579 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001580 self.assertEqual(str(b''), "b''")
1581 self.assertEqual(str(b'x'), "b'x'")
1582 self.assertEqual(str(b'\x80'), "b'\\x80'")
1583 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1584 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1585 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001586
1587 def test_literal(self):
1588 tests = [
1589 (b"Wonderful spam", "Wonderful spam"),
1590 (br"Wonderful spam too", "Wonderful spam too"),
1591 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1592 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1593 ]
1594 for b, s in tests:
1595 self.assertEqual(b, bytearray(s, 'latin-1'))
1596 for c in range(128, 256):
1597 self.assertRaises(SyntaxError, eval,
1598 'b"%s"' % chr(c))
1599
Christian Heimes510711d2008-01-30 11:57:58 +00001600 def test_split_bytearray(self):
1601 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1602
1603 def test_rsplit_bytearray(self):
1604 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1605
Georg Brandleb2c9642008-05-30 12:05:02 +00001606 def test_return_self(self):
1607 # bytearray.replace must always return a new bytearray
1608 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001609 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001610
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001611 @unittest.skipUnless(sys.flags.bytes_warning,
1612 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001613 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001614 def bytes_warning():
1615 return test.support.check_warnings(('', BytesWarning))
1616 with bytes_warning():
1617 b'' == ''
1618 with bytes_warning():
1619 '' == b''
1620 with bytes_warning():
1621 b'' != ''
1622 with bytes_warning():
1623 '' != b''
1624 with bytes_warning():
1625 bytearray(b'') == ''
1626 with bytes_warning():
1627 '' == bytearray(b'')
1628 with bytes_warning():
1629 bytearray(b'') != ''
1630 with bytes_warning():
1631 '' != bytearray(b'')
1632 with bytes_warning():
1633 b'\0' == 0
1634 with bytes_warning():
1635 0 == b'\0'
1636 with bytes_warning():
1637 b'\0' != 0
1638 with bytes_warning():
1639 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001640
Guido van Rossumd624f182006-04-24 13:47:05 +00001641 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001642 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001643 # __reversed__? (optimization)
1644
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001645 # XXX More string methods? (Those that don't use character properties)
1646
Neal Norwitz6968b052007-02-27 19:02:19 +00001647 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001648 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001649 # Unfortunately they are all bundled with tests that
1650 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001651
Guido van Rossum254348e2007-11-21 19:29:53 +00001652 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001653 # the rest that make sense (the code can be cleaned up to use modern
1654 # unittest methods at the same time).
1655
Martin Panter152a19c2016-04-06 06:37:17 +00001656class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001657 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001658 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001659
1660 def test_returns_new_copy(self):
1661 val = self.marshal(b'1234')
1662 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001663 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001664 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1665 method = getattr(val, methname)
1666 newval = method(3)
1667 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001668 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001669 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001670 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1671 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1672 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1673 newval = eval(expr)
1674 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001675 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001676 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001677 sep = self.marshal(b'')
1678 newval = sep.join([val])
1679 self.assertEqual(val, newval)
1680 self.assertIsNot(val, newval)
1681
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001682
Christian Heimes510711d2008-01-30 11:57:58 +00001683class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001684 def fixtype(self, obj):
1685 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001686 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001687 return super().fixtype(obj)
1688
Martin Panter152a19c2016-04-06 06:37:17 +00001689 contains_bytes = True
1690
Ezio Melotti0dceb562013-01-10 07:43:26 +02001691class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001692 type2test = bytearray
1693
Ezio Melotti0dceb562013-01-10 07:43:26 +02001694class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001695 type2test = bytes
1696
Georg Brandlc7885542007-03-06 19:16:20 +00001697
Ezio Melotti0dceb562013-01-10 07:43:26 +02001698class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001699
1700 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001701 self.assertTrue(issubclass(self.type2test, self.basetype))
1702 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001703
1704 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001705 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001706
1707 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001708 self.assertTrue(_a == _a)
1709 self.assertTrue(_a != _b)
1710 self.assertTrue(_a < _b)
1711 self.assertTrue(_a <= _b)
1712 self.assertTrue(_b >= _a)
1713 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001714 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001715
1716 # test concat of subclass instances
1717 self.assertEqual(a + b, _a + _b)
1718 self.assertEqual(a + b, a + _b)
1719 self.assertEqual(a + b, _a + b)
1720
1721 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001722 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001723
1724 def test_join(self):
1725 # Make sure join returns a NEW object for single item sequences
1726 # involving a subclass.
1727 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001728 s1 = self.type2test(b"abcd")
1729 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001730 self.assertIsNot(s1, s2)
1731 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001732
1733 # Test reverse, calling join on subclass
1734 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001735 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001736
1737 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001738 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001739 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001740 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001741 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001742 b = pickle.loads(pickle.dumps(a, proto))
1743 self.assertNotEqual(id(a), id(b))
1744 self.assertEqual(a, b)
1745 self.assertEqual(a.x, b.x)
1746 self.assertEqual(a.y, b.y)
1747 self.assertEqual(type(a), type(b))
1748 self.assertEqual(type(a.y), type(b.y))
1749
1750 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001751 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001752 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001753 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001754 for copy_method in (copy.copy, copy.deepcopy):
1755 b = copy_method(a)
1756 self.assertNotEqual(id(a), id(b))
1757 self.assertEqual(a, b)
1758 self.assertEqual(a.x, b.x)
1759 self.assertEqual(a.y, b.y)
1760 self.assertEqual(type(a), type(b))
1761 self.assertEqual(type(a.y), type(b.y))
1762
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001763 def test_fromhex(self):
1764 b = self.type2test.fromhex('1a2B30')
1765 self.assertEqual(b, b'\x1a\x2b\x30')
1766 self.assertIs(type(b), self.type2test)
1767
1768 class B1(self.basetype):
1769 def __new__(cls, value):
1770 me = self.basetype.__new__(cls, value)
1771 me.foo = 'bar'
1772 return me
1773
1774 b = B1.fromhex('1a2B30')
1775 self.assertEqual(b, b'\x1a\x2b\x30')
1776 self.assertIs(type(b), B1)
1777 self.assertEqual(b.foo, 'bar')
1778
1779 class B2(self.basetype):
1780 def __init__(me, *args, **kwargs):
1781 if self.basetype is not bytes:
1782 self.basetype.__init__(me, *args, **kwargs)
1783 me.foo = 'bar'
1784
1785 b = B2.fromhex('1a2B30')
1786 self.assertEqual(b, b'\x1a\x2b\x30')
1787 self.assertIs(type(b), B2)
1788 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001789
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001790
1791class ByteArraySubclass(bytearray):
1792 pass
1793
1794class BytesSubclass(bytes):
1795 pass
1796
Serhiy Storchaka15095802015-11-25 15:47:01 +02001797class OtherBytesSubclass(bytes):
1798 pass
1799
Ezio Melotti0dceb562013-01-10 07:43:26 +02001800class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001801 basetype = bytearray
1802 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001803
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001804 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001805 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001806 def __init__(me, newarg=1, *args, **kwargs):
1807 bytearray.__init__(me, *args, **kwargs)
1808 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001809 x = subclass(4, source=b"abcd")
1810 self.assertEqual(x, b"abcd")
1811 x = subclass(newarg=4, source=b"abcd")
1812 self.assertEqual(x, b"abcd")
1813
1814
Ezio Melotti0dceb562013-01-10 07:43:26 +02001815class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001816 basetype = bytes
1817 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001818
1819
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001820if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001821 unittest.main()