blob: cc433217ce16a1ad1edb929085bee0aae49894cd [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
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001004 def test_bytes_blocking(self):
1005 class IterationBlocked(list):
1006 __bytes__ = None
1007 i = [0, 1, 2, 3]
1008 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1009 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1010
1011 # At least in CPython, because bytes.__new__ and the C API
1012 # PyBytes_FromObject have different fallback rules, integer
1013 # fallback is handled specially, so test separately.
1014 class IntBlocked(int):
1015 __bytes__ = None
1016 self.assertEqual(bytes(3), b'\0\0\0')
1017 self.assertRaises(TypeError, bytes, IntBlocked(3))
1018
1019 # While there is no separately-defined rule for handling bytes
1020 # subclasses differently from other buffer-interface classes,
1021 # an implementation may well special-case them (as CPython 2.x
1022 # str did), so test them separately.
1023 class BytesSubclassBlocked(bytes):
1024 __bytes__ = None
1025 self.assertEqual(bytes(b'ab'), b'ab')
1026 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1027
1028 class BufferBlocked(bytearray):
1029 __bytes__ = None
1030 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1031 self.assertEqual(bytes(ba), b'ab')
1032 self.assertRaises(TypeError, bytes, bb)
1033
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001034
Ezio Melotti0dceb562013-01-10 07:43:26 +02001035class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001036 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001037
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001038 def test_getitem_error(self):
1039 msg = "bytearray indices must be integers or slices"
1040 with self.assertRaisesRegex(TypeError, msg):
1041 bytearray(b'python')['a']
1042
1043 def test_setitem_error(self):
1044 msg = "bytearray indices must be integers or slices"
1045 with self.assertRaisesRegex(TypeError, msg):
1046 b = bytearray(b'python')
1047 b['a'] = "python"
1048
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001049 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001050 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001051
Guido van Rossum254348e2007-11-21 19:29:53 +00001052 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001053 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001054 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001055 tfn = tempfile.mktemp()
1056 try:
1057 # Prepare
1058 with open(tfn, "wb") as f:
1059 f.write(short_sample)
1060 # Test readinto
1061 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001062 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001063 n = f.readinto(b)
1064 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001065 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001066 # Test writing in binary mode
1067 with open(tfn, "wb") as f:
1068 f.write(b)
1069 with open(tfn, "rb") as f:
1070 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001071 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001072 finally:
1073 try:
1074 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001075 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001076 pass
1077
Neal Norwitz6968b052007-02-27 19:02:19 +00001078 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001079 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001080 self.assertEqual(b.reverse(), None)
1081 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001082 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001083 b.reverse()
1084 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001085 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001086 b.reverse()
1087 self.assertFalse(b)
1088
Eli Bendersky4db28d32011-03-03 18:21:02 +00001089 def test_clear(self):
1090 b = bytearray(b'python')
1091 b.clear()
1092 self.assertEqual(b, b'')
1093
1094 b = bytearray(b'')
1095 b.clear()
1096 self.assertEqual(b, b'')
1097
1098 b = bytearray(b'')
1099 b.append(ord('r'))
1100 b.clear()
1101 b.append(ord('p'))
1102 self.assertEqual(b, b'p')
1103
1104 def test_copy(self):
1105 b = bytearray(b'abc')
1106 bb = b.copy()
1107 self.assertEqual(bb, b'abc')
1108
1109 b = bytearray(b'')
1110 bb = b.copy()
1111 self.assertEqual(bb, b'')
1112
1113 # test that it's indeed a copy and not a reference
1114 b = bytearray(b'abc')
1115 bb = b.copy()
1116 self.assertEqual(b, bb)
1117 self.assertIsNot(b, bb)
1118 bb.append(ord('d'))
1119 self.assertEqual(bb, b'abcd')
1120 self.assertEqual(b, b'abc')
1121
Guido van Rossumd624f182006-04-24 13:47:05 +00001122 def test_regexps(self):
1123 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001124 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001125 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001126 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001127
1128 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001129 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001130 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001131 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001132 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001133 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001134 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001135 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001136 try:
1137 b[3] = 0
1138 self.fail("Didn't raise IndexError")
1139 except IndexError:
1140 pass
1141 try:
1142 b[-10] = 0
1143 self.fail("Didn't raise IndexError")
1144 except IndexError:
1145 pass
1146 try:
1147 b[0] = 256
1148 self.fail("Didn't raise ValueError")
1149 except ValueError:
1150 pass
1151 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001152 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001153 self.fail("Didn't raise ValueError")
1154 except ValueError:
1155 pass
1156 try:
1157 b[0] = None
1158 self.fail("Didn't raise TypeError")
1159 except TypeError:
1160 pass
1161
1162 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001163 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001164 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001165 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001166 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001167 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001168 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001170
1171 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001172 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001173 self.assertEqual(list(b), list(range(10)))
1174
Guido van Rossum254348e2007-11-21 19:29:53 +00001175 b[0:5] = bytearray([1, 1, 1, 1, 1])
1176 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001177
1178 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001179 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001180
Guido van Rossum254348e2007-11-21 19:29:53 +00001181 b[0:0] = bytearray([0, 1, 2, 3, 4])
1182 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001183
Guido van Rossum254348e2007-11-21 19:29:53 +00001184 b[-7:-3] = bytearray([100, 101])
1185 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001186
1187 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001188 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001189
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001190 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001191 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 +00001192
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001193 b[3:] = b'foo'
1194 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1195
1196 b[:3] = memoryview(b'foo')
1197 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1198
1199 b[3:4] = []
1200 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1201
1202 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1203 ['a', 'b'], [b'a', b'b'], [[]]]:
1204 with self.assertRaises(TypeError):
1205 b[3:4] = elem
1206
1207 for elem in [[254, 255, 256], [-256, 9000]]:
1208 with self.assertRaises(ValueError):
1209 b[3:4] = elem
1210
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001211 def test_setslice_extend(self):
1212 # Exercise the resizing logic (see issue #19087)
1213 b = bytearray(range(100))
1214 self.assertEqual(list(b), list(range(100)))
1215 del b[:10]
1216 self.assertEqual(list(b), list(range(10, 100)))
1217 b.extend(range(100, 110))
1218 self.assertEqual(list(b), list(range(10, 110)))
1219
Antoine Pitrou25454112015-05-19 20:52:27 +02001220 def test_fifo_overrun(self):
1221 # Test for issue #23985, a buffer overrun when implementing a FIFO
1222 # Build Python in pydebug mode for best results.
1223 b = bytearray(10)
1224 b.pop() # Defeat expanding buffer off-by-one quirk
1225 del b[:1] # Advance start pointer without reallocating
1226 b += bytes(2) # Append exactly the number of deleted bytes
1227 del b # Free memory buffer, allowing pydebug verification
1228
1229 def test_del_expand(self):
1230 # Reducing the size should not expand the buffer (issue #23985)
1231 b = bytearray(10)
1232 size = sys.getsizeof(b)
1233 del b[:1]
1234 self.assertLessEqual(sys.getsizeof(b), size)
1235
Thomas Wouters376446d2006-12-19 08:30:14 +00001236 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001237 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001238 for start in indices:
1239 for stop in indices:
1240 # Skip invalid step 0
1241 for step in indices[1:]:
1242 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001243 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001244 # Make sure we have a slice of exactly the right length,
1245 # but with different data.
1246 data = L[start:stop:step]
1247 data.reverse()
1248 L[start:stop:step] = data
1249 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001250 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001251
Thomas Wouters376446d2006-12-19 08:30:14 +00001252 del L[start:stop:step]
1253 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001254 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001255
Guido van Rossumd624f182006-04-24 13:47:05 +00001256 def test_setslice_trap(self):
1257 # This test verifies that we correctly handle assigning self
1258 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001259 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001260 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001261 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001262
Guido van Rossum13e57212006-04-27 22:54:26 +00001263 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001264 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001265 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001266 b += b"def"
1267 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001268 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001269 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001270 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001271 self.assertEqual(b, b"abcdefxyz")
1272 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001273 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001274 except TypeError:
1275 pass
1276 else:
1277 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001278
1279 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001280 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001281 b1 = b
1282 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001283 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001284 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001285 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001286
1287 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001288 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001289 b1 = b
1290 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001291 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001292 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001293 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001294
Guido van Rossum20188312006-05-05 15:15:40 +00001295 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001296 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001297 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001298 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001299 seq = [alloc]
1300 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001301 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001302 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001303 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001304 if alloc not in seq:
1305 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001306
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001307 def test_init_alloc(self):
1308 b = bytearray()
1309 def g():
1310 for i in range(1, 100):
1311 yield i
1312 a = list(b)
1313 self.assertEqual(a, list(range(1, len(a)+1)))
1314 self.assertEqual(len(b), len(a))
1315 self.assertLessEqual(len(b), i)
1316 alloc = b.__alloc__()
1317 self.assertGreater(alloc, len(b)) # including trailing null byte
1318 b.__init__(g())
1319 self.assertEqual(list(b), list(range(1, 100)))
1320 self.assertEqual(len(b), 99)
1321 alloc = b.__alloc__()
1322 self.assertGreater(alloc, len(b))
1323
Neal Norwitz6968b052007-02-27 19:02:19 +00001324 def test_extend(self):
1325 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001326 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001327 a.extend(a)
1328 self.assertEqual(a, orig + orig)
1329 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001330 a = bytearray(b'')
1331 # Test iterators that don't have a __length_hint__
1332 a.extend(map(int, orig * 25))
1333 a.extend(int(x) for x in orig * 25)
1334 self.assertEqual(a, orig * 50)
1335 self.assertEqual(a[-5:], orig)
1336 a = bytearray(b'')
1337 a.extend(iter(map(int, orig * 50)))
1338 self.assertEqual(a, orig * 50)
1339 self.assertEqual(a[-5:], orig)
1340 a = bytearray(b'')
1341 a.extend(list(map(int, orig * 50)))
1342 self.assertEqual(a, orig * 50)
1343 self.assertEqual(a[-5:], orig)
1344 a = bytearray(b'')
1345 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1346 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1347 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001348 a = bytearray(b'')
1349 a.extend([Indexable(ord('a'))])
1350 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001351
Neal Norwitz6968b052007-02-27 19:02:19 +00001352 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001353 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001354 b.remove(ord('l'))
1355 self.assertEqual(b, b'helo')
1356 b.remove(ord('l'))
1357 self.assertEqual(b, b'heo')
1358 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1359 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001360 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001361 # remove first and last
1362 b.remove(ord('o'))
1363 b.remove(ord('h'))
1364 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001365 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001366 b.remove(Indexable(ord('e')))
1367 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001368
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001369 # test values outside of the ascii range: (0, 127)
1370 c = bytearray([126, 127, 128, 129])
1371 c.remove(127)
1372 self.assertEqual(c, bytes([126, 128, 129]))
1373 c.remove(129)
1374 self.assertEqual(c, bytes([126, 128]))
1375
Neal Norwitz6968b052007-02-27 19:02:19 +00001376 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001377 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001378 self.assertEqual(b.pop(), ord('d'))
1379 self.assertEqual(b.pop(0), ord('w'))
1380 self.assertEqual(b.pop(-2), ord('r'))
1381 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001382 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001383 # test for issue #6846
1384 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001385
1386 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001387 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001388
Neal Norwitz6968b052007-02-27 19:02:19 +00001389 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001390 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001391 b.append(ord('o'))
1392 self.assertEqual(b, b'hello')
1393 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001394 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001395 b.append(ord('A'))
1396 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001397 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001398 b = bytearray()
1399 b.append(Indexable(ord('A')))
1400 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001401
1402 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001403 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001404 b.insert(1, ord('i'))
1405 b.insert(4, ord('i'))
1406 b.insert(-2, ord('i'))
1407 b.insert(1000, ord('i'))
1408 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001409 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001410 b = bytearray()
1411 b.insert(0, Indexable(ord('A')))
1412 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001413
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001414 def test_copied(self):
1415 # Issue 4348. Make sure that operations that don't mutate the array
1416 # copy the bytes.
1417 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001418 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001419
1420 t = bytearray([i for i in range(256)])
1421 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001422 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001423
Guido van Rossum254348e2007-11-21 19:29:53 +00001424 def test_partition_bytearray_doesnt_share_nullstring(self):
1425 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001426 self.assertEqual(b, b"")
1427 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001428 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001429 b += b"!"
1430 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001431 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"")
1434 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001435 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001436 self.assertEqual(b, b"")
1437 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001438 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001439 b += b"!"
1440 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001441 c, b, 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"")
1444
Antoine Pitrou5504e892008-12-06 21:27:53 +00001445 def test_resize_forbidden(self):
1446 # #4509: can't resize a bytearray when there are buffer exports, even
1447 # if it wouldn't reallocate the underlying buffer.
1448 # Furthermore, no destructive changes to the buffer may be applied
1449 # before raising the error.
1450 b = bytearray(range(10))
1451 v = memoryview(b)
1452 def resize(n):
1453 b[1:-1] = range(n + 1, 2*n - 1)
1454 resize(10)
1455 orig = b[:]
1456 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001457 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001458 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001459 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001460 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001461 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001462 # Other operations implying resize
1463 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001464 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001465 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001466 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001467 def delitem():
1468 del b[1]
1469 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001470 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001471 # deleting a non-contiguous slice
1472 def delslice():
1473 b[1:-1:2] = b""
1474 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001475 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001476
Stefan Krah650c1e82015-02-03 21:43:23 +01001477 @test.support.cpython_only
1478 def test_obsolete_write_lock(self):
1479 from _testcapi import getbuffer_with_null_view
1480 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001481
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001482 def test_iterator_pickling2(self):
1483 orig = bytearray(b'abc')
1484 data = list(b'qwerty')
1485 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1486 # initial iterator
1487 itorig = iter(orig)
1488 d = pickle.dumps((itorig, orig), proto)
1489 it, b = pickle.loads(d)
1490 b[:] = data
1491 self.assertEqual(type(it), type(itorig))
1492 self.assertEqual(list(it), data)
1493
1494 # running iterator
1495 next(itorig)
1496 d = pickle.dumps((itorig, orig), proto)
1497 it, b = pickle.loads(d)
1498 b[:] = data
1499 self.assertEqual(type(it), type(itorig))
1500 self.assertEqual(list(it), data[1:])
1501
1502 # empty iterator
1503 for i in range(1, len(orig)):
1504 next(itorig)
1505 d = pickle.dumps((itorig, orig), proto)
1506 it, b = pickle.loads(d)
1507 b[:] = data
1508 self.assertEqual(type(it), type(itorig))
1509 self.assertEqual(list(it), data[len(orig):])
1510
1511 # exhausted iterator
1512 self.assertRaises(StopIteration, next, itorig)
1513 d = pickle.dumps((itorig, orig), proto)
1514 it, b = pickle.loads(d)
1515 b[:] = data
1516 self.assertEqual(list(it), [])
1517
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001518 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001519
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001520 def test_iterator_length_hint(self):
1521 # Issue 27443: __length_hint__ can return negative integer
1522 ba = bytearray(b'ab')
1523 it = iter(ba)
1524 next(it)
1525 ba.clear()
1526 # Shouldn't raise an error
1527 self.assertEqual(list(it), [])
1528
1529
Christian Heimes510711d2008-01-30 11:57:58 +00001530class AssortedBytesTest(unittest.TestCase):
1531 #
1532 # Test various combinations of bytes and bytearray
1533 #
1534
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001535 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001536 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001537 for f in str, repr:
1538 self.assertEqual(f(bytearray()), "bytearray(b'')")
1539 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1540 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1541 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1542 self.assertEqual(f(b"abc"), "b'abc'")
1543 self.assertEqual(f(b"'"), '''b"'"''') # '''
1544 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001545
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001546 @check_bytes_warnings
1547 def test_format(self):
1548 for b in b'abc', bytearray(b'abc'):
1549 self.assertEqual(format(b), str(b))
1550 self.assertEqual(format(b, ''), str(b))
1551 with self.assertRaisesRegex(TypeError,
1552 r'\b%s\b' % re.escape(type(b).__name__)):
1553 format(b, 's')
1554
Christian Heimes510711d2008-01-30 11:57:58 +00001555 def test_compare_bytes_to_bytearray(self):
1556 self.assertEqual(b"abc" == bytes(b"abc"), True)
1557 self.assertEqual(b"ab" != bytes(b"abc"), True)
1558 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1559 self.assertEqual(b"ab" < bytes(b"abc"), True)
1560 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1561 self.assertEqual(b"abc" > bytes(b"ab"), True)
1562
1563 self.assertEqual(b"abc" != bytes(b"abc"), False)
1564 self.assertEqual(b"ab" == bytes(b"abc"), False)
1565 self.assertEqual(b"ab" > bytes(b"abc"), False)
1566 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1567 self.assertEqual(b"abc" < bytes(b"ab"), False)
1568 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1569
1570 self.assertEqual(bytes(b"abc") == b"abc", True)
1571 self.assertEqual(bytes(b"ab") != b"abc", True)
1572 self.assertEqual(bytes(b"ab") <= b"abc", True)
1573 self.assertEqual(bytes(b"ab") < b"abc", True)
1574 self.assertEqual(bytes(b"abc") >= b"ab", True)
1575 self.assertEqual(bytes(b"abc") > b"ab", True)
1576
1577 self.assertEqual(bytes(b"abc") != b"abc", False)
1578 self.assertEqual(bytes(b"ab") == b"abc", False)
1579 self.assertEqual(bytes(b"ab") > b"abc", False)
1580 self.assertEqual(bytes(b"ab") >= b"abc", False)
1581 self.assertEqual(bytes(b"abc") < b"ab", False)
1582 self.assertEqual(bytes(b"abc") <= b"ab", False)
1583
Stefan Krah6e572b82013-01-26 13:06:36 +01001584 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001585 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001586 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001587 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001588 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001589 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001590
1591 def test_from_bytearray(self):
1592 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1593 buf = memoryview(sample)
1594 b = bytearray(buf)
1595 self.assertEqual(b, bytearray(sample))
1596
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001597 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001598 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001599 self.assertEqual(str(b''), "b''")
1600 self.assertEqual(str(b'x'), "b'x'")
1601 self.assertEqual(str(b'\x80'), "b'\\x80'")
1602 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1603 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1604 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001605
1606 def test_literal(self):
1607 tests = [
1608 (b"Wonderful spam", "Wonderful spam"),
1609 (br"Wonderful spam too", "Wonderful spam too"),
1610 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1611 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1612 ]
1613 for b, s in tests:
1614 self.assertEqual(b, bytearray(s, 'latin-1'))
1615 for c in range(128, 256):
1616 self.assertRaises(SyntaxError, eval,
1617 'b"%s"' % chr(c))
1618
Christian Heimes510711d2008-01-30 11:57:58 +00001619 def test_split_bytearray(self):
1620 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1621
1622 def test_rsplit_bytearray(self):
1623 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1624
Georg Brandleb2c9642008-05-30 12:05:02 +00001625 def test_return_self(self):
1626 # bytearray.replace must always return a new bytearray
1627 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001628 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001629
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001630 @unittest.skipUnless(sys.flags.bytes_warning,
1631 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001632 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001633 def bytes_warning():
1634 return test.support.check_warnings(('', BytesWarning))
1635 with bytes_warning():
1636 b'' == ''
1637 with bytes_warning():
1638 '' == b''
1639 with bytes_warning():
1640 b'' != ''
1641 with bytes_warning():
1642 '' != b''
1643 with bytes_warning():
1644 bytearray(b'') == ''
1645 with bytes_warning():
1646 '' == bytearray(b'')
1647 with bytes_warning():
1648 bytearray(b'') != ''
1649 with bytes_warning():
1650 '' != bytearray(b'')
1651 with bytes_warning():
1652 b'\0' == 0
1653 with bytes_warning():
1654 0 == b'\0'
1655 with bytes_warning():
1656 b'\0' != 0
1657 with bytes_warning():
1658 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001659
Guido van Rossumd624f182006-04-24 13:47:05 +00001660 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001661 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001662 # __reversed__? (optimization)
1663
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001664 # XXX More string methods? (Those that don't use character properties)
1665
Neal Norwitz6968b052007-02-27 19:02:19 +00001666 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001667 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001668 # Unfortunately they are all bundled with tests that
1669 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001670
Guido van Rossum254348e2007-11-21 19:29:53 +00001671 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001672 # the rest that make sense (the code can be cleaned up to use modern
1673 # unittest methods at the same time).
1674
Martin Panter152a19c2016-04-06 06:37:17 +00001675class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001676 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001677 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001678
1679 def test_returns_new_copy(self):
1680 val = self.marshal(b'1234')
1681 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001682 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001683 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1684 method = getattr(val, methname)
1685 newval = method(3)
1686 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001687 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001688 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001689 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1690 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1691 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1692 newval = eval(expr)
1693 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001694 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001695 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001696 sep = self.marshal(b'')
1697 newval = sep.join([val])
1698 self.assertEqual(val, newval)
1699 self.assertIsNot(val, newval)
1700
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001701
Christian Heimes510711d2008-01-30 11:57:58 +00001702class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001703 def fixtype(self, obj):
1704 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001705 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001706 return super().fixtype(obj)
1707
Martin Panter152a19c2016-04-06 06:37:17 +00001708 contains_bytes = True
1709
Ezio Melotti0dceb562013-01-10 07:43:26 +02001710class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001711 type2test = bytearray
1712
Ezio Melotti0dceb562013-01-10 07:43:26 +02001713class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001714 type2test = bytes
1715
Georg Brandlc7885542007-03-06 19:16:20 +00001716
Ezio Melotti0dceb562013-01-10 07:43:26 +02001717class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001718
1719 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001720 self.assertTrue(issubclass(self.type2test, self.basetype))
1721 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001722
1723 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001724 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001725
1726 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001727 self.assertTrue(_a == _a)
1728 self.assertTrue(_a != _b)
1729 self.assertTrue(_a < _b)
1730 self.assertTrue(_a <= _b)
1731 self.assertTrue(_b >= _a)
1732 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001733 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001734
1735 # test concat of subclass instances
1736 self.assertEqual(a + b, _a + _b)
1737 self.assertEqual(a + b, a + _b)
1738 self.assertEqual(a + b, _a + b)
1739
1740 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001741 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001742
1743 def test_join(self):
1744 # Make sure join returns a NEW object for single item sequences
1745 # involving a subclass.
1746 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001747 s1 = self.type2test(b"abcd")
1748 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001749 self.assertIsNot(s1, s2)
1750 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001751
1752 # Test reverse, calling join on subclass
1753 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001754 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001755
1756 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001757 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001758 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001759 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001760 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001761 b = pickle.loads(pickle.dumps(a, proto))
1762 self.assertNotEqual(id(a), id(b))
1763 self.assertEqual(a, b)
1764 self.assertEqual(a.x, b.x)
1765 self.assertEqual(a.y, b.y)
1766 self.assertEqual(type(a), type(b))
1767 self.assertEqual(type(a.y), type(b.y))
1768
1769 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001770 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001771 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001772 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001773 for copy_method in (copy.copy, copy.deepcopy):
1774 b = copy_method(a)
1775 self.assertNotEqual(id(a), id(b))
1776 self.assertEqual(a, b)
1777 self.assertEqual(a.x, b.x)
1778 self.assertEqual(a.y, b.y)
1779 self.assertEqual(type(a), type(b))
1780 self.assertEqual(type(a.y), type(b.y))
1781
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001782 def test_fromhex(self):
1783 b = self.type2test.fromhex('1a2B30')
1784 self.assertEqual(b, b'\x1a\x2b\x30')
1785 self.assertIs(type(b), self.type2test)
1786
1787 class B1(self.basetype):
1788 def __new__(cls, value):
1789 me = self.basetype.__new__(cls, value)
1790 me.foo = 'bar'
1791 return me
1792
1793 b = B1.fromhex('1a2B30')
1794 self.assertEqual(b, b'\x1a\x2b\x30')
1795 self.assertIs(type(b), B1)
1796 self.assertEqual(b.foo, 'bar')
1797
1798 class B2(self.basetype):
1799 def __init__(me, *args, **kwargs):
1800 if self.basetype is not bytes:
1801 self.basetype.__init__(me, *args, **kwargs)
1802 me.foo = 'bar'
1803
1804 b = B2.fromhex('1a2B30')
1805 self.assertEqual(b, b'\x1a\x2b\x30')
1806 self.assertIs(type(b), B2)
1807 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001808
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001809
1810class ByteArraySubclass(bytearray):
1811 pass
1812
1813class BytesSubclass(bytes):
1814 pass
1815
Serhiy Storchaka15095802015-11-25 15:47:01 +02001816class OtherBytesSubclass(bytes):
1817 pass
1818
Ezio Melotti0dceb562013-01-10 07:43:26 +02001819class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001820 basetype = bytearray
1821 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001822
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001823 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001824 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001825 def __init__(me, newarg=1, *args, **kwargs):
1826 bytearray.__init__(me, *args, **kwargs)
1827 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001828 x = subclass(4, source=b"abcd")
1829 self.assertEqual(x, b"abcd")
1830 x = subclass(newarg=4, source=b"abcd")
1831 self.assertEqual(x, b"abcd")
1832
1833
Ezio Melotti0dceb562013-01-10 07:43:26 +02001834class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001835 basetype = bytes
1836 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001837
1838
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001839if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001840 unittest.main()