blob: e61228d1a266f946b480f4f90c5d0dc5feddb1c1 [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
Victor Stinner22eb6892019-06-26 00:51:05 +020015import textwrap
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000016import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010017
Benjamin Petersonee8712c2008-05-20 21:35:26 +000018import test.support
Hai Shia089d212020-07-06 17:15:08 +080019from test.support import import_helper
Hai Shifcce8c62020-08-08 05:55:35 +080020from test.support import warnings_helper
Georg Brandlc7885542007-03-06 19:16:20 +000021import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030022import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010023from test.support import bigaddrspacetest, MAX_Py_ssize_t
Victor Stinner22eb6892019-06-26 00:51:05 +020024from test.support.script_helper import assert_python_failure
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000025
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000026
27if sys.flags.bytes_warning:
28 def check_bytes_warnings(func):
29 @functools.wraps(func)
30 def wrapper(*args, **kw):
Hai Shifcce8c62020-08-08 05:55:35 +080031 with warnings_helper.check_warnings(('', BytesWarning)):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000032 return func(*args, **kw)
33 return wrapper
34else:
35 # no-op
36 def check_bytes_warnings(func):
37 return func
38
39
Georg Brandl9a54d7c2008-07-16 23:15:30 +000040class Indexable:
41 def __init__(self, value=0):
42 self.value = value
43 def __index__(self):
44 return self.value
45
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000046
Ezio Melotti0dceb562013-01-10 07:43:26 +020047class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048
49 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000050 b = self.type2test()
51 self.assertEqual(type(b), self.type2test)
52 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000053
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000054 def test_copy(self):
55 a = self.type2test(b"abcd")
56 for copy_method in (copy.copy, copy.deepcopy):
57 b = copy_method(a)
58 self.assertEqual(a, b)
59 self.assertEqual(type(a), type(b))
60
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000061 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000062 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertEqual(len(b), 0)
64 self.assertRaises(IndexError, lambda: b[0])
65 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 self.assertRaises(IndexError, lambda: b[sys.maxsize])
67 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000068 self.assertRaises(IndexError, lambda: b[10**100])
69 self.assertRaises(IndexError, lambda: b[-1])
70 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000071 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
72 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
73 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertRaises(IndexError, lambda: b[-10**100])
75
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030076 def test_from_iterable(self):
77 b = self.type2test(range(256))
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000078 self.assertEqual(len(b), 256)
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +030079 self.assertEqual(list(b), list(range(256)))
80
81 # Non-sequence iterable.
82 b = self.type2test({42})
83 self.assertEqual(b, b"*")
84 b = self.type2test({43, 45})
85 self.assertIn(tuple(b), {(43, 45), (45, 43)})
86
87 # Iterator that has a __length_hint__.
88 b = self.type2test(iter(range(256)))
89 self.assertEqual(len(b), 256)
90 self.assertEqual(list(b), list(range(256)))
91
92 # Iterator that doesn't have a __length_hint__.
93 b = self.type2test(i for i in range(256) if i % 2)
94 self.assertEqual(len(b), 128)
95 self.assertEqual(list(b), list(range(256))[1::2])
96
97 # Sequence without __iter__.
98 class S:
99 def __getitem__(self, i):
100 return (1, 2, 3)[i]
101 b = self.type2test(S())
102 self.assertEqual(b, b"\x01\x02\x03")
103
104 def test_from_tuple(self):
105 # There is a special case for tuples.
106 b = self.type2test(tuple(range(256)))
107 self.assertEqual(len(b), 256)
108 self.assertEqual(list(b), list(range(256)))
109 b = self.type2test((1, 2, 3))
110 self.assertEqual(b, b"\x01\x02\x03")
111
112 def test_from_list(self):
113 # There is a special case for lists.
114 b = self.type2test(list(range(256)))
115 self.assertEqual(len(b), 256)
116 self.assertEqual(list(b), list(range(256)))
117 b = self.type2test([1, 2, 3])
118 self.assertEqual(b, b"\x01\x02\x03")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000119
Serhiy Storchaka914f9a02018-10-21 15:25:53 +0300120 def test_from_mutating_list(self):
121 # Issue #34973: Crash in bytes constructor with mutating list.
122 class X:
123 def __index__(self):
124 a.clear()
125 return 42
126 a = [X(), X()]
127 self.assertEqual(bytes(a), b'*')
128
129 class Y:
130 def __index__(self):
131 if len(a) < 1000:
132 a.append(self)
133 return 42
134 a = [Y()]
135 self.assertEqual(bytes(a), b'*' * 1000) # should not crash
136
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000137 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000138 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
139 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +0000141 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
142 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +0000143
INADA Naokia634e232017-01-06 17:32:01 +0900144 def test_from_buffer(self):
145 a = self.type2test(array.array('B', [1, 2, 3]))
146 self.assertEqual(a, b"\x01\x02\x03")
Serhiy Storchaka1a997eb2018-10-13 20:39:45 +0300147 a = self.type2test(b"\x01\x02\x03")
148 self.assertEqual(a, b"\x01\x02\x03")
INADA Naokia634e232017-01-06 17:32:01 +0900149
Serhiy Storchakae8904212018-10-15 00:02:57 +0300150 # Issues #29159 and #34974.
151 # Fallback when __index__ raises a TypeError
INADA Naokia634e232017-01-06 17:32:01 +0900152 class B(bytes):
153 def __index__(self):
154 raise TypeError
155
156 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
157
Guido van Rossum98297ee2007-11-06 21:34:58 +0000158 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +0000159 self.assertEqual(self.type2test(0), b'')
160 self.assertEqual(self.type2test(1), b'\x00')
161 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
162 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000163
Benjamin Peterson4c045832010-04-16 22:35:32 +0000164 self.assertEqual(self.type2test('0', 'ascii'), b'0')
165 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000166 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000167
168 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000169 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000170 class C:
171 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000172 self.assertRaises(TypeError, self.type2test, ["0"])
173 self.assertRaises(TypeError, self.type2test, [0.0])
174 self.assertRaises(TypeError, self.type2test, [None])
175 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka2c2044e2018-10-21 15:29:12 +0300176 self.assertRaises(TypeError, self.type2test, encoding='ascii')
177 self.assertRaises(TypeError, self.type2test, errors='ignore')
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200178 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
179 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
180 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
181 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
182 self.assertRaises(TypeError, self.type2test, '')
183 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
184 self.assertRaises(TypeError, self.type2test, '', b'ascii')
185 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000186
187 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000188 self.assertRaises(ValueError, self.type2test, [-1])
189 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
190 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
191 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
192 self.assertRaises(ValueError, self.type2test, [-10**100])
193 self.assertRaises(ValueError, self.type2test, [256])
194 self.assertRaises(ValueError, self.type2test, [257])
195 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
196 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
197 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000198
Antoine Pitroucc231542014-11-02 18:40:09 +0100199 @bigaddrspacetest
200 def test_constructor_overflow(self):
201 size = MAX_Py_ssize_t
202 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
203 try:
204 # Should either pass or raise an error (e.g. on debug builds with
205 # additional malloc() overhead), but shouldn't crash.
206 bytearray(size - 4)
207 except (OverflowError, MemoryError):
208 pass
209
Serhiy Storchakae8904212018-10-15 00:02:57 +0300210 def test_constructor_exceptions(self):
211 # Issue #34974: bytes and bytearray constructors replace unexpected
212 # exceptions.
213 class BadInt:
214 def __index__(self):
215 1/0
216 self.assertRaises(ZeroDivisionError, self.type2test, BadInt())
217 self.assertRaises(ZeroDivisionError, self.type2test, [BadInt()])
218
219 class BadIterable:
220 def __iter__(self):
221 1/0
222 self.assertRaises(ZeroDivisionError, self.type2test, BadIterable())
223
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000224 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000225 b1 = self.type2test([1, 2, 3])
226 b2 = self.type2test([1, 2, 3])
227 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000228
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000229 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000230 self.assertTrue(b2 != b3)
231 self.assertTrue(b1 <= b2)
232 self.assertTrue(b1 <= b3)
233 self.assertTrue(b1 < b3)
234 self.assertTrue(b1 >= b2)
235 self.assertTrue(b3 >= b2)
236 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000237
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000238 self.assertFalse(b1 != b2)
239 self.assertFalse(b2 == b3)
240 self.assertFalse(b1 > b2)
241 self.assertFalse(b1 > b3)
242 self.assertFalse(b1 >= b3)
243 self.assertFalse(b1 < b2)
244 self.assertFalse(b3 < b2)
245 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000246
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000247 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000248 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000249 # Byte comparisons with unicode should always fail!
250 # Test this for all expected byte orders and Unicode character
251 # sizes.
252 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
253 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
254 False)
255 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
256 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
257 False)
258 self.assertEqual(self.type2test() == str(), False)
259 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000260
261 def test_reversed(self):
262 input = list(map(ord, "Hello"))
263 b = self.type2test(input)
264 output = list(reversed(b))
265 input.reverse()
266 self.assertEqual(output, input)
267
268 def test_getslice(self):
269 def by(s):
270 return self.type2test(map(ord, s))
271 b = by("Hello, world")
272
273 self.assertEqual(b[:5], by("Hello"))
274 self.assertEqual(b[1:5], by("ello"))
275 self.assertEqual(b[5:7], by(", "))
276 self.assertEqual(b[7:], by("world"))
277 self.assertEqual(b[7:12], by("world"))
278 self.assertEqual(b[7:100], by("world"))
279
280 self.assertEqual(b[:-7], by("Hello"))
281 self.assertEqual(b[-11:-7], by("ello"))
282 self.assertEqual(b[-7:-5], by(", "))
283 self.assertEqual(b[-5:], by("world"))
284 self.assertEqual(b[-5:12], by("world"))
285 self.assertEqual(b[-5:100], by("world"))
286 self.assertEqual(b[-100:5], by("Hello"))
287
288 def test_extended_getslice(self):
289 # Test extended slicing by comparing with list slicing.
290 L = list(range(255))
291 b = self.type2test(L)
Zackery Spytz14514d92019-05-17 01:13:03 -0600292 indices = (0, None, 1, 3, 19, 100, sys.maxsize, -1, -2, -31, -100)
Christian Heimes510711d2008-01-30 11:57:58 +0000293 for start in indices:
294 for stop in indices:
295 # Skip step 0 (invalid)
296 for step in indices[1:]:
297 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
298
299 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000300 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000301 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000302 b = self.type2test(sample, enc)
303 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000304 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
305 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000306 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000307
308 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300309 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000310 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000311 b = self.type2test(sample, enc)
312 self.assertEqual(b.decode(enc), sample)
313 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000314 b = self.type2test(sample, "latin-1")
315 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
316 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
317 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000318 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000319 # Default encoding is utf-8
320 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000321
Victor Stinner22eb6892019-06-26 00:51:05 +0200322 def test_check_encoding_errors(self):
323 # bpo-37388: bytes(str) and bytes.encode() must check encoding
324 # and errors arguments in dev mode
325 invalid = 'Boom, Shaka Laka, Boom!'
326 encodings = ('ascii', 'utf8', 'latin1')
327 code = textwrap.dedent(f'''
328 import sys
329 type2test = {self.type2test.__name__}
330 encodings = {encodings!r}
331
332 for data in ('', 'short string'):
333 try:
334 type2test(data, encoding={invalid!r})
335 except LookupError:
336 pass
337 else:
338 sys.exit(21)
339
340 for encoding in encodings:
341 try:
342 type2test(data, encoding=encoding, errors={invalid!r})
343 except LookupError:
344 pass
345 else:
346 sys.exit(22)
347
348 for data in (b'', b'short string'):
349 data = type2test(data)
350 print(repr(data))
351 try:
352 data.decode(encoding={invalid!r})
353 except LookupError:
354 sys.exit(10)
355 else:
356 sys.exit(23)
357
358 try:
359 data.decode(errors={invalid!r})
360 except LookupError:
361 pass
362 else:
363 sys.exit(24)
364
365 for encoding in encodings:
366 try:
367 data.decode(encoding=encoding, errors={invalid!r})
368 except LookupError:
369 pass
370 else:
371 sys.exit(25)
372
373 sys.exit(10)
374 ''')
375 proc = assert_python_failure('-X', 'dev', '-c', code)
376 self.assertEqual(proc.rc, 10, proc)
377
Christian Heimes510711d2008-01-30 11:57:58 +0000378 def test_from_int(self):
379 b = self.type2test(0)
380 self.assertEqual(b, self.type2test())
381 b = self.type2test(10)
382 self.assertEqual(b, self.type2test([0]*10))
383 b = self.type2test(10000)
384 self.assertEqual(b, self.type2test([0]*10000))
385
386 def test_concat(self):
387 b1 = self.type2test(b"abc")
388 b2 = self.type2test(b"def")
389 self.assertEqual(b1 + b2, b"abcdef")
390 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
391 self.assertEqual(bytes(b"def") + b1, b"defabc")
392 self.assertRaises(TypeError, lambda: b1 + "def")
393 self.assertRaises(TypeError, lambda: "abc" + b2)
394
395 def test_repeat(self):
396 for b in b"abc", self.type2test(b"abc"):
397 self.assertEqual(b * 3, b"abcabcabc")
398 self.assertEqual(b * 0, b"")
399 self.assertEqual(b * -1, b"")
400 self.assertRaises(TypeError, lambda: b * 3.14)
401 self.assertRaises(TypeError, lambda: 3.14 * b)
402 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000403 with self.assertRaises((OverflowError, MemoryError)):
404 c = b * sys.maxsize
405 with self.assertRaises((OverflowError, MemoryError)):
406 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000407
408 def test_repeat_1char(self):
409 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
410
411 def test_contains(self):
412 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000413 self.assertIn(ord('a'), b)
414 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000415 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000416 self.assertRaises(ValueError, lambda: 300 in b)
417 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300418 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000419 self.assertRaises(TypeError, lambda: None in b)
420 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
421 self.assertRaises(TypeError, lambda: "a" in b)
422 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000423 self.assertIn(f(b""), b)
424 self.assertIn(f(b"a"), b)
425 self.assertIn(f(b"b"), b)
426 self.assertIn(f(b"c"), b)
427 self.assertIn(f(b"ab"), b)
428 self.assertIn(f(b"bc"), b)
429 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000430 self.assertNotIn(f(b"ac"), b)
431 self.assertNotIn(f(b"d"), b)
432 self.assertNotIn(f(b"dab"), b)
433 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000434
435 def test_fromhex(self):
436 self.assertRaises(TypeError, self.type2test.fromhex)
437 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000438 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000439 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000440 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
441 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200442
443 # check that ASCII whitespace is ignored
444 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
445 for c in "\x09\x0A\x0B\x0C\x0D\x20":
446 self.assertEqual(self.type2test.fromhex(c), self.type2test())
447 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
448 self.assertRaises(ValueError, self.type2test.fromhex, c)
449
Ezio Melottib3aedd42010-11-20 19:04:17 +0000450 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000451 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
452 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
453 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
454 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
455 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
456 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
457
Victor Stinner2bf89932015-10-14 11:25:33 +0200458 for data, pos in (
459 # invalid first hexadecimal character
460 ('12 x4 56', 3),
461 # invalid second hexadecimal character
462 ('12 3x 56', 4),
463 # two invalid hexadecimal characters
464 ('12 xy 56', 3),
465 # test non-ASCII string
466 ('12 3\xff 56', 4),
467 ):
468 with self.assertRaises(ValueError) as cm:
469 self.type2test.fromhex(data)
470 self.assertIn('at position %s' % pos, str(cm.exception))
471
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000472 def test_hex(self):
473 self.assertRaises(TypeError, self.type2test.hex)
474 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000475 self.assertEqual(self.type2test(b"").hex(), "")
476 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
477 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
478 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000479
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700480 def test_hex_separator_basics(self):
481 three_bytes = self.type2test(b'\xb9\x01\xef')
482 self.assertEqual(three_bytes.hex(), 'b901ef')
483 with self.assertRaises(ValueError):
484 three_bytes.hex('')
485 with self.assertRaises(ValueError):
486 three_bytes.hex('xx')
487 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
488 with self.assertRaises(TypeError):
489 three_bytes.hex(None, 0)
490 with self.assertRaises(ValueError):
491 three_bytes.hex('\xff')
492 with self.assertRaises(ValueError):
493 three_bytes.hex(b'\xff')
494 with self.assertRaises(ValueError):
495 three_bytes.hex(b'\x80')
496 with self.assertRaises(ValueError):
497 three_bytes.hex(chr(0x100))
498 self.assertEqual(three_bytes.hex(':', 0), 'b901ef')
499 self.assertEqual(three_bytes.hex(b'\x00'), 'b9\x0001\x00ef')
500 self.assertEqual(three_bytes.hex('\x00'), 'b9\x0001\x00ef')
501 self.assertEqual(three_bytes.hex(b'\x7f'), 'b9\x7f01\x7fef')
502 self.assertEqual(three_bytes.hex('\x7f'), 'b9\x7f01\x7fef')
503 self.assertEqual(three_bytes.hex(':', 3), 'b901ef')
504 self.assertEqual(three_bytes.hex(':', 4), 'b901ef')
505 self.assertEqual(three_bytes.hex(':', -4), 'b901ef')
506 self.assertEqual(three_bytes.hex(':'), 'b9:01:ef')
507 self.assertEqual(three_bytes.hex(b'$'), 'b9$01$ef')
508 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
509 self.assertEqual(three_bytes.hex(':', -1), 'b9:01:ef')
510 self.assertEqual(three_bytes.hex(':', 2), 'b9:01ef')
511 self.assertEqual(three_bytes.hex(':', 1), 'b9:01:ef')
512 self.assertEqual(three_bytes.hex('*', -2), 'b901*ef')
513
514 value = b'{s\005\000\000\000worldi\002\000\000\000s\005\000\000\000helloi\001\000\000\0000'
515 self.assertEqual(value.hex('.', 8), '7b7305000000776f.726c646902000000.730500000068656c.6c6f690100000030')
516
517 def test_hex_separator_five_bytes(self):
518 five_bytes = self.type2test(range(90,95))
519 self.assertEqual(five_bytes.hex(), '5a5b5c5d5e')
520
521 def test_hex_separator_six_bytes(self):
522 six_bytes = self.type2test(x*3 for x in range(1, 7))
523 self.assertEqual(six_bytes.hex(), '0306090c0f12')
524 self.assertEqual(six_bytes.hex('.', 1), '03.06.09.0c.0f.12')
525 self.assertEqual(six_bytes.hex(' ', 2), '0306 090c 0f12')
526 self.assertEqual(six_bytes.hex('-', 3), '030609-0c0f12')
527 self.assertEqual(six_bytes.hex(':', 4), '0306:090c0f12')
528 self.assertEqual(six_bytes.hex(':', 5), '03:06090c0f12')
529 self.assertEqual(six_bytes.hex(':', 6), '0306090c0f12')
530 self.assertEqual(six_bytes.hex(':', 95), '0306090c0f12')
531 self.assertEqual(six_bytes.hex('_', -3), '030609_0c0f12')
532 self.assertEqual(six_bytes.hex(':', -4), '0306090c:0f12')
533 self.assertEqual(six_bytes.hex(b'@', -5), '0306090c0f@12')
534 self.assertEqual(six_bytes.hex(':', -6), '0306090c0f12')
535 self.assertEqual(six_bytes.hex(' ', -95), '0306090c0f12')
536
Christian Heimes510711d2008-01-30 11:57:58 +0000537 def test_join(self):
538 self.assertEqual(self.type2test(b"").join([]), b"")
539 self.assertEqual(self.type2test(b"").join([b""]), b"")
540 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
541 lst = list(map(self.type2test, lst))
542 self.assertEqual(self.type2test(b"").join(lst), b"abc")
543 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
544 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200545 dot_join = self.type2test(b".:").join
546 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
547 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
548 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
549 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
550 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
551 # Stress it with many items
Bruce Merryd07d9f42020-01-29 09:09:24 +0200552 seq = [b"abc"] * 100000
553 expected = b"abc" + b".:abc" * 99999
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200554 self.assertEqual(dot_join(seq), expected)
Bruce Merryd07d9f42020-01-29 09:09:24 +0200555 # Stress test with empty separator
556 seq = [b"abc"] * 100000
557 expected = b"abc" * 100000
558 self.assertEqual(self.type2test(b"").join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400559 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200560 # Error handling and cleanup when some item in the middle of the
561 # sequence has the wrong type.
562 with self.assertRaises(TypeError):
563 dot_join([bytearray(b"ab"), "cd", b"ef"])
564 with self.assertRaises(TypeError):
565 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000566
Christian Heimes510711d2008-01-30 11:57:58 +0000567 def test_count(self):
568 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200569 i = 105
570 p = 112
571 w = 119
572
Christian Heimes510711d2008-01-30 11:57:58 +0000573 self.assertEqual(b.count(b'i'), 4)
574 self.assertEqual(b.count(b'ss'), 2)
575 self.assertEqual(b.count(b'w'), 0)
576
Antoine Pitrouac65d962011-10-20 23:54:17 +0200577 self.assertEqual(b.count(i), 4)
578 self.assertEqual(b.count(w), 0)
579
580 self.assertEqual(b.count(b'i', 6), 2)
581 self.assertEqual(b.count(b'p', 6), 2)
582 self.assertEqual(b.count(b'i', 1, 3), 1)
583 self.assertEqual(b.count(b'p', 7, 9), 1)
584
585 self.assertEqual(b.count(i, 6), 2)
586 self.assertEqual(b.count(p, 6), 2)
587 self.assertEqual(b.count(i, 1, 3), 1)
588 self.assertEqual(b.count(p, 7, 9), 1)
589
Christian Heimes510711d2008-01-30 11:57:58 +0000590 def test_startswith(self):
591 b = self.type2test(b'hello')
592 self.assertFalse(self.type2test().startswith(b"anything"))
593 self.assertTrue(b.startswith(b"hello"))
594 self.assertTrue(b.startswith(b"hel"))
595 self.assertTrue(b.startswith(b"h"))
596 self.assertFalse(b.startswith(b"hellow"))
597 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300598 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300599 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300600 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300601 self.assertIn('bytes', exc)
602 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000603
604 def test_endswith(self):
605 b = self.type2test(b'hello')
606 self.assertFalse(bytearray().endswith(b"anything"))
607 self.assertTrue(b.endswith(b"hello"))
608 self.assertTrue(b.endswith(b"llo"))
609 self.assertTrue(b.endswith(b"o"))
610 self.assertFalse(b.endswith(b"whello"))
611 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300612 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300613 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300614 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300615 self.assertIn('bytes', exc)
616 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000617
618 def test_find(self):
619 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200620 i = 105
621 w = 119
622
Christian Heimes510711d2008-01-30 11:57:58 +0000623 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000624 self.assertEqual(b.find(b'w'), -1)
625 self.assertEqual(b.find(b'mississippian'), -1)
626
Antoine Pitrouac65d962011-10-20 23:54:17 +0200627 self.assertEqual(b.find(i), 1)
628 self.assertEqual(b.find(w), -1)
629
630 self.assertEqual(b.find(b'ss', 3), 5)
631 self.assertEqual(b.find(b'ss', 1, 7), 2)
632 self.assertEqual(b.find(b'ss', 1, 3), -1)
633
634 self.assertEqual(b.find(i, 6), 7)
635 self.assertEqual(b.find(i, 1, 3), 1)
636 self.assertEqual(b.find(w, 1, 3), -1)
637
Victor Stinnerf8eac002011-12-18 01:17:41 +0100638 for index in (-1, 256, sys.maxsize + 1):
639 self.assertRaisesRegex(
640 ValueError, r'byte must be in range\(0, 256\)',
641 b.find, index)
642
Christian Heimes510711d2008-01-30 11:57:58 +0000643 def test_rfind(self):
644 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200645 i = 105
646 w = 119
647
Christian Heimes510711d2008-01-30 11:57:58 +0000648 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000649 self.assertEqual(b.rfind(b'w'), -1)
650 self.assertEqual(b.rfind(b'mississippian'), -1)
651
Antoine Pitrouac65d962011-10-20 23:54:17 +0200652 self.assertEqual(b.rfind(i), 10)
653 self.assertEqual(b.rfind(w), -1)
654
655 self.assertEqual(b.rfind(b'ss', 3), 5)
656 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
657
658 self.assertEqual(b.rfind(i, 1, 3), 1)
659 self.assertEqual(b.rfind(i, 3, 9), 7)
660 self.assertEqual(b.rfind(w, 1, 3), -1)
661
Christian Heimes510711d2008-01-30 11:57:58 +0000662 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200663 b = self.type2test(b'mississippi')
664 i = 105
665 w = 119
666
667 self.assertEqual(b.index(b'ss'), 2)
668 self.assertRaises(ValueError, b.index, b'w')
669 self.assertRaises(ValueError, b.index, b'mississippian')
670
671 self.assertEqual(b.index(i), 1)
672 self.assertRaises(ValueError, b.index, w)
673
674 self.assertEqual(b.index(b'ss', 3), 5)
675 self.assertEqual(b.index(b'ss', 1, 7), 2)
676 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
677
678 self.assertEqual(b.index(i, 6), 7)
679 self.assertEqual(b.index(i, 1, 3), 1)
680 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000681
682 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200683 b = self.type2test(b'mississippi')
684 i = 105
685 w = 119
686
687 self.assertEqual(b.rindex(b'ss'), 5)
688 self.assertRaises(ValueError, b.rindex, b'w')
689 self.assertRaises(ValueError, b.rindex, b'mississippian')
690
691 self.assertEqual(b.rindex(i), 10)
692 self.assertRaises(ValueError, b.rindex, w)
693
694 self.assertEqual(b.rindex(b'ss', 3), 5)
695 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
696
697 self.assertEqual(b.rindex(i, 1, 3), 1)
698 self.assertEqual(b.rindex(i, 3, 9), 7)
699 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000700
Ethan Furmanb95b5612015-01-23 20:05:18 -0800701 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300702 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800703 orig = b
704 b = b % b'world'
705 self.assertEqual(b, b'hello, world!')
706 self.assertEqual(orig, b'hello, %b!')
707 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300708 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800709 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200710 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200711 self.assertIs(type(a), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800712 # issue 29714
713 b = self.type2test(b'hello,\x00%b!')
714 b = b % b'world'
715 self.assertEqual(b, b'hello,\x00world!')
716 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800717
718 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300719 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800720 orig = b
721 b %= b'world'
722 self.assertEqual(b, b'hello, world!')
723 self.assertEqual(orig, b'hello, %b!')
724 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300725 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800726 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200727 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200728 self.assertIs(type(b), self.type2test)
Xiang Zhangb76ad512017-03-06 17:17:05 +0800729 # issue 29714
730 b = self.type2test(b'hello,\x00%b!')
731 b %= b'world'
732 self.assertEqual(b, b'hello,\x00world!')
733 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300734
735 def test_rmod(self):
736 with self.assertRaises(TypeError):
737 object() % self.type2test(b'abc')
738 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800739
Christian Heimes510711d2008-01-30 11:57:58 +0000740 def test_replace(self):
741 b = self.type2test(b'mississippi')
742 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
743 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
744
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300745 def test_replace_int_error(self):
746 self.assertRaises(TypeError, self.type2test(b'a b').replace, 32, b'')
747
Christian Heimes510711d2008-01-30 11:57:58 +0000748 def test_split_string_error(self):
749 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300750 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
751
752 def test_split_int_error(self):
753 self.assertRaises(TypeError, self.type2test(b'a b').split, 32)
754 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000755
Antoine Pitrouf8453022010-01-12 22:05:42 +0000756 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000757 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
758 b = self.type2test(b)
759 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000760 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
761 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
762
Christian Heimes510711d2008-01-30 11:57:58 +0000763 def test_rsplit_unicodewhitespace(self):
764 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000765 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
766
767 def test_partition(self):
768 b = self.type2test(b'mississippi')
769 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000770 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000771
772 def test_rpartition(self):
773 b = self.type2test(b'mississippi')
774 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
775 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000776 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000777
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300778 def test_partition_string_error(self):
779 self.assertRaises(TypeError, self.type2test(b'a b').partition, ' ')
780 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, ' ')
781
782 def test_partition_int_error(self):
783 self.assertRaises(TypeError, self.type2test(b'a b').partition, 32)
784 self.assertRaises(TypeError, self.type2test(b'a b').rpartition, 32)
785
Christian Heimes510711d2008-01-30 11:57:58 +0000786 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000787 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000788 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
789 b = self.type2test(b)
790 ps = pickle.dumps(b, proto)
791 q = pickle.loads(ps)
792 self.assertEqual(b, q)
793
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000794 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200795 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
796 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
797 it = itorg = iter(self.type2test(b))
798 data = list(self.type2test(b))
799 d = pickle.dumps(it, proto)
800 it = pickle.loads(d)
801 self.assertEqual(type(itorg), type(it))
802 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000803
Serhiy Storchakabad12572014-12-15 14:03:42 +0200804 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200805 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200806 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200807 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200808 d = pickle.dumps(it, proto)
809 it = pickle.loads(d)
810 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000811
Christian Heimes510711d2008-01-30 11:57:58 +0000812 def test_strip_bytearray(self):
813 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
814 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
815 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
816
817 def test_strip_string_error(self):
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300818 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'ac')
819 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'ac')
820 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'ac')
821
822 def test_strip_int_error(self):
823 self.assertRaises(TypeError, self.type2test(b' abc ').strip, 32)
824 self.assertRaises(TypeError, self.type2test(b' abc ').lstrip, 32)
825 self.assertRaises(TypeError, self.type2test(b' abc ').rstrip, 32)
Christian Heimes510711d2008-01-30 11:57:58 +0000826
Eli Bendersky906b88f2011-07-29 07:05:08 +0300827 def test_center(self):
828 # Fill character can be either bytes or bytearray (issue 12380)
829 b = self.type2test(b'abc')
830 for fill_type in (bytes, bytearray):
831 self.assertEqual(b.center(7, fill_type(b'-')),
832 self.type2test(b'--abc--'))
833
834 def test_ljust(self):
835 # Fill character can be either bytes or bytearray (issue 12380)
836 b = self.type2test(b'abc')
837 for fill_type in (bytes, bytearray):
838 self.assertEqual(b.ljust(7, fill_type(b'-')),
839 self.type2test(b'abc----'))
840
841 def test_rjust(self):
842 # Fill character can be either bytes or bytearray (issue 12380)
843 b = self.type2test(b'abc')
844 for fill_type in (bytes, bytearray):
845 self.assertEqual(b.rjust(7, fill_type(b'-')),
846 self.type2test(b'----abc'))
847
Serhiy Storchakaa2314282017-10-29 02:11:54 +0300848 def test_xjust_int_error(self):
849 self.assertRaises(TypeError, self.type2test(b'abc').center, 7, 32)
850 self.assertRaises(TypeError, self.type2test(b'abc').ljust, 7, 32)
851 self.assertRaises(TypeError, self.type2test(b'abc').rjust, 7, 32)
852
Christian Heimes510711d2008-01-30 11:57:58 +0000853 def test_ord(self):
854 b = self.type2test(b'\0A\x7f\x80\xff')
855 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
856 [0, 65, 127, 128, 255])
857
Georg Brandlabc38772009-04-12 15:51:51 +0000858 def test_maketrans(self):
859 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 +0000860 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000861 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'
862 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000863 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
864 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
865
Jesus Ceaac451502011-04-20 17:09:23 +0200866 def test_none_arguments(self):
867 # issue 11828
868 b = self.type2test(b'hello')
869 l = self.type2test(b'l')
870 h = self.type2test(b'h')
871 x = self.type2test(b'x')
872 o = self.type2test(b'o')
873
874 self.assertEqual(2, b.find(l, None))
875 self.assertEqual(3, b.find(l, -2, None))
876 self.assertEqual(2, b.find(l, None, -2))
877 self.assertEqual(0, b.find(h, None, None))
878
879 self.assertEqual(3, b.rfind(l, None))
880 self.assertEqual(3, b.rfind(l, -2, None))
881 self.assertEqual(2, b.rfind(l, None, -2))
882 self.assertEqual(0, b.rfind(h, None, None))
883
884 self.assertEqual(2, b.index(l, None))
885 self.assertEqual(3, b.index(l, -2, None))
886 self.assertEqual(2, b.index(l, None, -2))
887 self.assertEqual(0, b.index(h, None, None))
888
889 self.assertEqual(3, b.rindex(l, None))
890 self.assertEqual(3, b.rindex(l, -2, None))
891 self.assertEqual(2, b.rindex(l, None, -2))
892 self.assertEqual(0, b.rindex(h, None, None))
893
894 self.assertEqual(2, b.count(l, None))
895 self.assertEqual(1, b.count(l, -2, None))
896 self.assertEqual(1, b.count(l, None, -2))
897 self.assertEqual(0, b.count(x, None, None))
898
899 self.assertEqual(True, b.endswith(o, None))
900 self.assertEqual(True, b.endswith(o, -2, None))
901 self.assertEqual(True, b.endswith(l, None, -2))
902 self.assertEqual(False, b.endswith(x, None, None))
903
904 self.assertEqual(True, b.startswith(h, None))
905 self.assertEqual(True, b.startswith(l, -2, None))
906 self.assertEqual(True, b.startswith(h, None, -2))
907 self.assertEqual(False, b.startswith(x, None, None))
908
Antoine Pitrouac65d962011-10-20 23:54:17 +0200909 def test_integer_arguments_out_of_byte_range(self):
910 b = self.type2test(b'hello')
911
912 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
913 self.assertRaises(ValueError, method, -1)
914 self.assertRaises(ValueError, method, 256)
915 self.assertRaises(ValueError, method, 9999)
916
Jesus Ceaac451502011-04-20 17:09:23 +0200917 def test_find_etc_raise_correct_error_messages(self):
918 # issue 11828
919 b = self.type2test(b'hello')
920 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300921 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200922 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300923 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200924 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300925 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200926 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300927 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200928 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300929 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200930 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300931 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200932 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300933 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200934 x, None, None, None)
935
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300936 def test_free_after_iterating(self):
937 test.support.check_free_after_iterating(self, iter, self.type2test)
938 test.support.check_free_after_iterating(self, reversed, self.type2test)
939
Martin Panter1b6c6da2016-08-27 08:35:02 +0000940 def test_translate(self):
941 b = self.type2test(b'hello')
942 rosetta = bytearray(range(256))
943 rosetta[ord('o')] = ord('e')
944
945 self.assertRaises(TypeError, b.translate)
946 self.assertRaises(TypeError, b.translate, None, None)
947 self.assertRaises(ValueError, b.translate, bytes(range(255)))
948
949 c = b.translate(rosetta, b'hello')
950 self.assertEqual(b, b'hello')
951 self.assertIsInstance(c, self.type2test)
952
953 c = b.translate(rosetta)
954 d = b.translate(rosetta, b'')
955 self.assertEqual(c, d)
956 self.assertEqual(c, b'helle')
957
958 c = b.translate(rosetta, b'l')
959 self.assertEqual(c, b'hee')
960 c = b.translate(None, b'e')
961 self.assertEqual(c, b'hllo')
962
963 # test delete as a keyword argument
964 c = b.translate(rosetta, delete=b'')
965 self.assertEqual(c, b'helle')
966 c = b.translate(rosetta, delete=b'l')
967 self.assertEqual(c, b'hee')
968 c = b.translate(None, delete=b'e')
969 self.assertEqual(c, b'hllo')
970
Sergey Fedoseev92709a22019-09-09 21:28:34 +0500971 def test_sq_item(self):
Hai Shia089d212020-07-06 17:15:08 +0800972 _testcapi = import_helper.import_module('_testcapi')
Sergey Fedoseev92709a22019-09-09 21:28:34 +0500973 obj = self.type2test((42,))
974 with self.assertRaises(IndexError):
975 _testcapi.sequence_getitem(obj, -2)
976 with self.assertRaises(IndexError):
977 _testcapi.sequence_getitem(obj, 1)
978 self.assertEqual(_testcapi.sequence_getitem(obj, 0), 42)
979
Christian Heimes510711d2008-01-30 11:57:58 +0000980
Ezio Melotti0dceb562013-01-10 07:43:26 +0200981class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000982 type2test = bytes
983
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400984 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200985 b = b'python'
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400986 msg = "byte indices must be integers or slices"
987 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +0200988 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400989
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000990 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200991 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000992 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000993 self.assertRaises(TypeError, f.readinto, b"")
994
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000995 def test_custom(self):
996 class A:
997 def __bytes__(self):
998 return b'abc'
999 self.assertEqual(bytes(A()), b'abc')
1000 class A: pass
1001 self.assertRaises(TypeError, bytes, A())
1002 class A:
1003 def __bytes__(self):
1004 return None
1005 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -06001006 class A:
1007 def __bytes__(self):
1008 return b'a'
1009 def __index__(self):
1010 return 42
1011 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +02001012 # Issue #25766
1013 class A(str):
1014 def __bytes__(self):
1015 return b'abc'
1016 self.assertEqual(bytes(A('\u20ac')), b'abc')
1017 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +02001018 # Issue #24731
1019 class A:
1020 def __bytes__(self):
1021 return OtherBytesSubclass(b'abc')
1022 self.assertEqual(bytes(A()), b'abc')
1023 self.assertIs(type(bytes(A())), OtherBytesSubclass)
1024 self.assertEqual(BytesSubclass(A()), b'abc')
1025 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +00001026
Victor Stinner29e762c2011-01-05 03:33:28 +00001027 # Test PyBytes_FromFormat()
1028 def test_from_format(self):
Hai Shia089d212020-07-06 17:15:08 +08001029 ctypes = import_helper.import_module('ctypes')
1030 _testcapi = import_helper.import_module('_testcapi')
Victor Stinner03dab782015-10-14 00:21:35 +02001031 from ctypes import pythonapi, py_object
1032 from ctypes import (
1033 c_int, c_uint,
1034 c_long, c_ulong,
1035 c_size_t, c_ssize_t,
1036 c_char_p)
1037
Victor Stinner29e762c2011-01-05 03:33:28 +00001038 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
1039 PyBytes_FromFormat.restype = py_object
1040
Victor Stinner03dab782015-10-14 00:21:35 +02001041 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +00001042 self.assertEqual(PyBytes_FromFormat(b'format'),
1043 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +02001044 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
1045 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +00001046
Victor Stinner03dab782015-10-14 00:21:35 +02001047 # test formatters
1048 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
1049 b'c=\0')
1050 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
1051 b'c=@')
1052 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
1053 b'c=\xff')
1054 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
1055 c_int(1), c_long(2),
1056 c_size_t(3)),
1057 b'd=1 ld=2 zd=3')
1058 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
1059 c_int(-1), c_long(-2),
1060 c_size_t(-3)),
1061 b'd=-1 ld=-2 zd=-3')
1062 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
1063 c_uint(123), c_ulong(456),
1064 c_size_t(789)),
1065 b'u=123 lu=456 zu=789')
1066 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
1067 b'i=123')
1068 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
1069 b'i=-123')
1070 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
1071 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +02001072
1073 sizeof_ptr = ctypes.sizeof(c_char_p)
1074
1075 if os.name == 'nt':
1076 # Windows (MSCRT)
1077 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
1078 def ptr_formatter(ptr):
1079 return (ptr_format % ptr)
1080 else:
1081 # UNIX (glibc)
1082 def ptr_formatter(ptr):
1083 return '%#x' % ptr
1084
Victor Stinner7ab986d2015-10-14 02:55:12 +02001085 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +02001086 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
1087 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +02001088 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
1089 b's=cstr')
1090
1091 # test minimum and maximum integer values
1092 size_max = c_size_t(-1).value
1093 for formatstr, ctypes_type, value, py_formatter in (
1094 (b'%d', c_int, _testcapi.INT_MIN, str),
1095 (b'%d', c_int, _testcapi.INT_MAX, str),
1096 (b'%ld', c_long, _testcapi.LONG_MIN, str),
1097 (b'%ld', c_long, _testcapi.LONG_MAX, str),
1098 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
1099 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
1100 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
1101 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +02001102 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +02001103 ):
1104 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
1105 py_formatter(value).encode('ascii')),
1106
1107 # width and precision (width is currently ignored)
1108 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
1109 b'a')
1110 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
1111 b'abc')
1112
1113 # '%%' formatter
1114 self.assertEqual(PyBytes_FromFormat(b'%%'),
1115 b'%')
1116 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
1117 b'[%]')
1118 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
1119 b'%_')
1120 self.assertEqual(PyBytes_FromFormat(b'%%s'),
1121 b'%s')
1122
1123 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +00001124 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +02001125 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
1126 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +00001127
Victor Stinner03dab782015-10-14 00:21:35 +02001128 # Issue #19969: %c must raise OverflowError for values
1129 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +01001130 self.assertRaises(OverflowError,
1131 PyBytes_FromFormat, b'%c', c_int(-1))
1132 self.assertRaises(OverflowError,
1133 PyBytes_FromFormat, b'%c', c_int(256))
1134
Serhiy Storchaka44cc4822019-01-12 09:22:29 +02001135 # Issue #33817: empty strings
1136 self.assertEqual(PyBytes_FromFormat(b''),
1137 b'')
1138 self.assertEqual(PyBytes_FromFormat(b'%s', b''),
1139 b'')
1140
Guido van Rossum97c1adf2016-08-18 09:22:23 -07001141 def test_bytes_blocking(self):
1142 class IterationBlocked(list):
1143 __bytes__ = None
1144 i = [0, 1, 2, 3]
1145 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
1146 self.assertRaises(TypeError, bytes, IterationBlocked(i))
1147
1148 # At least in CPython, because bytes.__new__ and the C API
1149 # PyBytes_FromObject have different fallback rules, integer
1150 # fallback is handled specially, so test separately.
1151 class IntBlocked(int):
1152 __bytes__ = None
1153 self.assertEqual(bytes(3), b'\0\0\0')
1154 self.assertRaises(TypeError, bytes, IntBlocked(3))
1155
1156 # While there is no separately-defined rule for handling bytes
1157 # subclasses differently from other buffer-interface classes,
1158 # an implementation may well special-case them (as CPython 2.x
1159 # str did), so test them separately.
1160 class BytesSubclassBlocked(bytes):
1161 __bytes__ = None
1162 self.assertEqual(bytes(b'ab'), b'ab')
1163 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
1164
1165 class BufferBlocked(bytearray):
1166 __bytes__ = None
1167 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
1168 self.assertEqual(bytes(ba), b'ab')
1169 self.assertRaises(TypeError, bytes, bb)
1170
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00001171
Ezio Melotti0dceb562013-01-10 07:43:26 +02001172class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001173 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +00001174
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001175 def test_getitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001176 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001177 msg = "bytearray indices must be integers or slices"
1178 with self.assertRaisesRegex(TypeError, msg):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001179 b['a']
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001180
1181 def test_setitem_error(self):
Serhiy Storchaka8e79e6e2019-02-19 13:49:09 +02001182 b = bytearray(b'python')
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001183 msg = "bytearray indices must be integers or slices"
1184 with self.assertRaisesRegex(TypeError, msg):
Terry Jan Reedyffff1442014-08-02 01:30:37 -04001185 b['a'] = "python"
1186
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001187 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001188 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001189
Guido van Rossum254348e2007-11-21 19:29:53 +00001190 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +00001191 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +00001192 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001193 tfn = tempfile.mktemp()
1194 try:
1195 # Prepare
1196 with open(tfn, "wb") as f:
1197 f.write(short_sample)
1198 # Test readinto
1199 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +00001200 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +00001201 n = f.readinto(b)
1202 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +00001203 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +00001204 # Test writing in binary mode
1205 with open(tfn, "wb") as f:
1206 f.write(b)
1207 with open(tfn, "rb") as f:
1208 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +00001209 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +00001210 finally:
1211 try:
1212 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +02001213 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +00001214 pass
1215
Neal Norwitz6968b052007-02-27 19:02:19 +00001216 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001217 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001218 self.assertEqual(b.reverse(), None)
1219 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001220 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +00001221 b.reverse()
1222 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +00001223 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001224 b.reverse()
1225 self.assertFalse(b)
1226
Eli Bendersky4db28d32011-03-03 18:21:02 +00001227 def test_clear(self):
1228 b = bytearray(b'python')
1229 b.clear()
1230 self.assertEqual(b, b'')
1231
1232 b = bytearray(b'')
1233 b.clear()
1234 self.assertEqual(b, b'')
1235
1236 b = bytearray(b'')
1237 b.append(ord('r'))
1238 b.clear()
1239 b.append(ord('p'))
1240 self.assertEqual(b, b'p')
1241
1242 def test_copy(self):
1243 b = bytearray(b'abc')
1244 bb = b.copy()
1245 self.assertEqual(bb, b'abc')
1246
1247 b = bytearray(b'')
1248 bb = b.copy()
1249 self.assertEqual(bb, b'')
1250
1251 # test that it's indeed a copy and not a reference
1252 b = bytearray(b'abc')
1253 bb = b.copy()
1254 self.assertEqual(b, bb)
1255 self.assertIsNot(b, bb)
1256 bb.append(ord('d'))
1257 self.assertEqual(bb, b'abcd')
1258 self.assertEqual(b, b'abc')
1259
Guido van Rossumd624f182006-04-24 13:47:05 +00001260 def test_regexps(self):
1261 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001262 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001263 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001264 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001265
1266 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001267 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001268 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001269 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001270 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001271 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001272 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001273 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001274 try:
1275 b[3] = 0
1276 self.fail("Didn't raise IndexError")
1277 except IndexError:
1278 pass
1279 try:
1280 b[-10] = 0
1281 self.fail("Didn't raise IndexError")
1282 except IndexError:
1283 pass
1284 try:
1285 b[0] = 256
1286 self.fail("Didn't raise ValueError")
1287 except ValueError:
1288 pass
1289 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001290 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001291 self.fail("Didn't raise ValueError")
1292 except ValueError:
1293 pass
1294 try:
1295 b[0] = None
1296 self.fail("Didn't raise TypeError")
1297 except TypeError:
1298 pass
1299
1300 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001301 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001302 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001303 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001304 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001305 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001306 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001307 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001308
1309 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001310 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001311 self.assertEqual(list(b), list(range(10)))
1312
Guido van Rossum254348e2007-11-21 19:29:53 +00001313 b[0:5] = bytearray([1, 1, 1, 1, 1])
1314 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001315
1316 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001317 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001318
Guido van Rossum254348e2007-11-21 19:29:53 +00001319 b[0:0] = bytearray([0, 1, 2, 3, 4])
1320 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001321
Guido van Rossum254348e2007-11-21 19:29:53 +00001322 b[-7:-3] = bytearray([100, 101])
1323 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001324
1325 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001326 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001327
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001328 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001329 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 +00001330
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001331 b[3:] = b'foo'
1332 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1333
1334 b[:3] = memoryview(b'foo')
1335 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1336
1337 b[3:4] = []
1338 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1339
1340 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1341 ['a', 'b'], [b'a', b'b'], [[]]]:
1342 with self.assertRaises(TypeError):
1343 b[3:4] = elem
1344
1345 for elem in [[254, 255, 256], [-256, 9000]]:
1346 with self.assertRaises(ValueError):
1347 b[3:4] = elem
1348
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001349 def test_setslice_extend(self):
1350 # Exercise the resizing logic (see issue #19087)
1351 b = bytearray(range(100))
1352 self.assertEqual(list(b), list(range(100)))
1353 del b[:10]
1354 self.assertEqual(list(b), list(range(10, 100)))
1355 b.extend(range(100, 110))
1356 self.assertEqual(list(b), list(range(10, 110)))
1357
Antoine Pitrou25454112015-05-19 20:52:27 +02001358 def test_fifo_overrun(self):
1359 # Test for issue #23985, a buffer overrun when implementing a FIFO
1360 # Build Python in pydebug mode for best results.
1361 b = bytearray(10)
1362 b.pop() # Defeat expanding buffer off-by-one quirk
1363 del b[:1] # Advance start pointer without reallocating
1364 b += bytes(2) # Append exactly the number of deleted bytes
1365 del b # Free memory buffer, allowing pydebug verification
1366
1367 def test_del_expand(self):
1368 # Reducing the size should not expand the buffer (issue #23985)
1369 b = bytearray(10)
1370 size = sys.getsizeof(b)
1371 del b[:1]
1372 self.assertLessEqual(sys.getsizeof(b), size)
1373
Thomas Wouters376446d2006-12-19 08:30:14 +00001374 def test_extended_set_del_slice(self):
Zackery Spytz14514d92019-05-17 01:13:03 -06001375 indices = (0, None, 1, 3, 19, 300, 1<<333, sys.maxsize,
1376 -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001377 for start in indices:
1378 for stop in indices:
1379 # Skip invalid step 0
1380 for step in indices[1:]:
1381 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001382 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001383 # Make sure we have a slice of exactly the right length,
1384 # but with different data.
1385 data = L[start:stop:step]
1386 data.reverse()
1387 L[start:stop:step] = data
1388 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001389 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001390
Thomas Wouters376446d2006-12-19 08:30:14 +00001391 del L[start:stop:step]
1392 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001393 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001394
Guido van Rossumd624f182006-04-24 13:47:05 +00001395 def test_setslice_trap(self):
1396 # This test verifies that we correctly handle assigning self
1397 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001398 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001399 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001400 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001401
Guido van Rossum13e57212006-04-27 22:54:26 +00001402 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001403 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001404 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001405 b += b"def"
1406 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001407 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001408 self.assertIs(b, b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001409 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001410 self.assertEqual(b, b"abcdefxyz")
1411 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001412 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001413 except TypeError:
1414 pass
1415 else:
1416 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001417
1418 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001419 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001420 b1 = b
1421 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001422 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001423 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001424 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001425
1426 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001427 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001428 b1 = b
1429 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001430 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001431 self.assertEqual(b, b1)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001432 self.assertIs(b, b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001433
Guido van Rossum20188312006-05-05 15:15:40 +00001434 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001435 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001436 alloc = b.__alloc__()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001437 self.assertGreaterEqual(alloc, 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001438 seq = [alloc]
1439 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001440 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001441 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001442 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001443 if alloc not in seq:
1444 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001445
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001446 def test_init_alloc(self):
1447 b = bytearray()
1448 def g():
1449 for i in range(1, 100):
1450 yield i
1451 a = list(b)
1452 self.assertEqual(a, list(range(1, len(a)+1)))
1453 self.assertEqual(len(b), len(a))
1454 self.assertLessEqual(len(b), i)
1455 alloc = b.__alloc__()
1456 self.assertGreater(alloc, len(b)) # including trailing null byte
1457 b.__init__(g())
1458 self.assertEqual(list(b), list(range(1, 100)))
1459 self.assertEqual(len(b), 99)
1460 alloc = b.__alloc__()
1461 self.assertGreater(alloc, len(b))
1462
Neal Norwitz6968b052007-02-27 19:02:19 +00001463 def test_extend(self):
1464 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001465 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001466 a.extend(a)
1467 self.assertEqual(a, orig + orig)
1468 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001469 a = bytearray(b'')
1470 # Test iterators that don't have a __length_hint__
1471 a.extend(map(int, orig * 25))
1472 a.extend(int(x) for x in orig * 25)
1473 self.assertEqual(a, orig * 50)
1474 self.assertEqual(a[-5:], orig)
1475 a = bytearray(b'')
1476 a.extend(iter(map(int, orig * 50)))
1477 self.assertEqual(a, orig * 50)
1478 self.assertEqual(a[-5:], orig)
1479 a = bytearray(b'')
1480 a.extend(list(map(int, orig * 50)))
1481 self.assertEqual(a, orig * 50)
1482 self.assertEqual(a[-5:], orig)
1483 a = bytearray(b'')
1484 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1485 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1486 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001487 a = bytearray(b'')
1488 a.extend([Indexable(ord('a'))])
1489 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001490
Neal Norwitz6968b052007-02-27 19:02:19 +00001491 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001492 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001493 b.remove(ord('l'))
1494 self.assertEqual(b, b'helo')
1495 b.remove(ord('l'))
1496 self.assertEqual(b, b'heo')
1497 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1498 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001499 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001500 # remove first and last
1501 b.remove(ord('o'))
1502 b.remove(ord('h'))
1503 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001504 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001505 b.remove(Indexable(ord('e')))
1506 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001507
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001508 # test values outside of the ascii range: (0, 127)
1509 c = bytearray([126, 127, 128, 129])
1510 c.remove(127)
1511 self.assertEqual(c, bytes([126, 128, 129]))
1512 c.remove(129)
1513 self.assertEqual(c, bytes([126, 128]))
1514
Neal Norwitz6968b052007-02-27 19:02:19 +00001515 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001516 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001517 self.assertEqual(b.pop(), ord('d'))
1518 self.assertEqual(b.pop(0), ord('w'))
1519 self.assertEqual(b.pop(-2), ord('r'))
1520 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001521 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001522 # test for issue #6846
1523 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001524
1525 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001526 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001527
Neal Norwitz6968b052007-02-27 19:02:19 +00001528 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001529 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001530 b.append(ord('o'))
1531 self.assertEqual(b, b'hello')
1532 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001533 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001534 b.append(ord('A'))
1535 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001536 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001537 b = bytearray()
1538 b.append(Indexable(ord('A')))
1539 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001540
1541 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001542 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001543 b.insert(1, ord('i'))
1544 b.insert(4, ord('i'))
1545 b.insert(-2, ord('i'))
1546 b.insert(1000, ord('i'))
1547 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001548 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001549 b = bytearray()
1550 b.insert(0, Indexable(ord('A')))
1551 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001552
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001553 def test_copied(self):
1554 # Issue 4348. Make sure that operations that don't mutate the array
1555 # copy the bytes.
1556 b = bytearray(b'abc')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001557 self.assertIsNot(b, b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001558
1559 t = bytearray([i for i in range(256)])
1560 x = bytearray(b'')
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001561 self.assertIsNot(x, x.translate(t))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001562
Guido van Rossum254348e2007-11-21 19:29:53 +00001563 def test_partition_bytearray_doesnt_share_nullstring(self):
1564 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001565 self.assertEqual(b, b"")
1566 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001567 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001568 b += b"!"
1569 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001570 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001571 self.assertEqual(b, b"")
1572 self.assertEqual(c, b"")
1573 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001574 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001575 self.assertEqual(b, b"")
1576 self.assertEqual(c, b"")
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001577 self.assertIsNot(b, c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001578 b += b"!"
1579 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001580 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001581 self.assertEqual(b, b"")
1582 self.assertEqual(c, b"")
1583
Antoine Pitrou5504e892008-12-06 21:27:53 +00001584 def test_resize_forbidden(self):
1585 # #4509: can't resize a bytearray when there are buffer exports, even
1586 # if it wouldn't reallocate the underlying buffer.
1587 # Furthermore, no destructive changes to the buffer may be applied
1588 # before raising the error.
1589 b = bytearray(range(10))
1590 v = memoryview(b)
1591 def resize(n):
1592 b[1:-1] = range(n + 1, 2*n - 1)
1593 resize(10)
1594 orig = b[:]
1595 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001596 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001597 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001598 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001599 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001600 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001601 # Other operations implying resize
1602 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001603 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001604 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001605 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001606 def delitem():
1607 del b[1]
1608 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001609 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001610 # deleting a non-contiguous slice
1611 def delslice():
1612 b[1:-1:2] = b""
1613 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001614 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001615
Stefan Krah650c1e82015-02-03 21:43:23 +01001616 @test.support.cpython_only
1617 def test_obsolete_write_lock(self):
1618 from _testcapi import getbuffer_with_null_view
1619 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001620
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001621 def test_iterator_pickling2(self):
1622 orig = bytearray(b'abc')
1623 data = list(b'qwerty')
1624 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1625 # initial iterator
1626 itorig = iter(orig)
1627 d = pickle.dumps((itorig, orig), proto)
1628 it, b = pickle.loads(d)
1629 b[:] = data
1630 self.assertEqual(type(it), type(itorig))
1631 self.assertEqual(list(it), data)
1632
1633 # running iterator
1634 next(itorig)
1635 d = pickle.dumps((itorig, orig), proto)
1636 it, b = pickle.loads(d)
1637 b[:] = data
1638 self.assertEqual(type(it), type(itorig))
1639 self.assertEqual(list(it), data[1:])
1640
1641 # empty iterator
1642 for i in range(1, len(orig)):
1643 next(itorig)
1644 d = pickle.dumps((itorig, orig), proto)
1645 it, b = pickle.loads(d)
1646 b[:] = data
1647 self.assertEqual(type(it), type(itorig))
1648 self.assertEqual(list(it), data[len(orig):])
1649
1650 # exhausted iterator
1651 self.assertRaises(StopIteration, next, itorig)
1652 d = pickle.dumps((itorig, orig), proto)
1653 it, b = pickle.loads(d)
1654 b[:] = data
1655 self.assertEqual(list(it), [])
1656
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001657 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001658
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001659 def test_iterator_length_hint(self):
1660 # Issue 27443: __length_hint__ can return negative integer
1661 ba = bytearray(b'ab')
1662 it = iter(ba)
1663 next(it)
1664 ba.clear()
1665 # Shouldn't raise an error
1666 self.assertEqual(list(it), [])
1667
1668
Christian Heimes510711d2008-01-30 11:57:58 +00001669class AssortedBytesTest(unittest.TestCase):
1670 #
1671 # Test various combinations of bytes and bytearray
1672 #
1673
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001674 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001675 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001676 for f in str, repr:
1677 self.assertEqual(f(bytearray()), "bytearray(b'')")
1678 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1679 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1680 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1681 self.assertEqual(f(b"abc"), "b'abc'")
1682 self.assertEqual(f(b"'"), '''b"'"''') # '''
1683 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001684
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001685 @check_bytes_warnings
1686 def test_format(self):
1687 for b in b'abc', bytearray(b'abc'):
1688 self.assertEqual(format(b), str(b))
1689 self.assertEqual(format(b, ''), str(b))
1690 with self.assertRaisesRegex(TypeError,
1691 r'\b%s\b' % re.escape(type(b).__name__)):
1692 format(b, 's')
1693
Christian Heimes510711d2008-01-30 11:57:58 +00001694 def test_compare_bytes_to_bytearray(self):
1695 self.assertEqual(b"abc" == bytes(b"abc"), True)
1696 self.assertEqual(b"ab" != bytes(b"abc"), True)
1697 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1698 self.assertEqual(b"ab" < bytes(b"abc"), True)
1699 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1700 self.assertEqual(b"abc" > bytes(b"ab"), True)
1701
1702 self.assertEqual(b"abc" != bytes(b"abc"), False)
1703 self.assertEqual(b"ab" == bytes(b"abc"), False)
1704 self.assertEqual(b"ab" > bytes(b"abc"), False)
1705 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1706 self.assertEqual(b"abc" < bytes(b"ab"), False)
1707 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1708
1709 self.assertEqual(bytes(b"abc") == b"abc", True)
1710 self.assertEqual(bytes(b"ab") != b"abc", True)
1711 self.assertEqual(bytes(b"ab") <= b"abc", True)
1712 self.assertEqual(bytes(b"ab") < b"abc", True)
1713 self.assertEqual(bytes(b"abc") >= b"ab", True)
1714 self.assertEqual(bytes(b"abc") > b"ab", True)
1715
1716 self.assertEqual(bytes(b"abc") != b"abc", False)
1717 self.assertEqual(bytes(b"ab") == b"abc", False)
1718 self.assertEqual(bytes(b"ab") > b"abc", False)
1719 self.assertEqual(bytes(b"ab") >= b"abc", False)
1720 self.assertEqual(bytes(b"abc") < b"ab", False)
1721 self.assertEqual(bytes(b"abc") <= b"ab", False)
1722
Stefan Krah6e572b82013-01-26 13:06:36 +01001723 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001724 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001725 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001726 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001727 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001728 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001729
1730 def test_from_bytearray(self):
1731 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1732 buf = memoryview(sample)
1733 b = bytearray(buf)
1734 self.assertEqual(b, bytearray(sample))
1735
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001736 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001737 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001738 self.assertEqual(str(b''), "b''")
1739 self.assertEqual(str(b'x'), "b'x'")
1740 self.assertEqual(str(b'\x80'), "b'\\x80'")
1741 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1742 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1743 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001744
1745 def test_literal(self):
1746 tests = [
1747 (b"Wonderful spam", "Wonderful spam"),
1748 (br"Wonderful spam too", "Wonderful spam too"),
1749 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1750 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1751 ]
1752 for b, s in tests:
1753 self.assertEqual(b, bytearray(s, 'latin-1'))
1754 for c in range(128, 256):
1755 self.assertRaises(SyntaxError, eval,
1756 'b"%s"' % chr(c))
1757
Christian Heimes510711d2008-01-30 11:57:58 +00001758 def test_split_bytearray(self):
1759 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1760
1761 def test_rsplit_bytearray(self):
1762 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1763
Georg Brandleb2c9642008-05-30 12:05:02 +00001764 def test_return_self(self):
1765 # bytearray.replace must always return a new bytearray
1766 b = bytearray()
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001767 self.assertIsNot(b.replace(b'', b''), b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001768
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001769 @unittest.skipUnless(sys.flags.bytes_warning,
1770 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001771 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001772 def bytes_warning():
Hai Shifcce8c62020-08-08 05:55:35 +08001773 return warnings_helper.check_warnings(('', BytesWarning))
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001774 with bytes_warning():
1775 b'' == ''
1776 with bytes_warning():
1777 '' == b''
1778 with bytes_warning():
1779 b'' != ''
1780 with bytes_warning():
1781 '' != b''
1782 with bytes_warning():
1783 bytearray(b'') == ''
1784 with bytes_warning():
1785 '' == bytearray(b'')
1786 with bytes_warning():
1787 bytearray(b'') != ''
1788 with bytes_warning():
1789 '' != bytearray(b'')
1790 with bytes_warning():
1791 b'\0' == 0
1792 with bytes_warning():
1793 0 == b'\0'
1794 with bytes_warning():
1795 b'\0' != 0
1796 with bytes_warning():
1797 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001798
Guido van Rossumd624f182006-04-24 13:47:05 +00001799 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001800 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001801 # __reversed__? (optimization)
1802
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001803 # XXX More string methods? (Those that don't use character properties)
1804
Neal Norwitz6968b052007-02-27 19:02:19 +00001805 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001806 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001807 # Unfortunately they are all bundled with tests that
1808 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001809
Guido van Rossum254348e2007-11-21 19:29:53 +00001810 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001811 # the rest that make sense (the code can be cleaned up to use modern
1812 # unittest methods at the same time).
1813
Martin Panter152a19c2016-04-06 06:37:17 +00001814class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001815 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001816 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001817
1818 def test_returns_new_copy(self):
1819 val = self.marshal(b'1234')
1820 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001821 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001822 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1823 method = getattr(val, methname)
1824 newval = method(3)
1825 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001826 self.assertIsNot(val, newval,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001827 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001828 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1829 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1830 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1831 newval = eval(expr)
1832 self.assertEqual(val, newval)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001833 self.assertIsNot(val, newval,
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001834 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001835 sep = self.marshal(b'')
1836 newval = sep.join([val])
1837 self.assertEqual(val, newval)
1838 self.assertIsNot(val, newval)
1839
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001840
Christian Heimes510711d2008-01-30 11:57:58 +00001841class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001842 def fixtype(self, obj):
1843 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001844 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001845 return super().fixtype(obj)
1846
Martin Panter152a19c2016-04-06 06:37:17 +00001847 contains_bytes = True
1848
Ezio Melotti0dceb562013-01-10 07:43:26 +02001849class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001850 type2test = bytearray
1851
Ezio Melotti0dceb562013-01-10 07:43:26 +02001852class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001853 type2test = bytes
1854
Georg Brandlc7885542007-03-06 19:16:20 +00001855
Ezio Melotti0dceb562013-01-10 07:43:26 +02001856class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001857
1858 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001859 self.assertTrue(issubclass(self.type2test, self.basetype))
1860 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001861
1862 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001863 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001864
1865 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001866 self.assertTrue(_a == _a)
1867 self.assertTrue(_a != _b)
1868 self.assertTrue(_a < _b)
1869 self.assertTrue(_a <= _b)
1870 self.assertTrue(_b >= _a)
1871 self.assertTrue(_b > _a)
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001872 self.assertIsNot(_a, a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001873
1874 # test concat of subclass instances
1875 self.assertEqual(a + b, _a + _b)
1876 self.assertEqual(a + b, a + _b)
1877 self.assertEqual(a + b, _a + b)
1878
1879 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001880 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001881
1882 def test_join(self):
1883 # Make sure join returns a NEW object for single item sequences
1884 # involving a subclass.
1885 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001886 s1 = self.type2test(b"abcd")
1887 s2 = self.basetype().join([s1])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001888 self.assertIsNot(s1, s2)
1889 self.assertIs(type(s2), self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001890
1891 # Test reverse, calling join on subclass
1892 s3 = s1.join([b"abcd"])
Serhiy Storchaka604e74c2017-03-27 13:59:07 +03001893 self.assertIs(type(s3), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001894
1895 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001896 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001897 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001898 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001899 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001900 b = pickle.loads(pickle.dumps(a, proto))
1901 self.assertNotEqual(id(a), id(b))
1902 self.assertEqual(a, b)
1903 self.assertEqual(a.x, b.x)
1904 self.assertEqual(a.y, b.y)
1905 self.assertEqual(type(a), type(b))
1906 self.assertEqual(type(a.y), type(b.y))
1907
1908 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001909 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001910 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001911 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001912 for copy_method in (copy.copy, copy.deepcopy):
1913 b = copy_method(a)
1914 self.assertNotEqual(id(a), id(b))
1915 self.assertEqual(a, b)
1916 self.assertEqual(a.x, b.x)
1917 self.assertEqual(a.y, b.y)
1918 self.assertEqual(type(a), type(b))
1919 self.assertEqual(type(a.y), type(b.y))
1920
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001921 def test_fromhex(self):
1922 b = self.type2test.fromhex('1a2B30')
1923 self.assertEqual(b, b'\x1a\x2b\x30')
1924 self.assertIs(type(b), self.type2test)
1925
1926 class B1(self.basetype):
1927 def __new__(cls, value):
1928 me = self.basetype.__new__(cls, value)
1929 me.foo = 'bar'
1930 return me
1931
1932 b = B1.fromhex('1a2B30')
1933 self.assertEqual(b, b'\x1a\x2b\x30')
1934 self.assertIs(type(b), B1)
1935 self.assertEqual(b.foo, 'bar')
1936
1937 class B2(self.basetype):
1938 def __init__(me, *args, **kwargs):
1939 if self.basetype is not bytes:
1940 self.basetype.__init__(me, *args, **kwargs)
1941 me.foo = 'bar'
1942
1943 b = B2.fromhex('1a2B30')
1944 self.assertEqual(b, b'\x1a\x2b\x30')
1945 self.assertIs(type(b), B2)
1946 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001947
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001948
1949class ByteArraySubclass(bytearray):
1950 pass
1951
1952class BytesSubclass(bytes):
1953 pass
1954
Serhiy Storchaka15095802015-11-25 15:47:01 +02001955class OtherBytesSubclass(bytes):
1956 pass
1957
Ezio Melotti0dceb562013-01-10 07:43:26 +02001958class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001959 basetype = bytearray
1960 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001961
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001962 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001963 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001964 def __init__(me, newarg=1, *args, **kwargs):
1965 bytearray.__init__(me, *args, **kwargs)
1966 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001967 x = subclass(4, source=b"abcd")
1968 self.assertEqual(x, b"abcd")
1969 x = subclass(newarg=4, source=b"abcd")
1970 self.assertEqual(x, b"abcd")
1971
1972
Ezio Melotti0dceb562013-01-10 07:43:26 +02001973class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001974 basetype = bytes
1975 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001976
1977
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001978if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001979 unittest.main()