blob: 274616bf998dbc41b82b3cf37281e2a0f7447c60 [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
Miss Islington (bot)d0756422018-10-13 11:02:23 -070072 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)
Miss Islington (bot)d0756422018-10-13 11:02:23 -070075 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
Miss Islington (bot)7f34d552018-10-21 05:55:52 -0700116 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")
Miss Islington (bot)d0756422018-10-13 11:02:23 -0700143 a = self.type2test(b"\x01\x02\x03")
144 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900145
Miss Islington (bot)13708322018-10-14 14:26:28 -0700146 # 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 Storchaka83cf99d2014-12-02 09:24:06 +0200172 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
173 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
174 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
175 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
176 self.assertRaises(TypeError, self.type2test, '')
177 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
178 self.assertRaises(TypeError, self.type2test, '', b'ascii')
179 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000180
181 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000182 self.assertRaises(ValueError, self.type2test, [-1])
183 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
184 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
185 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
186 self.assertRaises(ValueError, self.type2test, [-10**100])
187 self.assertRaises(ValueError, self.type2test, [256])
188 self.assertRaises(ValueError, self.type2test, [257])
189 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
190 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
191 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000192
Antoine Pitroucc231542014-11-02 18:40:09 +0100193 @bigaddrspacetest
194 def test_constructor_overflow(self):
195 size = MAX_Py_ssize_t
196 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
197 try:
198 # Should either pass or raise an error (e.g. on debug builds with
199 # additional malloc() overhead), but shouldn't crash.
200 bytearray(size - 4)
201 except (OverflowError, MemoryError):
202 pass
203
Miss Islington (bot)13708322018-10-14 14:26:28 -0700204 def test_constructor_exceptions(self):
205 # Issue #34974: bytes and bytearray constructors replace unexpected
206 # exceptions.
207 class BadInt:
208 def __index__(self):
209 1/0
210 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
211 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
212
213 class BadIterable:
214 def __iter__(self):
215 1/0
216 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
217
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000218 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000219 b1 = self.type2test([1, 2, 3])
220 b2 = self.type2test([1, 2, 3])
221 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000222
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000223 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000224 self.assertTrue(b2 != b3)
225 self.assertTrue(b1 <= b2)
226 self.assertTrue(b1 <= b3)
227 self.assertTrue(b1 < b3)
228 self.assertTrue(b1 >= b2)
229 self.assertTrue(b3 >= b2)
230 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000231
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000232 self.assertFalse(b1 != b2)
233 self.assertFalse(b2 == b3)
234 self.assertFalse(b1 > b2)
235 self.assertFalse(b1 > b3)
236 self.assertFalse(b1 >= b3)
237 self.assertFalse(b1 < b2)
238 self.assertFalse(b3 < b2)
239 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000240
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000241 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000242 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000243 # Byte comparisons with unicode should always fail!
244 # Test this for all expected byte orders and Unicode character
245 # sizes.
246 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
247 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
248 False)
249 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
250 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
251 False)
252 self.assertEqual(self.type2test() == str(), False)
253 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000254
255 def test_reversed(self):
256 input = list(map(ord, "Hello"))
257 b = self.type2test(input)
258 output = list(reversed(b))
259 input.reverse()
260 self.assertEqual(output, input)
261
262 def test_getslice(self):
263 def by(s):
264 return self.type2test(map(ord, s))
265 b = by("Hello, world")
266
267 self.assertEqual(b[:5], by("Hello"))
268 self.assertEqual(b[1:5], by("ello"))
269 self.assertEqual(b[5:7], by(", "))
270 self.assertEqual(b[7:], by("world"))
271 self.assertEqual(b[7:12], by("world"))
272 self.assertEqual(b[7:100], by("world"))
273
274 self.assertEqual(b[:-7], by("Hello"))
275 self.assertEqual(b[-11:-7], by("ello"))
276 self.assertEqual(b[-7:-5], by(", "))
277 self.assertEqual(b[-5:], by("world"))
278 self.assertEqual(b[-5:12], by("world"))
279 self.assertEqual(b[-5:100], by("world"))
280 self.assertEqual(b[-100:5], by("Hello"))
281
282 def test_extended_getslice(self):
283 # Test extended slicing by comparing with list slicing.
284 L = list(range(255))
285 b = self.type2test(L)
286 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
287 for start in indices:
288 for stop in indices:
289 # Skip step 0 (invalid)
290 for step in indices[1:]:
291 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
292
293 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000294 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000295 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000296 b = self.type2test(sample, enc)
297 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000298 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
299 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000300 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000301
302 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300303 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000304 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000305 b = self.type2test(sample, enc)
306 self.assertEqual(b.decode(enc), sample)
307 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000308 b = self.type2test(sample, "latin-1")
309 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
310 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
311 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000312 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000313 # Default encoding is utf-8
314 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000315
316 def test_from_int(self):
317 b = self.type2test(0)
318 self.assertEqual(b, self.type2test())
319 b = self.type2test(10)
320 self.assertEqual(b, self.type2test([0]*10))
321 b = self.type2test(10000)
322 self.assertEqual(b, self.type2test([0]*10000))
323
324 def test_concat(self):
325 b1 = self.type2test(b"abc")
326 b2 = self.type2test(b"def")
327 self.assertEqual(b1 + b2, b"abcdef")
328 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
329 self.assertEqual(bytes(b"def") + b1, b"defabc")
330 self.assertRaises(TypeError, lambda: b1 + "def")
331 self.assertRaises(TypeError, lambda: "abc" + b2)
332
333 def test_repeat(self):
334 for b in b"abc", self.type2test(b"abc"):
335 self.assertEqual(b * 3, b"abcabcabc")
336 self.assertEqual(b * 0, b"")
337 self.assertEqual(b * -1, b"")
338 self.assertRaises(TypeError, lambda: b * 3.14)
339 self.assertRaises(TypeError, lambda: 3.14 * b)
340 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000341 with self.assertRaises((OverflowError, MemoryError)):
342 c = b * sys.maxsize
343 with self.assertRaises((OverflowError, MemoryError)):
344 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000345
346 def test_repeat_1char(self):
347 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
348
349 def test_contains(self):
350 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000351 self.assertIn(ord('a'), b)
352 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000353 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000354 self.assertRaises(ValueError, lambda: 300 in b)
355 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300356 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000357 self.assertRaises(TypeError, lambda: None in b)
358 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
359 self.assertRaises(TypeError, lambda: "a" in b)
360 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000361 self.assertIn(f(b""), b)
362 self.assertIn(f(b"a"), b)
363 self.assertIn(f(b"b"), b)
364 self.assertIn(f(b"c"), b)
365 self.assertIn(f(b"ab"), b)
366 self.assertIn(f(b"bc"), b)
367 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000368 self.assertNotIn(f(b"ac"), b)
369 self.assertNotIn(f(b"d"), b)
370 self.assertNotIn(f(b"dab"), b)
371 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000372
373 def test_fromhex(self):
374 self.assertRaises(TypeError, self.type2test.fromhex)
375 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000376 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000377 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000378 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
379 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200380
381 # check that ASCII whitespace is ignored
382 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
383 for c in "\x09\x0A\x0B\x0C\x0D\x20":
384 self.assertEqual(self.type2test.fromhex(c), self.type2test())
385 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
386 self.assertRaises(ValueError, self.type2test.fromhex, c)
387
Ezio Melottib3aedd42010-11-20 19:04:17 +0000388 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000389 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
390 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
391 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
392 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
393 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
394 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
395
Victor Stinner2bf89932015-10-14 11:25:33 +0200396 for data, pos in (
397 # invalid first hexadecimal character
398 ('12 x4 56', 3),
399 # invalid second hexadecimal character
400 ('12 3x 56', 4),
401 # two invalid hexadecimal characters
402 ('12 xy 56', 3),
403 # test non-ASCII string
404 ('12 3\xff 56', 4),
405 ):
406 with self.assertRaises(ValueError) as cm:
407 self.type2test.fromhex(data)
408 self.assertIn('at position %s' % pos, str(cm.exception))
409
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000410 def test_hex(self):
411 self.assertRaises(TypeError, self.type2test.hex)
412 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000413 self.assertEqual(self.type2test(b"").hex(), "")
414 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
415 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
416 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000417
Christian Heimes510711d2008-01-30 11:57:58 +0000418 def test_join(self):
419 self.assertEqual(self.type2test(b"").join([]), b"")
420 self.assertEqual(self.type2test(b"").join([b""]), b"")
421 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
422 lst = list(map(self.type2test, lst))
423 self.assertEqual(self.type2test(b"").join(lst), b"abc")
424 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
425 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200426 dot_join = self.type2test(b".:").join
427 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
428 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
429 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
430 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
431 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
432 # Stress it with many items
433 seq = [b"abc"] * 1000
434 expected = b"abc" + b".:abc" * 999
435 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400436 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200437 # Error handling and cleanup when some item in the middle of the
438 # sequence has the wrong type.
439 with self.assertRaises(TypeError):
440 dot_join([bytearray(b"ab"), "cd", b"ef"])
441 with self.assertRaises(TypeError):
442 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000443
Christian Heimes510711d2008-01-30 11:57:58 +0000444 def test_count(self):
445 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200446 i = 105
447 p = 112
448 w = 119
449
Christian Heimes510711d2008-01-30 11:57:58 +0000450 self.assertEqual(b.count(b'i'), 4)
451 self.assertEqual(b.count(b'ss'), 2)
452 self.assertEqual(b.count(b'w'), 0)
453
Antoine Pitrouac65d962011-10-20 23:54:17 +0200454 self.assertEqual(b.count(i), 4)
455 self.assertEqual(b.count(w), 0)
456
457 self.assertEqual(b.count(b'i', 6), 2)
458 self.assertEqual(b.count(b'p', 6), 2)
459 self.assertEqual(b.count(b'i', 1, 3), 1)
460 self.assertEqual(b.count(b'p', 7, 9), 1)
461
462 self.assertEqual(b.count(i, 6), 2)
463 self.assertEqual(b.count(p, 6), 2)
464 self.assertEqual(b.count(i, 1, 3), 1)
465 self.assertEqual(b.count(p, 7, 9), 1)
466
Christian Heimes510711d2008-01-30 11:57:58 +0000467 def test_startswith(self):
468 b = self.type2test(b'hello')
469 self.assertFalse(self.type2test().startswith(b"anything"))
470 self.assertTrue(b.startswith(b"hello"))
471 self.assertTrue(b.startswith(b"hel"))
472 self.assertTrue(b.startswith(b"h"))
473 self.assertFalse(b.startswith(b"hellow"))
474 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300475 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300476 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300477 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300478 self.assertIn('bytes', exc)
479 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000480
481 def test_endswith(self):
482 b = self.type2test(b'hello')
483 self.assertFalse(bytearray().endswith(b"anything"))
484 self.assertTrue(b.endswith(b"hello"))
485 self.assertTrue(b.endswith(b"llo"))
486 self.assertTrue(b.endswith(b"o"))
487 self.assertFalse(b.endswith(b"whello"))
488 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300489 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300490 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300491 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300492 self.assertIn('bytes', exc)
493 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000494
495 def test_find(self):
496 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200497 i = 105
498 w = 119
499
Christian Heimes510711d2008-01-30 11:57:58 +0000500 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000501 self.assertEqual(b.find(b'w'), -1)
502 self.assertEqual(b.find(b'mississippian'), -1)
503
Antoine Pitrouac65d962011-10-20 23:54:17 +0200504 self.assertEqual(b.find(i), 1)
505 self.assertEqual(b.find(w), -1)
506
507 self.assertEqual(b.find(b'ss', 3), 5)
508 self.assertEqual(b.find(b'ss', 1, 7), 2)
509 self.assertEqual(b.find(b'ss', 1, 3), -1)
510
511 self.assertEqual(b.find(i, 6), 7)
512 self.assertEqual(b.find(i, 1, 3), 1)
513 self.assertEqual(b.find(w, 1, 3), -1)
514
Victor Stinnerf8eac002011-12-18 01:17:41 +0100515 for index in (-1, 256, sys.maxsize + 1):
516 self.assertRaisesRegex(
517 ValueError, r'byte must be in range\(0, 256\)',
518 b.find, index)
519
Christian Heimes510711d2008-01-30 11:57:58 +0000520 def test_rfind(self):
521 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200522 i = 105
523 w = 119
524
Christian Heimes510711d2008-01-30 11:57:58 +0000525 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000526 self.assertEqual(b.rfind(b'w'), -1)
527 self.assertEqual(b.rfind(b'mississippian'), -1)
528
Antoine Pitrouac65d962011-10-20 23:54:17 +0200529 self.assertEqual(b.rfind(i), 10)
530 self.assertEqual(b.rfind(w), -1)
531
532 self.assertEqual(b.rfind(b'ss', 3), 5)
533 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
534
535 self.assertEqual(b.rfind(i, 1, 3), 1)
536 self.assertEqual(b.rfind(i, 3, 9), 7)
537 self.assertEqual(b.rfind(w, 1, 3), -1)
538
Christian Heimes510711d2008-01-30 11:57:58 +0000539 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200540 b = self.type2test(b'mississippi')
541 i = 105
542 w = 119
543
544 self.assertEqual(b.index(b'ss'), 2)
545 self.assertRaises(ValueError, b.index, b'w')
546 self.assertRaises(ValueError, b.index, b'mississippian')
547
548 self.assertEqual(b.index(i), 1)
549 self.assertRaises(ValueError, b.index, w)
550
551 self.assertEqual(b.index(b'ss', 3), 5)
552 self.assertEqual(b.index(b'ss', 1, 7), 2)
553 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
554
555 self.assertEqual(b.index(i, 6), 7)
556 self.assertEqual(b.index(i, 1, 3), 1)
557 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000558
559 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200560 b = self.type2test(b'mississippi')
561 i = 105
562 w = 119
563
564 self.assertEqual(b.rindex(b'ss'), 5)
565 self.assertRaises(ValueError, b.rindex, b'w')
566 self.assertRaises(ValueError, b.rindex, b'mississippian')
567
568 self.assertEqual(b.rindex(i), 10)
569 self.assertRaises(ValueError, b.rindex, w)
570
571 self.assertEqual(b.rindex(b'ss', 3), 5)
572 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
573
574 self.assertEqual(b.rindex(i, 1, 3), 1)
575 self.assertEqual(b.rindex(i, 3, 9), 7)
576 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000577
Ethan Furmanb95b5612015-01-23 20:05:18 -0800578 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300579 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800580 orig = b
581 b = b % b'world'
582 self.assertEqual(b, b'hello, world!')
583 self.assertEqual(orig, b'hello, %b!')
584 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300585 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800586 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200587 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200588 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800589 # issue 29714
590 b = self.type2test(b'hello,\x00%b!')
591 b = b % b'world'
592 self.assertEqual(b, b'hello,\x00world!')
593 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800594
595 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300596 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800597 orig = b
598 b %= b'world'
599 self.assertEqual(b, b'hello, world!')
600 self.assertEqual(orig, b'hello, %b!')
601 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300602 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800603 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200604 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200605 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800606 # issue 29714
607 b = self.type2test(b'hello,\x00%b!')
608 b %= b'world'
609 self.assertEqual(b, b'hello,\x00world!')
610 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300611
612 def test_rmod(self):
613 with self.assertRaises(TypeError):
614 object() % self.type2test(b'abc')
615 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800616
Christian Heimes510711d2008-01-30 11:57:58 +0000617 def test_replace(self):
618 b = self.type2test(b'mississippi')
619 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
620 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
621
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300622 def test_replace_int_error(self):
623 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
624
Christian Heimes510711d2008-01-30 11:57:58 +0000625 def test_split_string_error(self):
626 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300627 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
628
629 def test_split_int_error(self):
630 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
631 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000632
Antoine Pitrouf8453022010-01-12 22:05:42 +0000633 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000634 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
635 b = self.type2test(b)
636 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000637 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
638 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
639
Christian Heimes510711d2008-01-30 11:57:58 +0000640 def test_rsplit_unicodewhitespace(self):
641 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000642 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
643
644 def test_partition(self):
645 b = self.type2test(b'mississippi')
646 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000647 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000648
649 def test_rpartition(self):
650 b = self.type2test(b'mississippi')
651 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
652 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000653 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000654
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300655 def test_partition_string_error(self):
656 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
657 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
658
659 def test_partition_int_error(self):
660 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
661 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
662
Christian Heimes510711d2008-01-30 11:57:58 +0000663 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000664 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000665 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
666 b = self.type2test(b)
667 ps = pickle.dumps(b, proto)
668 q = pickle.loads(ps)
669 self.assertEqual(b, q)
670
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000671 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200672 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
673 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
674 it = itorg = iter(self.type2test(b))
675 data = list(self.type2test(b))
676 d = pickle.dumps(it, proto)
677 it = pickle.loads(d)
678 self.assertEqual(type(itorg), type(it))
679 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000680
Serhiy Storchakabad12572014-12-15 14:03:42 +0200681 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200682 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200683 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200684 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200685 d = pickle.dumps(it, proto)
686 it = pickle.loads(d)
687 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000688
Christian Heimes510711d2008-01-30 11:57:58 +0000689 def test_strip_bytearray(self):
690 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
691 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
692 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
693
694 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300695 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
696 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
697 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
698
699 def test_strip_int_error(self):
700 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
701 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
702 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000703
Eli Bendersky906b88f2011-07-29 07:05:08 +0300704 def test_center(self):
705 # Fill character can be either bytes or bytearray (issue 12380)
706 b = self.type2test(b'abc')
707 for fill_type in (bytes, bytearray):
708 self.assertEqual(b.center(7, fill_type(b'-')),
709 self.type2test(b'--abc--'))
710
711 def test_ljust(self):
712 # Fill character can be either bytes or bytearray (issue 12380)
713 b = self.type2test(b'abc')
714 for fill_type in (bytes, bytearray):
715 self.assertEqual(b.ljust(7, fill_type(b'-')),
716 self.type2test(b'abc----'))
717
718 def test_rjust(self):
719 # Fill character can be either bytes or bytearray (issue 12380)
720 b = self.type2test(b'abc')
721 for fill_type in (bytes, bytearray):
722 self.assertEqual(b.rjust(7, fill_type(b'-')),
723 self.type2test(b'----abc'))
724
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300725 def test_xjust_int_error(self):
726 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
727 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
728 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
729
Christian Heimes510711d2008-01-30 11:57:58 +0000730 def test_ord(self):
731 b = self.type2test(b'\0A\x7f\x80\xff')
732 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
733 [0, 65, 127, 128, 255])
734
Georg Brandlabc38772009-04-12 15:51:51 +0000735 def test_maketrans(self):
736 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 +0000737 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000738 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'
739 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000740 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
741 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
742
Jesus Ceaac451502011-04-20 17:09:23 +0200743 def test_none_arguments(self):
744 # issue 11828
745 b = self.type2test(b'hello')
746 l = self.type2test(b'l')
747 h = self.type2test(b'h')
748 x = self.type2test(b'x')
749 o = self.type2test(b'o')
750
751 self.assertEqual(2, b.find(l, None))
752 self.assertEqual(3, b.find(l, -2, None))
753 self.assertEqual(2, b.find(l, None, -2))
754 self.assertEqual(0, b.find(h, None, None))
755
756 self.assertEqual(3, b.rfind(l, None))
757 self.assertEqual(3, b.rfind(l, -2, None))
758 self.assertEqual(2, b.rfind(l, None, -2))
759 self.assertEqual(0, b.rfind(h, None, None))
760
761 self.assertEqual(2, b.index(l, None))
762 self.assertEqual(3, b.index(l, -2, None))
763 self.assertEqual(2, b.index(l, None, -2))
764 self.assertEqual(0, b.index(h, None, None))
765
766 self.assertEqual(3, b.rindex(l, None))
767 self.assertEqual(3, b.rindex(l, -2, None))
768 self.assertEqual(2, b.rindex(l, None, -2))
769 self.assertEqual(0, b.rindex(h, None, None))
770
771 self.assertEqual(2, b.count(l, None))
772 self.assertEqual(1, b.count(l, -2, None))
773 self.assertEqual(1, b.count(l, None, -2))
774 self.assertEqual(0, b.count(x, None, None))
775
776 self.assertEqual(True, b.endswith(o, None))
777 self.assertEqual(True, b.endswith(o, -2, None))
778 self.assertEqual(True, b.endswith(l, None, -2))
779 self.assertEqual(False, b.endswith(x, None, None))
780
781 self.assertEqual(True, b.startswith(h, None))
782 self.assertEqual(True, b.startswith(l, -2, None))
783 self.assertEqual(True, b.startswith(h, None, -2))
784 self.assertEqual(False, b.startswith(x, None, None))
785
Antoine Pitrouac65d962011-10-20 23:54:17 +0200786 def test_integer_arguments_out_of_byte_range(self):
787 b = self.type2test(b'hello')
788
789 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
790 self.assertRaises(ValueError, method, -1)
791 self.assertRaises(ValueError, method, 256)
792 self.assertRaises(ValueError, method, 9999)
793
Jesus Ceaac451502011-04-20 17:09:23 +0200794 def test_find_etc_raise_correct_error_messages(self):
795 # issue 11828
796 b = self.type2test(b'hello')
797 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300798 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200799 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300800 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200801 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300802 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200803 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300804 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200805 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300806 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200807 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300808 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200809 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300810 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200811 x, None, None, None)
812
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300813 def test_free_after_iterating(self):
814 test.support.check_free_after_iterating(self, iter, self.type2test)
815 test.support.check_free_after_iterating(self, reversed, self.type2test)
816
Martin Panter1b6c6da2016-08-27 08:35:02 +0000817 def test_translate(self):
818 b = self.type2test(b'hello')
819 rosetta = bytearray(range(256))
820 rosetta[ord('o')] = ord('e')
821
822 self.assertRaises(TypeError, b.translate)
823 self.assertRaises(TypeError, b.translate, None, None)
824 self.assertRaises(ValueError, b.translate, bytes(range(255)))
825
826 c = b.translate(rosetta, b'hello')
827 self.assertEqual(b, b'hello')
828 self.assertIsInstance(c, self.type2test)
829
830 c = b.translate(rosetta)
831 d = b.translate(rosetta, b'')
832 self.assertEqual(c, d)
833 self.assertEqual(c, b'helle')
834
835 c = b.translate(rosetta, b'l')
836 self.assertEqual(c, b'hee')
837 c = b.translate(None, b'e')
838 self.assertEqual(c, b'hllo')
839
840 # test delete as a keyword argument
841 c = b.translate(rosetta, delete=b'')
842 self.assertEqual(c, b'helle')
843 c = b.translate(rosetta, delete=b'l')
844 self.assertEqual(c, b'hee')
845 c = b.translate(None, delete=b'e')
846 self.assertEqual(c, b'hllo')
847
Christian Heimes510711d2008-01-30 11:57:58 +0000848
Ezio Melotti0dceb562013-01-10 07:43:26 +0200849class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000850 type2test = bytes
851
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400852 def test_getitem_error(self):
853 msg = "byte indices must be integers or slices"
854 with self.assertRaisesRegex(TypeError, msg):
855 b'python'['a']
856
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000857 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200858 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000859 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000860 self.assertRaises(TypeError, f.readinto, b"")
861
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000862 def test_custom(self):
863 class A:
864 def __bytes__(self):
865 return b'abc'
866 self.assertEqual(bytes(A()), b'abc')
867 class A: pass
868 self.assertRaises(TypeError, bytes, A())
869 class A:
870 def __bytes__(self):
871 return None
872 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600873 class A:
874 def __bytes__(self):
875 return b'a'
876 def __index__(self):
877 return 42
878 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200879 # Issue #25766
880 class A(str):
881 def __bytes__(self):
882 return b'abc'
883 self.assertEqual(bytes(A('\u20ac')), b'abc')
884 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200885 # Issue #24731
886 class A:
887 def __bytes__(self):
888 return OtherBytesSubclass(b'abc')
889 self.assertEqual(bytes(A()), b'abc')
890 self.assertIs(type(bytes(A())), OtherBytesSubclass)
891 self.assertEqual(BytesSubclass(A()), b'abc')
892 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000893
Victor Stinner29e762c2011-01-05 03:33:28 +0000894 # Test PyBytes_FromFormat()
895 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200896 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200897 _testcapi = test.support.import_module('_testcapi')
898 from ctypes import pythonapi, py_object
899 from ctypes import (
900 c_int, c_uint,
901 c_long, c_ulong,
902 c_size_t, c_ssize_t,
903 c_char_p)
904
Victor Stinner29e762c2011-01-05 03:33:28 +0000905 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
906 PyBytes_FromFormat.restype = py_object
907
Victor Stinner03dab782015-10-14 00:21:35 +0200908 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000909 self.assertEqual(PyBytes_FromFormat(b'format'),
910 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200911 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
912 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000913
Victor Stinner03dab782015-10-14 00:21:35 +0200914 # test formatters
915 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
916 b'c=\0')
917 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
918 b'c=@')
919 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
920 b'c=\xff')
921 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
922 c_int(1), c_long(2),
923 c_size_t(3)),
924 b'd=1 ld=2 zd=3')
925 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
926 c_int(-1), c_long(-2),
927 c_size_t(-3)),
928 b'd=-1 ld=-2 zd=-3')
929 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
930 c_uint(123), c_ulong(456),
931 c_size_t(789)),
932 b'u=123 lu=456 zu=789')
933 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
934 b'i=123')
935 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
936 b'i=-123')
937 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
938 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200939
940 sizeof_ptr = ctypes.sizeof(c_char_p)
941
942 if os.name == 'nt':
943 # Windows (MSCRT)
944 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
945 def ptr_formatter(ptr):
946 return (ptr_format % ptr)
947 else:
948 # UNIX (glibc)
949 def ptr_formatter(ptr):
950 return '%#x' % ptr
951
Victor Stinner7ab986d2015-10-14 02:55:12 +0200952 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200953 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
954 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200955 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
956 b's=cstr')
957
958 # test minimum and maximum integer values
959 size_max = c_size_t(-1).value
960 for formatstr, ctypes_type, value, py_formatter in (
961 (b'%d', c_int, _testcapi.INT_MIN, str),
962 (b'%d', c_int, _testcapi.INT_MAX, str),
963 (b'%ld', c_long, _testcapi.LONG_MIN, str),
964 (b'%ld', c_long, _testcapi.LONG_MAX, str),
965 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
966 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
967 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
968 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200969 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200970 ):
971 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
972 py_formatter(value).encode('ascii')),
973
974 # width and precision (width is currently ignored)
975 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
976 b'a')
977 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
978 b'abc')
979
980 # '%%' formatter
981 self.assertEqual(PyBytes_FromFormat(b'%%'),
982 b'%')
983 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
984 b'[%]')
985 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
986 b'%_')
987 self.assertEqual(PyBytes_FromFormat(b'%%s'),
988 b'%s')
989
990 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000991 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200992 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
993 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000994
Victor Stinner03dab782015-10-14 00:21:35 +0200995 # Issue #19969: %c must raise OverflowError for values
996 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100997 self.assertRaises(OverflowError,
998 PyBytes_FromFormat, b'%c', c_int(-1))
999 self.assertRaises(OverflowError,
1000 PyBytes_FromFormat, b'%c', c_int(256))
1001
Miss Islington (bot)d39c1922019-01-11 23:40:09 -08001002 # Issue #33817: empty strings
1003 self.assertEqual(PyBytes_FromFormat(b''),
1004 b'')
1005 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1006 b'')
1007
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001008 def test_bytes_blocking(self):
1009 class IterationBlocked(list):
1010 __bytes__ = None
1011 i = [0, 1, 2, 3]
1012 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1013 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1014
1015 # At least in CPython, because bytes.__new__ and the C API
1016 # PyBytes_FromObject have different fallback rules, integer
1017 # fallback is handled specially, so test separately.
1018 class IntBlocked(int):
1019 __bytes__ = None
1020 self.assertEqual(bytes(3), b'\0\0\0')
1021 self.assertRaises(TypeError, bytes, IntBlocked(3))
1022
1023 # While there is no separately-defined rule for handling bytes
1024 # subclasses differently from other buffer-interface classes,
1025 # an implementation may well special-case them (as CPython 2.x
1026 # str did), so test them separately.
1027 class BytesSubclassBlocked(bytes):
1028 __bytes__ = None
1029 self.assertEqual(bytes(b'ab'), b'ab')
1030 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1031
1032 class BufferBlocked(bytearray):
1033 __bytes__ = None
1034 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1035 self.assertEqual(bytes(ba), b'ab')
1036 self.assertRaises(TypeError, bytes, bb)
1037
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001038
Ezio Melotti0dceb562013-01-10 07:43:26 +02001039class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001040 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001041
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001042 def test_getitem_error(self):
1043 msg = "bytearray indices must be integers or slices"
1044 with self.assertRaisesRegex(TypeError, msg):
1045 bytearray(b'python')['a']
1046
1047 def test_setitem_error(self):
1048 msg = "bytearray indices must be integers or slices"
1049 with self.assertRaisesRegex(TypeError, msg):
1050 b = bytearray(b'python')
1051 b['a'] = "python"
1052
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001053 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001054 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001055
Guido van Rossum254348e2007-11-21 19:29:53 +00001056 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001057 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001058 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001059 tfn = tempfile.mktemp()
1060 try:
1061 # Prepare
1062 with open(tfn, "wb") as f:
1063 f.write(short_sample)
1064 # Test readinto
1065 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001066 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001067 n = f.readinto(b)
1068 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001069 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001070 # Test writing in binary mode
1071 with open(tfn, "wb") as f:
1072 f.write(b)
1073 with open(tfn, "rb") as f:
1074 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001075 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001076 finally:
1077 try:
1078 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001079 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001080 pass
1081
Neal Norwitz6968b052007-02-27 19:02:19 +00001082 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001083 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001084 self.assertEqual(b.reverse(), None)
1085 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001086 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001087 b.reverse()
1088 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001089 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001090 b.reverse()
1091 self.assertFalse(b)
1092
Eli Bendersky4db28d32011-03-03 18:21:02 +00001093 def test_clear(self):
1094 b = bytearray(b'python')
1095 b.clear()
1096 self.assertEqual(b, b'')
1097
1098 b = bytearray(b'')
1099 b.clear()
1100 self.assertEqual(b, b'')
1101
1102 b = bytearray(b'')
1103 b.append(ord('r'))
1104 b.clear()
1105 b.append(ord('p'))
1106 self.assertEqual(b, b'p')
1107
1108 def test_copy(self):
1109 b = bytearray(b'abc')
1110 bb = b.copy()
1111 self.assertEqual(bb, b'abc')
1112
1113 b = bytearray(b'')
1114 bb = b.copy()
1115 self.assertEqual(bb, b'')
1116
1117 # test that it's indeed a copy and not a reference
1118 b = bytearray(b'abc')
1119 bb = b.copy()
1120 self.assertEqual(b, bb)
1121 self.assertIsNot(b, bb)
1122 bb.append(ord('d'))
1123 self.assertEqual(bb, b'abcd')
1124 self.assertEqual(b, b'abc')
1125
Guido van Rossumd624f182006-04-24 13:47:05 +00001126 def test_regexps(self):
1127 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001128 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001129 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001130 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001131
1132 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001133 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001134 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001135 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001136 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001138 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001140 try:
1141 b[3] = 0
1142 self.fail("Didn't raise IndexError")
1143 except IndexError:
1144 pass
1145 try:
1146 b[-10] = 0
1147 self.fail("Didn't raise IndexError")
1148 except IndexError:
1149 pass
1150 try:
1151 b[0] = 256
1152 self.fail("Didn't raise ValueError")
1153 except ValueError:
1154 pass
1155 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001156 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001157 self.fail("Didn't raise ValueError")
1158 except ValueError:
1159 pass
1160 try:
1161 b[0] = None
1162 self.fail("Didn't raise TypeError")
1163 except TypeError:
1164 pass
1165
1166 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001167 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001168 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001170 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001171 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001172 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001173 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001174
1175 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001176 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001177 self.assertEqual(list(b), list(range(10)))
1178
Guido van Rossum254348e2007-11-21 19:29:53 +00001179 b[0:5] = bytearray([1, 1, 1, 1, 1])
1180 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001181
1182 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001183 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001184
Guido van Rossum254348e2007-11-21 19:29:53 +00001185 b[0:0] = bytearray([0, 1, 2, 3, 4])
1186 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001187
Guido van Rossum254348e2007-11-21 19:29:53 +00001188 b[-7:-3] = bytearray([100, 101])
1189 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001190
1191 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001192 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001193
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001194 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001195 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 +00001196
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001197 b[3:] = b'foo'
1198 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1199
1200 b[:3] = memoryview(b'foo')
1201 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1202
1203 b[3:4] = []
1204 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1205
1206 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1207 ['a', 'b'], [b'a', b'b'], [[]]]:
1208 with self.assertRaises(TypeError):
1209 b[3:4] = elem
1210
1211 for elem in [[254, 255, 256], [-256, 9000]]:
1212 with self.assertRaises(ValueError):
1213 b[3:4] = elem
1214
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001215 def test_setslice_extend(self):
1216 # Exercise the resizing logic (see issue #19087)
1217 b = bytearray(range(100))
1218 self.assertEqual(list(b), list(range(100)))
1219 del b[:10]
1220 self.assertEqual(list(b), list(range(10, 100)))
1221 b.extend(range(100, 110))
1222 self.assertEqual(list(b), list(range(10, 110)))
1223
Antoine Pitrou25454112015-05-19 20:52:27 +02001224 def test_fifo_overrun(self):
1225 # Test for issue #23985, a buffer overrun when implementing a FIFO
1226 # Build Python in pydebug mode for best results.
1227 b = bytearray(10)
1228 b.pop() # Defeat expanding buffer off-by-one quirk
1229 del b[:1] # Advance start pointer without reallocating
1230 b += bytes(2) # Append exactly the number of deleted bytes
1231 del b # Free memory buffer, allowing pydebug verification
1232
1233 def test_del_expand(self):
1234 # Reducing the size should not expand the buffer (issue #23985)
1235 b = bytearray(10)
1236 size = sys.getsizeof(b)
1237 del b[:1]
1238 self.assertLessEqual(sys.getsizeof(b), size)
1239
Thomas Wouters376446d2006-12-19 08:30:14 +00001240 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001241 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001242 for start in indices:
1243 for stop in indices:
1244 # Skip invalid step 0
1245 for step in indices[1:]:
1246 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001247 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001248 # Make sure we have a slice of exactly the right length,
1249 # but with different data.
1250 data = L[start:stop:step]
1251 data.reverse()
1252 L[start:stop:step] = data
1253 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001254 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001255
Thomas Wouters376446d2006-12-19 08:30:14 +00001256 del L[start:stop:step]
1257 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001258 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001259
Guido van Rossumd624f182006-04-24 13:47:05 +00001260 def test_setslice_trap(self):
1261 # This test verifies that we correctly handle assigning self
1262 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001263 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001264 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001265 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001266
Guido van Rossum13e57212006-04-27 22:54:26 +00001267 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001268 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001269 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001270 b += b"def"
1271 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001272 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001273 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001274 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001275 self.assertEqual(b, b"abcdefxyz")
1276 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001277 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001278 except TypeError:
1279 pass
1280 else:
1281 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001282
1283 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001284 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001285 b1 = b
1286 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001287 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001288 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001289 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001290
1291 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001292 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001293 b1 = b
1294 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001295 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001296 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001297 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001298
Guido van Rossum20188312006-05-05 15:15:40 +00001299 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001300 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001301 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001302 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001303 seq = [alloc]
1304 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001305 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001306 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001307 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001308 if alloc not in seq:
1309 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001310
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001311 def test_init_alloc(self):
1312 b = bytearray()
1313 def g():
1314 for i in range(1, 100):
1315 yield i
1316 a = list(b)
1317 self.assertEqual(a, list(range(1, len(a)+1)))
1318 self.assertEqual(len(b), len(a))
1319 self.assertLessEqual(len(b), i)
1320 alloc = b.__alloc__()
1321 self.assertGreater(alloc, len(b)) # including trailing null byte
1322 b.__init__(g())
1323 self.assertEqual(list(b), list(range(1, 100)))
1324 self.assertEqual(len(b), 99)
1325 alloc = b.__alloc__()
1326 self.assertGreater(alloc, len(b))
1327
Neal Norwitz6968b052007-02-27 19:02:19 +00001328 def test_extend(self):
1329 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001330 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001331 a.extend(a)
1332 self.assertEqual(a, orig + orig)
1333 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001334 a = bytearray(b'')
1335 # Test iterators that don't have a __length_hint__
1336 a.extend(map(int, orig * 25))
1337 a.extend(int(x) for x in orig * 25)
1338 self.assertEqual(a, orig * 50)
1339 self.assertEqual(a[-5:], orig)
1340 a = bytearray(b'')
1341 a.extend(iter(map(int, orig * 50)))
1342 self.assertEqual(a, orig * 50)
1343 self.assertEqual(a[-5:], orig)
1344 a = bytearray(b'')
1345 a.extend(list(map(int, orig * 50)))
1346 self.assertEqual(a, orig * 50)
1347 self.assertEqual(a[-5:], orig)
1348 a = bytearray(b'')
1349 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1350 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1351 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001352 a = bytearray(b'')
1353 a.extend([Indexable(ord('a'))])
1354 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001355
Neal Norwitz6968b052007-02-27 19:02:19 +00001356 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001357 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001358 b.remove(ord('l'))
1359 self.assertEqual(b, b'helo')
1360 b.remove(ord('l'))
1361 self.assertEqual(b, b'heo')
1362 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1363 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001364 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001365 # remove first and last
1366 b.remove(ord('o'))
1367 b.remove(ord('h'))
1368 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001369 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001370 b.remove(Indexable(ord('e')))
1371 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001372
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001373 # test values outside of the ascii range: (0, 127)
1374 c = bytearray([126, 127, 128, 129])
1375 c.remove(127)
1376 self.assertEqual(c, bytes([126, 128, 129]))
1377 c.remove(129)
1378 self.assertEqual(c, bytes([126, 128]))
1379
Neal Norwitz6968b052007-02-27 19:02:19 +00001380 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001381 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001382 self.assertEqual(b.pop(), ord('d'))
1383 self.assertEqual(b.pop(0), ord('w'))
1384 self.assertEqual(b.pop(-2), ord('r'))
1385 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001386 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001387 # test for issue #6846
1388 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001389
1390 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001391 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001392
Neal Norwitz6968b052007-02-27 19:02:19 +00001393 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001394 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001395 b.append(ord('o'))
1396 self.assertEqual(b, b'hello')
1397 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001398 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001399 b.append(ord('A'))
1400 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001401 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001402 b = bytearray()
1403 b.append(Indexable(ord('A')))
1404 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001405
1406 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001407 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001408 b.insert(1, ord('i'))
1409 b.insert(4, ord('i'))
1410 b.insert(-2, ord('i'))
1411 b.insert(1000, ord('i'))
1412 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001413 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001414 b = bytearray()
1415 b.insert(0, Indexable(ord('A')))
1416 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001417
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001418 def test_copied(self):
1419 # Issue 4348. Make sure that operations that don't mutate the array
1420 # copy the bytes.
1421 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001422 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001423
1424 t = bytearray([i for i in range(256)])
1425 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001426 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001427
Guido van Rossum254348e2007-11-21 19:29:53 +00001428 def test_partition_bytearray_doesnt_share_nullstring(self):
1429 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001430 self.assertEqual(b, b"")
1431 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001432 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001433 b += b"!"
1434 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001435 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001436 self.assertEqual(b, b"")
1437 self.assertEqual(c, b"")
1438 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001439 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001440 self.assertEqual(b, b"")
1441 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001442 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001443 b += b"!"
1444 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001445 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001446 self.assertEqual(b, b"")
1447 self.assertEqual(c, b"")
1448
Antoine Pitrou5504e892008-12-06 21:27:53 +00001449 def test_resize_forbidden(self):
1450 # #4509: can't resize a bytearray when there are buffer exports, even
1451 # if it wouldn't reallocate the underlying buffer.
1452 # Furthermore, no destructive changes to the buffer may be applied
1453 # before raising the error.
1454 b = bytearray(range(10))
1455 v = memoryview(b)
1456 def resize(n):
1457 b[1:-1] = range(n + 1, 2*n - 1)
1458 resize(10)
1459 orig = b[:]
1460 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001461 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001462 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001463 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001464 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001465 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001466 # Other operations implying resize
1467 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001468 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001469 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001470 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001471 def delitem():
1472 del b[1]
1473 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001474 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001475 # deleting a non-contiguous slice
1476 def delslice():
1477 b[1:-1:2] = b""
1478 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001479 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001480
Stefan Krah650c1e82015-02-03 21:43:23 +01001481 @test.support.cpython_only
1482 def test_obsolete_write_lock(self):
1483 from _testcapi import getbuffer_with_null_view
1484 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001485
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001486 def test_iterator_pickling2(self):
1487 orig = bytearray(b'abc')
1488 data = list(b'qwerty')
1489 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1490 # initial iterator
1491 itorig = iter(orig)
1492 d = pickle.dumps((itorig, orig), proto)
1493 it, b = pickle.loads(d)
1494 b[:] = data
1495 self.assertEqual(type(it), type(itorig))
1496 self.assertEqual(list(it), data)
1497
1498 # running iterator
1499 next(itorig)
1500 d = pickle.dumps((itorig, orig), proto)
1501 it, b = pickle.loads(d)
1502 b[:] = data
1503 self.assertEqual(type(it), type(itorig))
1504 self.assertEqual(list(it), data[1:])
1505
1506 # empty iterator
1507 for i in range(1, len(orig)):
1508 next(itorig)
1509 d = pickle.dumps((itorig, orig), proto)
1510 it, b = pickle.loads(d)
1511 b[:] = data
1512 self.assertEqual(type(it), type(itorig))
1513 self.assertEqual(list(it), data[len(orig):])
1514
1515 # exhausted iterator
1516 self.assertRaises(StopIteration, next, itorig)
1517 d = pickle.dumps((itorig, orig), proto)
1518 it, b = pickle.loads(d)
1519 b[:] = data
1520 self.assertEqual(list(it), [])
1521
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001522 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001523
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001524 def test_iterator_length_hint(self):
1525 # Issue 27443: __length_hint__ can return negative integer
1526 ba = bytearray(b'ab')
1527 it = iter(ba)
1528 next(it)
1529 ba.clear()
1530 # Shouldn't raise an error
1531 self.assertEqual(list(it), [])
1532
1533
Christian Heimes510711d2008-01-30 11:57:58 +00001534class AssortedBytesTest(unittest.TestCase):
1535 #
1536 # Test various combinations of bytes and bytearray
1537 #
1538
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001539 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001540 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001541 for f in str, repr:
1542 self.assertEqual(f(bytearray()), "bytearray(b'')")
1543 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1544 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1545 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1546 self.assertEqual(f(b"abc"), "b'abc'")
1547 self.assertEqual(f(b"'"), '''b"'"''') # '''
1548 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001549
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001550 @check_bytes_warnings
1551 def test_format(self):
1552 for b in b'abc', bytearray(b'abc'):
1553 self.assertEqual(format(b), str(b))
1554 self.assertEqual(format(b, ''), str(b))
1555 with self.assertRaisesRegex(TypeError,
1556 r'\b%s\b' % re.escape(type(b).__name__)):
1557 format(b, 's')
1558
Christian Heimes510711d2008-01-30 11:57:58 +00001559 def test_compare_bytes_to_bytearray(self):
1560 self.assertEqual(b"abc" == bytes(b"abc"), True)
1561 self.assertEqual(b"ab" != bytes(b"abc"), True)
1562 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1563 self.assertEqual(b"ab" < bytes(b"abc"), True)
1564 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1565 self.assertEqual(b"abc" > bytes(b"ab"), True)
1566
1567 self.assertEqual(b"abc" != bytes(b"abc"), False)
1568 self.assertEqual(b"ab" == bytes(b"abc"), False)
1569 self.assertEqual(b"ab" > bytes(b"abc"), False)
1570 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1571 self.assertEqual(b"abc" < bytes(b"ab"), False)
1572 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1573
1574 self.assertEqual(bytes(b"abc") == b"abc", True)
1575 self.assertEqual(bytes(b"ab") != b"abc", True)
1576 self.assertEqual(bytes(b"ab") <= b"abc", True)
1577 self.assertEqual(bytes(b"ab") < b"abc", True)
1578 self.assertEqual(bytes(b"abc") >= b"ab", True)
1579 self.assertEqual(bytes(b"abc") > b"ab", True)
1580
1581 self.assertEqual(bytes(b"abc") != b"abc", False)
1582 self.assertEqual(bytes(b"ab") == b"abc", False)
1583 self.assertEqual(bytes(b"ab") > b"abc", False)
1584 self.assertEqual(bytes(b"ab") >= b"abc", False)
1585 self.assertEqual(bytes(b"abc") < b"ab", False)
1586 self.assertEqual(bytes(b"abc") <= b"ab", False)
1587
Stefan Krah6e572b82013-01-26 13:06:36 +01001588 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001589 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001590 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001591 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001592 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001593 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001594
1595 def test_from_bytearray(self):
1596 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1597 buf = memoryview(sample)
1598 b = bytearray(buf)
1599 self.assertEqual(b, bytearray(sample))
1600
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001601 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001602 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001603 self.assertEqual(str(b''), "b''")
1604 self.assertEqual(str(b'x'), "b'x'")
1605 self.assertEqual(str(b'\x80'), "b'\\x80'")
1606 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1607 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1608 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001609
1610 def test_literal(self):
1611 tests = [
1612 (b"Wonderful spam", "Wonderful spam"),
1613 (br"Wonderful spam too", "Wonderful spam too"),
1614 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1615 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1616 ]
1617 for b, s in tests:
1618 self.assertEqual(b, bytearray(s, 'latin-1'))
1619 for c in range(128, 256):
1620 self.assertRaises(SyntaxError, eval,
1621 'b"%s"' % chr(c))
1622
Christian Heimes510711d2008-01-30 11:57:58 +00001623 def test_split_bytearray(self):
1624 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1625
1626 def test_rsplit_bytearray(self):
1627 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1628
Georg Brandleb2c9642008-05-30 12:05:02 +00001629 def test_return_self(self):
1630 # bytearray.replace must always return a new bytearray
1631 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001632 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001633
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001634 @unittest.skipUnless(sys.flags.bytes_warning,
1635 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001636 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001637 def bytes_warning():
1638 return test.support.check_warnings(('', BytesWarning))
1639 with bytes_warning():
1640 b'' == ''
1641 with bytes_warning():
1642 '' == b''
1643 with bytes_warning():
1644 b'' != ''
1645 with bytes_warning():
1646 '' != b''
1647 with bytes_warning():
1648 bytearray(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 b'\0' == 0
1657 with bytes_warning():
1658 0 == b'\0'
1659 with bytes_warning():
1660 b'\0' != 0
1661 with bytes_warning():
1662 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001663
Guido van Rossumd624f182006-04-24 13:47:05 +00001664 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001665 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001666 # __reversed__? (optimization)
1667
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001668 # XXX More string methods? (Those that don't use character properties)
1669
Neal Norwitz6968b052007-02-27 19:02:19 +00001670 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001671 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001672 # Unfortunately they are all bundled with tests that
1673 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001674
Guido van Rossum254348e2007-11-21 19:29:53 +00001675 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001676 # the rest that make sense (the code can be cleaned up to use modern
1677 # unittest methods at the same time).
1678
Martin Panter152a19c2016-04-06 06:37:17 +00001679class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001680 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001681 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001682
1683 def test_returns_new_copy(self):
1684 val = self.marshal(b'1234')
1685 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001686 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001687 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1688 method = getattr(val, methname)
1689 newval = method(3)
1690 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001691 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001692 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001693 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1694 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1695 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1696 newval = eval(expr)
1697 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001698 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001699 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001700 sep = self.marshal(b'')
1701 newval = sep.join([val])
1702 self.assertEqual(val, newval)
1703 self.assertIsNot(val, newval)
1704
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001705
Christian Heimes510711d2008-01-30 11:57:58 +00001706class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001707 def fixtype(self, obj):
1708 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001709 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001710 return super().fixtype(obj)
1711
Martin Panter152a19c2016-04-06 06:37:17 +00001712 contains_bytes = True
1713
Ezio Melotti0dceb562013-01-10 07:43:26 +02001714class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001715 type2test = bytearray
1716
Ezio Melotti0dceb562013-01-10 07:43:26 +02001717class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001718 type2test = bytes
1719
Georg Brandlc7885542007-03-06 19:16:20 +00001720
Ezio Melotti0dceb562013-01-10 07:43:26 +02001721class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001722
1723 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001724 self.assertTrue(issubclass(self.type2test, self.basetype))
1725 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001726
1727 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001728 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001729
1730 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001731 self.assertTrue(_a == _a)
1732 self.assertTrue(_a != _b)
1733 self.assertTrue(_a < _b)
1734 self.assertTrue(_a <= _b)
1735 self.assertTrue(_b >= _a)
1736 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001737 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001738
1739 # test concat of subclass instances
1740 self.assertEqual(a + b, _a + _b)
1741 self.assertEqual(a + b, a + _b)
1742 self.assertEqual(a + b, _a + b)
1743
1744 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001745 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001746
1747 def test_join(self):
1748 # Make sure join returns a NEW object for single item sequences
1749 # involving a subclass.
1750 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001751 s1 = self.type2test(b"abcd")
1752 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001753 self.assertIsNot(s1, s2)
1754 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001755
1756 # Test reverse, calling join on subclass
1757 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001758 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001759
1760 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001761 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001762 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001763 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001764 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001765 b = pickle.loads(pickle.dumps(a, proto))
1766 self.assertNotEqual(id(a), id(b))
1767 self.assertEqual(a, b)
1768 self.assertEqual(a.x, b.x)
1769 self.assertEqual(a.y, b.y)
1770 self.assertEqual(type(a), type(b))
1771 self.assertEqual(type(a.y), type(b.y))
1772
1773 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001774 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001775 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001776 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001777 for copy_method in (copy.copy, copy.deepcopy):
1778 b = copy_method(a)
1779 self.assertNotEqual(id(a), id(b))
1780 self.assertEqual(a, b)
1781 self.assertEqual(a.x, b.x)
1782 self.assertEqual(a.y, b.y)
1783 self.assertEqual(type(a), type(b))
1784 self.assertEqual(type(a.y), type(b.y))
1785
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001786 def test_fromhex(self):
1787 b = self.type2test.fromhex('1a2B30')
1788 self.assertEqual(b, b'\x1a\x2b\x30')
1789 self.assertIs(type(b), self.type2test)
1790
1791 class B1(self.basetype):
1792 def __new__(cls, value):
1793 me = self.basetype.__new__(cls, value)
1794 me.foo = 'bar'
1795 return me
1796
1797 b = B1.fromhex('1a2B30')
1798 self.assertEqual(b, b'\x1a\x2b\x30')
1799 self.assertIs(type(b), B1)
1800 self.assertEqual(b.foo, 'bar')
1801
1802 class B2(self.basetype):
1803 def __init__(me, *args, **kwargs):
1804 if self.basetype is not bytes:
1805 self.basetype.__init__(me, *args, **kwargs)
1806 me.foo = 'bar'
1807
1808 b = B2.fromhex('1a2B30')
1809 self.assertEqual(b, b'\x1a\x2b\x30')
1810 self.assertIs(type(b), B2)
1811 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001812
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001813
1814class ByteArraySubclass(bytearray):
1815 pass
1816
1817class BytesSubclass(bytes):
1818 pass
1819
Serhiy Storchaka15095802015-11-25 15:47:01 +02001820class OtherBytesSubclass(bytes):
1821 pass
1822
Ezio Melotti0dceb562013-01-10 07:43:26 +02001823class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001824 basetype = bytearray
1825 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001826
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001827 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001828 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001829 def __init__(me, newarg=1, *args, **kwargs):
1830 bytearray.__init__(me, *args, **kwargs)
1831 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001832 x = subclass(4, source=b"abcd")
1833 self.assertEqual(x, b"abcd")
1834 x = subclass(newarg=4, source=b"abcd")
1835 self.assertEqual(x, b"abcd")
1836
1837
Ezio Melotti0dceb562013-01-10 07:43:26 +02001838class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001839 basetype = bytes
1840 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001841
1842
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001843if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001844 unittest.main()