blob: f7454d9b36a86a7ab5cfa87035b84f6f96da115a [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
Serhiy Storchaka914f9a02018-10-21 15:25:53 +0300116 def test_from_mutating_list(self):
117 # Issue #34973: Crash in bytes constructor with mutating list.
118 class X:
119 def __index__(self):
120 a.clear()
121 return 42
122 a = [X(), X()]
123 self.assertEqual(bytes(a), b'*')
124
125 class Y:
126 def __index__(self):
127 if len(a) < 1000:
128 a.append(self)
129 return 42
130 a = [Y()]
131 self.assertEqual(bytes(a), b'*' * 1000) # should not crash
132
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000133 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000134 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
135 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000137 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
138 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000139
INADA Naokia634e232017-01-06 17:32:01 +0900140 def test_from_buffer(self):
141 a = self.type2test(array.array('B', [1, 2, 3]))
142 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300143 a = self.type2test(b"\x01\x02\x03")
144 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900145
Serhiy Storchakae8904212018-10-15 00:02:57 +0300146 # Issues #29159 and #34974.
147 # Fallback when __index__ raises a TypeError
INADA Naokia634e232017-01-06 17:32:01 +0900148 class B(bytes):
149 def __index__(self):
150 raise TypeError
151
152 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
153
Guido van Rossum98297ee2007-11-06 21:34:58 +0000154 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000155 self.assertEqual(self.type2test(0), b'')
156 self.assertEqual(self.type2test(1), b'\x00')
157 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
158 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000159
Benjamin Peterson4c045832010-04-16 22:35:32 +0000160 self.assertEqual(self.type2test('0', 'ascii'), b'0')
161 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000162 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000163
164 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000165 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000166 class C:
167 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000168 self.assertRaises(TypeError, self.type2test, ["0"])
169 self.assertRaises(TypeError, self.type2test, [0.0])
170 self.assertRaises(TypeError, self.type2test, [None])
171 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300172 self.assertRaises(TypeError, self.type2test, encoding='ascii')
173 self.assertRaises(TypeError, self.type2test, errors='ignore')
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200174 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
175 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
176 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
177 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
178 self.assertRaises(TypeError, self.type2test, '')
179 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
180 self.assertRaises(TypeError, self.type2test, '', b'ascii')
181 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000182
183 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000184 self.assertRaises(ValueError, self.type2test, [-1])
185 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
186 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
187 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
188 self.assertRaises(ValueError, self.type2test, [-10**100])
189 self.assertRaises(ValueError, self.type2test, [256])
190 self.assertRaises(ValueError, self.type2test, [257])
191 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
192 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
193 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000194
Antoine Pitroucc231542014-11-02 18:40:09 +0100195 @bigaddrspacetest
196 def test_constructor_overflow(self):
197 size = MAX_Py_ssize_t
198 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
199 try:
200 # Should either pass or raise an error (e.g. on debug builds with
201 # additional malloc() overhead), but shouldn't crash.
202 bytearray(size - 4)
203 except (OverflowError, MemoryError):
204 pass
205
Serhiy Storchakae8904212018-10-15 00:02:57 +0300206 def test_constructor_exceptions(self):
207 # Issue #34974: bytes and bytearray constructors replace unexpected
208 # exceptions.
209 class BadInt:
210 def __index__(self):
211 1/0
212 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
213 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
214
215 class BadIterable:
216 def __iter__(self):
217 1/0
218 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
219
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000220 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000221 b1 = self.type2test([1, 2, 3])
222 b2 = self.type2test([1, 2, 3])
223 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000224
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000225 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000226 self.assertTrue(b2 != b3)
227 self.assertTrue(b1 <= b2)
228 self.assertTrue(b1 <= b3)
229 self.assertTrue(b1 < b3)
230 self.assertTrue(b1 >= b2)
231 self.assertTrue(b3 >= b2)
232 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000233
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000234 self.assertFalse(b1 != b2)
235 self.assertFalse(b2 == b3)
236 self.assertFalse(b1 > b2)
237 self.assertFalse(b1 > b3)
238 self.assertFalse(b1 >= b3)
239 self.assertFalse(b1 < b2)
240 self.assertFalse(b3 < b2)
241 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000242
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000243 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000244 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000245 # Byte comparisons with unicode should always fail!
246 # Test this for all expected byte orders and Unicode character
247 # sizes.
248 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
249 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
250 False)
251 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
252 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
253 False)
254 self.assertEqual(self.type2test() == str(), False)
255 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000256
257 def test_reversed(self):
258 input = list(map(ord, "Hello"))
259 b = self.type2test(input)
260 output = list(reversed(b))
261 input.reverse()
262 self.assertEqual(output, input)
263
264 def test_getslice(self):
265 def by(s):
266 return self.type2test(map(ord, s))
267 b = by("Hello, world")
268
269 self.assertEqual(b[:5], by("Hello"))
270 self.assertEqual(b[1:5], by("ello"))
271 self.assertEqual(b[5:7], by(", "))
272 self.assertEqual(b[7:], by("world"))
273 self.assertEqual(b[7:12], by("world"))
274 self.assertEqual(b[7:100], by("world"))
275
276 self.assertEqual(b[:-7], by("Hello"))
277 self.assertEqual(b[-11:-7], by("ello"))
278 self.assertEqual(b[-7:-5], by(", "))
279 self.assertEqual(b[-5:], by("world"))
280 self.assertEqual(b[-5:12], by("world"))
281 self.assertEqual(b[-5:100], by("world"))
282 self.assertEqual(b[-100:5], by("Hello"))
283
284 def test_extended_getslice(self):
285 # Test extended slicing by comparing with list slicing.
286 L = list(range(255))
287 b = self.type2test(L)
288 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
289 for start in indices:
290 for stop in indices:
291 # Skip step 0 (invalid)
292 for step in indices[1:]:
293 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
294
295 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000296 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000297 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000298 b = self.type2test(sample, enc)
299 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000300 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
301 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000302 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000303
304 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300305 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000306 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000307 b = self.type2test(sample, enc)
308 self.assertEqual(b.decode(enc), sample)
309 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000310 b = self.type2test(sample, "latin-1")
311 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
312 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
313 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000314 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000315 # Default encoding is utf-8
316 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000317
318 def test_from_int(self):
319 b = self.type2test(0)
320 self.assertEqual(b, self.type2test())
321 b = self.type2test(10)
322 self.assertEqual(b, self.type2test([0]*10))
323 b = self.type2test(10000)
324 self.assertEqual(b, self.type2test([0]*10000))
325
326 def test_concat(self):
327 b1 = self.type2test(b"abc")
328 b2 = self.type2test(b"def")
329 self.assertEqual(b1 + b2, b"abcdef")
330 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
331 self.assertEqual(bytes(b"def") + b1, b"defabc")
332 self.assertRaises(TypeError, lambda: b1 + "def")
333 self.assertRaises(TypeError, lambda: "abc" + b2)
334
335 def test_repeat(self):
336 for b in b"abc", self.type2test(b"abc"):
337 self.assertEqual(b * 3, b"abcabcabc")
338 self.assertEqual(b * 0, b"")
339 self.assertEqual(b * -1, b"")
340 self.assertRaises(TypeError, lambda: b * 3.14)
341 self.assertRaises(TypeError, lambda: 3.14 * b)
342 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000343 with self.assertRaises((OverflowError, MemoryError)):
344 c = b * sys.maxsize
345 with self.assertRaises((OverflowError, MemoryError)):
346 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000347
348 def test_repeat_1char(self):
349 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
350
351 def test_contains(self):
352 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000353 self.assertIn(ord('a'), b)
354 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000355 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000356 self.assertRaises(ValueError, lambda: 300 in b)
357 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300358 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000359 self.assertRaises(TypeError, lambda: None in b)
360 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
361 self.assertRaises(TypeError, lambda: "a" in b)
362 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000363 self.assertIn(f(b""), b)
364 self.assertIn(f(b"a"), b)
365 self.assertIn(f(b"b"), b)
366 self.assertIn(f(b"c"), b)
367 self.assertIn(f(b"ab"), b)
368 self.assertIn(f(b"bc"), b)
369 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000370 self.assertNotIn(f(b"ac"), b)
371 self.assertNotIn(f(b"d"), b)
372 self.assertNotIn(f(b"dab"), b)
373 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000374
375 def test_fromhex(self):
376 self.assertRaises(TypeError, self.type2test.fromhex)
377 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000378 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000379 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000380 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
381 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200382
383 # check that ASCII whitespace is ignored
384 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
385 for c in "\x09\x0A\x0B\x0C\x0D\x20":
386 self.assertEqual(self.type2test.fromhex(c), self.type2test())
387 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
388 self.assertRaises(ValueError, self.type2test.fromhex, c)
389
Ezio Melottib3aedd42010-11-20 19:04:17 +0000390 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000391 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
392 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
393 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
394 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
395 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
396 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
397
Victor Stinner2bf89932015-10-14 11:25:33 +0200398 for data, pos in (
399 # invalid first hexadecimal character
400 ('12 x4 56', 3),
401 # invalid second hexadecimal character
402 ('12 3x 56', 4),
403 # two invalid hexadecimal characters
404 ('12 xy 56', 3),
405 # test non-ASCII string
406 ('12 3\xff 56', 4),
407 ):
408 with self.assertRaises(ValueError) as cm:
409 self.type2test.fromhex(data)
410 self.assertIn('at position %s' % pos, str(cm.exception))
411
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000412 def test_hex(self):
413 self.assertRaises(TypeError, self.type2test.hex)
414 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000415 self.assertEqual(self.type2test(b"").hex(), "")
416 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
417 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
418 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000419
Christian Heimes510711d2008-01-30 11:57:58 +0000420 def test_join(self):
421 self.assertEqual(self.type2test(b"").join([]), b"")
422 self.assertEqual(self.type2test(b"").join([b""]), b"")
423 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
424 lst = list(map(self.type2test, lst))
425 self.assertEqual(self.type2test(b"").join(lst), b"abc")
426 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
427 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200428 dot_join = self.type2test(b".:").join
429 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
430 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
431 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
432 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
433 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
434 # Stress it with many items
435 seq = [b"abc"] * 1000
436 expected = b"abc" + b".:abc" * 999
437 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400438 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200439 # Error handling and cleanup when some item in the middle of the
440 # sequence has the wrong type.
441 with self.assertRaises(TypeError):
442 dot_join([bytearray(b"ab"), "cd", b"ef"])
443 with self.assertRaises(TypeError):
444 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000445
Christian Heimes510711d2008-01-30 11:57:58 +0000446 def test_count(self):
447 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200448 i = 105
449 p = 112
450 w = 119
451
Christian Heimes510711d2008-01-30 11:57:58 +0000452 self.assertEqual(b.count(b'i'), 4)
453 self.assertEqual(b.count(b'ss'), 2)
454 self.assertEqual(b.count(b'w'), 0)
455
Antoine Pitrouac65d962011-10-20 23:54:17 +0200456 self.assertEqual(b.count(i), 4)
457 self.assertEqual(b.count(w), 0)
458
459 self.assertEqual(b.count(b'i', 6), 2)
460 self.assertEqual(b.count(b'p', 6), 2)
461 self.assertEqual(b.count(b'i', 1, 3), 1)
462 self.assertEqual(b.count(b'p', 7, 9), 1)
463
464 self.assertEqual(b.count(i, 6), 2)
465 self.assertEqual(b.count(p, 6), 2)
466 self.assertEqual(b.count(i, 1, 3), 1)
467 self.assertEqual(b.count(p, 7, 9), 1)
468
Christian Heimes510711d2008-01-30 11:57:58 +0000469 def test_startswith(self):
470 b = self.type2test(b'hello')
471 self.assertFalse(self.type2test().startswith(b"anything"))
472 self.assertTrue(b.startswith(b"hello"))
473 self.assertTrue(b.startswith(b"hel"))
474 self.assertTrue(b.startswith(b"h"))
475 self.assertFalse(b.startswith(b"hellow"))
476 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300477 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300478 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300479 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300480 self.assertIn('bytes', exc)
481 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000482
483 def test_endswith(self):
484 b = self.type2test(b'hello')
485 self.assertFalse(bytearray().endswith(b"anything"))
486 self.assertTrue(b.endswith(b"hello"))
487 self.assertTrue(b.endswith(b"llo"))
488 self.assertTrue(b.endswith(b"o"))
489 self.assertFalse(b.endswith(b"whello"))
490 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300491 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300492 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300493 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300494 self.assertIn('bytes', exc)
495 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000496
497 def test_find(self):
498 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200499 i = 105
500 w = 119
501
Christian Heimes510711d2008-01-30 11:57:58 +0000502 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000503 self.assertEqual(b.find(b'w'), -1)
504 self.assertEqual(b.find(b'mississippian'), -1)
505
Antoine Pitrouac65d962011-10-20 23:54:17 +0200506 self.assertEqual(b.find(i), 1)
507 self.assertEqual(b.find(w), -1)
508
509 self.assertEqual(b.find(b'ss', 3), 5)
510 self.assertEqual(b.find(b'ss', 1, 7), 2)
511 self.assertEqual(b.find(b'ss', 1, 3), -1)
512
513 self.assertEqual(b.find(i, 6), 7)
514 self.assertEqual(b.find(i, 1, 3), 1)
515 self.assertEqual(b.find(w, 1, 3), -1)
516
Victor Stinnerf8eac002011-12-18 01:17:41 +0100517 for index in (-1, 256, sys.maxsize + 1):
518 self.assertRaisesRegex(
519 ValueError, r'byte must be in range\(0, 256\)',
520 b.find, index)
521
Christian Heimes510711d2008-01-30 11:57:58 +0000522 def test_rfind(self):
523 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200524 i = 105
525 w = 119
526
Christian Heimes510711d2008-01-30 11:57:58 +0000527 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000528 self.assertEqual(b.rfind(b'w'), -1)
529 self.assertEqual(b.rfind(b'mississippian'), -1)
530
Antoine Pitrouac65d962011-10-20 23:54:17 +0200531 self.assertEqual(b.rfind(i), 10)
532 self.assertEqual(b.rfind(w), -1)
533
534 self.assertEqual(b.rfind(b'ss', 3), 5)
535 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
536
537 self.assertEqual(b.rfind(i, 1, 3), 1)
538 self.assertEqual(b.rfind(i, 3, 9), 7)
539 self.assertEqual(b.rfind(w, 1, 3), -1)
540
Christian Heimes510711d2008-01-30 11:57:58 +0000541 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200542 b = self.type2test(b'mississippi')
543 i = 105
544 w = 119
545
546 self.assertEqual(b.index(b'ss'), 2)
547 self.assertRaises(ValueError, b.index, b'w')
548 self.assertRaises(ValueError, b.index, b'mississippian')
549
550 self.assertEqual(b.index(i), 1)
551 self.assertRaises(ValueError, b.index, w)
552
553 self.assertEqual(b.index(b'ss', 3), 5)
554 self.assertEqual(b.index(b'ss', 1, 7), 2)
555 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
556
557 self.assertEqual(b.index(i, 6), 7)
558 self.assertEqual(b.index(i, 1, 3), 1)
559 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000560
561 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200562 b = self.type2test(b'mississippi')
563 i = 105
564 w = 119
565
566 self.assertEqual(b.rindex(b'ss'), 5)
567 self.assertRaises(ValueError, b.rindex, b'w')
568 self.assertRaises(ValueError, b.rindex, b'mississippian')
569
570 self.assertEqual(b.rindex(i), 10)
571 self.assertRaises(ValueError, b.rindex, w)
572
573 self.assertEqual(b.rindex(b'ss', 3), 5)
574 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
575
576 self.assertEqual(b.rindex(i, 1, 3), 1)
577 self.assertEqual(b.rindex(i, 3, 9), 7)
578 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000579
Ethan Furmanb95b5612015-01-23 20:05:18 -0800580 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300581 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800582 orig = b
583 b = b % b'world'
584 self.assertEqual(b, b'hello, world!')
585 self.assertEqual(orig, b'hello, %b!')
586 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300587 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800588 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200589 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200590 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800591 # issue 29714
592 b = self.type2test(b'hello,\x00%b!')
593 b = b % b'world'
594 self.assertEqual(b, b'hello,\x00world!')
595 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800596
597 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300598 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800599 orig = b
600 b %= b'world'
601 self.assertEqual(b, b'hello, world!')
602 self.assertEqual(orig, b'hello, %b!')
603 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300604 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800605 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200606 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200607 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800608 # issue 29714
609 b = self.type2test(b'hello,\x00%b!')
610 b %= b'world'
611 self.assertEqual(b, b'hello,\x00world!')
612 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300613
614 def test_rmod(self):
615 with self.assertRaises(TypeError):
616 object() % self.type2test(b'abc')
617 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800618
Christian Heimes510711d2008-01-30 11:57:58 +0000619 def test_replace(self):
620 b = self.type2test(b'mississippi')
621 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
622 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
623
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300624 def test_replace_int_error(self):
625 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
626
Christian Heimes510711d2008-01-30 11:57:58 +0000627 def test_split_string_error(self):
628 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300629 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
630
631 def test_split_int_error(self):
632 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
633 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000634
Antoine Pitrouf8453022010-01-12 22:05:42 +0000635 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000636 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
637 b = self.type2test(b)
638 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000639 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
640 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
641
Christian Heimes510711d2008-01-30 11:57:58 +0000642 def test_rsplit_unicodewhitespace(self):
643 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000644 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
645
646 def test_partition(self):
647 b = self.type2test(b'mississippi')
648 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000649 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000650
651 def test_rpartition(self):
652 b = self.type2test(b'mississippi')
653 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
654 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000655 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000656
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300657 def test_partition_string_error(self):
658 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
659 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
660
661 def test_partition_int_error(self):
662 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
663 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
664
Christian Heimes510711d2008-01-30 11:57:58 +0000665 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000666 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000667 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
668 b = self.type2test(b)
669 ps = pickle.dumps(b, proto)
670 q = pickle.loads(ps)
671 self.assertEqual(b, q)
672
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000673 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200674 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
675 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
676 it = itorg = iter(self.type2test(b))
677 data = list(self.type2test(b))
678 d = pickle.dumps(it, proto)
679 it = pickle.loads(d)
680 self.assertEqual(type(itorg), type(it))
681 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000682
Serhiy Storchakabad12572014-12-15 14:03:42 +0200683 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200684 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200685 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200686 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200687 d = pickle.dumps(it, proto)
688 it = pickle.loads(d)
689 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000690
Christian Heimes510711d2008-01-30 11:57:58 +0000691 def test_strip_bytearray(self):
692 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
693 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
694 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
695
696 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300697 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
698 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
699 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
700
701 def test_strip_int_error(self):
702 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
703 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
704 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000705
Eli Bendersky906b88f2011-07-29 07:05:08 +0300706 def test_center(self):
707 # Fill character can be either bytes or bytearray (issue 12380)
708 b = self.type2test(b'abc')
709 for fill_type in (bytes, bytearray):
710 self.assertEqual(b.center(7, fill_type(b'-')),
711 self.type2test(b'--abc--'))
712
713 def test_ljust(self):
714 # Fill character can be either bytes or bytearray (issue 12380)
715 b = self.type2test(b'abc')
716 for fill_type in (bytes, bytearray):
717 self.assertEqual(b.ljust(7, fill_type(b'-')),
718 self.type2test(b'abc----'))
719
720 def test_rjust(self):
721 # Fill character can be either bytes or bytearray (issue 12380)
722 b = self.type2test(b'abc')
723 for fill_type in (bytes, bytearray):
724 self.assertEqual(b.rjust(7, fill_type(b'-')),
725 self.type2test(b'----abc'))
726
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300727 def test_xjust_int_error(self):
728 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
729 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
730 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
731
Christian Heimes510711d2008-01-30 11:57:58 +0000732 def test_ord(self):
733 b = self.type2test(b'\0A\x7f\x80\xff')
734 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
735 [0, 65, 127, 128, 255])
736
Georg Brandlabc38772009-04-12 15:51:51 +0000737 def test_maketrans(self):
738 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 +0000739 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000740 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'
741 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000742 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
743 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
744
Jesus Ceaac451502011-04-20 17:09:23 +0200745 def test_none_arguments(self):
746 # issue 11828
747 b = self.type2test(b'hello')
748 l = self.type2test(b'l')
749 h = self.type2test(b'h')
750 x = self.type2test(b'x')
751 o = self.type2test(b'o')
752
753 self.assertEqual(2, b.find(l, None))
754 self.assertEqual(3, b.find(l, -2, None))
755 self.assertEqual(2, b.find(l, None, -2))
756 self.assertEqual(0, b.find(h, None, None))
757
758 self.assertEqual(3, b.rfind(l, None))
759 self.assertEqual(3, b.rfind(l, -2, None))
760 self.assertEqual(2, b.rfind(l, None, -2))
761 self.assertEqual(0, b.rfind(h, None, None))
762
763 self.assertEqual(2, b.index(l, None))
764 self.assertEqual(3, b.index(l, -2, None))
765 self.assertEqual(2, b.index(l, None, -2))
766 self.assertEqual(0, b.index(h, None, None))
767
768 self.assertEqual(3, b.rindex(l, None))
769 self.assertEqual(3, b.rindex(l, -2, None))
770 self.assertEqual(2, b.rindex(l, None, -2))
771 self.assertEqual(0, b.rindex(h, None, None))
772
773 self.assertEqual(2, b.count(l, None))
774 self.assertEqual(1, b.count(l, -2, None))
775 self.assertEqual(1, b.count(l, None, -2))
776 self.assertEqual(0, b.count(x, None, None))
777
778 self.assertEqual(True, b.endswith(o, None))
779 self.assertEqual(True, b.endswith(o, -2, None))
780 self.assertEqual(True, b.endswith(l, None, -2))
781 self.assertEqual(False, b.endswith(x, None, None))
782
783 self.assertEqual(True, b.startswith(h, None))
784 self.assertEqual(True, b.startswith(l, -2, None))
785 self.assertEqual(True, b.startswith(h, None, -2))
786 self.assertEqual(False, b.startswith(x, None, None))
787
Antoine Pitrouac65d962011-10-20 23:54:17 +0200788 def test_integer_arguments_out_of_byte_range(self):
789 b = self.type2test(b'hello')
790
791 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
792 self.assertRaises(ValueError, method, -1)
793 self.assertRaises(ValueError, method, 256)
794 self.assertRaises(ValueError, method, 9999)
795
Jesus Ceaac451502011-04-20 17:09:23 +0200796 def test_find_etc_raise_correct_error_messages(self):
797 # issue 11828
798 b = self.type2test(b'hello')
799 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300800 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200801 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300802 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200803 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300804 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200805 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300806 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200807 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300808 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200809 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300810 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200811 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300812 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200813 x, None, None, None)
814
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300815 def test_free_after_iterating(self):
816 test.support.check_free_after_iterating(self, iter, self.type2test)
817 test.support.check_free_after_iterating(self, reversed, self.type2test)
818
Martin Panter1b6c6da2016-08-27 08:35:02 +0000819 def test_translate(self):
820 b = self.type2test(b'hello')
821 rosetta = bytearray(range(256))
822 rosetta[ord('o')] = ord('e')
823
824 self.assertRaises(TypeError, b.translate)
825 self.assertRaises(TypeError, b.translate, None, None)
826 self.assertRaises(ValueError, b.translate, bytes(range(255)))
827
828 c = b.translate(rosetta, b'hello')
829 self.assertEqual(b, b'hello')
830 self.assertIsInstance(c, self.type2test)
831
832 c = b.translate(rosetta)
833 d = b.translate(rosetta, b'')
834 self.assertEqual(c, d)
835 self.assertEqual(c, b'helle')
836
837 c = b.translate(rosetta, b'l')
838 self.assertEqual(c, b'hee')
839 c = b.translate(None, b'e')
840 self.assertEqual(c, b'hllo')
841
842 # test delete as a keyword argument
843 c = b.translate(rosetta, delete=b'')
844 self.assertEqual(c, b'helle')
845 c = b.translate(rosetta, delete=b'l')
846 self.assertEqual(c, b'hee')
847 c = b.translate(None, delete=b'e')
848 self.assertEqual(c, b'hllo')
849
Christian Heimes510711d2008-01-30 11:57:58 +0000850
Ezio Melotti0dceb562013-01-10 07:43:26 +0200851class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000852 type2test = bytes
853
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400854 def test_getitem_error(self):
855 msg = "byte indices must be integers or slices"
856 with self.assertRaisesRegex(TypeError, msg):
857 b'python'['a']
858
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000859 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200860 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000861 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000862 self.assertRaises(TypeError, f.readinto, b"")
863
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000864 def test_custom(self):
865 class A:
866 def __bytes__(self):
867 return b'abc'
868 self.assertEqual(bytes(A()), b'abc')
869 class A: pass
870 self.assertRaises(TypeError, bytes, A())
871 class A:
872 def __bytes__(self):
873 return None
874 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600875 class A:
876 def __bytes__(self):
877 return b'a'
878 def __index__(self):
879 return 42
880 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200881 # Issue #25766
882 class A(str):
883 def __bytes__(self):
884 return b'abc'
885 self.assertEqual(bytes(A('\u20ac')), b'abc')
886 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200887 # Issue #24731
888 class A:
889 def __bytes__(self):
890 return OtherBytesSubclass(b'abc')
891 self.assertEqual(bytes(A()), b'abc')
892 self.assertIs(type(bytes(A())), OtherBytesSubclass)
893 self.assertEqual(BytesSubclass(A()), b'abc')
894 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000895
Victor Stinner29e762c2011-01-05 03:33:28 +0000896 # Test PyBytes_FromFormat()
897 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200898 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200899 _testcapi = test.support.import_module('_testcapi')
900 from ctypes import pythonapi, py_object
901 from ctypes import (
902 c_int, c_uint,
903 c_long, c_ulong,
904 c_size_t, c_ssize_t,
905 c_char_p)
906
Victor Stinner29e762c2011-01-05 03:33:28 +0000907 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
908 PyBytes_FromFormat.restype = py_object
909
Victor Stinner03dab782015-10-14 00:21:35 +0200910 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000911 self.assertEqual(PyBytes_FromFormat(b'format'),
912 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200913 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
914 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000915
Victor Stinner03dab782015-10-14 00:21:35 +0200916 # test formatters
917 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
918 b'c=\0')
919 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
920 b'c=@')
921 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
922 b'c=\xff')
923 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
924 c_int(1), c_long(2),
925 c_size_t(3)),
926 b'd=1 ld=2 zd=3')
927 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
928 c_int(-1), c_long(-2),
929 c_size_t(-3)),
930 b'd=-1 ld=-2 zd=-3')
931 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
932 c_uint(123), c_ulong(456),
933 c_size_t(789)),
934 b'u=123 lu=456 zu=789')
935 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
936 b'i=123')
937 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
938 b'i=-123')
939 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
940 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200941
942 sizeof_ptr = ctypes.sizeof(c_char_p)
943
944 if os.name == 'nt':
945 # Windows (MSCRT)
946 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
947 def ptr_formatter(ptr):
948 return (ptr_format % ptr)
949 else:
950 # UNIX (glibc)
951 def ptr_formatter(ptr):
952 return '%#x' % ptr
953
Victor Stinner7ab986d2015-10-14 02:55:12 +0200954 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200955 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
956 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200957 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
958 b's=cstr')
959
960 # test minimum and maximum integer values
961 size_max = c_size_t(-1).value
962 for formatstr, ctypes_type, value, py_formatter in (
963 (b'%d', c_int, _testcapi.INT_MIN, str),
964 (b'%d', c_int, _testcapi.INT_MAX, str),
965 (b'%ld', c_long, _testcapi.LONG_MIN, str),
966 (b'%ld', c_long, _testcapi.LONG_MAX, str),
967 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
968 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
969 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
970 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200971 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200972 ):
973 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
974 py_formatter(value).encode('ascii')),
975
976 # width and precision (width is currently ignored)
977 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
978 b'a')
979 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
980 b'abc')
981
982 # '%%' formatter
983 self.assertEqual(PyBytes_FromFormat(b'%%'),
984 b'%')
985 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
986 b'[%]')
987 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
988 b'%_')
989 self.assertEqual(PyBytes_FromFormat(b'%%s'),
990 b'%s')
991
992 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000993 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200994 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
995 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000996
Victor Stinner03dab782015-10-14 00:21:35 +0200997 # Issue #19969: %c must raise OverflowError for values
998 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100999 self.assertRaises(OverflowError,
1000 PyBytes_FromFormat, b'%c', c_int(-1))
1001 self.assertRaises(OverflowError,
1002 PyBytes_FromFormat, b'%c', c_int(256))
1003
Serhiy Storchaka44cc4822019-01-12 09:22:29 +02001004 # Issue #33817: empty strings
1005 self.assertEqual(PyBytes_FromFormat(b''),
1006 b'')
1007 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1008 b'')
1009
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001010 def test_bytes_blocking(self):
1011 class IterationBlocked(list):
1012 __bytes__ = None
1013 i = [0, 1, 2, 3]
1014 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1015 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1016
1017 # At least in CPython, because bytes.__new__ and the C API
1018 # PyBytes_FromObject have different fallback rules, integer
1019 # fallback is handled specially, so test separately.
1020 class IntBlocked(int):
1021 __bytes__ = None
1022 self.assertEqual(bytes(3), b'\0\0\0')
1023 self.assertRaises(TypeError, bytes, IntBlocked(3))
1024
1025 # While there is no separately-defined rule for handling bytes
1026 # subclasses differently from other buffer-interface classes,
1027 # an implementation may well special-case them (as CPython 2.x
1028 # str did), so test them separately.
1029 class BytesSubclassBlocked(bytes):
1030 __bytes__ = None
1031 self.assertEqual(bytes(b'ab'), b'ab')
1032 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1033
1034 class BufferBlocked(bytearray):
1035 __bytes__ = None
1036 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1037 self.assertEqual(bytes(ba), b'ab')
1038 self.assertRaises(TypeError, bytes, bb)
1039
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001040
Ezio Melotti0dceb562013-01-10 07:43:26 +02001041class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001042 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001043
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001044 def test_getitem_error(self):
1045 msg = "bytearray indices must be integers or slices"
1046 with self.assertRaisesRegex(TypeError, msg):
1047 bytearray(b'python')['a']
1048
1049 def test_setitem_error(self):
1050 msg = "bytearray indices must be integers or slices"
1051 with self.assertRaisesRegex(TypeError, msg):
1052 b = bytearray(b'python')
1053 b['a'] = "python"
1054
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001055 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001056 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001057
Guido van Rossum254348e2007-11-21 19:29:53 +00001058 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001059 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001060 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001061 tfn = tempfile.mktemp()
1062 try:
1063 # Prepare
1064 with open(tfn, "wb") as f:
1065 f.write(short_sample)
1066 # Test readinto
1067 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001068 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001069 n = f.readinto(b)
1070 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001071 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001072 # Test writing in binary mode
1073 with open(tfn, "wb") as f:
1074 f.write(b)
1075 with open(tfn, "rb") as f:
1076 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001077 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001078 finally:
1079 try:
1080 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001081 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001082 pass
1083
Neal Norwitz6968b052007-02-27 19:02:19 +00001084 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001085 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001086 self.assertEqual(b.reverse(), None)
1087 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001088 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001089 b.reverse()
1090 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001091 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001092 b.reverse()
1093 self.assertFalse(b)
1094
Eli Bendersky4db28d32011-03-03 18:21:02 +00001095 def test_clear(self):
1096 b = bytearray(b'python')
1097 b.clear()
1098 self.assertEqual(b, b'')
1099
1100 b = bytearray(b'')
1101 b.clear()
1102 self.assertEqual(b, b'')
1103
1104 b = bytearray(b'')
1105 b.append(ord('r'))
1106 b.clear()
1107 b.append(ord('p'))
1108 self.assertEqual(b, b'p')
1109
1110 def test_copy(self):
1111 b = bytearray(b'abc')
1112 bb = b.copy()
1113 self.assertEqual(bb, b'abc')
1114
1115 b = bytearray(b'')
1116 bb = b.copy()
1117 self.assertEqual(bb, b'')
1118
1119 # test that it's indeed a copy and not a reference
1120 b = bytearray(b'abc')
1121 bb = b.copy()
1122 self.assertEqual(b, bb)
1123 self.assertIsNot(b, bb)
1124 bb.append(ord('d'))
1125 self.assertEqual(bb, b'abcd')
1126 self.assertEqual(b, b'abc')
1127
Guido van Rossumd624f182006-04-24 13:47:05 +00001128 def test_regexps(self):
1129 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001130 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001131 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001132 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001133
1134 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001135 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001136 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001138 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001140 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001141 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001142 try:
1143 b[3] = 0
1144 self.fail("Didn't raise IndexError")
1145 except IndexError:
1146 pass
1147 try:
1148 b[-10] = 0
1149 self.fail("Didn't raise IndexError")
1150 except IndexError:
1151 pass
1152 try:
1153 b[0] = 256
1154 self.fail("Didn't raise ValueError")
1155 except ValueError:
1156 pass
1157 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001158 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001159 self.fail("Didn't raise ValueError")
1160 except ValueError:
1161 pass
1162 try:
1163 b[0] = None
1164 self.fail("Didn't raise TypeError")
1165 except TypeError:
1166 pass
1167
1168 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001170 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001171 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001172 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001173 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001174 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001175 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001176
1177 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001178 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001179 self.assertEqual(list(b), list(range(10)))
1180
Guido van Rossum254348e2007-11-21 19:29:53 +00001181 b[0:5] = bytearray([1, 1, 1, 1, 1])
1182 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001183
1184 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001185 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001186
Guido van Rossum254348e2007-11-21 19:29:53 +00001187 b[0:0] = bytearray([0, 1, 2, 3, 4])
1188 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001189
Guido van Rossum254348e2007-11-21 19:29:53 +00001190 b[-7:-3] = bytearray([100, 101])
1191 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001192
1193 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001194 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001195
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001196 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001197 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 +00001198
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001199 b[3:] = b'foo'
1200 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1201
1202 b[:3] = memoryview(b'foo')
1203 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1204
1205 b[3:4] = []
1206 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1207
1208 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1209 ['a', 'b'], [b'a', b'b'], [[]]]:
1210 with self.assertRaises(TypeError):
1211 b[3:4] = elem
1212
1213 for elem in [[254, 255, 256], [-256, 9000]]:
1214 with self.assertRaises(ValueError):
1215 b[3:4] = elem
1216
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001217 def test_setslice_extend(self):
1218 # Exercise the resizing logic (see issue #19087)
1219 b = bytearray(range(100))
1220 self.assertEqual(list(b), list(range(100)))
1221 del b[:10]
1222 self.assertEqual(list(b), list(range(10, 100)))
1223 b.extend(range(100, 110))
1224 self.assertEqual(list(b), list(range(10, 110)))
1225
Antoine Pitrou25454112015-05-19 20:52:27 +02001226 def test_fifo_overrun(self):
1227 # Test for issue #23985, a buffer overrun when implementing a FIFO
1228 # Build Python in pydebug mode for best results.
1229 b = bytearray(10)
1230 b.pop() # Defeat expanding buffer off-by-one quirk
1231 del b[:1] # Advance start pointer without reallocating
1232 b += bytes(2) # Append exactly the number of deleted bytes
1233 del b # Free memory buffer, allowing pydebug verification
1234
1235 def test_del_expand(self):
1236 # Reducing the size should not expand the buffer (issue #23985)
1237 b = bytearray(10)
1238 size = sys.getsizeof(b)
1239 del b[:1]
1240 self.assertLessEqual(sys.getsizeof(b), size)
1241
Thomas Wouters376446d2006-12-19 08:30:14 +00001242 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001243 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001244 for start in indices:
1245 for stop in indices:
1246 # Skip invalid step 0
1247 for step in indices[1:]:
1248 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001249 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001250 # Make sure we have a slice of exactly the right length,
1251 # but with different data.
1252 data = L[start:stop:step]
1253 data.reverse()
1254 L[start:stop:step] = data
1255 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001256 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001257
Thomas Wouters376446d2006-12-19 08:30:14 +00001258 del L[start:stop:step]
1259 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001260 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001261
Guido van Rossumd624f182006-04-24 13:47:05 +00001262 def test_setslice_trap(self):
1263 # This test verifies that we correctly handle assigning self
1264 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001265 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001266 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001267 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001268
Guido van Rossum13e57212006-04-27 22:54:26 +00001269 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001270 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001271 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001272 b += b"def"
1273 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001274 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001275 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001276 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001277 self.assertEqual(b, b"abcdefxyz")
1278 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001279 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001280 except TypeError:
1281 pass
1282 else:
1283 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001284
1285 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001286 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001287 b1 = b
1288 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001289 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001290 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001291 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001292
1293 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001294 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001295 b1 = b
1296 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001297 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001298 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001299 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001300
Guido van Rossum20188312006-05-05 15:15:40 +00001301 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001302 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001303 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001304 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001305 seq = [alloc]
1306 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001307 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001308 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001309 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001310 if alloc not in seq:
1311 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001312
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001313 def test_init_alloc(self):
1314 b = bytearray()
1315 def g():
1316 for i in range(1, 100):
1317 yield i
1318 a = list(b)
1319 self.assertEqual(a, list(range(1, len(a)+1)))
1320 self.assertEqual(len(b), len(a))
1321 self.assertLessEqual(len(b), i)
1322 alloc = b.__alloc__()
1323 self.assertGreater(alloc, len(b)) # including trailing null byte
1324 b.__init__(g())
1325 self.assertEqual(list(b), list(range(1, 100)))
1326 self.assertEqual(len(b), 99)
1327 alloc = b.__alloc__()
1328 self.assertGreater(alloc, len(b))
1329
Neal Norwitz6968b052007-02-27 19:02:19 +00001330 def test_extend(self):
1331 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001332 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001333 a.extend(a)
1334 self.assertEqual(a, orig + orig)
1335 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001336 a = bytearray(b'')
1337 # Test iterators that don't have a __length_hint__
1338 a.extend(map(int, orig * 25))
1339 a.extend(int(x) for x in orig * 25)
1340 self.assertEqual(a, orig * 50)
1341 self.assertEqual(a[-5:], orig)
1342 a = bytearray(b'')
1343 a.extend(iter(map(int, orig * 50)))
1344 self.assertEqual(a, orig * 50)
1345 self.assertEqual(a[-5:], orig)
1346 a = bytearray(b'')
1347 a.extend(list(map(int, orig * 50)))
1348 self.assertEqual(a, orig * 50)
1349 self.assertEqual(a[-5:], orig)
1350 a = bytearray(b'')
1351 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1352 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1353 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001354 a = bytearray(b'')
1355 a.extend([Indexable(ord('a'))])
1356 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001357
Neal Norwitz6968b052007-02-27 19:02:19 +00001358 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001359 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001360 b.remove(ord('l'))
1361 self.assertEqual(b, b'helo')
1362 b.remove(ord('l'))
1363 self.assertEqual(b, b'heo')
1364 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1365 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001366 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001367 # remove first and last
1368 b.remove(ord('o'))
1369 b.remove(ord('h'))
1370 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001371 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001372 b.remove(Indexable(ord('e')))
1373 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001374
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001375 # test values outside of the ascii range: (0, 127)
1376 c = bytearray([126, 127, 128, 129])
1377 c.remove(127)
1378 self.assertEqual(c, bytes([126, 128, 129]))
1379 c.remove(129)
1380 self.assertEqual(c, bytes([126, 128]))
1381
Neal Norwitz6968b052007-02-27 19:02:19 +00001382 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001383 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001384 self.assertEqual(b.pop(), ord('d'))
1385 self.assertEqual(b.pop(0), ord('w'))
1386 self.assertEqual(b.pop(-2), ord('r'))
1387 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001388 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001389 # test for issue #6846
1390 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001391
1392 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001393 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001394
Neal Norwitz6968b052007-02-27 19:02:19 +00001395 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001396 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001397 b.append(ord('o'))
1398 self.assertEqual(b, b'hello')
1399 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001400 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001401 b.append(ord('A'))
1402 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001403 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001404 b = bytearray()
1405 b.append(Indexable(ord('A')))
1406 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001407
1408 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001409 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001410 b.insert(1, ord('i'))
1411 b.insert(4, ord('i'))
1412 b.insert(-2, ord('i'))
1413 b.insert(1000, ord('i'))
1414 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001415 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001416 b = bytearray()
1417 b.insert(0, Indexable(ord('A')))
1418 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001419
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001420 def test_copied(self):
1421 # Issue 4348. Make sure that operations that don't mutate the array
1422 # copy the bytes.
1423 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001424 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001425
1426 t = bytearray([i for i in range(256)])
1427 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001428 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001429
Guido van Rossum254348e2007-11-21 19:29:53 +00001430 def test_partition_bytearray_doesnt_share_nullstring(self):
1431 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001432 self.assertEqual(b, b"")
1433 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001434 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001435 b += b"!"
1436 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001437 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001438 self.assertEqual(b, b"")
1439 self.assertEqual(c, b"")
1440 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001441 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001442 self.assertEqual(b, b"")
1443 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001444 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001445 b += b"!"
1446 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001447 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001448 self.assertEqual(b, b"")
1449 self.assertEqual(c, b"")
1450
Antoine Pitrou5504e892008-12-06 21:27:53 +00001451 def test_resize_forbidden(self):
1452 # #4509: can't resize a bytearray when there are buffer exports, even
1453 # if it wouldn't reallocate the underlying buffer.
1454 # Furthermore, no destructive changes to the buffer may be applied
1455 # before raising the error.
1456 b = bytearray(range(10))
1457 v = memoryview(b)
1458 def resize(n):
1459 b[1:-1] = range(n + 1, 2*n - 1)
1460 resize(10)
1461 orig = b[:]
1462 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001463 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001464 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001465 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001466 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001467 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001468 # Other operations implying resize
1469 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001470 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001471 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001472 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001473 def delitem():
1474 del b[1]
1475 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001476 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001477 # deleting a non-contiguous slice
1478 def delslice():
1479 b[1:-1:2] = b""
1480 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001481 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001482
Stefan Krah650c1e82015-02-03 21:43:23 +01001483 @test.support.cpython_only
1484 def test_obsolete_write_lock(self):
1485 from _testcapi import getbuffer_with_null_view
1486 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001487
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001488 def test_iterator_pickling2(self):
1489 orig = bytearray(b'abc')
1490 data = list(b'qwerty')
1491 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1492 # initial iterator
1493 itorig = iter(orig)
1494 d = pickle.dumps((itorig, orig), proto)
1495 it, b = pickle.loads(d)
1496 b[:] = data
1497 self.assertEqual(type(it), type(itorig))
1498 self.assertEqual(list(it), data)
1499
1500 # running iterator
1501 next(itorig)
1502 d = pickle.dumps((itorig, orig), proto)
1503 it, b = pickle.loads(d)
1504 b[:] = data
1505 self.assertEqual(type(it), type(itorig))
1506 self.assertEqual(list(it), data[1:])
1507
1508 # empty iterator
1509 for i in range(1, len(orig)):
1510 next(itorig)
1511 d = pickle.dumps((itorig, orig), proto)
1512 it, b = pickle.loads(d)
1513 b[:] = data
1514 self.assertEqual(type(it), type(itorig))
1515 self.assertEqual(list(it), data[len(orig):])
1516
1517 # exhausted iterator
1518 self.assertRaises(StopIteration, next, itorig)
1519 d = pickle.dumps((itorig, orig), proto)
1520 it, b = pickle.loads(d)
1521 b[:] = data
1522 self.assertEqual(list(it), [])
1523
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001524 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001525
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001526 def test_iterator_length_hint(self):
1527 # Issue 27443: __length_hint__ can return negative integer
1528 ba = bytearray(b'ab')
1529 it = iter(ba)
1530 next(it)
1531 ba.clear()
1532 # Shouldn't raise an error
1533 self.assertEqual(list(it), [])
1534
1535
Christian Heimes510711d2008-01-30 11:57:58 +00001536class AssortedBytesTest(unittest.TestCase):
1537 #
1538 # Test various combinations of bytes and bytearray
1539 #
1540
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001541 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001542 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001543 for f in str, repr:
1544 self.assertEqual(f(bytearray()), "bytearray(b'')")
1545 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1546 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1547 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1548 self.assertEqual(f(b"abc"), "b'abc'")
1549 self.assertEqual(f(b"'"), '''b"'"''') # '''
1550 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001551
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001552 @check_bytes_warnings
1553 def test_format(self):
1554 for b in b'abc', bytearray(b'abc'):
1555 self.assertEqual(format(b), str(b))
1556 self.assertEqual(format(b, ''), str(b))
1557 with self.assertRaisesRegex(TypeError,
1558 r'\b%s\b' % re.escape(type(b).__name__)):
1559 format(b, 's')
1560
Christian Heimes510711d2008-01-30 11:57:58 +00001561 def test_compare_bytes_to_bytearray(self):
1562 self.assertEqual(b"abc" == bytes(b"abc"), True)
1563 self.assertEqual(b"ab" != bytes(b"abc"), True)
1564 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1565 self.assertEqual(b"ab" < bytes(b"abc"), True)
1566 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1567 self.assertEqual(b"abc" > bytes(b"ab"), True)
1568
1569 self.assertEqual(b"abc" != bytes(b"abc"), False)
1570 self.assertEqual(b"ab" == bytes(b"abc"), False)
1571 self.assertEqual(b"ab" > bytes(b"abc"), False)
1572 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1573 self.assertEqual(b"abc" < bytes(b"ab"), False)
1574 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1575
1576 self.assertEqual(bytes(b"abc") == b"abc", True)
1577 self.assertEqual(bytes(b"ab") != b"abc", True)
1578 self.assertEqual(bytes(b"ab") <= b"abc", True)
1579 self.assertEqual(bytes(b"ab") < b"abc", True)
1580 self.assertEqual(bytes(b"abc") >= b"ab", True)
1581 self.assertEqual(bytes(b"abc") > b"ab", True)
1582
1583 self.assertEqual(bytes(b"abc") != b"abc", False)
1584 self.assertEqual(bytes(b"ab") == b"abc", False)
1585 self.assertEqual(bytes(b"ab") > b"abc", False)
1586 self.assertEqual(bytes(b"ab") >= b"abc", False)
1587 self.assertEqual(bytes(b"abc") < b"ab", False)
1588 self.assertEqual(bytes(b"abc") <= b"ab", False)
1589
Stefan Krah6e572b82013-01-26 13:06:36 +01001590 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001591 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001592 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001593 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001594 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001595 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001596
1597 def test_from_bytearray(self):
1598 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1599 buf = memoryview(sample)
1600 b = bytearray(buf)
1601 self.assertEqual(b, bytearray(sample))
1602
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001603 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001604 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001605 self.assertEqual(str(b''), "b''")
1606 self.assertEqual(str(b'x'), "b'x'")
1607 self.assertEqual(str(b'\x80'), "b'\\x80'")
1608 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1609 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1610 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001611
1612 def test_literal(self):
1613 tests = [
1614 (b"Wonderful spam", "Wonderful spam"),
1615 (br"Wonderful spam too", "Wonderful spam too"),
1616 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1617 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1618 ]
1619 for b, s in tests:
1620 self.assertEqual(b, bytearray(s, 'latin-1'))
1621 for c in range(128, 256):
1622 self.assertRaises(SyntaxError, eval,
1623 'b"%s"' % chr(c))
1624
Christian Heimes510711d2008-01-30 11:57:58 +00001625 def test_split_bytearray(self):
1626 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1627
1628 def test_rsplit_bytearray(self):
1629 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1630
Georg Brandleb2c9642008-05-30 12:05:02 +00001631 def test_return_self(self):
1632 # bytearray.replace must always return a new bytearray
1633 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001634 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001635
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001636 @unittest.skipUnless(sys.flags.bytes_warning,
1637 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001638 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001639 def bytes_warning():
1640 return test.support.check_warnings(('', BytesWarning))
1641 with bytes_warning():
1642 b'' == ''
1643 with bytes_warning():
1644 '' == b''
1645 with bytes_warning():
1646 b'' != ''
1647 with bytes_warning():
1648 '' != b''
1649 with bytes_warning():
1650 bytearray(b'') == ''
1651 with bytes_warning():
1652 '' == bytearray(b'')
1653 with bytes_warning():
1654 bytearray(b'') != ''
1655 with bytes_warning():
1656 '' != bytearray(b'')
1657 with bytes_warning():
1658 b'\0' == 0
1659 with bytes_warning():
1660 0 == b'\0'
1661 with bytes_warning():
1662 b'\0' != 0
1663 with bytes_warning():
1664 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001665
Guido van Rossumd624f182006-04-24 13:47:05 +00001666 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001667 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001668 # __reversed__? (optimization)
1669
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001670 # XXX More string methods? (Those that don't use character properties)
1671
Neal Norwitz6968b052007-02-27 19:02:19 +00001672 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001673 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001674 # Unfortunately they are all bundled with tests that
1675 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001676
Guido van Rossum254348e2007-11-21 19:29:53 +00001677 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001678 # the rest that make sense (the code can be cleaned up to use modern
1679 # unittest methods at the same time).
1680
Martin Panter152a19c2016-04-06 06:37:17 +00001681class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001682 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001683 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001684
1685 def test_returns_new_copy(self):
1686 val = self.marshal(b'1234')
1687 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001688 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001689 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1690 method = getattr(val, methname)
1691 newval = method(3)
1692 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001693 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001694 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001695 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1696 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1697 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1698 newval = eval(expr)
1699 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001700 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001701 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001702 sep = self.marshal(b'')
1703 newval = sep.join([val])
1704 self.assertEqual(val, newval)
1705 self.assertIsNot(val, newval)
1706
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001707
Christian Heimes510711d2008-01-30 11:57:58 +00001708class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001709 def fixtype(self, obj):
1710 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001711 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001712 return super().fixtype(obj)
1713
Martin Panter152a19c2016-04-06 06:37:17 +00001714 contains_bytes = True
1715
Ezio Melotti0dceb562013-01-10 07:43:26 +02001716class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001717 type2test = bytearray
1718
Ezio Melotti0dceb562013-01-10 07:43:26 +02001719class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001720 type2test = bytes
1721
Georg Brandlc7885542007-03-06 19:16:20 +00001722
Ezio Melotti0dceb562013-01-10 07:43:26 +02001723class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001724
1725 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001726 self.assertTrue(issubclass(self.type2test, self.basetype))
1727 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001728
1729 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001730 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001731
1732 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001733 self.assertTrue(_a == _a)
1734 self.assertTrue(_a != _b)
1735 self.assertTrue(_a < _b)
1736 self.assertTrue(_a <= _b)
1737 self.assertTrue(_b >= _a)
1738 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001739 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001740
1741 # test concat of subclass instances
1742 self.assertEqual(a + b, _a + _b)
1743 self.assertEqual(a + b, a + _b)
1744 self.assertEqual(a + b, _a + b)
1745
1746 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001747 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001748
1749 def test_join(self):
1750 # Make sure join returns a NEW object for single item sequences
1751 # involving a subclass.
1752 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001753 s1 = self.type2test(b"abcd")
1754 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001755 self.assertIsNot(s1, s2)
1756 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001757
1758 # Test reverse, calling join on subclass
1759 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001760 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001761
1762 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001763 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001764 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001765 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001766 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001767 b = pickle.loads(pickle.dumps(a, proto))
1768 self.assertNotEqual(id(a), id(b))
1769 self.assertEqual(a, b)
1770 self.assertEqual(a.x, b.x)
1771 self.assertEqual(a.y, b.y)
1772 self.assertEqual(type(a), type(b))
1773 self.assertEqual(type(a.y), type(b.y))
1774
1775 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001776 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001777 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001778 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001779 for copy_method in (copy.copy, copy.deepcopy):
1780 b = copy_method(a)
1781 self.assertNotEqual(id(a), id(b))
1782 self.assertEqual(a, b)
1783 self.assertEqual(a.x, b.x)
1784 self.assertEqual(a.y, b.y)
1785 self.assertEqual(type(a), type(b))
1786 self.assertEqual(type(a.y), type(b.y))
1787
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001788 def test_fromhex(self):
1789 b = self.type2test.fromhex('1a2B30')
1790 self.assertEqual(b, b'\x1a\x2b\x30')
1791 self.assertIs(type(b), self.type2test)
1792
1793 class B1(self.basetype):
1794 def __new__(cls, value):
1795 me = self.basetype.__new__(cls, value)
1796 me.foo = 'bar'
1797 return me
1798
1799 b = B1.fromhex('1a2B30')
1800 self.assertEqual(b, b'\x1a\x2b\x30')
1801 self.assertIs(type(b), B1)
1802 self.assertEqual(b.foo, 'bar')
1803
1804 class B2(self.basetype):
1805 def __init__(me, *args, **kwargs):
1806 if self.basetype is not bytes:
1807 self.basetype.__init__(me, *args, **kwargs)
1808 me.foo = 'bar'
1809
1810 b = B2.fromhex('1a2B30')
1811 self.assertEqual(b, b'\x1a\x2b\x30')
1812 self.assertIs(type(b), B2)
1813 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001814
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001815
1816class ByteArraySubclass(bytearray):
1817 pass
1818
1819class BytesSubclass(bytes):
1820 pass
1821
Serhiy Storchaka15095802015-11-25 15:47:01 +02001822class OtherBytesSubclass(bytes):
1823 pass
1824
Ezio Melotti0dceb562013-01-10 07:43:26 +02001825class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001826 basetype = bytearray
1827 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001828
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001829 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001830 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001831 def __init__(me, newarg=1, *args, **kwargs):
1832 bytearray.__init__(me, *args, **kwargs)
1833 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001834 x = subclass(4, source=b"abcd")
1835 self.assertEqual(x, b"abcd")
1836 x = subclass(newarg=4, source=b"abcd")
1837 self.assertEqual(x, b"abcd")
1838
1839
Ezio Melotti0dceb562013-01-10 07:43:26 +02001840class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001841 basetype = bytes
1842 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001843
1844
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001845if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001846 unittest.main()