blob: a103a7d39cae2416109f8d6b039ebded7bdc1c27 [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
Martin Panter152a19c2016-04-06 06:37:17 +00003XXX This is a mess. Common tests should be unified with string_tests.py (and
4the latter should be modernized).
Guido van Rossum98297ee2007-11-06 21:34:58 +00005"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00006
INADA Naokia634e232017-01-06 17:32:01 +09007import array
Guido van Rossumd624f182006-04-24 13:47:05 +00008import os
9import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000010import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000011import copy
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000012import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000013import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000014import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000015import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010016
Benjamin Petersonee8712c2008-05-20 21:35:26 +000017import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000018import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030019import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010020from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000021
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000022
23if sys.flags.bytes_warning:
24 def check_bytes_warnings(func):
25 @functools.wraps(func)
26 def wrapper(*args, **kw):
27 with test.support.check_warnings(('', BytesWarning)):
28 return func(*args, **kw)
29 return wrapper
30else:
31 # no-op
32 def check_bytes_warnings(func):
33 return func
34
35
Georg Brandl9a54d7c2008-07-16 23:15:30 +000036class Indexable:
37 def __init__(self, value=0):
38 self.value = value
39 def __index__(self):
40 return self.value
41
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000042
Ezio Melotti0dceb562013-01-10 07:43:26 +020043class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000044
45 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000046 b = self.type2test()
47 self.assertEqual(type(b), self.type2test)
48 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000049
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000050 def test_copy(self):
51 a = self.type2test(b"abcd")
52 for copy_method in (copy.copy, copy.deepcopy):
53 b = copy_method(a)
54 self.assertEqual(a, b)
55 self.assertEqual(type(a), type(b))
56
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000057 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000058 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000059 self.assertEqual(len(b), 0)
60 self.assertRaises(IndexError, lambda: b[0])
61 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000062 self.assertRaises(IndexError, lambda: b[sys.maxsize])
63 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000064 self.assertRaises(IndexError, lambda: b[10**100])
65 self.assertRaises(IndexError, lambda: b[-1])
66 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000067 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
69 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000070 self.assertRaises(IndexError, lambda: b[-10**100])
71
72 def test_from_list(self):
73 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000074 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000075 self.assertEqual(len(b), 256)
76 self.assertEqual(list(b), ints)
77
78 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000079 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
80 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000081 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000082 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
83 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000084
INADA Naokia634e232017-01-06 17:32:01 +090085 def test_from_buffer(self):
86 a = self.type2test(array.array('B', [1, 2, 3]))
87 self.assertEqual(a, b"\x01\x02\x03")
88
89 # http://bugs.python.org/issue29159
90 # Fallback when __index__ raises exception other than OverflowError
91 class B(bytes):
92 def __index__(self):
93 raise TypeError
94
95 self.assertEqual(self.type2test(B(b"foobar")), b"foobar")
96
Guido van Rossum98297ee2007-11-06 21:34:58 +000097 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000098 self.assertEqual(self.type2test(0), b'')
99 self.assertEqual(self.type2test(1), b'\x00')
100 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
101 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000102
Benjamin Peterson4c045832010-04-16 22:35:32 +0000103 self.assertEqual(self.type2test('0', 'ascii'), b'0')
104 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +0000105 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000106
107 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000108 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000109 class C:
110 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000111 self.assertRaises(TypeError, self.type2test, ["0"])
112 self.assertRaises(TypeError, self.type2test, [0.0])
113 self.assertRaises(TypeError, self.type2test, [None])
114 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200115 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
116 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
117 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
118 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
119 self.assertRaises(TypeError, self.type2test, '')
120 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
121 self.assertRaises(TypeError, self.type2test, '', b'ascii')
122 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000123
124 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000125 self.assertRaises(ValueError, self.type2test, [-1])
126 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
127 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
128 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
129 self.assertRaises(ValueError, self.type2test, [-10**100])
130 self.assertRaises(ValueError, self.type2test, [256])
131 self.assertRaises(ValueError, self.type2test, [257])
132 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
133 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
134 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000135
Antoine Pitroucc231542014-11-02 18:40:09 +0100136 @bigaddrspacetest
137 def test_constructor_overflow(self):
138 size = MAX_Py_ssize_t
139 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
140 try:
141 # Should either pass or raise an error (e.g. on debug builds with
142 # additional malloc() overhead), but shouldn't crash.
143 bytearray(size - 4)
144 except (OverflowError, MemoryError):
145 pass
146
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000147 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000148 b1 = self.type2test([1, 2, 3])
149 b2 = self.type2test([1, 2, 3])
150 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000151
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000152 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000153 self.assertTrue(b2 != b3)
154 self.assertTrue(b1 <= b2)
155 self.assertTrue(b1 <= b3)
156 self.assertTrue(b1 < b3)
157 self.assertTrue(b1 >= b2)
158 self.assertTrue(b3 >= b2)
159 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000160
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000161 self.assertFalse(b1 != b2)
162 self.assertFalse(b2 == b3)
163 self.assertFalse(b1 > b2)
164 self.assertFalse(b1 > b3)
165 self.assertFalse(b1 >= b3)
166 self.assertFalse(b1 < b2)
167 self.assertFalse(b3 < b2)
168 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000169
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000170 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000171 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000172 # Byte comparisons with unicode should always fail!
173 # Test this for all expected byte orders and Unicode character
174 # sizes.
175 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
176 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
177 False)
178 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
179 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
180 False)
181 self.assertEqual(self.type2test() == str(), False)
182 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000183
184 def test_reversed(self):
185 input = list(map(ord, "Hello"))
186 b = self.type2test(input)
187 output = list(reversed(b))
188 input.reverse()
189 self.assertEqual(output, input)
190
191 def test_getslice(self):
192 def by(s):
193 return self.type2test(map(ord, s))
194 b = by("Hello, world")
195
196 self.assertEqual(b[:5], by("Hello"))
197 self.assertEqual(b[1:5], by("ello"))
198 self.assertEqual(b[5:7], by(", "))
199 self.assertEqual(b[7:], by("world"))
200 self.assertEqual(b[7:12], by("world"))
201 self.assertEqual(b[7:100], by("world"))
202
203 self.assertEqual(b[:-7], by("Hello"))
204 self.assertEqual(b[-11:-7], by("ello"))
205 self.assertEqual(b[-7:-5], by(", "))
206 self.assertEqual(b[-5:], by("world"))
207 self.assertEqual(b[-5:12], by("world"))
208 self.assertEqual(b[-5:100], by("world"))
209 self.assertEqual(b[-100:5], by("Hello"))
210
211 def test_extended_getslice(self):
212 # Test extended slicing by comparing with list slicing.
213 L = list(range(255))
214 b = self.type2test(L)
215 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
216 for start in indices:
217 for stop in indices:
218 # Skip step 0 (invalid)
219 for step in indices[1:]:
220 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
221
222 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000223 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000224 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000225 b = self.type2test(sample, enc)
226 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000227 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
228 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000229 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000230
231 def test_decode(self):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300232 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000233 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000234 b = self.type2test(sample, enc)
235 self.assertEqual(b.decode(enc), sample)
236 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000237 b = self.type2test(sample, "latin-1")
238 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
239 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
240 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000241 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000242 # Default encoding is utf-8
243 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000244
245 def test_from_int(self):
246 b = self.type2test(0)
247 self.assertEqual(b, self.type2test())
248 b = self.type2test(10)
249 self.assertEqual(b, self.type2test([0]*10))
250 b = self.type2test(10000)
251 self.assertEqual(b, self.type2test([0]*10000))
252
253 def test_concat(self):
254 b1 = self.type2test(b"abc")
255 b2 = self.type2test(b"def")
256 self.assertEqual(b1 + b2, b"abcdef")
257 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
258 self.assertEqual(bytes(b"def") + b1, b"defabc")
259 self.assertRaises(TypeError, lambda: b1 + "def")
260 self.assertRaises(TypeError, lambda: "abc" + b2)
261
262 def test_repeat(self):
263 for b in b"abc", self.type2test(b"abc"):
264 self.assertEqual(b * 3, b"abcabcabc")
265 self.assertEqual(b * 0, b"")
266 self.assertEqual(b * -1, b"")
267 self.assertRaises(TypeError, lambda: b * 3.14)
268 self.assertRaises(TypeError, lambda: 3.14 * b)
269 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000270 with self.assertRaises((OverflowError, MemoryError)):
271 c = b * sys.maxsize
272 with self.assertRaises((OverflowError, MemoryError)):
273 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000274
275 def test_repeat_1char(self):
276 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
277
278 def test_contains(self):
279 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000280 self.assertIn(ord('a'), b)
281 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000282 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000283 self.assertRaises(ValueError, lambda: 300 in b)
284 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300285 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000286 self.assertRaises(TypeError, lambda: None in b)
287 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
288 self.assertRaises(TypeError, lambda: "a" in b)
289 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000290 self.assertIn(f(b""), b)
291 self.assertIn(f(b"a"), b)
292 self.assertIn(f(b"b"), b)
293 self.assertIn(f(b"c"), b)
294 self.assertIn(f(b"ab"), b)
295 self.assertIn(f(b"bc"), b)
296 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000297 self.assertNotIn(f(b"ac"), b)
298 self.assertNotIn(f(b"d"), b)
299 self.assertNotIn(f(b"dab"), b)
300 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000301
302 def test_fromhex(self):
303 self.assertRaises(TypeError, self.type2test.fromhex)
304 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000305 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000306 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000307 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
308 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
309 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000310 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
311 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
312 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
313 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
314 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
315 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
316
Victor Stinner2bf89932015-10-14 11:25:33 +0200317 for data, pos in (
318 # invalid first hexadecimal character
319 ('12 x4 56', 3),
320 # invalid second hexadecimal character
321 ('12 3x 56', 4),
322 # two invalid hexadecimal characters
323 ('12 xy 56', 3),
324 # test non-ASCII string
325 ('12 3\xff 56', 4),
326 ):
327 with self.assertRaises(ValueError) as cm:
328 self.type2test.fromhex(data)
329 self.assertIn('at position %s' % pos, str(cm.exception))
330
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000331 def test_hex(self):
332 self.assertRaises(TypeError, self.type2test.hex)
333 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000334 self.assertEqual(self.type2test(b"").hex(), "")
335 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
336 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
337 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000338
Christian Heimes510711d2008-01-30 11:57:58 +0000339 def test_join(self):
340 self.assertEqual(self.type2test(b"").join([]), b"")
341 self.assertEqual(self.type2test(b"").join([b""]), b"")
342 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
343 lst = list(map(self.type2test, lst))
344 self.assertEqual(self.type2test(b"").join(lst), b"abc")
345 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
346 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200347 dot_join = self.type2test(b".:").join
348 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
349 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
350 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
351 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
352 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
353 # Stress it with many items
354 seq = [b"abc"] * 1000
355 expected = b"abc" + b".:abc" * 999
356 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400357 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200358 # Error handling and cleanup when some item in the middle of the
359 # sequence has the wrong type.
360 with self.assertRaises(TypeError):
361 dot_join([bytearray(b"ab"), "cd", b"ef"])
362 with self.assertRaises(TypeError):
363 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000364
Christian Heimes510711d2008-01-30 11:57:58 +0000365 def test_count(self):
366 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200367 i = 105
368 p = 112
369 w = 119
370
Christian Heimes510711d2008-01-30 11:57:58 +0000371 self.assertEqual(b.count(b'i'), 4)
372 self.assertEqual(b.count(b'ss'), 2)
373 self.assertEqual(b.count(b'w'), 0)
374
Antoine Pitrouac65d962011-10-20 23:54:17 +0200375 self.assertEqual(b.count(i), 4)
376 self.assertEqual(b.count(w), 0)
377
378 self.assertEqual(b.count(b'i', 6), 2)
379 self.assertEqual(b.count(b'p', 6), 2)
380 self.assertEqual(b.count(b'i', 1, 3), 1)
381 self.assertEqual(b.count(b'p', 7, 9), 1)
382
383 self.assertEqual(b.count(i, 6), 2)
384 self.assertEqual(b.count(p, 6), 2)
385 self.assertEqual(b.count(i, 1, 3), 1)
386 self.assertEqual(b.count(p, 7, 9), 1)
387
Christian Heimes510711d2008-01-30 11:57:58 +0000388 def test_startswith(self):
389 b = self.type2test(b'hello')
390 self.assertFalse(self.type2test().startswith(b"anything"))
391 self.assertTrue(b.startswith(b"hello"))
392 self.assertTrue(b.startswith(b"hel"))
393 self.assertTrue(b.startswith(b"h"))
394 self.assertFalse(b.startswith(b"hellow"))
395 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300396 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300397 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300398 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300399 self.assertIn('bytes', exc)
400 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000401
402 def test_endswith(self):
403 b = self.type2test(b'hello')
404 self.assertFalse(bytearray().endswith(b"anything"))
405 self.assertTrue(b.endswith(b"hello"))
406 self.assertTrue(b.endswith(b"llo"))
407 self.assertTrue(b.endswith(b"o"))
408 self.assertFalse(b.endswith(b"whello"))
409 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300410 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300411 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300412 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300413 self.assertIn('bytes', exc)
414 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000415
416 def test_find(self):
417 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200418 i = 105
419 w = 119
420
Christian Heimes510711d2008-01-30 11:57:58 +0000421 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000422 self.assertEqual(b.find(b'w'), -1)
423 self.assertEqual(b.find(b'mississippian'), -1)
424
Antoine Pitrouac65d962011-10-20 23:54:17 +0200425 self.assertEqual(b.find(i), 1)
426 self.assertEqual(b.find(w), -1)
427
428 self.assertEqual(b.find(b'ss', 3), 5)
429 self.assertEqual(b.find(b'ss', 1, 7), 2)
430 self.assertEqual(b.find(b'ss', 1, 3), -1)
431
432 self.assertEqual(b.find(i, 6), 7)
433 self.assertEqual(b.find(i, 1, 3), 1)
434 self.assertEqual(b.find(w, 1, 3), -1)
435
Victor Stinnerf8eac002011-12-18 01:17:41 +0100436 for index in (-1, 256, sys.maxsize + 1):
437 self.assertRaisesRegex(
438 ValueError, r'byte must be in range\(0, 256\)',
439 b.find, index)
440
Christian Heimes510711d2008-01-30 11:57:58 +0000441 def test_rfind(self):
442 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200443 i = 105
444 w = 119
445
Christian Heimes510711d2008-01-30 11:57:58 +0000446 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000447 self.assertEqual(b.rfind(b'w'), -1)
448 self.assertEqual(b.rfind(b'mississippian'), -1)
449
Antoine Pitrouac65d962011-10-20 23:54:17 +0200450 self.assertEqual(b.rfind(i), 10)
451 self.assertEqual(b.rfind(w), -1)
452
453 self.assertEqual(b.rfind(b'ss', 3), 5)
454 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
455
456 self.assertEqual(b.rfind(i, 1, 3), 1)
457 self.assertEqual(b.rfind(i, 3, 9), 7)
458 self.assertEqual(b.rfind(w, 1, 3), -1)
459
Christian Heimes510711d2008-01-30 11:57:58 +0000460 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200461 b = self.type2test(b'mississippi')
462 i = 105
463 w = 119
464
465 self.assertEqual(b.index(b'ss'), 2)
466 self.assertRaises(ValueError, b.index, b'w')
467 self.assertRaises(ValueError, b.index, b'mississippian')
468
469 self.assertEqual(b.index(i), 1)
470 self.assertRaises(ValueError, b.index, w)
471
472 self.assertEqual(b.index(b'ss', 3), 5)
473 self.assertEqual(b.index(b'ss', 1, 7), 2)
474 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
475
476 self.assertEqual(b.index(i, 6), 7)
477 self.assertEqual(b.index(i, 1, 3), 1)
478 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000479
480 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200481 b = self.type2test(b'mississippi')
482 i = 105
483 w = 119
484
485 self.assertEqual(b.rindex(b'ss'), 5)
486 self.assertRaises(ValueError, b.rindex, b'w')
487 self.assertRaises(ValueError, b.rindex, b'mississippian')
488
489 self.assertEqual(b.rindex(i), 10)
490 self.assertRaises(ValueError, b.rindex, w)
491
492 self.assertEqual(b.rindex(b'ss', 3), 5)
493 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
494
495 self.assertEqual(b.rindex(i, 1, 3), 1)
496 self.assertEqual(b.rindex(i, 3, 9), 7)
497 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000498
Ethan Furmanb95b5612015-01-23 20:05:18 -0800499 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300500 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800501 orig = b
502 b = b % b'world'
503 self.assertEqual(b, b'hello, world!')
504 self.assertEqual(orig, b'hello, %b!')
505 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300506 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800507 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200508 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200509 self.assertIs(type(a), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800510
511 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300512 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800513 orig = b
514 b %= b'world'
515 self.assertEqual(b, b'hello, world!')
516 self.assertEqual(orig, b'hello, %b!')
517 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300518 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800519 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200520 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200521 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300522
523 def test_rmod(self):
524 with self.assertRaises(TypeError):
525 object() % self.type2test(b'abc')
526 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800527
Christian Heimes510711d2008-01-30 11:57:58 +0000528 def test_replace(self):
529 b = self.type2test(b'mississippi')
530 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
531 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
532
Christian Heimes510711d2008-01-30 11:57:58 +0000533 def test_split_string_error(self):
534 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
535
Antoine Pitrouf8453022010-01-12 22:05:42 +0000536 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000537 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
538 b = self.type2test(b)
539 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000540 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
541 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
542
Christian Heimes510711d2008-01-30 11:57:58 +0000543 def test_rsplit_string_error(self):
544 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
545
546 def test_rsplit_unicodewhitespace(self):
547 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000548 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
549
550 def test_partition(self):
551 b = self.type2test(b'mississippi')
552 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000553 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000554
555 def test_rpartition(self):
556 b = self.type2test(b'mississippi')
557 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
558 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000559 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000560
561 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000562 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000563 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
564 b = self.type2test(b)
565 ps = pickle.dumps(b, proto)
566 q = pickle.loads(ps)
567 self.assertEqual(b, q)
568
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000569 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200570 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
571 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
572 it = itorg = iter(self.type2test(b))
573 data = list(self.type2test(b))
574 d = pickle.dumps(it, proto)
575 it = pickle.loads(d)
576 self.assertEqual(type(itorg), type(it))
577 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000578
Serhiy Storchakabad12572014-12-15 14:03:42 +0200579 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200580 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200581 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200582 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200583 d = pickle.dumps(it, proto)
584 it = pickle.loads(d)
585 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000586
Christian Heimes510711d2008-01-30 11:57:58 +0000587 def test_strip_bytearray(self):
588 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
589 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
590 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
591
592 def test_strip_string_error(self):
593 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
594 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
595 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
596
Eli Bendersky906b88f2011-07-29 07:05:08 +0300597 def test_center(self):
598 # Fill character can be either bytes or bytearray (issue 12380)
599 b = self.type2test(b'abc')
600 for fill_type in (bytes, bytearray):
601 self.assertEqual(b.center(7, fill_type(b'-')),
602 self.type2test(b'--abc--'))
603
604 def test_ljust(self):
605 # Fill character can be either bytes or bytearray (issue 12380)
606 b = self.type2test(b'abc')
607 for fill_type in (bytes, bytearray):
608 self.assertEqual(b.ljust(7, fill_type(b'-')),
609 self.type2test(b'abc----'))
610
611 def test_rjust(self):
612 # Fill character can be either bytes or bytearray (issue 12380)
613 b = self.type2test(b'abc')
614 for fill_type in (bytes, bytearray):
615 self.assertEqual(b.rjust(7, fill_type(b'-')),
616 self.type2test(b'----abc'))
617
Christian Heimes510711d2008-01-30 11:57:58 +0000618 def test_ord(self):
619 b = self.type2test(b'\0A\x7f\x80\xff')
620 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
621 [0, 65, 127, 128, 255])
622
Georg Brandlabc38772009-04-12 15:51:51 +0000623 def test_maketrans(self):
624 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 +0000625 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000626 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'
627 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000628 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
629 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
630
Jesus Ceaac451502011-04-20 17:09:23 +0200631 def test_none_arguments(self):
632 # issue 11828
633 b = self.type2test(b'hello')
634 l = self.type2test(b'l')
635 h = self.type2test(b'h')
636 x = self.type2test(b'x')
637 o = self.type2test(b'o')
638
639 self.assertEqual(2, b.find(l, None))
640 self.assertEqual(3, b.find(l, -2, None))
641 self.assertEqual(2, b.find(l, None, -2))
642 self.assertEqual(0, b.find(h, None, None))
643
644 self.assertEqual(3, b.rfind(l, None))
645 self.assertEqual(3, b.rfind(l, -2, None))
646 self.assertEqual(2, b.rfind(l, None, -2))
647 self.assertEqual(0, b.rfind(h, None, None))
648
649 self.assertEqual(2, b.index(l, None))
650 self.assertEqual(3, b.index(l, -2, None))
651 self.assertEqual(2, b.index(l, None, -2))
652 self.assertEqual(0, b.index(h, None, None))
653
654 self.assertEqual(3, b.rindex(l, None))
655 self.assertEqual(3, b.rindex(l, -2, None))
656 self.assertEqual(2, b.rindex(l, None, -2))
657 self.assertEqual(0, b.rindex(h, None, None))
658
659 self.assertEqual(2, b.count(l, None))
660 self.assertEqual(1, b.count(l, -2, None))
661 self.assertEqual(1, b.count(l, None, -2))
662 self.assertEqual(0, b.count(x, None, None))
663
664 self.assertEqual(True, b.endswith(o, None))
665 self.assertEqual(True, b.endswith(o, -2, None))
666 self.assertEqual(True, b.endswith(l, None, -2))
667 self.assertEqual(False, b.endswith(x, None, None))
668
669 self.assertEqual(True, b.startswith(h, None))
670 self.assertEqual(True, b.startswith(l, -2, None))
671 self.assertEqual(True, b.startswith(h, None, -2))
672 self.assertEqual(False, b.startswith(x, None, None))
673
Antoine Pitrouac65d962011-10-20 23:54:17 +0200674 def test_integer_arguments_out_of_byte_range(self):
675 b = self.type2test(b'hello')
676
677 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
678 self.assertRaises(ValueError, method, -1)
679 self.assertRaises(ValueError, method, 256)
680 self.assertRaises(ValueError, method, 9999)
681
Jesus Ceaac451502011-04-20 17:09:23 +0200682 def test_find_etc_raise_correct_error_messages(self):
683 # issue 11828
684 b = self.type2test(b'hello')
685 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300686 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200687 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300688 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200689 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300690 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200691 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300692 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200693 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300694 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200695 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300696 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200697 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300698 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200699 x, None, None, None)
700
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300701 def test_free_after_iterating(self):
702 test.support.check_free_after_iterating(self, iter, self.type2test)
703 test.support.check_free_after_iterating(self, reversed, self.type2test)
704
Martin Panter1b6c6da2016-08-27 08:35:02 +0000705 def test_translate(self):
706 b = self.type2test(b'hello')
707 rosetta = bytearray(range(256))
708 rosetta[ord('o')] = ord('e')
709
710 self.assertRaises(TypeError, b.translate)
711 self.assertRaises(TypeError, b.translate, None, None)
712 self.assertRaises(ValueError, b.translate, bytes(range(255)))
713
714 c = b.translate(rosetta, b'hello')
715 self.assertEqual(b, b'hello')
716 self.assertIsInstance(c, self.type2test)
717
718 c = b.translate(rosetta)
719 d = b.translate(rosetta, b'')
720 self.assertEqual(c, d)
721 self.assertEqual(c, b'helle')
722
723 c = b.translate(rosetta, b'l')
724 self.assertEqual(c, b'hee')
725 c = b.translate(None, b'e')
726 self.assertEqual(c, b'hllo')
727
728 # test delete as a keyword argument
729 c = b.translate(rosetta, delete=b'')
730 self.assertEqual(c, b'helle')
731 c = b.translate(rosetta, delete=b'l')
732 self.assertEqual(c, b'hee')
733 c = b.translate(None, delete=b'e')
734 self.assertEqual(c, b'hllo')
735
Christian Heimes510711d2008-01-30 11:57:58 +0000736
Ezio Melotti0dceb562013-01-10 07:43:26 +0200737class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000738 type2test = bytes
739
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400740 def test_getitem_error(self):
741 msg = "byte indices must be integers or slices"
742 with self.assertRaisesRegex(TypeError, msg):
743 b'python'['a']
744
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000745 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200746 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000747 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000748 self.assertRaises(TypeError, f.readinto, b"")
749
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000750 def test_custom(self):
751 class A:
752 def __bytes__(self):
753 return b'abc'
754 self.assertEqual(bytes(A()), b'abc')
755 class A: pass
756 self.assertRaises(TypeError, bytes, A())
757 class A:
758 def __bytes__(self):
759 return None
760 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600761 class A:
762 def __bytes__(self):
763 return b'a'
764 def __index__(self):
765 return 42
766 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200767 # Issue #25766
768 class A(str):
769 def __bytes__(self):
770 return b'abc'
771 self.assertEqual(bytes(A('\u20ac')), b'abc')
772 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200773 # Issue #24731
774 class A:
775 def __bytes__(self):
776 return OtherBytesSubclass(b'abc')
777 self.assertEqual(bytes(A()), b'abc')
778 self.assertIs(type(bytes(A())), OtherBytesSubclass)
779 self.assertEqual(BytesSubclass(A()), b'abc')
780 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000781
Victor Stinner29e762c2011-01-05 03:33:28 +0000782 # Test PyBytes_FromFormat()
783 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200784 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200785 _testcapi = test.support.import_module('_testcapi')
786 from ctypes import pythonapi, py_object
787 from ctypes import (
788 c_int, c_uint,
789 c_long, c_ulong,
790 c_size_t, c_ssize_t,
791 c_char_p)
792
Victor Stinner29e762c2011-01-05 03:33:28 +0000793 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
794 PyBytes_FromFormat.restype = py_object
795
Victor Stinner03dab782015-10-14 00:21:35 +0200796 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000797 self.assertEqual(PyBytes_FromFormat(b'format'),
798 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200799 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
800 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000801
Victor Stinner03dab782015-10-14 00:21:35 +0200802 # test formatters
803 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
804 b'c=\0')
805 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
806 b'c=@')
807 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
808 b'c=\xff')
809 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
810 c_int(1), c_long(2),
811 c_size_t(3)),
812 b'd=1 ld=2 zd=3')
813 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
814 c_int(-1), c_long(-2),
815 c_size_t(-3)),
816 b'd=-1 ld=-2 zd=-3')
817 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
818 c_uint(123), c_ulong(456),
819 c_size_t(789)),
820 b'u=123 lu=456 zu=789')
821 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
822 b'i=123')
823 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
824 b'i=-123')
825 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
826 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200827
828 sizeof_ptr = ctypes.sizeof(c_char_p)
829
830 if os.name == 'nt':
831 # Windows (MSCRT)
832 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
833 def ptr_formatter(ptr):
834 return (ptr_format % ptr)
835 else:
836 # UNIX (glibc)
837 def ptr_formatter(ptr):
838 return '%#x' % ptr
839
Victor Stinner7ab986d2015-10-14 02:55:12 +0200840 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200841 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
842 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200843 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
844 b's=cstr')
845
846 # test minimum and maximum integer values
847 size_max = c_size_t(-1).value
848 for formatstr, ctypes_type, value, py_formatter in (
849 (b'%d', c_int, _testcapi.INT_MIN, str),
850 (b'%d', c_int, _testcapi.INT_MAX, str),
851 (b'%ld', c_long, _testcapi.LONG_MIN, str),
852 (b'%ld', c_long, _testcapi.LONG_MAX, str),
853 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
854 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
855 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
856 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200857 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200858 ):
859 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
860 py_formatter(value).encode('ascii')),
861
862 # width and precision (width is currently ignored)
863 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
864 b'a')
865 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
866 b'abc')
867
868 # '%%' formatter
869 self.assertEqual(PyBytes_FromFormat(b'%%'),
870 b'%')
871 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
872 b'[%]')
873 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
874 b'%_')
875 self.assertEqual(PyBytes_FromFormat(b'%%s'),
876 b'%s')
877
878 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000879 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200880 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
881 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000882
Victor Stinner03dab782015-10-14 00:21:35 +0200883 # Issue #19969: %c must raise OverflowError for values
884 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100885 self.assertRaises(OverflowError,
886 PyBytes_FromFormat, b'%c', c_int(-1))
887 self.assertRaises(OverflowError,
888 PyBytes_FromFormat, b'%c', c_int(256))
889
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700890 def test_bytes_blocking(self):
891 class IterationBlocked(list):
892 __bytes__ = None
893 i = [0, 1, 2, 3]
894 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
895 self.assertRaises(TypeError, bytes, IterationBlocked(i))
896
897 # At least in CPython, because bytes.__new__ and the C API
898 # PyBytes_FromObject have different fallback rules, integer
899 # fallback is handled specially, so test separately.
900 class IntBlocked(int):
901 __bytes__ = None
902 self.assertEqual(bytes(3), b'\0\0\0')
903 self.assertRaises(TypeError, bytes, IntBlocked(3))
904
905 # While there is no separately-defined rule for handling bytes
906 # subclasses differently from other buffer-interface classes,
907 # an implementation may well special-case them (as CPython 2.x
908 # str did), so test them separately.
909 class BytesSubclassBlocked(bytes):
910 __bytes__ = None
911 self.assertEqual(bytes(b'ab'), b'ab')
912 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
913
914 class BufferBlocked(bytearray):
915 __bytes__ = None
916 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
917 self.assertEqual(bytes(ba), b'ab')
918 self.assertRaises(TypeError, bytes, bb)
919
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000920
Ezio Melotti0dceb562013-01-10 07:43:26 +0200921class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000922 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000923
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400924 def test_getitem_error(self):
925 msg = "bytearray indices must be integers or slices"
926 with self.assertRaisesRegex(TypeError, msg):
927 bytearray(b'python')['a']
928
929 def test_setitem_error(self):
930 msg = "bytearray indices must be integers or slices"
931 with self.assertRaisesRegex(TypeError, msg):
932 b = bytearray(b'python')
933 b['a'] = "python"
934
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000935 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000936 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000937
Guido van Rossum254348e2007-11-21 19:29:53 +0000938 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000939 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000940 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000941 tfn = tempfile.mktemp()
942 try:
943 # Prepare
944 with open(tfn, "wb") as f:
945 f.write(short_sample)
946 # Test readinto
947 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000948 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000949 n = f.readinto(b)
950 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000951 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000952 # Test writing in binary mode
953 with open(tfn, "wb") as f:
954 f.write(b)
955 with open(tfn, "rb") as f:
956 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000957 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000958 finally:
959 try:
960 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200961 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000962 pass
963
Neal Norwitz6968b052007-02-27 19:02:19 +0000964 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000965 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000966 self.assertEqual(b.reverse(), None)
967 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000968 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000969 b.reverse()
970 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000971 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000972 b.reverse()
973 self.assertFalse(b)
974
Eli Bendersky4db28d32011-03-03 18:21:02 +0000975 def test_clear(self):
976 b = bytearray(b'python')
977 b.clear()
978 self.assertEqual(b, b'')
979
980 b = bytearray(b'')
981 b.clear()
982 self.assertEqual(b, b'')
983
984 b = bytearray(b'')
985 b.append(ord('r'))
986 b.clear()
987 b.append(ord('p'))
988 self.assertEqual(b, b'p')
989
990 def test_copy(self):
991 b = bytearray(b'abc')
992 bb = b.copy()
993 self.assertEqual(bb, b'abc')
994
995 b = bytearray(b'')
996 bb = b.copy()
997 self.assertEqual(bb, b'')
998
999 # test that it's indeed a copy and not a reference
1000 b = bytearray(b'abc')
1001 bb = b.copy()
1002 self.assertEqual(b, bb)
1003 self.assertIsNot(b, bb)
1004 bb.append(ord('d'))
1005 self.assertEqual(bb, b'abcd')
1006 self.assertEqual(b, b'abc')
1007
Guido van Rossumd624f182006-04-24 13:47:05 +00001008 def test_regexps(self):
1009 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001010 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001011 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001012 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001013
1014 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001015 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001016 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001017 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001018 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001019 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001020 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001021 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001022 try:
1023 b[3] = 0
1024 self.fail("Didn't raise IndexError")
1025 except IndexError:
1026 pass
1027 try:
1028 b[-10] = 0
1029 self.fail("Didn't raise IndexError")
1030 except IndexError:
1031 pass
1032 try:
1033 b[0] = 256
1034 self.fail("Didn't raise ValueError")
1035 except ValueError:
1036 pass
1037 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001038 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001039 self.fail("Didn't raise ValueError")
1040 except ValueError:
1041 pass
1042 try:
1043 b[0] = None
1044 self.fail("Didn't raise TypeError")
1045 except TypeError:
1046 pass
1047
1048 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001049 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001050 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001051 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001052 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001053 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001054 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001055 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001056
1057 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001058 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001059 self.assertEqual(list(b), list(range(10)))
1060
Guido van Rossum254348e2007-11-21 19:29:53 +00001061 b[0:5] = bytearray([1, 1, 1, 1, 1])
1062 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001063
1064 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001065 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001066
Guido van Rossum254348e2007-11-21 19:29:53 +00001067 b[0:0] = bytearray([0, 1, 2, 3, 4])
1068 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001069
Guido van Rossum254348e2007-11-21 19:29:53 +00001070 b[-7:-3] = bytearray([100, 101])
1071 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001072
1073 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001074 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001075
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001076 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001077 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 +00001078
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001079 b[3:] = b'foo'
1080 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1081
1082 b[:3] = memoryview(b'foo')
1083 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1084
1085 b[3:4] = []
1086 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1087
1088 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1089 ['a', 'b'], [b'a', b'b'], [[]]]:
1090 with self.assertRaises(TypeError):
1091 b[3:4] = elem
1092
1093 for elem in [[254, 255, 256], [-256, 9000]]:
1094 with self.assertRaises(ValueError):
1095 b[3:4] = elem
1096
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001097 def test_setslice_extend(self):
1098 # Exercise the resizing logic (see issue #19087)
1099 b = bytearray(range(100))
1100 self.assertEqual(list(b), list(range(100)))
1101 del b[:10]
1102 self.assertEqual(list(b), list(range(10, 100)))
1103 b.extend(range(100, 110))
1104 self.assertEqual(list(b), list(range(10, 110)))
1105
Antoine Pitrou25454112015-05-19 20:52:27 +02001106 def test_fifo_overrun(self):
1107 # Test for issue #23985, a buffer overrun when implementing a FIFO
1108 # Build Python in pydebug mode for best results.
1109 b = bytearray(10)
1110 b.pop() # Defeat expanding buffer off-by-one quirk
1111 del b[:1] # Advance start pointer without reallocating
1112 b += bytes(2) # Append exactly the number of deleted bytes
1113 del b # Free memory buffer, allowing pydebug verification
1114
1115 def test_del_expand(self):
1116 # Reducing the size should not expand the buffer (issue #23985)
1117 b = bytearray(10)
1118 size = sys.getsizeof(b)
1119 del b[:1]
1120 self.assertLessEqual(sys.getsizeof(b), size)
1121
Thomas Wouters376446d2006-12-19 08:30:14 +00001122 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001123 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001124 for start in indices:
1125 for stop in indices:
1126 # Skip invalid step 0
1127 for step in indices[1:]:
1128 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001129 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001130 # Make sure we have a slice of exactly the right length,
1131 # but with different data.
1132 data = L[start:stop:step]
1133 data.reverse()
1134 L[start:stop:step] = data
1135 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001136 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001137
Thomas Wouters376446d2006-12-19 08:30:14 +00001138 del L[start:stop:step]
1139 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001140 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001141
Guido van Rossumd624f182006-04-24 13:47:05 +00001142 def test_setslice_trap(self):
1143 # This test verifies that we correctly handle assigning self
1144 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001145 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001146 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001147 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001148
Guido van Rossum13e57212006-04-27 22:54:26 +00001149 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001150 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001151 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001152 b += b"def"
1153 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001154 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001155 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001156 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001157 self.assertEqual(b, b"abcdefxyz")
1158 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001159 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001160 except TypeError:
1161 pass
1162 else:
1163 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001164
1165 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001166 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001167 b1 = b
1168 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001169 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001170 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001171 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001172
1173 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001174 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001175 b1 = b
1176 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001177 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001178 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001179 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001180
Guido van Rossum20188312006-05-05 15:15:40 +00001181 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001182 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001183 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001184 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001185 seq = [alloc]
1186 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001187 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001188 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001189 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001190 if alloc not in seq:
1191 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001192
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001193 def test_init_alloc(self):
1194 b = bytearray()
1195 def g():
1196 for i in range(1, 100):
1197 yield i
1198 a = list(b)
1199 self.assertEqual(a, list(range(1, len(a)+1)))
1200 self.assertEqual(len(b), len(a))
1201 self.assertLessEqual(len(b), i)
1202 alloc = b.__alloc__()
1203 self.assertGreater(alloc, len(b)) # including trailing null byte
1204 b.__init__(g())
1205 self.assertEqual(list(b), list(range(1, 100)))
1206 self.assertEqual(len(b), 99)
1207 alloc = b.__alloc__()
1208 self.assertGreater(alloc, len(b))
1209
Neal Norwitz6968b052007-02-27 19:02:19 +00001210 def test_extend(self):
1211 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001212 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001213 a.extend(a)
1214 self.assertEqual(a, orig + orig)
1215 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001216 a = bytearray(b'')
1217 # Test iterators that don't have a __length_hint__
1218 a.extend(map(int, orig * 25))
1219 a.extend(int(x) for x in orig * 25)
1220 self.assertEqual(a, orig * 50)
1221 self.assertEqual(a[-5:], orig)
1222 a = bytearray(b'')
1223 a.extend(iter(map(int, orig * 50)))
1224 self.assertEqual(a, orig * 50)
1225 self.assertEqual(a[-5:], orig)
1226 a = bytearray(b'')
1227 a.extend(list(map(int, orig * 50)))
1228 self.assertEqual(a, orig * 50)
1229 self.assertEqual(a[-5:], orig)
1230 a = bytearray(b'')
1231 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1232 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1233 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001234 a = bytearray(b'')
1235 a.extend([Indexable(ord('a'))])
1236 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001237
Neal Norwitz6968b052007-02-27 19:02:19 +00001238 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001239 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001240 b.remove(ord('l'))
1241 self.assertEqual(b, b'helo')
1242 b.remove(ord('l'))
1243 self.assertEqual(b, b'heo')
1244 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1245 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001246 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001247 # remove first and last
1248 b.remove(ord('o'))
1249 b.remove(ord('h'))
1250 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001251 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001252 b.remove(Indexable(ord('e')))
1253 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001254
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001255 # test values outside of the ascii range: (0, 127)
1256 c = bytearray([126, 127, 128, 129])
1257 c.remove(127)
1258 self.assertEqual(c, bytes([126, 128, 129]))
1259 c.remove(129)
1260 self.assertEqual(c, bytes([126, 128]))
1261
Neal Norwitz6968b052007-02-27 19:02:19 +00001262 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001263 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001264 self.assertEqual(b.pop(), ord('d'))
1265 self.assertEqual(b.pop(0), ord('w'))
1266 self.assertEqual(b.pop(-2), ord('r'))
1267 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001268 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001269 # test for issue #6846
1270 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001271
1272 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001273 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001274
Neal Norwitz6968b052007-02-27 19:02:19 +00001275 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001276 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001277 b.append(ord('o'))
1278 self.assertEqual(b, b'hello')
1279 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001280 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001281 b.append(ord('A'))
1282 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001283 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001284 b = bytearray()
1285 b.append(Indexable(ord('A')))
1286 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001287
1288 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001289 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001290 b.insert(1, ord('i'))
1291 b.insert(4, ord('i'))
1292 b.insert(-2, ord('i'))
1293 b.insert(1000, ord('i'))
1294 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001295 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001296 b = bytearray()
1297 b.insert(0, Indexable(ord('A')))
1298 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001299
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001300 def test_copied(self):
1301 # Issue 4348. Make sure that operations that don't mutate the array
1302 # copy the bytes.
1303 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001304 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001305
1306 t = bytearray([i for i in range(256)])
1307 x = bytearray(b'')
1308 self.assertFalse(x is x.translate(t))
1309
Guido van Rossum254348e2007-11-21 19:29:53 +00001310 def test_partition_bytearray_doesnt_share_nullstring(self):
1311 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001312 self.assertEqual(b, b"")
1313 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001314 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001315 b += b"!"
1316 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001317 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001318 self.assertEqual(b, b"")
1319 self.assertEqual(c, b"")
1320 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001321 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001322 self.assertEqual(b, b"")
1323 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001324 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001325 b += b"!"
1326 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001327 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001328 self.assertEqual(b, b"")
1329 self.assertEqual(c, b"")
1330
Antoine Pitrou5504e892008-12-06 21:27:53 +00001331 def test_resize_forbidden(self):
1332 # #4509: can't resize a bytearray when there are buffer exports, even
1333 # if it wouldn't reallocate the underlying buffer.
1334 # Furthermore, no destructive changes to the buffer may be applied
1335 # before raising the error.
1336 b = bytearray(range(10))
1337 v = memoryview(b)
1338 def resize(n):
1339 b[1:-1] = range(n + 1, 2*n - 1)
1340 resize(10)
1341 orig = b[:]
1342 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001343 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001344 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001345 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001346 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001347 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001348 # Other operations implying resize
1349 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001350 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001351 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001352 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001353 def delitem():
1354 del b[1]
1355 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001356 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001357 # deleting a non-contiguous slice
1358 def delslice():
1359 b[1:-1:2] = b""
1360 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001361 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001362
Stefan Krah650c1e82015-02-03 21:43:23 +01001363 @test.support.cpython_only
1364 def test_obsolete_write_lock(self):
1365 from _testcapi import getbuffer_with_null_view
1366 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001367
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001368 def test_iterator_pickling2(self):
1369 orig = bytearray(b'abc')
1370 data = list(b'qwerty')
1371 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1372 # initial iterator
1373 itorig = iter(orig)
1374 d = pickle.dumps((itorig, orig), proto)
1375 it, b = pickle.loads(d)
1376 b[:] = data
1377 self.assertEqual(type(it), type(itorig))
1378 self.assertEqual(list(it), data)
1379
1380 # running iterator
1381 next(itorig)
1382 d = pickle.dumps((itorig, orig), proto)
1383 it, b = pickle.loads(d)
1384 b[:] = data
1385 self.assertEqual(type(it), type(itorig))
1386 self.assertEqual(list(it), data[1:])
1387
1388 # empty iterator
1389 for i in range(1, len(orig)):
1390 next(itorig)
1391 d = pickle.dumps((itorig, orig), proto)
1392 it, b = pickle.loads(d)
1393 b[:] = data
1394 self.assertEqual(type(it), type(itorig))
1395 self.assertEqual(list(it), data[len(orig):])
1396
1397 # exhausted iterator
1398 self.assertRaises(StopIteration, next, itorig)
1399 d = pickle.dumps((itorig, orig), proto)
1400 it, b = pickle.loads(d)
1401 b[:] = data
1402 self.assertEqual(list(it), [])
1403
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001404 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001405
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001406 def test_iterator_length_hint(self):
1407 # Issue 27443: __length_hint__ can return negative integer
1408 ba = bytearray(b'ab')
1409 it = iter(ba)
1410 next(it)
1411 ba.clear()
1412 # Shouldn't raise an error
1413 self.assertEqual(list(it), [])
1414
1415
Christian Heimes510711d2008-01-30 11:57:58 +00001416class AssortedBytesTest(unittest.TestCase):
1417 #
1418 # Test various combinations of bytes and bytearray
1419 #
1420
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001421 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001422 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001423 for f in str, repr:
1424 self.assertEqual(f(bytearray()), "bytearray(b'')")
1425 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1426 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1427 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1428 self.assertEqual(f(b"abc"), "b'abc'")
1429 self.assertEqual(f(b"'"), '''b"'"''') # '''
1430 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001431
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001432 @check_bytes_warnings
1433 def test_format(self):
1434 for b in b'abc', bytearray(b'abc'):
1435 self.assertEqual(format(b), str(b))
1436 self.assertEqual(format(b, ''), str(b))
1437 with self.assertRaisesRegex(TypeError,
1438 r'\b%s\b' % re.escape(type(b).__name__)):
1439 format(b, 's')
1440
Christian Heimes510711d2008-01-30 11:57:58 +00001441 def test_compare_bytes_to_bytearray(self):
1442 self.assertEqual(b"abc" == bytes(b"abc"), True)
1443 self.assertEqual(b"ab" != bytes(b"abc"), True)
1444 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1445 self.assertEqual(b"ab" < bytes(b"abc"), True)
1446 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1447 self.assertEqual(b"abc" > bytes(b"ab"), True)
1448
1449 self.assertEqual(b"abc" != bytes(b"abc"), False)
1450 self.assertEqual(b"ab" == bytes(b"abc"), False)
1451 self.assertEqual(b"ab" > bytes(b"abc"), False)
1452 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1453 self.assertEqual(b"abc" < bytes(b"ab"), False)
1454 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1455
1456 self.assertEqual(bytes(b"abc") == b"abc", True)
1457 self.assertEqual(bytes(b"ab") != b"abc", True)
1458 self.assertEqual(bytes(b"ab") <= b"abc", True)
1459 self.assertEqual(bytes(b"ab") < b"abc", True)
1460 self.assertEqual(bytes(b"abc") >= b"ab", True)
1461 self.assertEqual(bytes(b"abc") > b"ab", True)
1462
1463 self.assertEqual(bytes(b"abc") != b"abc", False)
1464 self.assertEqual(bytes(b"ab") == b"abc", False)
1465 self.assertEqual(bytes(b"ab") > b"abc", False)
1466 self.assertEqual(bytes(b"ab") >= b"abc", False)
1467 self.assertEqual(bytes(b"abc") < b"ab", False)
1468 self.assertEqual(bytes(b"abc") <= b"ab", False)
1469
Stefan Krah6e572b82013-01-26 13:06:36 +01001470 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001471 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001472 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001473 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001474 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001475 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001476
1477 def test_from_bytearray(self):
1478 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1479 buf = memoryview(sample)
1480 b = bytearray(buf)
1481 self.assertEqual(b, bytearray(sample))
1482
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001483 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001484 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001485 self.assertEqual(str(b''), "b''")
1486 self.assertEqual(str(b'x'), "b'x'")
1487 self.assertEqual(str(b'\x80'), "b'\\x80'")
1488 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1489 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1490 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001491
1492 def test_literal(self):
1493 tests = [
1494 (b"Wonderful spam", "Wonderful spam"),
1495 (br"Wonderful spam too", "Wonderful spam too"),
1496 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1497 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1498 ]
1499 for b, s in tests:
1500 self.assertEqual(b, bytearray(s, 'latin-1'))
1501 for c in range(128, 256):
1502 self.assertRaises(SyntaxError, eval,
1503 'b"%s"' % chr(c))
1504
Christian Heimes510711d2008-01-30 11:57:58 +00001505 def test_split_bytearray(self):
1506 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1507
1508 def test_rsplit_bytearray(self):
1509 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1510
Georg Brandleb2c9642008-05-30 12:05:02 +00001511 def test_return_self(self):
1512 # bytearray.replace must always return a new bytearray
1513 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001514 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001515
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001516 @unittest.skipUnless(sys.flags.bytes_warning,
1517 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001518 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001519 def bytes_warning():
1520 return test.support.check_warnings(('', BytesWarning))
1521 with bytes_warning():
1522 b'' == ''
1523 with bytes_warning():
1524 '' == b''
1525 with bytes_warning():
1526 b'' != ''
1527 with bytes_warning():
1528 '' != b''
1529 with bytes_warning():
1530 bytearray(b'') == ''
1531 with bytes_warning():
1532 '' == bytearray(b'')
1533 with bytes_warning():
1534 bytearray(b'') != ''
1535 with bytes_warning():
1536 '' != bytearray(b'')
1537 with bytes_warning():
1538 b'\0' == 0
1539 with bytes_warning():
1540 0 == b'\0'
1541 with bytes_warning():
1542 b'\0' != 0
1543 with bytes_warning():
1544 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001545
Guido van Rossumd624f182006-04-24 13:47:05 +00001546 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001547 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001548 # __reversed__? (optimization)
1549
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001550 # XXX More string methods? (Those that don't use character properties)
1551
Neal Norwitz6968b052007-02-27 19:02:19 +00001552 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001553 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001554 # Unfortunately they are all bundled with tests that
1555 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001556
Guido van Rossum254348e2007-11-21 19:29:53 +00001557 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001558 # the rest that make sense (the code can be cleaned up to use modern
1559 # unittest methods at the same time).
1560
Martin Panter152a19c2016-04-06 06:37:17 +00001561class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001562 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001563 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001564
1565 def test_returns_new_copy(self):
1566 val = self.marshal(b'1234')
1567 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001568 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001569 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1570 method = getattr(val, methname)
1571 newval = method(3)
1572 self.assertEqual(val, newval)
1573 self.assertTrue(val is not newval,
1574 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001575 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1576 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1577 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1578 newval = eval(expr)
1579 self.assertEqual(val, newval)
1580 self.assertTrue(val is not newval,
1581 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001582 sep = self.marshal(b'')
1583 newval = sep.join([val])
1584 self.assertEqual(val, newval)
1585 self.assertIsNot(val, newval)
1586
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001587
Christian Heimes510711d2008-01-30 11:57:58 +00001588class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001589 def fixtype(self, obj):
1590 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001591 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001592 return super().fixtype(obj)
1593
Martin Panter152a19c2016-04-06 06:37:17 +00001594 contains_bytes = True
1595
Ezio Melotti0dceb562013-01-10 07:43:26 +02001596class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001597 type2test = bytearray
1598
Ezio Melotti0dceb562013-01-10 07:43:26 +02001599class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001600 type2test = bytes
1601
Georg Brandlc7885542007-03-06 19:16:20 +00001602
Ezio Melotti0dceb562013-01-10 07:43:26 +02001603class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001604
1605 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001606 self.assertTrue(issubclass(self.type2test, self.basetype))
1607 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001608
1609 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001610 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001611
1612 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001613 self.assertTrue(_a == _a)
1614 self.assertTrue(_a != _b)
1615 self.assertTrue(_a < _b)
1616 self.assertTrue(_a <= _b)
1617 self.assertTrue(_b >= _a)
1618 self.assertTrue(_b > _a)
1619 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001620
1621 # test concat of subclass instances
1622 self.assertEqual(a + b, _a + _b)
1623 self.assertEqual(a + b, a + _b)
1624 self.assertEqual(a + b, _a + b)
1625
1626 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001627 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001628
1629 def test_join(self):
1630 # Make sure join returns a NEW object for single item sequences
1631 # involving a subclass.
1632 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001633 s1 = self.type2test(b"abcd")
1634 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001635 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001636 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001637
1638 # Test reverse, calling join on subclass
1639 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001640 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001641
1642 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001643 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001644 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001645 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001646 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001647 b = pickle.loads(pickle.dumps(a, proto))
1648 self.assertNotEqual(id(a), id(b))
1649 self.assertEqual(a, b)
1650 self.assertEqual(a.x, b.x)
1651 self.assertEqual(a.y, b.y)
1652 self.assertEqual(type(a), type(b))
1653 self.assertEqual(type(a.y), type(b.y))
1654
1655 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001656 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001657 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001658 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001659 for copy_method in (copy.copy, copy.deepcopy):
1660 b = copy_method(a)
1661 self.assertNotEqual(id(a), id(b))
1662 self.assertEqual(a, b)
1663 self.assertEqual(a.x, b.x)
1664 self.assertEqual(a.y, b.y)
1665 self.assertEqual(type(a), type(b))
1666 self.assertEqual(type(a.y), type(b.y))
1667
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001668 def test_fromhex(self):
1669 b = self.type2test.fromhex('1a2B30')
1670 self.assertEqual(b, b'\x1a\x2b\x30')
1671 self.assertIs(type(b), self.type2test)
1672
1673 class B1(self.basetype):
1674 def __new__(cls, value):
1675 me = self.basetype.__new__(cls, value)
1676 me.foo = 'bar'
1677 return me
1678
1679 b = B1.fromhex('1a2B30')
1680 self.assertEqual(b, b'\x1a\x2b\x30')
1681 self.assertIs(type(b), B1)
1682 self.assertEqual(b.foo, 'bar')
1683
1684 class B2(self.basetype):
1685 def __init__(me, *args, **kwargs):
1686 if self.basetype is not bytes:
1687 self.basetype.__init__(me, *args, **kwargs)
1688 me.foo = 'bar'
1689
1690 b = B2.fromhex('1a2B30')
1691 self.assertEqual(b, b'\x1a\x2b\x30')
1692 self.assertIs(type(b), B2)
1693 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001694
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001695
1696class ByteArraySubclass(bytearray):
1697 pass
1698
1699class BytesSubclass(bytes):
1700 pass
1701
Serhiy Storchaka15095802015-11-25 15:47:01 +02001702class OtherBytesSubclass(bytes):
1703 pass
1704
Ezio Melotti0dceb562013-01-10 07:43:26 +02001705class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001706 basetype = bytearray
1707 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001708
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001709 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001710 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001711 def __init__(me, newarg=1, *args, **kwargs):
1712 bytearray.__init__(me, *args, **kwargs)
1713 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001714 x = subclass(4, source=b"abcd")
1715 self.assertEqual(x, b"abcd")
1716 x = subclass(newarg=4, source=b"abcd")
1717 self.assertEqual(x, b"abcd")
1718
1719
Ezio Melotti0dceb562013-01-10 07:43:26 +02001720class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001721 basetype = bytes
1722 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001723
1724
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001725if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001726 unittest.main()