blob: 145411efbb9d0cadcc6afe815eac5ee232dfa8cd [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 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
Serhiy Storchakae8904212018-10-15 00:02:57 +0300204 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
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001002 def test_bytes_blocking(self):
1003 class IterationBlocked(list):
1004 __bytes__ = None
1005 i = [0, 1, 2, 3]
1006 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1007 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1008
1009 # At least in CPython, because bytes.__new__ and the C API
1010 # PyBytes_FromObject have different fallback rules, integer
1011 # fallback is handled specially, so test separately.
1012 class IntBlocked(int):
1013 __bytes__ = None
1014 self.assertEqual(bytes(3), b'\0\0\0')
1015 self.assertRaises(TypeError, bytes, IntBlocked(3))
1016
1017 # While there is no separately-defined rule for handling bytes
1018 # subclasses differently from other buffer-interface classes,
1019 # an implementation may well special-case them (as CPython 2.x
1020 # str did), so test them separately.
1021 class BytesSubclassBlocked(bytes):
1022 __bytes__ = None
1023 self.assertEqual(bytes(b'ab'), b'ab')
1024 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1025
1026 class BufferBlocked(bytearray):
1027 __bytes__ = None
1028 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1029 self.assertEqual(bytes(ba), b'ab')
1030 self.assertRaises(TypeError, bytes, bb)
1031
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001032
Ezio Melotti0dceb562013-01-10 07:43:26 +02001033class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001034 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001035
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001036 def test_getitem_error(self):
1037 msg = "bytearray indices must be integers or slices"
1038 with self.assertRaisesRegex(TypeError, msg):
1039 bytearray(b'python')['a']
1040
1041 def test_setitem_error(self):
1042 msg = "bytearray indices must be integers or slices"
1043 with self.assertRaisesRegex(TypeError, msg):
1044 b = bytearray(b'python')
1045 b['a'] = "python"
1046
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001047 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001048 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001049
Guido van Rossum254348e2007-11-21 19:29:53 +00001050 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001051 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001052 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001053 tfn = tempfile.mktemp()
1054 try:
1055 # Prepare
1056 with open(tfn, "wb") as f:
1057 f.write(short_sample)
1058 # Test readinto
1059 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001060 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001061 n = f.readinto(b)
1062 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001063 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001064 # Test writing in binary mode
1065 with open(tfn, "wb") as f:
1066 f.write(b)
1067 with open(tfn, "rb") as f:
1068 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001069 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001070 finally:
1071 try:
1072 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001073 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001074 pass
1075
Neal Norwitz6968b052007-02-27 19:02:19 +00001076 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001077 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001078 self.assertEqual(b.reverse(), None)
1079 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001080 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001081 b.reverse()
1082 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001083 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001084 b.reverse()
1085 self.assertFalse(b)
1086
Eli Bendersky4db28d32011-03-03 18:21:02 +00001087 def test_clear(self):
1088 b = bytearray(b'python')
1089 b.clear()
1090 self.assertEqual(b, b'')
1091
1092 b = bytearray(b'')
1093 b.clear()
1094 self.assertEqual(b, b'')
1095
1096 b = bytearray(b'')
1097 b.append(ord('r'))
1098 b.clear()
1099 b.append(ord('p'))
1100 self.assertEqual(b, b'p')
1101
1102 def test_copy(self):
1103 b = bytearray(b'abc')
1104 bb = b.copy()
1105 self.assertEqual(bb, b'abc')
1106
1107 b = bytearray(b'')
1108 bb = b.copy()
1109 self.assertEqual(bb, b'')
1110
1111 # test that it's indeed a copy and not a reference
1112 b = bytearray(b'abc')
1113 bb = b.copy()
1114 self.assertEqual(b, bb)
1115 self.assertIsNot(b, bb)
1116 bb.append(ord('d'))
1117 self.assertEqual(bb, b'abcd')
1118 self.assertEqual(b, b'abc')
1119
Guido van Rossumd624f182006-04-24 13:47:05 +00001120 def test_regexps(self):
1121 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001122 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001123 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001124 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001125
1126 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001127 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001128 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001129 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001130 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001131 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001132 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001133 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001134 try:
1135 b[3] = 0
1136 self.fail("Didn't raise IndexError")
1137 except IndexError:
1138 pass
1139 try:
1140 b[-10] = 0
1141 self.fail("Didn't raise IndexError")
1142 except IndexError:
1143 pass
1144 try:
1145 b[0] = 256
1146 self.fail("Didn't raise ValueError")
1147 except ValueError:
1148 pass
1149 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001150 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001151 self.fail("Didn't raise ValueError")
1152 except ValueError:
1153 pass
1154 try:
1155 b[0] = None
1156 self.fail("Didn't raise TypeError")
1157 except TypeError:
1158 pass
1159
1160 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001161 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001162 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001163 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001164 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001165 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001166 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001167 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001168
1169 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001170 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001171 self.assertEqual(list(b), list(range(10)))
1172
Guido van Rossum254348e2007-11-21 19:29:53 +00001173 b[0:5] = bytearray([1, 1, 1, 1, 1])
1174 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001175
1176 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001177 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001178
Guido van Rossum254348e2007-11-21 19:29:53 +00001179 b[0:0] = bytearray([0, 1, 2, 3, 4])
1180 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001181
Guido van Rossum254348e2007-11-21 19:29:53 +00001182 b[-7:-3] = bytearray([100, 101])
1183 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001184
1185 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001186 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001187
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001188 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001189 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 +00001190
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001191 b[3:] = b'foo'
1192 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1193
1194 b[:3] = memoryview(b'foo')
1195 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1196
1197 b[3:4] = []
1198 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1199
1200 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1201 ['a', 'b'], [b'a', b'b'], [[]]]:
1202 with self.assertRaises(TypeError):
1203 b[3:4] = elem
1204
1205 for elem in [[254, 255, 256], [-256, 9000]]:
1206 with self.assertRaises(ValueError):
1207 b[3:4] = elem
1208
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001209 def test_setslice_extend(self):
1210 # Exercise the resizing logic (see issue #19087)
1211 b = bytearray(range(100))
1212 self.assertEqual(list(b), list(range(100)))
1213 del b[:10]
1214 self.assertEqual(list(b), list(range(10, 100)))
1215 b.extend(range(100, 110))
1216 self.assertEqual(list(b), list(range(10, 110)))
1217
Antoine Pitrou25454112015-05-19 20:52:27 +02001218 def test_fifo_overrun(self):
1219 # Test for issue #23985, a buffer overrun when implementing a FIFO
1220 # Build Python in pydebug mode for best results.
1221 b = bytearray(10)
1222 b.pop() # Defeat expanding buffer off-by-one quirk
1223 del b[:1] # Advance start pointer without reallocating
1224 b += bytes(2) # Append exactly the number of deleted bytes
1225 del b # Free memory buffer, allowing pydebug verification
1226
1227 def test_del_expand(self):
1228 # Reducing the size should not expand the buffer (issue #23985)
1229 b = bytearray(10)
1230 size = sys.getsizeof(b)
1231 del b[:1]
1232 self.assertLessEqual(sys.getsizeof(b), size)
1233
Thomas Wouters376446d2006-12-19 08:30:14 +00001234 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001235 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001236 for start in indices:
1237 for stop in indices:
1238 # Skip invalid step 0
1239 for step in indices[1:]:
1240 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001241 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001242 # Make sure we have a slice of exactly the right length,
1243 # but with different data.
1244 data = L[start:stop:step]
1245 data.reverse()
1246 L[start:stop:step] = data
1247 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001248 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001249
Thomas Wouters376446d2006-12-19 08:30:14 +00001250 del L[start:stop:step]
1251 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001252 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001253
Guido van Rossumd624f182006-04-24 13:47:05 +00001254 def test_setslice_trap(self):
1255 # This test verifies that we correctly handle assigning self
1256 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001257 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001258 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001259 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001260
Guido van Rossum13e57212006-04-27 22:54:26 +00001261 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001262 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001263 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001264 b += b"def"
1265 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001266 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001267 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001268 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001269 self.assertEqual(b, b"abcdefxyz")
1270 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001271 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001272 except TypeError:
1273 pass
1274 else:
1275 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001276
1277 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001278 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001279 b1 = b
1280 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001281 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001282 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001283 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001284
1285 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001286 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001287 b1 = b
1288 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001289 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001290 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001291 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001292
Guido van Rossum20188312006-05-05 15:15:40 +00001293 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001294 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001295 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001296 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001297 seq = [alloc]
1298 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001299 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001300 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001301 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001302 if alloc not in seq:
1303 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001304
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001305 def test_init_alloc(self):
1306 b = bytearray()
1307 def g():
1308 for i in range(1, 100):
1309 yield i
1310 a = list(b)
1311 self.assertEqual(a, list(range(1, len(a)+1)))
1312 self.assertEqual(len(b), len(a))
1313 self.assertLessEqual(len(b), i)
1314 alloc = b.__alloc__()
1315 self.assertGreater(alloc, len(b)) # including trailing null byte
1316 b.__init__(g())
1317 self.assertEqual(list(b), list(range(1, 100)))
1318 self.assertEqual(len(b), 99)
1319 alloc = b.__alloc__()
1320 self.assertGreater(alloc, len(b))
1321
Neal Norwitz6968b052007-02-27 19:02:19 +00001322 def test_extend(self):
1323 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001324 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001325 a.extend(a)
1326 self.assertEqual(a, orig + orig)
1327 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001328 a = bytearray(b'')
1329 # Test iterators that don't have a __length_hint__
1330 a.extend(map(int, orig * 25))
1331 a.extend(int(x) for x in orig * 25)
1332 self.assertEqual(a, orig * 50)
1333 self.assertEqual(a[-5:], orig)
1334 a = bytearray(b'')
1335 a.extend(iter(map(int, orig * 50)))
1336 self.assertEqual(a, orig * 50)
1337 self.assertEqual(a[-5:], orig)
1338 a = bytearray(b'')
1339 a.extend(list(map(int, orig * 50)))
1340 self.assertEqual(a, orig * 50)
1341 self.assertEqual(a[-5:], orig)
1342 a = bytearray(b'')
1343 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1344 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1345 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001346 a = bytearray(b'')
1347 a.extend([Indexable(ord('a'))])
1348 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001349
Neal Norwitz6968b052007-02-27 19:02:19 +00001350 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001351 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001352 b.remove(ord('l'))
1353 self.assertEqual(b, b'helo')
1354 b.remove(ord('l'))
1355 self.assertEqual(b, b'heo')
1356 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1357 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001358 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001359 # remove first and last
1360 b.remove(ord('o'))
1361 b.remove(ord('h'))
1362 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001363 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001364 b.remove(Indexable(ord('e')))
1365 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001366
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001367 # test values outside of the ascii range: (0, 127)
1368 c = bytearray([126, 127, 128, 129])
1369 c.remove(127)
1370 self.assertEqual(c, bytes([126, 128, 129]))
1371 c.remove(129)
1372 self.assertEqual(c, bytes([126, 128]))
1373
Neal Norwitz6968b052007-02-27 19:02:19 +00001374 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001375 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001376 self.assertEqual(b.pop(), ord('d'))
1377 self.assertEqual(b.pop(0), ord('w'))
1378 self.assertEqual(b.pop(-2), ord('r'))
1379 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001380 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001381 # test for issue #6846
1382 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001383
1384 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001385 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001386
Neal Norwitz6968b052007-02-27 19:02:19 +00001387 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001388 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001389 b.append(ord('o'))
1390 self.assertEqual(b, b'hello')
1391 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001392 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001393 b.append(ord('A'))
1394 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001395 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001396 b = bytearray()
1397 b.append(Indexable(ord('A')))
1398 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001399
1400 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001401 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001402 b.insert(1, ord('i'))
1403 b.insert(4, ord('i'))
1404 b.insert(-2, ord('i'))
1405 b.insert(1000, ord('i'))
1406 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001407 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001408 b = bytearray()
1409 b.insert(0, Indexable(ord('A')))
1410 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001411
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001412 def test_copied(self):
1413 # Issue 4348. Make sure that operations that don't mutate the array
1414 # copy the bytes.
1415 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001416 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001417
1418 t = bytearray([i for i in range(256)])
1419 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001420 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001421
Guido van Rossum254348e2007-11-21 19:29:53 +00001422 def test_partition_bytearray_doesnt_share_nullstring(self):
1423 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001424 self.assertEqual(b, b"")
1425 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001426 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001427 b += b"!"
1428 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001429 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"")
1432 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001433 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001434 self.assertEqual(b, b"")
1435 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001436 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001437 b += b"!"
1438 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001439 c, b, 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"")
1442
Antoine Pitrou5504e892008-12-06 21:27:53 +00001443 def test_resize_forbidden(self):
1444 # #4509: can't resize a bytearray when there are buffer exports, even
1445 # if it wouldn't reallocate the underlying buffer.
1446 # Furthermore, no destructive changes to the buffer may be applied
1447 # before raising the error.
1448 b = bytearray(range(10))
1449 v = memoryview(b)
1450 def resize(n):
1451 b[1:-1] = range(n + 1, 2*n - 1)
1452 resize(10)
1453 orig = b[:]
1454 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001455 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001456 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001457 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001458 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001459 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001460 # Other operations implying resize
1461 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001462 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001463 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001464 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001465 def delitem():
1466 del b[1]
1467 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001468 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001469 # deleting a non-contiguous slice
1470 def delslice():
1471 b[1:-1:2] = b""
1472 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001473 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001474
Stefan Krah650c1e82015-02-03 21:43:23 +01001475 @test.support.cpython_only
1476 def test_obsolete_write_lock(self):
1477 from _testcapi import getbuffer_with_null_view
1478 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001479
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001480 def test_iterator_pickling2(self):
1481 orig = bytearray(b'abc')
1482 data = list(b'qwerty')
1483 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1484 # initial iterator
1485 itorig = iter(orig)
1486 d = pickle.dumps((itorig, orig), proto)
1487 it, b = pickle.loads(d)
1488 b[:] = data
1489 self.assertEqual(type(it), type(itorig))
1490 self.assertEqual(list(it), data)
1491
1492 # running iterator
1493 next(itorig)
1494 d = pickle.dumps((itorig, orig), proto)
1495 it, b = pickle.loads(d)
1496 b[:] = data
1497 self.assertEqual(type(it), type(itorig))
1498 self.assertEqual(list(it), data[1:])
1499
1500 # empty iterator
1501 for i in range(1, len(orig)):
1502 next(itorig)
1503 d = pickle.dumps((itorig, orig), proto)
1504 it, b = pickle.loads(d)
1505 b[:] = data
1506 self.assertEqual(type(it), type(itorig))
1507 self.assertEqual(list(it), data[len(orig):])
1508
1509 # exhausted iterator
1510 self.assertRaises(StopIteration, next, itorig)
1511 d = pickle.dumps((itorig, orig), proto)
1512 it, b = pickle.loads(d)
1513 b[:] = data
1514 self.assertEqual(list(it), [])
1515
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001516 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001517
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001518 def test_iterator_length_hint(self):
1519 # Issue 27443: __length_hint__ can return negative integer
1520 ba = bytearray(b'ab')
1521 it = iter(ba)
1522 next(it)
1523 ba.clear()
1524 # Shouldn't raise an error
1525 self.assertEqual(list(it), [])
1526
1527
Christian Heimes510711d2008-01-30 11:57:58 +00001528class AssortedBytesTest(unittest.TestCase):
1529 #
1530 # Test various combinations of bytes and bytearray
1531 #
1532
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001533 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001534 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001535 for f in str, repr:
1536 self.assertEqual(f(bytearray()), "bytearray(b'')")
1537 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1538 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1539 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1540 self.assertEqual(f(b"abc"), "b'abc'")
1541 self.assertEqual(f(b"'"), '''b"'"''') # '''
1542 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001543
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001544 @check_bytes_warnings
1545 def test_format(self):
1546 for b in b'abc', bytearray(b'abc'):
1547 self.assertEqual(format(b), str(b))
1548 self.assertEqual(format(b, ''), str(b))
1549 with self.assertRaisesRegex(TypeError,
1550 r'\b%s\b' % re.escape(type(b).__name__)):
1551 format(b, 's')
1552
Christian Heimes510711d2008-01-30 11:57:58 +00001553 def test_compare_bytes_to_bytearray(self):
1554 self.assertEqual(b"abc" == bytes(b"abc"), True)
1555 self.assertEqual(b"ab" != bytes(b"abc"), True)
1556 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1557 self.assertEqual(b"ab" < bytes(b"abc"), True)
1558 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1559 self.assertEqual(b"abc" > bytes(b"ab"), True)
1560
1561 self.assertEqual(b"abc" != bytes(b"abc"), False)
1562 self.assertEqual(b"ab" == bytes(b"abc"), False)
1563 self.assertEqual(b"ab" > bytes(b"abc"), False)
1564 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1565 self.assertEqual(b"abc" < bytes(b"ab"), False)
1566 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1567
1568 self.assertEqual(bytes(b"abc") == b"abc", True)
1569 self.assertEqual(bytes(b"ab") != b"abc", True)
1570 self.assertEqual(bytes(b"ab") <= b"abc", True)
1571 self.assertEqual(bytes(b"ab") < b"abc", True)
1572 self.assertEqual(bytes(b"abc") >= b"ab", True)
1573 self.assertEqual(bytes(b"abc") > b"ab", True)
1574
1575 self.assertEqual(bytes(b"abc") != b"abc", False)
1576 self.assertEqual(bytes(b"ab") == b"abc", False)
1577 self.assertEqual(bytes(b"ab") > b"abc", False)
1578 self.assertEqual(bytes(b"ab") >= b"abc", False)
1579 self.assertEqual(bytes(b"abc") < b"ab", False)
1580 self.assertEqual(bytes(b"abc") <= b"ab", False)
1581
Stefan Krah6e572b82013-01-26 13:06:36 +01001582 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001583 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001584 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001585 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001586 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001587 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001588
1589 def test_from_bytearray(self):
1590 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1591 buf = memoryview(sample)
1592 b = bytearray(buf)
1593 self.assertEqual(b, bytearray(sample))
1594
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001595 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001596 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001597 self.assertEqual(str(b''), "b''")
1598 self.assertEqual(str(b'x'), "b'x'")
1599 self.assertEqual(str(b'\x80'), "b'\\x80'")
1600 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1601 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1602 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001603
1604 def test_literal(self):
1605 tests = [
1606 (b"Wonderful spam", "Wonderful spam"),
1607 (br"Wonderful spam too", "Wonderful spam too"),
1608 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1609 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1610 ]
1611 for b, s in tests:
1612 self.assertEqual(b, bytearray(s, 'latin-1'))
1613 for c in range(128, 256):
1614 self.assertRaises(SyntaxError, eval,
1615 'b"%s"' % chr(c))
1616
Christian Heimes510711d2008-01-30 11:57:58 +00001617 def test_split_bytearray(self):
1618 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1619
1620 def test_rsplit_bytearray(self):
1621 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1622
Georg Brandleb2c9642008-05-30 12:05:02 +00001623 def test_return_self(self):
1624 # bytearray.replace must always return a new bytearray
1625 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001626 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001627
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001628 @unittest.skipUnless(sys.flags.bytes_warning,
1629 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001630 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001631 def bytes_warning():
1632 return test.support.check_warnings(('', BytesWarning))
1633 with bytes_warning():
1634 b'' == ''
1635 with bytes_warning():
1636 '' == b''
1637 with bytes_warning():
1638 b'' != ''
1639 with bytes_warning():
1640 '' != b''
1641 with bytes_warning():
1642 bytearray(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 b'\0' == 0
1651 with bytes_warning():
1652 0 == b'\0'
1653 with bytes_warning():
1654 b'\0' != 0
1655 with bytes_warning():
1656 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001657
Guido van Rossumd624f182006-04-24 13:47:05 +00001658 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001659 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001660 # __reversed__? (optimization)
1661
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001662 # XXX More string methods? (Those that don't use character properties)
1663
Neal Norwitz6968b052007-02-27 19:02:19 +00001664 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001665 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001666 # Unfortunately they are all bundled with tests that
1667 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001668
Guido van Rossum254348e2007-11-21 19:29:53 +00001669 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001670 # the rest that make sense (the code can be cleaned up to use modern
1671 # unittest methods at the same time).
1672
Martin Panter152a19c2016-04-06 06:37:17 +00001673class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001674 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001675 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001676
1677 def test_returns_new_copy(self):
1678 val = self.marshal(b'1234')
1679 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001680 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001681 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1682 method = getattr(val, methname)
1683 newval = method(3)
1684 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001685 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001686 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001687 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1688 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1689 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1690 newval = eval(expr)
1691 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001692 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001693 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001694 sep = self.marshal(b'')
1695 newval = sep.join([val])
1696 self.assertEqual(val, newval)
1697 self.assertIsNot(val, newval)
1698
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001699
Christian Heimes510711d2008-01-30 11:57:58 +00001700class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001701 def fixtype(self, obj):
1702 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001703 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001704 return super().fixtype(obj)
1705
Martin Panter152a19c2016-04-06 06:37:17 +00001706 contains_bytes = True
1707
Ezio Melotti0dceb562013-01-10 07:43:26 +02001708class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001709 type2test = bytearray
1710
Ezio Melotti0dceb562013-01-10 07:43:26 +02001711class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001712 type2test = bytes
1713
Georg Brandlc7885542007-03-06 19:16:20 +00001714
Ezio Melotti0dceb562013-01-10 07:43:26 +02001715class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001716
1717 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001718 self.assertTrue(issubclass(self.type2test, self.basetype))
1719 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001720
1721 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001722 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001723
1724 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001725 self.assertTrue(_a == _a)
1726 self.assertTrue(_a != _b)
1727 self.assertTrue(_a < _b)
1728 self.assertTrue(_a <= _b)
1729 self.assertTrue(_b >= _a)
1730 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001731 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001732
1733 # test concat of subclass instances
1734 self.assertEqual(a + b, _a + _b)
1735 self.assertEqual(a + b, a + _b)
1736 self.assertEqual(a + b, _a + b)
1737
1738 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001739 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001740
1741 def test_join(self):
1742 # Make sure join returns a NEW object for single item sequences
1743 # involving a subclass.
1744 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001745 s1 = self.type2test(b"abcd")
1746 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001747 self.assertIsNot(s1, s2)
1748 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001749
1750 # Test reverse, calling join on subclass
1751 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001752 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001753
1754 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001755 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001756 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001757 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001758 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001759 b = pickle.loads(pickle.dumps(a, proto))
1760 self.assertNotEqual(id(a), id(b))
1761 self.assertEqual(a, b)
1762 self.assertEqual(a.x, b.x)
1763 self.assertEqual(a.y, b.y)
1764 self.assertEqual(type(a), type(b))
1765 self.assertEqual(type(a.y), type(b.y))
1766
1767 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001768 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001769 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001770 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001771 for copy_method in (copy.copy, copy.deepcopy):
1772 b = copy_method(a)
1773 self.assertNotEqual(id(a), id(b))
1774 self.assertEqual(a, b)
1775 self.assertEqual(a.x, b.x)
1776 self.assertEqual(a.y, b.y)
1777 self.assertEqual(type(a), type(b))
1778 self.assertEqual(type(a.y), type(b.y))
1779
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001780 def test_fromhex(self):
1781 b = self.type2test.fromhex('1a2B30')
1782 self.assertEqual(b, b'\x1a\x2b\x30')
1783 self.assertIs(type(b), self.type2test)
1784
1785 class B1(self.basetype):
1786 def __new__(cls, value):
1787 me = self.basetype.__new__(cls, value)
1788 me.foo = 'bar'
1789 return me
1790
1791 b = B1.fromhex('1a2B30')
1792 self.assertEqual(b, b'\x1a\x2b\x30')
1793 self.assertIs(type(b), B1)
1794 self.assertEqual(b.foo, 'bar')
1795
1796 class B2(self.basetype):
1797 def __init__(me, *args, **kwargs):
1798 if self.basetype is not bytes:
1799 self.basetype.__init__(me, *args, **kwargs)
1800 me.foo = 'bar'
1801
1802 b = B2.fromhex('1a2B30')
1803 self.assertEqual(b, b'\x1a\x2b\x30')
1804 self.assertIs(type(b), B2)
1805 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001806
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001807
1808class ByteArraySubclass(bytearray):
1809 pass
1810
1811class BytesSubclass(bytes):
1812 pass
1813
Serhiy Storchaka15095802015-11-25 15:47:01 +02001814class OtherBytesSubclass(bytes):
1815 pass
1816
Ezio Melotti0dceb562013-01-10 07:43:26 +02001817class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001818 basetype = bytearray
1819 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001820
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001821 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001822 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001823 def __init__(me, newarg=1, *args, **kwargs):
1824 bytearray.__init__(me, *args, **kwargs)
1825 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001826 x = subclass(4, source=b"abcd")
1827 self.assertEqual(x, b"abcd")
1828 x = subclass(newarg=4, source=b"abcd")
1829 self.assertEqual(x, b"abcd")
1830
1831
Ezio Melotti0dceb562013-01-10 07:43:26 +02001832class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001833 basetype = bytes
1834 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001835
1836
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001837if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001838 unittest.main()