blob: 129b4abf337629ec298bc68c67966087aacfcbec [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
Guido van Rossumd624f182006-04-24 13:47:05 +00007import os
8import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00009import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000010import copy
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000011import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010015
Benjamin Petersonee8712c2008-05-20 21:35:26 +000016import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030018import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010019from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000020
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000021
22if sys.flags.bytes_warning:
23 def check_bytes_warnings(func):
24 @functools.wraps(func)
25 def wrapper(*args, **kw):
26 with test.support.check_warnings(('', BytesWarning)):
27 return func(*args, **kw)
28 return wrapper
29else:
30 # no-op
31 def check_bytes_warnings(func):
32 return func
33
34
Georg Brandl9a54d7c2008-07-16 23:15:30 +000035class Indexable:
36 def __init__(self, value=0):
37 self.value = value
38 def __index__(self):
39 return self.value
40
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000041
Ezio Melotti0dceb562013-01-10 07:43:26 +020042class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043
44 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000045 b = self.type2test()
46 self.assertEqual(type(b), self.type2test)
47 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000049 def test_copy(self):
50 a = self.type2test(b"abcd")
51 for copy_method in (copy.copy, copy.deepcopy):
52 b = copy_method(a)
53 self.assertEqual(a, b)
54 self.assertEqual(type(a), type(b))
55
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000056 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000057 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058 self.assertEqual(len(b), 0)
59 self.assertRaises(IndexError, lambda: b[0])
60 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000061 self.assertRaises(IndexError, lambda: b[sys.maxsize])
62 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertRaises(IndexError, lambda: b[10**100])
64 self.assertRaises(IndexError, lambda: b[-1])
65 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
67 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000069 self.assertRaises(IndexError, lambda: b[-10**100])
70
71 def test_from_list(self):
72 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000073 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertEqual(len(b), 256)
75 self.assertEqual(list(b), ints)
76
77 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000078 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
79 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000080 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000081 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
82 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000083
84 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000085 self.assertEqual(self.type2test(0), b'')
86 self.assertEqual(self.type2test(1), b'\x00')
87 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
88 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000089
Benjamin Peterson4c045832010-04-16 22:35:32 +000090 self.assertEqual(self.type2test('0', 'ascii'), b'0')
91 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000092 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000093
94 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000095 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000096 class C:
97 pass
Christian Heimes510711d2008-01-30 11:57:58 +000098 self.assertRaises(TypeError, self.type2test, ["0"])
99 self.assertRaises(TypeError, self.type2test, [0.0])
100 self.assertRaises(TypeError, self.type2test, [None])
101 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200102 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
103 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
104 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
105 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
106 self.assertRaises(TypeError, self.type2test, '')
107 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
108 self.assertRaises(TypeError, self.type2test, '', b'ascii')
109 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000110
111 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000112 self.assertRaises(ValueError, self.type2test, [-1])
113 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
114 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
115 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
116 self.assertRaises(ValueError, self.type2test, [-10**100])
117 self.assertRaises(ValueError, self.type2test, [256])
118 self.assertRaises(ValueError, self.type2test, [257])
119 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
120 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
121 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000122
Antoine Pitroucc231542014-11-02 18:40:09 +0100123 @bigaddrspacetest
124 def test_constructor_overflow(self):
125 size = MAX_Py_ssize_t
126 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
127 try:
128 # Should either pass or raise an error (e.g. on debug builds with
129 # additional malloc() overhead), but shouldn't crash.
130 bytearray(size - 4)
131 except (OverflowError, MemoryError):
132 pass
133
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000134 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000135 b1 = self.type2test([1, 2, 3])
136 b2 = self.type2test([1, 2, 3])
137 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000138
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000139 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000140 self.assertTrue(b2 != b3)
141 self.assertTrue(b1 <= b2)
142 self.assertTrue(b1 <= b3)
143 self.assertTrue(b1 < b3)
144 self.assertTrue(b1 >= b2)
145 self.assertTrue(b3 >= b2)
146 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000147
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000148 self.assertFalse(b1 != b2)
149 self.assertFalse(b2 == b3)
150 self.assertFalse(b1 > b2)
151 self.assertFalse(b1 > b3)
152 self.assertFalse(b1 >= b3)
153 self.assertFalse(b1 < b2)
154 self.assertFalse(b3 < b2)
155 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000156
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000157 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000158 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000159 # Byte comparisons with unicode should always fail!
160 # Test this for all expected byte orders and Unicode character
161 # sizes.
162 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
163 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
164 False)
165 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
166 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
167 False)
168 self.assertEqual(self.type2test() == str(), False)
169 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000170
171 def test_reversed(self):
172 input = list(map(ord, "Hello"))
173 b = self.type2test(input)
174 output = list(reversed(b))
175 input.reverse()
176 self.assertEqual(output, input)
177
178 def test_getslice(self):
179 def by(s):
180 return self.type2test(map(ord, s))
181 b = by("Hello, world")
182
183 self.assertEqual(b[:5], by("Hello"))
184 self.assertEqual(b[1:5], by("ello"))
185 self.assertEqual(b[5:7], by(", "))
186 self.assertEqual(b[7:], by("world"))
187 self.assertEqual(b[7:12], by("world"))
188 self.assertEqual(b[7:100], by("world"))
189
190 self.assertEqual(b[:-7], by("Hello"))
191 self.assertEqual(b[-11:-7], by("ello"))
192 self.assertEqual(b[-7:-5], by(", "))
193 self.assertEqual(b[-5:], by("world"))
194 self.assertEqual(b[-5:12], by("world"))
195 self.assertEqual(b[-5:100], by("world"))
196 self.assertEqual(b[-100:5], by("Hello"))
197
198 def test_extended_getslice(self):
199 # Test extended slicing by comparing with list slicing.
200 L = list(range(255))
201 b = self.type2test(L)
202 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
203 for start in indices:
204 for stop in indices:
205 # Skip step 0 (invalid)
206 for step in indices[1:]:
207 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
208
209 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000210 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000211 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000212 b = self.type2test(sample, enc)
213 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000214 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
215 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000216 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000217
218 def test_decode(self):
219 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000220 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000221 b = self.type2test(sample, enc)
222 self.assertEqual(b.decode(enc), sample)
223 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000224 b = self.type2test(sample, "latin-1")
225 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
226 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
227 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000228 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000229 # Default encoding is utf-8
230 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000231
232 def test_from_int(self):
233 b = self.type2test(0)
234 self.assertEqual(b, self.type2test())
235 b = self.type2test(10)
236 self.assertEqual(b, self.type2test([0]*10))
237 b = self.type2test(10000)
238 self.assertEqual(b, self.type2test([0]*10000))
239
240 def test_concat(self):
241 b1 = self.type2test(b"abc")
242 b2 = self.type2test(b"def")
243 self.assertEqual(b1 + b2, b"abcdef")
244 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
245 self.assertEqual(bytes(b"def") + b1, b"defabc")
246 self.assertRaises(TypeError, lambda: b1 + "def")
247 self.assertRaises(TypeError, lambda: "abc" + b2)
248
249 def test_repeat(self):
250 for b in b"abc", self.type2test(b"abc"):
251 self.assertEqual(b * 3, b"abcabcabc")
252 self.assertEqual(b * 0, b"")
253 self.assertEqual(b * -1, b"")
254 self.assertRaises(TypeError, lambda: b * 3.14)
255 self.assertRaises(TypeError, lambda: 3.14 * b)
256 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000257 with self.assertRaises((OverflowError, MemoryError)):
258 c = b * sys.maxsize
259 with self.assertRaises((OverflowError, MemoryError)):
260 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000261
262 def test_repeat_1char(self):
263 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
264
265 def test_contains(self):
266 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000267 self.assertIn(ord('a'), b)
268 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000269 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000270 self.assertRaises(ValueError, lambda: 300 in b)
271 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300272 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000273 self.assertRaises(TypeError, lambda: None in b)
274 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
275 self.assertRaises(TypeError, lambda: "a" in b)
276 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000277 self.assertIn(f(b""), b)
278 self.assertIn(f(b"a"), b)
279 self.assertIn(f(b"b"), b)
280 self.assertIn(f(b"c"), b)
281 self.assertIn(f(b"ab"), b)
282 self.assertIn(f(b"bc"), b)
283 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000284 self.assertNotIn(f(b"ac"), b)
285 self.assertNotIn(f(b"d"), b)
286 self.assertNotIn(f(b"dab"), b)
287 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000288
289 def test_fromhex(self):
290 self.assertRaises(TypeError, self.type2test.fromhex)
291 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000292 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000293 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000294 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
295 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
296 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000297 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
298 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
299 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
300 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
301 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
302 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
303
Victor Stinner2bf89932015-10-14 11:25:33 +0200304 for data, pos in (
305 # invalid first hexadecimal character
306 ('12 x4 56', 3),
307 # invalid second hexadecimal character
308 ('12 3x 56', 4),
309 # two invalid hexadecimal characters
310 ('12 xy 56', 3),
311 # test non-ASCII string
312 ('12 3\xff 56', 4),
313 ):
314 with self.assertRaises(ValueError) as cm:
315 self.type2test.fromhex(data)
316 self.assertIn('at position %s' % pos, str(cm.exception))
317
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000318 def test_hex(self):
319 self.assertRaises(TypeError, self.type2test.hex)
320 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000321 self.assertEqual(self.type2test(b"").hex(), "")
322 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
323 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
324 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000325
Christian Heimes510711d2008-01-30 11:57:58 +0000326 def test_join(self):
327 self.assertEqual(self.type2test(b"").join([]), b"")
328 self.assertEqual(self.type2test(b"").join([b""]), b"")
329 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
330 lst = list(map(self.type2test, lst))
331 self.assertEqual(self.type2test(b"").join(lst), b"abc")
332 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
333 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200334 dot_join = self.type2test(b".:").join
335 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
336 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
337 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
338 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
339 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
340 # Stress it with many items
341 seq = [b"abc"] * 1000
342 expected = b"abc" + b".:abc" * 999
343 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400344 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200345 # Error handling and cleanup when some item in the middle of the
346 # sequence has the wrong type.
347 with self.assertRaises(TypeError):
348 dot_join([bytearray(b"ab"), "cd", b"ef"])
349 with self.assertRaises(TypeError):
350 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000351
Christian Heimes510711d2008-01-30 11:57:58 +0000352 def test_count(self):
353 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200354 i = 105
355 p = 112
356 w = 119
357
Christian Heimes510711d2008-01-30 11:57:58 +0000358 self.assertEqual(b.count(b'i'), 4)
359 self.assertEqual(b.count(b'ss'), 2)
360 self.assertEqual(b.count(b'w'), 0)
361
Antoine Pitrouac65d962011-10-20 23:54:17 +0200362 self.assertEqual(b.count(i), 4)
363 self.assertEqual(b.count(w), 0)
364
365 self.assertEqual(b.count(b'i', 6), 2)
366 self.assertEqual(b.count(b'p', 6), 2)
367 self.assertEqual(b.count(b'i', 1, 3), 1)
368 self.assertEqual(b.count(b'p', 7, 9), 1)
369
370 self.assertEqual(b.count(i, 6), 2)
371 self.assertEqual(b.count(p, 6), 2)
372 self.assertEqual(b.count(i, 1, 3), 1)
373 self.assertEqual(b.count(p, 7, 9), 1)
374
Christian Heimes510711d2008-01-30 11:57:58 +0000375 def test_startswith(self):
376 b = self.type2test(b'hello')
377 self.assertFalse(self.type2test().startswith(b"anything"))
378 self.assertTrue(b.startswith(b"hello"))
379 self.assertTrue(b.startswith(b"hel"))
380 self.assertTrue(b.startswith(b"h"))
381 self.assertFalse(b.startswith(b"hellow"))
382 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300383 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300384 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300385 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300386 self.assertIn('bytes', exc)
387 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000388
389 def test_endswith(self):
390 b = self.type2test(b'hello')
391 self.assertFalse(bytearray().endswith(b"anything"))
392 self.assertTrue(b.endswith(b"hello"))
393 self.assertTrue(b.endswith(b"llo"))
394 self.assertTrue(b.endswith(b"o"))
395 self.assertFalse(b.endswith(b"whello"))
396 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300397 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300398 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300399 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300400 self.assertIn('bytes', exc)
401 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000402
403 def test_find(self):
404 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200405 i = 105
406 w = 119
407
Christian Heimes510711d2008-01-30 11:57:58 +0000408 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000409 self.assertEqual(b.find(b'w'), -1)
410 self.assertEqual(b.find(b'mississippian'), -1)
411
Antoine Pitrouac65d962011-10-20 23:54:17 +0200412 self.assertEqual(b.find(i), 1)
413 self.assertEqual(b.find(w), -1)
414
415 self.assertEqual(b.find(b'ss', 3), 5)
416 self.assertEqual(b.find(b'ss', 1, 7), 2)
417 self.assertEqual(b.find(b'ss', 1, 3), -1)
418
419 self.assertEqual(b.find(i, 6), 7)
420 self.assertEqual(b.find(i, 1, 3), 1)
421 self.assertEqual(b.find(w, 1, 3), -1)
422
Victor Stinnerf8eac002011-12-18 01:17:41 +0100423 for index in (-1, 256, sys.maxsize + 1):
424 self.assertRaisesRegex(
425 ValueError, r'byte must be in range\(0, 256\)',
426 b.find, index)
427
Christian Heimes510711d2008-01-30 11:57:58 +0000428 def test_rfind(self):
429 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200430 i = 105
431 w = 119
432
Christian Heimes510711d2008-01-30 11:57:58 +0000433 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000434 self.assertEqual(b.rfind(b'w'), -1)
435 self.assertEqual(b.rfind(b'mississippian'), -1)
436
Antoine Pitrouac65d962011-10-20 23:54:17 +0200437 self.assertEqual(b.rfind(i), 10)
438 self.assertEqual(b.rfind(w), -1)
439
440 self.assertEqual(b.rfind(b'ss', 3), 5)
441 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
442
443 self.assertEqual(b.rfind(i, 1, 3), 1)
444 self.assertEqual(b.rfind(i, 3, 9), 7)
445 self.assertEqual(b.rfind(w, 1, 3), -1)
446
Christian Heimes510711d2008-01-30 11:57:58 +0000447 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200448 b = self.type2test(b'mississippi')
449 i = 105
450 w = 119
451
452 self.assertEqual(b.index(b'ss'), 2)
453 self.assertRaises(ValueError, b.index, b'w')
454 self.assertRaises(ValueError, b.index, b'mississippian')
455
456 self.assertEqual(b.index(i), 1)
457 self.assertRaises(ValueError, b.index, w)
458
459 self.assertEqual(b.index(b'ss', 3), 5)
460 self.assertEqual(b.index(b'ss', 1, 7), 2)
461 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
462
463 self.assertEqual(b.index(i, 6), 7)
464 self.assertEqual(b.index(i, 1, 3), 1)
465 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000466
467 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200468 b = self.type2test(b'mississippi')
469 i = 105
470 w = 119
471
472 self.assertEqual(b.rindex(b'ss'), 5)
473 self.assertRaises(ValueError, b.rindex, b'w')
474 self.assertRaises(ValueError, b.rindex, b'mississippian')
475
476 self.assertEqual(b.rindex(i), 10)
477 self.assertRaises(ValueError, b.rindex, w)
478
479 self.assertEqual(b.rindex(b'ss', 3), 5)
480 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
481
482 self.assertEqual(b.rindex(i, 1, 3), 1)
483 self.assertEqual(b.rindex(i, 3, 9), 7)
484 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000485
Ethan Furmanb95b5612015-01-23 20:05:18 -0800486 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300487 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800488 orig = b
489 b = b % b'world'
490 self.assertEqual(b, b'hello, world!')
491 self.assertEqual(orig, b'hello, %b!')
492 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300493 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800494 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200495 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200496 self.assertIs(type(a), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800497
498 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300499 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800500 orig = b
501 b %= b'world'
502 self.assertEqual(b, b'hello, world!')
503 self.assertEqual(orig, b'hello, %b!')
504 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300505 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800506 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200507 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200508 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300509
510 def test_rmod(self):
511 with self.assertRaises(TypeError):
512 object() % self.type2test(b'abc')
513 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800514
Christian Heimes510711d2008-01-30 11:57:58 +0000515 def test_replace(self):
516 b = self.type2test(b'mississippi')
517 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
518 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
519
Christian Heimes510711d2008-01-30 11:57:58 +0000520 def test_split_string_error(self):
521 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
522
Antoine Pitrouf8453022010-01-12 22:05:42 +0000523 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000524 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
525 b = self.type2test(b)
526 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000527 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
528 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
529
Christian Heimes510711d2008-01-30 11:57:58 +0000530 def test_rsplit_string_error(self):
531 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
532
533 def test_rsplit_unicodewhitespace(self):
534 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000535 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
536
537 def test_partition(self):
538 b = self.type2test(b'mississippi')
539 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000540 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000541
542 def test_rpartition(self):
543 b = self.type2test(b'mississippi')
544 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
545 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000546 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000547
548 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000549 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000550 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
551 b = self.type2test(b)
552 ps = pickle.dumps(b, proto)
553 q = pickle.loads(ps)
554 self.assertEqual(b, q)
555
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000556 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200557 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
558 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
559 it = itorg = iter(self.type2test(b))
560 data = list(self.type2test(b))
561 d = pickle.dumps(it, proto)
562 it = pickle.loads(d)
563 self.assertEqual(type(itorg), type(it))
564 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000565
Serhiy Storchakabad12572014-12-15 14:03:42 +0200566 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200567 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200568 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200569 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200570 d = pickle.dumps(it, proto)
571 it = pickle.loads(d)
572 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000573
Christian Heimes510711d2008-01-30 11:57:58 +0000574 def test_strip_bytearray(self):
575 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
576 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
577 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
578
579 def test_strip_string_error(self):
580 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
581 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
582 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
583
Eli Bendersky906b88f2011-07-29 07:05:08 +0300584 def test_center(self):
585 # Fill character can be either bytes or bytearray (issue 12380)
586 b = self.type2test(b'abc')
587 for fill_type in (bytes, bytearray):
588 self.assertEqual(b.center(7, fill_type(b'-')),
589 self.type2test(b'--abc--'))
590
591 def test_ljust(self):
592 # Fill character can be either bytes or bytearray (issue 12380)
593 b = self.type2test(b'abc')
594 for fill_type in (bytes, bytearray):
595 self.assertEqual(b.ljust(7, fill_type(b'-')),
596 self.type2test(b'abc----'))
597
598 def test_rjust(self):
599 # Fill character can be either bytes or bytearray (issue 12380)
600 b = self.type2test(b'abc')
601 for fill_type in (bytes, bytearray):
602 self.assertEqual(b.rjust(7, fill_type(b'-')),
603 self.type2test(b'----abc'))
604
Christian Heimes510711d2008-01-30 11:57:58 +0000605 def test_ord(self):
606 b = self.type2test(b'\0A\x7f\x80\xff')
607 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
608 [0, 65, 127, 128, 255])
609
Georg Brandlabc38772009-04-12 15:51:51 +0000610 def test_maketrans(self):
611 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 +0000612 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000613 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'
614 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000615 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
616 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
617
Jesus Ceaac451502011-04-20 17:09:23 +0200618 def test_none_arguments(self):
619 # issue 11828
620 b = self.type2test(b'hello')
621 l = self.type2test(b'l')
622 h = self.type2test(b'h')
623 x = self.type2test(b'x')
624 o = self.type2test(b'o')
625
626 self.assertEqual(2, b.find(l, None))
627 self.assertEqual(3, b.find(l, -2, None))
628 self.assertEqual(2, b.find(l, None, -2))
629 self.assertEqual(0, b.find(h, None, None))
630
631 self.assertEqual(3, b.rfind(l, None))
632 self.assertEqual(3, b.rfind(l, -2, None))
633 self.assertEqual(2, b.rfind(l, None, -2))
634 self.assertEqual(0, b.rfind(h, None, None))
635
636 self.assertEqual(2, b.index(l, None))
637 self.assertEqual(3, b.index(l, -2, None))
638 self.assertEqual(2, b.index(l, None, -2))
639 self.assertEqual(0, b.index(h, None, None))
640
641 self.assertEqual(3, b.rindex(l, None))
642 self.assertEqual(3, b.rindex(l, -2, None))
643 self.assertEqual(2, b.rindex(l, None, -2))
644 self.assertEqual(0, b.rindex(h, None, None))
645
646 self.assertEqual(2, b.count(l, None))
647 self.assertEqual(1, b.count(l, -2, None))
648 self.assertEqual(1, b.count(l, None, -2))
649 self.assertEqual(0, b.count(x, None, None))
650
651 self.assertEqual(True, b.endswith(o, None))
652 self.assertEqual(True, b.endswith(o, -2, None))
653 self.assertEqual(True, b.endswith(l, None, -2))
654 self.assertEqual(False, b.endswith(x, None, None))
655
656 self.assertEqual(True, b.startswith(h, None))
657 self.assertEqual(True, b.startswith(l, -2, None))
658 self.assertEqual(True, b.startswith(h, None, -2))
659 self.assertEqual(False, b.startswith(x, None, None))
660
Antoine Pitrouac65d962011-10-20 23:54:17 +0200661 def test_integer_arguments_out_of_byte_range(self):
662 b = self.type2test(b'hello')
663
664 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
665 self.assertRaises(ValueError, method, -1)
666 self.assertRaises(ValueError, method, 256)
667 self.assertRaises(ValueError, method, 9999)
668
Jesus Ceaac451502011-04-20 17:09:23 +0200669 def test_find_etc_raise_correct_error_messages(self):
670 # issue 11828
671 b = self.type2test(b'hello')
672 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300673 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200674 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300675 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200676 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300677 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200678 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300679 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200680 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300681 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200682 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300683 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200684 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300685 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200686 x, None, None, None)
687
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300688 def test_free_after_iterating(self):
689 test.support.check_free_after_iterating(self, iter, self.type2test)
690 test.support.check_free_after_iterating(self, reversed, self.type2test)
691
Christian Heimes510711d2008-01-30 11:57:58 +0000692
Ezio Melotti0dceb562013-01-10 07:43:26 +0200693class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000694 type2test = bytes
695
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400696 def test_getitem_error(self):
697 msg = "byte indices must be integers or slices"
698 with self.assertRaisesRegex(TypeError, msg):
699 b'python'['a']
700
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000701 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200702 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000703 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000704 self.assertRaises(TypeError, f.readinto, b"")
705
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000706 def test_custom(self):
707 class A:
708 def __bytes__(self):
709 return b'abc'
710 self.assertEqual(bytes(A()), b'abc')
711 class A: pass
712 self.assertRaises(TypeError, bytes, A())
713 class A:
714 def __bytes__(self):
715 return None
716 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600717 class A:
718 def __bytes__(self):
719 return b'a'
720 def __index__(self):
721 return 42
722 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200723 # Issue #25766
724 class A(str):
725 def __bytes__(self):
726 return b'abc'
727 self.assertEqual(bytes(A('\u20ac')), b'abc')
728 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200729 # Issue #24731
730 class A:
731 def __bytes__(self):
732 return OtherBytesSubclass(b'abc')
733 self.assertEqual(bytes(A()), b'abc')
734 self.assertIs(type(bytes(A())), OtherBytesSubclass)
735 self.assertEqual(BytesSubclass(A()), b'abc')
736 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000737
Victor Stinner29e762c2011-01-05 03:33:28 +0000738 # Test PyBytes_FromFormat()
739 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200740 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200741 _testcapi = test.support.import_module('_testcapi')
742 from ctypes import pythonapi, py_object
743 from ctypes import (
744 c_int, c_uint,
745 c_long, c_ulong,
746 c_size_t, c_ssize_t,
747 c_char_p)
748
Victor Stinner29e762c2011-01-05 03:33:28 +0000749 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
750 PyBytes_FromFormat.restype = py_object
751
Victor Stinner03dab782015-10-14 00:21:35 +0200752 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000753 self.assertEqual(PyBytes_FromFormat(b'format'),
754 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200755 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
756 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000757
Victor Stinner03dab782015-10-14 00:21:35 +0200758 # test formatters
759 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
760 b'c=\0')
761 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
762 b'c=@')
763 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
764 b'c=\xff')
765 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
766 c_int(1), c_long(2),
767 c_size_t(3)),
768 b'd=1 ld=2 zd=3')
769 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
770 c_int(-1), c_long(-2),
771 c_size_t(-3)),
772 b'd=-1 ld=-2 zd=-3')
773 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
774 c_uint(123), c_ulong(456),
775 c_size_t(789)),
776 b'u=123 lu=456 zu=789')
777 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
778 b'i=123')
779 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
780 b'i=-123')
781 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
782 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200783
784 sizeof_ptr = ctypes.sizeof(c_char_p)
785
786 if os.name == 'nt':
787 # Windows (MSCRT)
788 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
789 def ptr_formatter(ptr):
790 return (ptr_format % ptr)
791 else:
792 # UNIX (glibc)
793 def ptr_formatter(ptr):
794 return '%#x' % ptr
795
Victor Stinner7ab986d2015-10-14 02:55:12 +0200796 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200797 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
798 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200799 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
800 b's=cstr')
801
802 # test minimum and maximum integer values
803 size_max = c_size_t(-1).value
804 for formatstr, ctypes_type, value, py_formatter in (
805 (b'%d', c_int, _testcapi.INT_MIN, str),
806 (b'%d', c_int, _testcapi.INT_MAX, str),
807 (b'%ld', c_long, _testcapi.LONG_MIN, str),
808 (b'%ld', c_long, _testcapi.LONG_MAX, str),
809 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
810 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
811 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
812 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200813 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200814 ):
815 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
816 py_formatter(value).encode('ascii')),
817
818 # width and precision (width is currently ignored)
819 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
820 b'a')
821 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
822 b'abc')
823
824 # '%%' formatter
825 self.assertEqual(PyBytes_FromFormat(b'%%'),
826 b'%')
827 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
828 b'[%]')
829 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
830 b'%_')
831 self.assertEqual(PyBytes_FromFormat(b'%%s'),
832 b'%s')
833
834 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000835 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200836 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
837 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000838
Victor Stinner03dab782015-10-14 00:21:35 +0200839 # Issue #19969: %c must raise OverflowError for values
840 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100841 self.assertRaises(OverflowError,
842 PyBytes_FromFormat, b'%c', c_int(-1))
843 self.assertRaises(OverflowError,
844 PyBytes_FromFormat, b'%c', c_int(256))
845
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000846
Ezio Melotti0dceb562013-01-10 07:43:26 +0200847class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000848 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000849
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400850 def test_getitem_error(self):
851 msg = "bytearray indices must be integers or slices"
852 with self.assertRaisesRegex(TypeError, msg):
853 bytearray(b'python')['a']
854
855 def test_setitem_error(self):
856 msg = "bytearray indices must be integers or slices"
857 with self.assertRaisesRegex(TypeError, msg):
858 b = bytearray(b'python')
859 b['a'] = "python"
860
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000861 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000862 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000863
Guido van Rossum254348e2007-11-21 19:29:53 +0000864 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000865 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000866 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000867 tfn = tempfile.mktemp()
868 try:
869 # Prepare
870 with open(tfn, "wb") as f:
871 f.write(short_sample)
872 # Test readinto
873 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000874 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000875 n = f.readinto(b)
876 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000877 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000878 # Test writing in binary mode
879 with open(tfn, "wb") as f:
880 f.write(b)
881 with open(tfn, "rb") as f:
882 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000883 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000884 finally:
885 try:
886 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200887 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000888 pass
889
Neal Norwitz6968b052007-02-27 19:02:19 +0000890 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000891 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000892 self.assertEqual(b.reverse(), None)
893 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000894 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000895 b.reverse()
896 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000897 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000898 b.reverse()
899 self.assertFalse(b)
900
Eli Bendersky4db28d32011-03-03 18:21:02 +0000901 def test_clear(self):
902 b = bytearray(b'python')
903 b.clear()
904 self.assertEqual(b, b'')
905
906 b = bytearray(b'')
907 b.clear()
908 self.assertEqual(b, b'')
909
910 b = bytearray(b'')
911 b.append(ord('r'))
912 b.clear()
913 b.append(ord('p'))
914 self.assertEqual(b, b'p')
915
916 def test_copy(self):
917 b = bytearray(b'abc')
918 bb = b.copy()
919 self.assertEqual(bb, b'abc')
920
921 b = bytearray(b'')
922 bb = b.copy()
923 self.assertEqual(bb, b'')
924
925 # test that it's indeed a copy and not a reference
926 b = bytearray(b'abc')
927 bb = b.copy()
928 self.assertEqual(b, bb)
929 self.assertIsNot(b, bb)
930 bb.append(ord('d'))
931 self.assertEqual(bb, b'abcd')
932 self.assertEqual(b, b'abc')
933
Guido van Rossumd624f182006-04-24 13:47:05 +0000934 def test_regexps(self):
935 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000936 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000937 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000938 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000939
940 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000941 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000942 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000943 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000944 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000945 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000946 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000947 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000948 try:
949 b[3] = 0
950 self.fail("Didn't raise IndexError")
951 except IndexError:
952 pass
953 try:
954 b[-10] = 0
955 self.fail("Didn't raise IndexError")
956 except IndexError:
957 pass
958 try:
959 b[0] = 256
960 self.fail("Didn't raise ValueError")
961 except ValueError:
962 pass
963 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000964 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000965 self.fail("Didn't raise ValueError")
966 except ValueError:
967 pass
968 try:
969 b[0] = None
970 self.fail("Didn't raise TypeError")
971 except TypeError:
972 pass
973
974 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000975 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000976 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000977 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000978 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000979 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000980 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000981 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000982
983 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000984 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000985 self.assertEqual(list(b), list(range(10)))
986
Guido van Rossum254348e2007-11-21 19:29:53 +0000987 b[0:5] = bytearray([1, 1, 1, 1, 1])
988 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000989
990 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000991 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000992
Guido van Rossum254348e2007-11-21 19:29:53 +0000993 b[0:0] = bytearray([0, 1, 2, 3, 4])
994 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000995
Guido van Rossum254348e2007-11-21 19:29:53 +0000996 b[-7:-3] = bytearray([100, 101])
997 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000998
999 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001000 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001001
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001002 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001003 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 +00001004
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001005 b[3:] = b'foo'
1006 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1007
1008 b[:3] = memoryview(b'foo')
1009 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1010
1011 b[3:4] = []
1012 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1013
1014 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1015 ['a', 'b'], [b'a', b'b'], [[]]]:
1016 with self.assertRaises(TypeError):
1017 b[3:4] = elem
1018
1019 for elem in [[254, 255, 256], [-256, 9000]]:
1020 with self.assertRaises(ValueError):
1021 b[3:4] = elem
1022
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001023 def test_setslice_extend(self):
1024 # Exercise the resizing logic (see issue #19087)
1025 b = bytearray(range(100))
1026 self.assertEqual(list(b), list(range(100)))
1027 del b[:10]
1028 self.assertEqual(list(b), list(range(10, 100)))
1029 b.extend(range(100, 110))
1030 self.assertEqual(list(b), list(range(10, 110)))
1031
Antoine Pitrou25454112015-05-19 20:52:27 +02001032 def test_fifo_overrun(self):
1033 # Test for issue #23985, a buffer overrun when implementing a FIFO
1034 # Build Python in pydebug mode for best results.
1035 b = bytearray(10)
1036 b.pop() # Defeat expanding buffer off-by-one quirk
1037 del b[:1] # Advance start pointer without reallocating
1038 b += bytes(2) # Append exactly the number of deleted bytes
1039 del b # Free memory buffer, allowing pydebug verification
1040
1041 def test_del_expand(self):
1042 # Reducing the size should not expand the buffer (issue #23985)
1043 b = bytearray(10)
1044 size = sys.getsizeof(b)
1045 del b[:1]
1046 self.assertLessEqual(sys.getsizeof(b), size)
1047
Thomas Wouters376446d2006-12-19 08:30:14 +00001048 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001049 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001050 for start in indices:
1051 for stop in indices:
1052 # Skip invalid step 0
1053 for step in indices[1:]:
1054 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001055 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001056 # Make sure we have a slice of exactly the right length,
1057 # but with different data.
1058 data = L[start:stop:step]
1059 data.reverse()
1060 L[start:stop:step] = data
1061 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001062 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001063
Thomas Wouters376446d2006-12-19 08:30:14 +00001064 del L[start:stop:step]
1065 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001066 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001067
Guido van Rossumd624f182006-04-24 13:47:05 +00001068 def test_setslice_trap(self):
1069 # This test verifies that we correctly handle assigning self
1070 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001071 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001072 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001073 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001074
Guido van Rossum13e57212006-04-27 22:54:26 +00001075 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001076 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001077 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001078 b += b"def"
1079 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001080 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001081 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001082 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001083 self.assertEqual(b, b"abcdefxyz")
1084 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001085 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001086 except TypeError:
1087 pass
1088 else:
1089 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001090
1091 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001092 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001093 b1 = b
1094 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001095 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001096 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001097 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001098
1099 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001100 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001101 b1 = b
1102 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001103 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001104 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001105 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001106
Guido van Rossum20188312006-05-05 15:15:40 +00001107 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001108 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001109 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001110 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001111 seq = [alloc]
1112 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001113 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001114 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001115 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001116 if alloc not in seq:
1117 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001118
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001119 def test_init_alloc(self):
1120 b = bytearray()
1121 def g():
1122 for i in range(1, 100):
1123 yield i
1124 a = list(b)
1125 self.assertEqual(a, list(range(1, len(a)+1)))
1126 self.assertEqual(len(b), len(a))
1127 self.assertLessEqual(len(b), i)
1128 alloc = b.__alloc__()
1129 self.assertGreater(alloc, len(b)) # including trailing null byte
1130 b.__init__(g())
1131 self.assertEqual(list(b), list(range(1, 100)))
1132 self.assertEqual(len(b), 99)
1133 alloc = b.__alloc__()
1134 self.assertGreater(alloc, len(b))
1135
Neal Norwitz6968b052007-02-27 19:02:19 +00001136 def test_extend(self):
1137 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001138 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001139 a.extend(a)
1140 self.assertEqual(a, orig + orig)
1141 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001142 a = bytearray(b'')
1143 # Test iterators that don't have a __length_hint__
1144 a.extend(map(int, orig * 25))
1145 a.extend(int(x) for x in orig * 25)
1146 self.assertEqual(a, orig * 50)
1147 self.assertEqual(a[-5:], orig)
1148 a = bytearray(b'')
1149 a.extend(iter(map(int, orig * 50)))
1150 self.assertEqual(a, orig * 50)
1151 self.assertEqual(a[-5:], orig)
1152 a = bytearray(b'')
1153 a.extend(list(map(int, orig * 50)))
1154 self.assertEqual(a, orig * 50)
1155 self.assertEqual(a[-5:], orig)
1156 a = bytearray(b'')
1157 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1158 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1159 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001160 a = bytearray(b'')
1161 a.extend([Indexable(ord('a'))])
1162 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001163
Neal Norwitz6968b052007-02-27 19:02:19 +00001164 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001165 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001166 b.remove(ord('l'))
1167 self.assertEqual(b, b'helo')
1168 b.remove(ord('l'))
1169 self.assertEqual(b, b'heo')
1170 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1171 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001172 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001173 # remove first and last
1174 b.remove(ord('o'))
1175 b.remove(ord('h'))
1176 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001177 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001178 b.remove(Indexable(ord('e')))
1179 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001180
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001181 # test values outside of the ascii range: (0, 127)
1182 c = bytearray([126, 127, 128, 129])
1183 c.remove(127)
1184 self.assertEqual(c, bytes([126, 128, 129]))
1185 c.remove(129)
1186 self.assertEqual(c, bytes([126, 128]))
1187
Neal Norwitz6968b052007-02-27 19:02:19 +00001188 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001189 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001190 self.assertEqual(b.pop(), ord('d'))
1191 self.assertEqual(b.pop(0), ord('w'))
1192 self.assertEqual(b.pop(-2), ord('r'))
1193 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001194 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001195 # test for issue #6846
1196 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001197
1198 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001199 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001200
Neal Norwitz6968b052007-02-27 19:02:19 +00001201 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001202 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001203 b.append(ord('o'))
1204 self.assertEqual(b, b'hello')
1205 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001206 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001207 b.append(ord('A'))
1208 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001209 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001210 b = bytearray()
1211 b.append(Indexable(ord('A')))
1212 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001213
1214 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001215 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001216 b.insert(1, ord('i'))
1217 b.insert(4, ord('i'))
1218 b.insert(-2, ord('i'))
1219 b.insert(1000, ord('i'))
1220 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001221 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001222 b = bytearray()
1223 b.insert(0, Indexable(ord('A')))
1224 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001225
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001226 def test_copied(self):
1227 # Issue 4348. Make sure that operations that don't mutate the array
1228 # copy the bytes.
1229 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001230 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001231
1232 t = bytearray([i for i in range(256)])
1233 x = bytearray(b'')
1234 self.assertFalse(x is x.translate(t))
1235
Guido van Rossum254348e2007-11-21 19:29:53 +00001236 def test_partition_bytearray_doesnt_share_nullstring(self):
1237 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001238 self.assertEqual(b, b"")
1239 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001240 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001241 b += b"!"
1242 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001243 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001244 self.assertEqual(b, b"")
1245 self.assertEqual(c, b"")
1246 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001247 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001248 self.assertEqual(b, b"")
1249 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001250 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001251 b += b"!"
1252 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001253 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001254 self.assertEqual(b, b"")
1255 self.assertEqual(c, b"")
1256
Antoine Pitrou5504e892008-12-06 21:27:53 +00001257 def test_resize_forbidden(self):
1258 # #4509: can't resize a bytearray when there are buffer exports, even
1259 # if it wouldn't reallocate the underlying buffer.
1260 # Furthermore, no destructive changes to the buffer may be applied
1261 # before raising the error.
1262 b = bytearray(range(10))
1263 v = memoryview(b)
1264 def resize(n):
1265 b[1:-1] = range(n + 1, 2*n - 1)
1266 resize(10)
1267 orig = b[:]
1268 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001269 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001270 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001271 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001272 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001273 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001274 # Other operations implying resize
1275 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001276 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001277 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001278 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001279 def delitem():
1280 del b[1]
1281 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001282 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001283 # deleting a non-contiguous slice
1284 def delslice():
1285 b[1:-1:2] = b""
1286 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001287 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001288
Stefan Krah650c1e82015-02-03 21:43:23 +01001289 @test.support.cpython_only
1290 def test_obsolete_write_lock(self):
1291 from _testcapi import getbuffer_with_null_view
1292 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001293
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001294 def test_iterator_pickling2(self):
1295 orig = bytearray(b'abc')
1296 data = list(b'qwerty')
1297 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1298 # initial iterator
1299 itorig = iter(orig)
1300 d = pickle.dumps((itorig, orig), proto)
1301 it, b = pickle.loads(d)
1302 b[:] = data
1303 self.assertEqual(type(it), type(itorig))
1304 self.assertEqual(list(it), data)
1305
1306 # running iterator
1307 next(itorig)
1308 d = pickle.dumps((itorig, orig), proto)
1309 it, b = pickle.loads(d)
1310 b[:] = data
1311 self.assertEqual(type(it), type(itorig))
1312 self.assertEqual(list(it), data[1:])
1313
1314 # empty iterator
1315 for i in range(1, len(orig)):
1316 next(itorig)
1317 d = pickle.dumps((itorig, orig), proto)
1318 it, b = pickle.loads(d)
1319 b[:] = data
1320 self.assertEqual(type(it), type(itorig))
1321 self.assertEqual(list(it), data[len(orig):])
1322
1323 # exhausted iterator
1324 self.assertRaises(StopIteration, next, itorig)
1325 d = pickle.dumps((itorig, orig), proto)
1326 it, b = pickle.loads(d)
1327 b[:] = data
1328 self.assertEqual(list(it), [])
1329
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001330 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001331
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001332 def test_iterator_length_hint(self):
1333 # Issue 27443: __length_hint__ can return negative integer
1334 ba = bytearray(b'ab')
1335 it = iter(ba)
1336 next(it)
1337 ba.clear()
1338 # Shouldn't raise an error
1339 self.assertEqual(list(it), [])
1340
1341
Christian Heimes510711d2008-01-30 11:57:58 +00001342class AssortedBytesTest(unittest.TestCase):
1343 #
1344 # Test various combinations of bytes and bytearray
1345 #
1346
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001347 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001348 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001349 for f in str, repr:
1350 self.assertEqual(f(bytearray()), "bytearray(b'')")
1351 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1352 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1353 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1354 self.assertEqual(f(b"abc"), "b'abc'")
1355 self.assertEqual(f(b"'"), '''b"'"''') # '''
1356 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001357
1358 def test_compare_bytes_to_bytearray(self):
1359 self.assertEqual(b"abc" == bytes(b"abc"), True)
1360 self.assertEqual(b"ab" != bytes(b"abc"), True)
1361 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1362 self.assertEqual(b"ab" < bytes(b"abc"), True)
1363 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1364 self.assertEqual(b"abc" > bytes(b"ab"), True)
1365
1366 self.assertEqual(b"abc" != bytes(b"abc"), False)
1367 self.assertEqual(b"ab" == bytes(b"abc"), False)
1368 self.assertEqual(b"ab" > bytes(b"abc"), False)
1369 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1370 self.assertEqual(b"abc" < bytes(b"ab"), False)
1371 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1372
1373 self.assertEqual(bytes(b"abc") == b"abc", True)
1374 self.assertEqual(bytes(b"ab") != b"abc", True)
1375 self.assertEqual(bytes(b"ab") <= b"abc", True)
1376 self.assertEqual(bytes(b"ab") < b"abc", True)
1377 self.assertEqual(bytes(b"abc") >= b"ab", True)
1378 self.assertEqual(bytes(b"abc") > b"ab", True)
1379
1380 self.assertEqual(bytes(b"abc") != b"abc", False)
1381 self.assertEqual(bytes(b"ab") == b"abc", False)
1382 self.assertEqual(bytes(b"ab") > b"abc", False)
1383 self.assertEqual(bytes(b"ab") >= b"abc", False)
1384 self.assertEqual(bytes(b"abc") < b"ab", False)
1385 self.assertEqual(bytes(b"abc") <= b"ab", False)
1386
Stefan Krah6e572b82013-01-26 13:06:36 +01001387 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001388 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001389 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001390 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001391 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001392 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001393
1394 def test_from_bytearray(self):
1395 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1396 buf = memoryview(sample)
1397 b = bytearray(buf)
1398 self.assertEqual(b, bytearray(sample))
1399
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001400 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001401 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001402 self.assertEqual(str(b''), "b''")
1403 self.assertEqual(str(b'x'), "b'x'")
1404 self.assertEqual(str(b'\x80'), "b'\\x80'")
1405 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1406 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1407 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001408
1409 def test_literal(self):
1410 tests = [
1411 (b"Wonderful spam", "Wonderful spam"),
1412 (br"Wonderful spam too", "Wonderful spam too"),
1413 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1414 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1415 ]
1416 for b, s in tests:
1417 self.assertEqual(b, bytearray(s, 'latin-1'))
1418 for c in range(128, 256):
1419 self.assertRaises(SyntaxError, eval,
1420 'b"%s"' % chr(c))
1421
1422 def test_translate(self):
1423 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001424 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001425 rosetta = bytearray(range(0, 256))
1426 rosetta[ord('o')] = ord('e')
1427 c = b.translate(rosetta, b'l')
1428 self.assertEqual(b, b'hello')
1429 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001430 c = ba.translate(rosetta, b'l')
1431 self.assertEqual(ba, b'hello')
1432 self.assertEqual(c, b'hee')
1433 c = b.translate(None, b'e')
1434 self.assertEqual(c, b'hllo')
1435 c = ba.translate(None, b'e')
1436 self.assertEqual(c, b'hllo')
1437 self.assertRaises(TypeError, b.translate, None, None)
1438 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001439
1440 def test_split_bytearray(self):
1441 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1442
1443 def test_rsplit_bytearray(self):
1444 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1445
Georg Brandleb2c9642008-05-30 12:05:02 +00001446 def test_return_self(self):
1447 # bytearray.replace must always return a new bytearray
1448 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001449 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001450
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001451 @unittest.skipUnless(sys.flags.bytes_warning,
1452 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001453 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001454 def bytes_warning():
1455 return test.support.check_warnings(('', BytesWarning))
1456 with bytes_warning():
1457 b'' == ''
1458 with bytes_warning():
1459 '' == b''
1460 with bytes_warning():
1461 b'' != ''
1462 with bytes_warning():
1463 '' != b''
1464 with bytes_warning():
1465 bytearray(b'') == ''
1466 with bytes_warning():
1467 '' == bytearray(b'')
1468 with bytes_warning():
1469 bytearray(b'') != ''
1470 with bytes_warning():
1471 '' != bytearray(b'')
1472 with bytes_warning():
1473 b'\0' == 0
1474 with bytes_warning():
1475 0 == b'\0'
1476 with bytes_warning():
1477 b'\0' != 0
1478 with bytes_warning():
1479 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001480
Guido van Rossumd624f182006-04-24 13:47:05 +00001481 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001482 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001483 # __reversed__? (optimization)
1484
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001485 # XXX More string methods? (Those that don't use character properties)
1486
Neal Norwitz6968b052007-02-27 19:02:19 +00001487 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001488 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001489 # Unfortunately they are all bundled with tests that
1490 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001491
Guido van Rossum254348e2007-11-21 19:29:53 +00001492 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001493 # the rest that make sense (the code can be cleaned up to use modern
1494 # unittest methods at the same time).
1495
Martin Panter152a19c2016-04-06 06:37:17 +00001496class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001497 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001498 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001499
1500 def test_returns_new_copy(self):
1501 val = self.marshal(b'1234')
1502 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001503 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001504 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1505 method = getattr(val, methname)
1506 newval = method(3)
1507 self.assertEqual(val, newval)
1508 self.assertTrue(val is not newval,
1509 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001510 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1511 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1512 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1513 newval = eval(expr)
1514 self.assertEqual(val, newval)
1515 self.assertTrue(val is not newval,
1516 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001517 sep = self.marshal(b'')
1518 newval = sep.join([val])
1519 self.assertEqual(val, newval)
1520 self.assertIsNot(val, newval)
1521
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001522
Christian Heimes510711d2008-01-30 11:57:58 +00001523class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001524 def fixtype(self, obj):
1525 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001526 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001527 return super().fixtype(obj)
1528
Martin Panter152a19c2016-04-06 06:37:17 +00001529 contains_bytes = True
1530
Ezio Melotti0dceb562013-01-10 07:43:26 +02001531class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001532 type2test = bytearray
1533
Ezio Melotti0dceb562013-01-10 07:43:26 +02001534class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001535 type2test = bytes
1536
Georg Brandlc7885542007-03-06 19:16:20 +00001537
Ezio Melotti0dceb562013-01-10 07:43:26 +02001538class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001539
1540 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001541 self.assertTrue(issubclass(self.type2test, self.basetype))
1542 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001543
1544 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001545 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001546
1547 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001548 self.assertTrue(_a == _a)
1549 self.assertTrue(_a != _b)
1550 self.assertTrue(_a < _b)
1551 self.assertTrue(_a <= _b)
1552 self.assertTrue(_b >= _a)
1553 self.assertTrue(_b > _a)
1554 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001555
1556 # test concat of subclass instances
1557 self.assertEqual(a + b, _a + _b)
1558 self.assertEqual(a + b, a + _b)
1559 self.assertEqual(a + b, _a + b)
1560
1561 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001562 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001563
1564 def test_join(self):
1565 # Make sure join returns a NEW object for single item sequences
1566 # involving a subclass.
1567 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001568 s1 = self.type2test(b"abcd")
1569 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001570 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001571 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001572
1573 # Test reverse, calling join on subclass
1574 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001575 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001576
1577 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001578 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001579 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001580 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001581 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001582 b = pickle.loads(pickle.dumps(a, proto))
1583 self.assertNotEqual(id(a), id(b))
1584 self.assertEqual(a, b)
1585 self.assertEqual(a.x, b.x)
1586 self.assertEqual(a.y, b.y)
1587 self.assertEqual(type(a), type(b))
1588 self.assertEqual(type(a.y), type(b.y))
1589
1590 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001591 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001592 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001593 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001594 for copy_method in (copy.copy, copy.deepcopy):
1595 b = copy_method(a)
1596 self.assertNotEqual(id(a), id(b))
1597 self.assertEqual(a, b)
1598 self.assertEqual(a.x, b.x)
1599 self.assertEqual(a.y, b.y)
1600 self.assertEqual(type(a), type(b))
1601 self.assertEqual(type(a.y), type(b.y))
1602
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001603 def test_fromhex(self):
1604 b = self.type2test.fromhex('1a2B30')
1605 self.assertEqual(b, b'\x1a\x2b\x30')
1606 self.assertIs(type(b), self.type2test)
1607
1608 class B1(self.basetype):
1609 def __new__(cls, value):
1610 me = self.basetype.__new__(cls, value)
1611 me.foo = 'bar'
1612 return me
1613
1614 b = B1.fromhex('1a2B30')
1615 self.assertEqual(b, b'\x1a\x2b\x30')
1616 self.assertIs(type(b), B1)
1617 self.assertEqual(b.foo, 'bar')
1618
1619 class B2(self.basetype):
1620 def __init__(me, *args, **kwargs):
1621 if self.basetype is not bytes:
1622 self.basetype.__init__(me, *args, **kwargs)
1623 me.foo = 'bar'
1624
1625 b = B2.fromhex('1a2B30')
1626 self.assertEqual(b, b'\x1a\x2b\x30')
1627 self.assertIs(type(b), B2)
1628 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001629
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001630
1631class ByteArraySubclass(bytearray):
1632 pass
1633
1634class BytesSubclass(bytes):
1635 pass
1636
Serhiy Storchaka15095802015-11-25 15:47:01 +02001637class OtherBytesSubclass(bytes):
1638 pass
1639
Ezio Melotti0dceb562013-01-10 07:43:26 +02001640class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001641 basetype = bytearray
1642 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001643
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001644 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001645 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001646 def __init__(me, newarg=1, *args, **kwargs):
1647 bytearray.__init__(me, *args, **kwargs)
1648 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001649 x = subclass(4, source=b"abcd")
1650 self.assertEqual(x, b"abcd")
1651 x = subclass(newarg=4, source=b"abcd")
1652 self.assertEqual(x, b"abcd")
1653
1654
Ezio Melotti0dceb562013-01-10 07:43:26 +02001655class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001656 basetype = bytes
1657 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001658
1659
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001660if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001661 unittest.main()