blob: cd82fa64570cb5ed4a73fd61415734d61aff1295 [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)
Xiang Zhangdf6d7b42017-03-06 18:17:10 +0800510 # issue 29714
511 b = self.type2test(b'hello,\x00%b!')
512 b = b % b'world'
513 self.assertEqual(b, b'hello,\x00world!')
514 self.assertIs(type(b), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800515
516 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300517 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800518 orig = b
519 b %= b'world'
520 self.assertEqual(b, b'hello, world!')
521 self.assertEqual(orig, b'hello, %b!')
522 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300523 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800524 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200525 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200526 self.assertIs(type(b), self.type2test)
Xiang Zhangdf6d7b42017-03-06 18:17:10 +0800527 # issue 29714
528 b = self.type2test(b'hello,\x00%b!')
529 b %= b'world'
530 self.assertEqual(b, b'hello,\x00world!')
531 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300532
533 def test_rmod(self):
534 with self.assertRaises(TypeError):
535 object() % self.type2test(b'abc')
536 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800537
Christian Heimes510711d2008-01-30 11:57:58 +0000538 def test_replace(self):
539 b = self.type2test(b'mississippi')
540 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
541 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
542
Christian Heimes510711d2008-01-30 11:57:58 +0000543 def test_split_string_error(self):
544 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
545
Antoine Pitrouf8453022010-01-12 22:05:42 +0000546 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000547 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
548 b = self.type2test(b)
549 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000550 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
551 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
552
Christian Heimes510711d2008-01-30 11:57:58 +0000553 def test_rsplit_string_error(self):
554 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
555
556 def test_rsplit_unicodewhitespace(self):
557 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000558 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
559
560 def test_partition(self):
561 b = self.type2test(b'mississippi')
562 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000563 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000564
565 def test_rpartition(self):
566 b = self.type2test(b'mississippi')
567 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
568 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000569 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000570
571 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000572 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000573 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
574 b = self.type2test(b)
575 ps = pickle.dumps(b, proto)
576 q = pickle.loads(ps)
577 self.assertEqual(b, q)
578
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000579 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200580 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
581 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
582 it = itorg = iter(self.type2test(b))
583 data = list(self.type2test(b))
584 d = pickle.dumps(it, proto)
585 it = pickle.loads(d)
586 self.assertEqual(type(itorg), type(it))
587 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000588
Serhiy Storchakabad12572014-12-15 14:03:42 +0200589 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200590 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200591 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200592 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200593 d = pickle.dumps(it, proto)
594 it = pickle.loads(d)
595 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000596
Christian Heimes510711d2008-01-30 11:57:58 +0000597 def test_strip_bytearray(self):
598 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
599 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
600 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
601
602 def test_strip_string_error(self):
603 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
604 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
605 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
606
Eli Bendersky906b88f2011-07-29 07:05:08 +0300607 def test_center(self):
608 # Fill character can be either bytes or bytearray (issue 12380)
609 b = self.type2test(b'abc')
610 for fill_type in (bytes, bytearray):
611 self.assertEqual(b.center(7, fill_type(b'-')),
612 self.type2test(b'--abc--'))
613
614 def test_ljust(self):
615 # Fill character can be either bytes or bytearray (issue 12380)
616 b = self.type2test(b'abc')
617 for fill_type in (bytes, bytearray):
618 self.assertEqual(b.ljust(7, fill_type(b'-')),
619 self.type2test(b'abc----'))
620
621 def test_rjust(self):
622 # Fill character can be either bytes or bytearray (issue 12380)
623 b = self.type2test(b'abc')
624 for fill_type in (bytes, bytearray):
625 self.assertEqual(b.rjust(7, fill_type(b'-')),
626 self.type2test(b'----abc'))
627
Christian Heimes510711d2008-01-30 11:57:58 +0000628 def test_ord(self):
629 b = self.type2test(b'\0A\x7f\x80\xff')
630 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
631 [0, 65, 127, 128, 255])
632
Georg Brandlabc38772009-04-12 15:51:51 +0000633 def test_maketrans(self):
634 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 +0000635 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000636 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'
637 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000638 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
639 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
640
Jesus Ceaac451502011-04-20 17:09:23 +0200641 def test_none_arguments(self):
642 # issue 11828
643 b = self.type2test(b'hello')
644 l = self.type2test(b'l')
645 h = self.type2test(b'h')
646 x = self.type2test(b'x')
647 o = self.type2test(b'o')
648
649 self.assertEqual(2, b.find(l, None))
650 self.assertEqual(3, b.find(l, -2, None))
651 self.assertEqual(2, b.find(l, None, -2))
652 self.assertEqual(0, b.find(h, None, None))
653
654 self.assertEqual(3, b.rfind(l, None))
655 self.assertEqual(3, b.rfind(l, -2, None))
656 self.assertEqual(2, b.rfind(l, None, -2))
657 self.assertEqual(0, b.rfind(h, None, None))
658
659 self.assertEqual(2, b.index(l, None))
660 self.assertEqual(3, b.index(l, -2, None))
661 self.assertEqual(2, b.index(l, None, -2))
662 self.assertEqual(0, b.index(h, None, None))
663
664 self.assertEqual(3, b.rindex(l, None))
665 self.assertEqual(3, b.rindex(l, -2, None))
666 self.assertEqual(2, b.rindex(l, None, -2))
667 self.assertEqual(0, b.rindex(h, None, None))
668
669 self.assertEqual(2, b.count(l, None))
670 self.assertEqual(1, b.count(l, -2, None))
671 self.assertEqual(1, b.count(l, None, -2))
672 self.assertEqual(0, b.count(x, None, None))
673
674 self.assertEqual(True, b.endswith(o, None))
675 self.assertEqual(True, b.endswith(o, -2, None))
676 self.assertEqual(True, b.endswith(l, None, -2))
677 self.assertEqual(False, b.endswith(x, None, None))
678
679 self.assertEqual(True, b.startswith(h, None))
680 self.assertEqual(True, b.startswith(l, -2, None))
681 self.assertEqual(True, b.startswith(h, None, -2))
682 self.assertEqual(False, b.startswith(x, None, None))
683
Antoine Pitrouac65d962011-10-20 23:54:17 +0200684 def test_integer_arguments_out_of_byte_range(self):
685 b = self.type2test(b'hello')
686
687 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
688 self.assertRaises(ValueError, method, -1)
689 self.assertRaises(ValueError, method, 256)
690 self.assertRaises(ValueError, method, 9999)
691
Jesus Ceaac451502011-04-20 17:09:23 +0200692 def test_find_etc_raise_correct_error_messages(self):
693 # issue 11828
694 b = self.type2test(b'hello')
695 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300696 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200697 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300698 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200699 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300700 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200701 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300702 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200703 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300704 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200705 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300706 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200707 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300708 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200709 x, None, None, None)
710
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300711 def test_free_after_iterating(self):
712 test.support.check_free_after_iterating(self, iter, self.type2test)
713 test.support.check_free_after_iterating(self, reversed, self.type2test)
714
Martin Panter1b6c6da2016-08-27 08:35:02 +0000715 def test_translate(self):
716 b = self.type2test(b'hello')
717 rosetta = bytearray(range(256))
718 rosetta[ord('o')] = ord('e')
719
720 self.assertRaises(TypeError, b.translate)
721 self.assertRaises(TypeError, b.translate, None, None)
722 self.assertRaises(ValueError, b.translate, bytes(range(255)))
723
724 c = b.translate(rosetta, b'hello')
725 self.assertEqual(b, b'hello')
726 self.assertIsInstance(c, self.type2test)
727
728 c = b.translate(rosetta)
729 d = b.translate(rosetta, b'')
730 self.assertEqual(c, d)
731 self.assertEqual(c, b'helle')
732
733 c = b.translate(rosetta, b'l')
734 self.assertEqual(c, b'hee')
735 c = b.translate(None, b'e')
736 self.assertEqual(c, b'hllo')
737
738 # test delete as a keyword argument
739 c = b.translate(rosetta, delete=b'')
740 self.assertEqual(c, b'helle')
741 c = b.translate(rosetta, delete=b'l')
742 self.assertEqual(c, b'hee')
743 c = b.translate(None, delete=b'e')
744 self.assertEqual(c, b'hllo')
745
Christian Heimes510711d2008-01-30 11:57:58 +0000746
Ezio Melotti0dceb562013-01-10 07:43:26 +0200747class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000748 type2test = bytes
749
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400750 def test_getitem_error(self):
751 msg = "byte indices must be integers or slices"
752 with self.assertRaisesRegex(TypeError, msg):
753 b'python'['a']
754
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000755 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200756 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000757 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000758 self.assertRaises(TypeError, f.readinto, b"")
759
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000760 def test_custom(self):
761 class A:
762 def __bytes__(self):
763 return b'abc'
764 self.assertEqual(bytes(A()), b'abc')
765 class A: pass
766 self.assertRaises(TypeError, bytes, A())
767 class A:
768 def __bytes__(self):
769 return None
770 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600771 class A:
772 def __bytes__(self):
773 return b'a'
774 def __index__(self):
775 return 42
776 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200777 # Issue #25766
778 class A(str):
779 def __bytes__(self):
780 return b'abc'
781 self.assertEqual(bytes(A('\u20ac')), b'abc')
782 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200783 # Issue #24731
784 class A:
785 def __bytes__(self):
786 return OtherBytesSubclass(b'abc')
787 self.assertEqual(bytes(A()), b'abc')
788 self.assertIs(type(bytes(A())), OtherBytesSubclass)
789 self.assertEqual(BytesSubclass(A()), b'abc')
790 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000791
Victor Stinner29e762c2011-01-05 03:33:28 +0000792 # Test PyBytes_FromFormat()
793 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200794 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200795 _testcapi = test.support.import_module('_testcapi')
796 from ctypes import pythonapi, py_object
797 from ctypes import (
798 c_int, c_uint,
799 c_long, c_ulong,
800 c_size_t, c_ssize_t,
801 c_char_p)
802
Victor Stinner29e762c2011-01-05 03:33:28 +0000803 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
804 PyBytes_FromFormat.restype = py_object
805
Victor Stinner03dab782015-10-14 00:21:35 +0200806 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000807 self.assertEqual(PyBytes_FromFormat(b'format'),
808 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200809 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
810 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000811
Victor Stinner03dab782015-10-14 00:21:35 +0200812 # test formatters
813 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
814 b'c=\0')
815 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
816 b'c=@')
817 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
818 b'c=\xff')
819 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
820 c_int(1), c_long(2),
821 c_size_t(3)),
822 b'd=1 ld=2 zd=3')
823 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
824 c_int(-1), c_long(-2),
825 c_size_t(-3)),
826 b'd=-1 ld=-2 zd=-3')
827 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
828 c_uint(123), c_ulong(456),
829 c_size_t(789)),
830 b'u=123 lu=456 zu=789')
831 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
832 b'i=123')
833 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
834 b'i=-123')
835 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
836 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200837
838 sizeof_ptr = ctypes.sizeof(c_char_p)
839
840 if os.name == 'nt':
841 # Windows (MSCRT)
842 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
843 def ptr_formatter(ptr):
844 return (ptr_format % ptr)
845 else:
846 # UNIX (glibc)
847 def ptr_formatter(ptr):
848 return '%#x' % ptr
849
Victor Stinner7ab986d2015-10-14 02:55:12 +0200850 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200851 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
852 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200853 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
854 b's=cstr')
855
856 # test minimum and maximum integer values
857 size_max = c_size_t(-1).value
858 for formatstr, ctypes_type, value, py_formatter in (
859 (b'%d', c_int, _testcapi.INT_MIN, str),
860 (b'%d', c_int, _testcapi.INT_MAX, str),
861 (b'%ld', c_long, _testcapi.LONG_MIN, str),
862 (b'%ld', c_long, _testcapi.LONG_MAX, str),
863 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
864 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
865 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
866 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200867 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200868 ):
869 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
870 py_formatter(value).encode('ascii')),
871
872 # width and precision (width is currently ignored)
873 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
874 b'a')
875 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
876 b'abc')
877
878 # '%%' formatter
879 self.assertEqual(PyBytes_FromFormat(b'%%'),
880 b'%')
881 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
882 b'[%]')
883 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
884 b'%_')
885 self.assertEqual(PyBytes_FromFormat(b'%%s'),
886 b'%s')
887
888 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000889 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200890 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
891 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000892
Victor Stinner03dab782015-10-14 00:21:35 +0200893 # Issue #19969: %c must raise OverflowError for values
894 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100895 self.assertRaises(OverflowError,
896 PyBytes_FromFormat, b'%c', c_int(-1))
897 self.assertRaises(OverflowError,
898 PyBytes_FromFormat, b'%c', c_int(256))
899
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700900 def test_bytes_blocking(self):
901 class IterationBlocked(list):
902 __bytes__ = None
903 i = [0, 1, 2, 3]
904 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
905 self.assertRaises(TypeError, bytes, IterationBlocked(i))
906
907 # At least in CPython, because bytes.__new__ and the C API
908 # PyBytes_FromObject have different fallback rules, integer
909 # fallback is handled specially, so test separately.
910 class IntBlocked(int):
911 __bytes__ = None
912 self.assertEqual(bytes(3), b'\0\0\0')
913 self.assertRaises(TypeError, bytes, IntBlocked(3))
914
915 # While there is no separately-defined rule for handling bytes
916 # subclasses differently from other buffer-interface classes,
917 # an implementation may well special-case them (as CPython 2.x
918 # str did), so test them separately.
919 class BytesSubclassBlocked(bytes):
920 __bytes__ = None
921 self.assertEqual(bytes(b'ab'), b'ab')
922 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
923
924 class BufferBlocked(bytearray):
925 __bytes__ = None
926 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
927 self.assertEqual(bytes(ba), b'ab')
928 self.assertRaises(TypeError, bytes, bb)
929
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000930
Ezio Melotti0dceb562013-01-10 07:43:26 +0200931class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000932 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000933
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400934 def test_getitem_error(self):
935 msg = "bytearray indices must be integers or slices"
936 with self.assertRaisesRegex(TypeError, msg):
937 bytearray(b'python')['a']
938
939 def test_setitem_error(self):
940 msg = "bytearray indices must be integers or slices"
941 with self.assertRaisesRegex(TypeError, msg):
942 b = bytearray(b'python')
943 b['a'] = "python"
944
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000945 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000946 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000947
Guido van Rossum254348e2007-11-21 19:29:53 +0000948 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000949 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000950 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000951 tfn = tempfile.mktemp()
952 try:
953 # Prepare
954 with open(tfn, "wb") as f:
955 f.write(short_sample)
956 # Test readinto
957 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000958 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000959 n = f.readinto(b)
960 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000961 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000962 # Test writing in binary mode
963 with open(tfn, "wb") as f:
964 f.write(b)
965 with open(tfn, "rb") as f:
966 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000967 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000968 finally:
969 try:
970 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200971 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000972 pass
973
Neal Norwitz6968b052007-02-27 19:02:19 +0000974 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000975 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000976 self.assertEqual(b.reverse(), None)
977 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000978 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000979 b.reverse()
980 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000981 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000982 b.reverse()
983 self.assertFalse(b)
984
Eli Bendersky4db28d32011-03-03 18:21:02 +0000985 def test_clear(self):
986 b = bytearray(b'python')
987 b.clear()
988 self.assertEqual(b, b'')
989
990 b = bytearray(b'')
991 b.clear()
992 self.assertEqual(b, b'')
993
994 b = bytearray(b'')
995 b.append(ord('r'))
996 b.clear()
997 b.append(ord('p'))
998 self.assertEqual(b, b'p')
999
1000 def test_copy(self):
1001 b = bytearray(b'abc')
1002 bb = b.copy()
1003 self.assertEqual(bb, b'abc')
1004
1005 b = bytearray(b'')
1006 bb = b.copy()
1007 self.assertEqual(bb, b'')
1008
1009 # test that it's indeed a copy and not a reference
1010 b = bytearray(b'abc')
1011 bb = b.copy()
1012 self.assertEqual(b, bb)
1013 self.assertIsNot(b, bb)
1014 bb.append(ord('d'))
1015 self.assertEqual(bb, b'abcd')
1016 self.assertEqual(b, b'abc')
1017
Guido van Rossumd624f182006-04-24 13:47:05 +00001018 def test_regexps(self):
1019 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001020 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001021 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001022 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001023
1024 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001025 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001026 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001027 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001028 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001029 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001030 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001031 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001032 try:
1033 b[3] = 0
1034 self.fail("Didn't raise IndexError")
1035 except IndexError:
1036 pass
1037 try:
1038 b[-10] = 0
1039 self.fail("Didn't raise IndexError")
1040 except IndexError:
1041 pass
1042 try:
1043 b[0] = 256
1044 self.fail("Didn't raise ValueError")
1045 except ValueError:
1046 pass
1047 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001048 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001049 self.fail("Didn't raise ValueError")
1050 except ValueError:
1051 pass
1052 try:
1053 b[0] = None
1054 self.fail("Didn't raise TypeError")
1055 except TypeError:
1056 pass
1057
1058 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001059 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001060 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001061 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001062 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001063 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001064 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001065 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001066
1067 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001068 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001069 self.assertEqual(list(b), list(range(10)))
1070
Guido van Rossum254348e2007-11-21 19:29:53 +00001071 b[0:5] = bytearray([1, 1, 1, 1, 1])
1072 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001073
1074 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001075 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001076
Guido van Rossum254348e2007-11-21 19:29:53 +00001077 b[0:0] = bytearray([0, 1, 2, 3, 4])
1078 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001079
Guido van Rossum254348e2007-11-21 19:29:53 +00001080 b[-7:-3] = bytearray([100, 101])
1081 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001082
1083 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001084 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001085
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001086 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001087 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 +00001088
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001089 b[3:] = b'foo'
1090 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1091
1092 b[:3] = memoryview(b'foo')
1093 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1094
1095 b[3:4] = []
1096 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1097
1098 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1099 ['a', 'b'], [b'a', b'b'], [[]]]:
1100 with self.assertRaises(TypeError):
1101 b[3:4] = elem
1102
1103 for elem in [[254, 255, 256], [-256, 9000]]:
1104 with self.assertRaises(ValueError):
1105 b[3:4] = elem
1106
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001107 def test_setslice_extend(self):
1108 # Exercise the resizing logic (see issue #19087)
1109 b = bytearray(range(100))
1110 self.assertEqual(list(b), list(range(100)))
1111 del b[:10]
1112 self.assertEqual(list(b), list(range(10, 100)))
1113 b.extend(range(100, 110))
1114 self.assertEqual(list(b), list(range(10, 110)))
1115
Antoine Pitrou25454112015-05-19 20:52:27 +02001116 def test_fifo_overrun(self):
1117 # Test for issue #23985, a buffer overrun when implementing a FIFO
1118 # Build Python in pydebug mode for best results.
1119 b = bytearray(10)
1120 b.pop() # Defeat expanding buffer off-by-one quirk
1121 del b[:1] # Advance start pointer without reallocating
1122 b += bytes(2) # Append exactly the number of deleted bytes
1123 del b # Free memory buffer, allowing pydebug verification
1124
1125 def test_del_expand(self):
1126 # Reducing the size should not expand the buffer (issue #23985)
1127 b = bytearray(10)
1128 size = sys.getsizeof(b)
1129 del b[:1]
1130 self.assertLessEqual(sys.getsizeof(b), size)
1131
Thomas Wouters376446d2006-12-19 08:30:14 +00001132 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001133 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001134 for start in indices:
1135 for stop in indices:
1136 # Skip invalid step 0
1137 for step in indices[1:]:
1138 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001139 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001140 # Make sure we have a slice of exactly the right length,
1141 # but with different data.
1142 data = L[start:stop:step]
1143 data.reverse()
1144 L[start:stop:step] = data
1145 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001146 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001147
Thomas Wouters376446d2006-12-19 08:30:14 +00001148 del L[start:stop:step]
1149 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001150 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001151
Guido van Rossumd624f182006-04-24 13:47:05 +00001152 def test_setslice_trap(self):
1153 # This test verifies that we correctly handle assigning self
1154 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001155 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001156 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001157 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001158
Guido van Rossum13e57212006-04-27 22:54:26 +00001159 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001160 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001161 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001162 b += b"def"
1163 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001164 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001165 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001166 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001167 self.assertEqual(b, b"abcdefxyz")
1168 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001169 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001170 except TypeError:
1171 pass
1172 else:
1173 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001174
1175 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001176 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001177 b1 = b
1178 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001179 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001180 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001181 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001182
1183 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001184 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001185 b1 = b
1186 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001187 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001188 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001189 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001190
Guido van Rossum20188312006-05-05 15:15:40 +00001191 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001192 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001193 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001194 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001195 seq = [alloc]
1196 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001197 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001198 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001199 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001200 if alloc not in seq:
1201 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001202
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001203 def test_init_alloc(self):
1204 b = bytearray()
1205 def g():
1206 for i in range(1, 100):
1207 yield i
1208 a = list(b)
1209 self.assertEqual(a, list(range(1, len(a)+1)))
1210 self.assertEqual(len(b), len(a))
1211 self.assertLessEqual(len(b), i)
1212 alloc = b.__alloc__()
1213 self.assertGreater(alloc, len(b)) # including trailing null byte
1214 b.__init__(g())
1215 self.assertEqual(list(b), list(range(1, 100)))
1216 self.assertEqual(len(b), 99)
1217 alloc = b.__alloc__()
1218 self.assertGreater(alloc, len(b))
1219
Neal Norwitz6968b052007-02-27 19:02:19 +00001220 def test_extend(self):
1221 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001222 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001223 a.extend(a)
1224 self.assertEqual(a, orig + orig)
1225 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001226 a = bytearray(b'')
1227 # Test iterators that don't have a __length_hint__
1228 a.extend(map(int, orig * 25))
1229 a.extend(int(x) for x in orig * 25)
1230 self.assertEqual(a, orig * 50)
1231 self.assertEqual(a[-5:], orig)
1232 a = bytearray(b'')
1233 a.extend(iter(map(int, orig * 50)))
1234 self.assertEqual(a, orig * 50)
1235 self.assertEqual(a[-5:], orig)
1236 a = bytearray(b'')
1237 a.extend(list(map(int, orig * 50)))
1238 self.assertEqual(a, orig * 50)
1239 self.assertEqual(a[-5:], orig)
1240 a = bytearray(b'')
1241 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1242 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1243 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001244 a = bytearray(b'')
1245 a.extend([Indexable(ord('a'))])
1246 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001247
Neal Norwitz6968b052007-02-27 19:02:19 +00001248 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001249 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001250 b.remove(ord('l'))
1251 self.assertEqual(b, b'helo')
1252 b.remove(ord('l'))
1253 self.assertEqual(b, b'heo')
1254 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1255 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001256 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001257 # remove first and last
1258 b.remove(ord('o'))
1259 b.remove(ord('h'))
1260 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001261 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001262 b.remove(Indexable(ord('e')))
1263 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001264
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001265 # test values outside of the ascii range: (0, 127)
1266 c = bytearray([126, 127, 128, 129])
1267 c.remove(127)
1268 self.assertEqual(c, bytes([126, 128, 129]))
1269 c.remove(129)
1270 self.assertEqual(c, bytes([126, 128]))
1271
Neal Norwitz6968b052007-02-27 19:02:19 +00001272 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001273 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001274 self.assertEqual(b.pop(), ord('d'))
1275 self.assertEqual(b.pop(0), ord('w'))
1276 self.assertEqual(b.pop(-2), ord('r'))
1277 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001278 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001279 # test for issue #6846
1280 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001281
1282 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001283 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001284
Neal Norwitz6968b052007-02-27 19:02:19 +00001285 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001286 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001287 b.append(ord('o'))
1288 self.assertEqual(b, b'hello')
1289 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001290 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001291 b.append(ord('A'))
1292 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001293 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001294 b = bytearray()
1295 b.append(Indexable(ord('A')))
1296 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001297
1298 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001299 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001300 b.insert(1, ord('i'))
1301 b.insert(4, ord('i'))
1302 b.insert(-2, ord('i'))
1303 b.insert(1000, ord('i'))
1304 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001305 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001306 b = bytearray()
1307 b.insert(0, Indexable(ord('A')))
1308 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001309
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001310 def test_copied(self):
1311 # Issue 4348. Make sure that operations that don't mutate the array
1312 # copy the bytes.
1313 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001314 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001315
1316 t = bytearray([i for i in range(256)])
1317 x = bytearray(b'')
1318 self.assertFalse(x is x.translate(t))
1319
Guido van Rossum254348e2007-11-21 19:29:53 +00001320 def test_partition_bytearray_doesnt_share_nullstring(self):
1321 a, b, c = bytearray(b"x").partition(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 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001328 self.assertEqual(b, b"")
1329 self.assertEqual(c, b"")
1330 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001331 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001332 self.assertEqual(b, b"")
1333 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001334 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001335 b += b"!"
1336 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001337 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001338 self.assertEqual(b, b"")
1339 self.assertEqual(c, b"")
1340
Antoine Pitrou5504e892008-12-06 21:27:53 +00001341 def test_resize_forbidden(self):
1342 # #4509: can't resize a bytearray when there are buffer exports, even
1343 # if it wouldn't reallocate the underlying buffer.
1344 # Furthermore, no destructive changes to the buffer may be applied
1345 # before raising the error.
1346 b = bytearray(range(10))
1347 v = memoryview(b)
1348 def resize(n):
1349 b[1:-1] = range(n + 1, 2*n - 1)
1350 resize(10)
1351 orig = b[:]
1352 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001353 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001354 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001355 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001356 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001357 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001358 # Other operations implying resize
1359 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001360 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001361 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001362 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001363 def delitem():
1364 del b[1]
1365 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001366 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001367 # deleting a non-contiguous slice
1368 def delslice():
1369 b[1:-1:2] = b""
1370 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001371 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001372
Stefan Krah650c1e82015-02-03 21:43:23 +01001373 @test.support.cpython_only
1374 def test_obsolete_write_lock(self):
1375 from _testcapi import getbuffer_with_null_view
1376 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001377
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001378 def test_iterator_pickling2(self):
1379 orig = bytearray(b'abc')
1380 data = list(b'qwerty')
1381 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1382 # initial iterator
1383 itorig = iter(orig)
1384 d = pickle.dumps((itorig, orig), proto)
1385 it, b = pickle.loads(d)
1386 b[:] = data
1387 self.assertEqual(type(it), type(itorig))
1388 self.assertEqual(list(it), data)
1389
1390 # running iterator
1391 next(itorig)
1392 d = pickle.dumps((itorig, orig), proto)
1393 it, b = pickle.loads(d)
1394 b[:] = data
1395 self.assertEqual(type(it), type(itorig))
1396 self.assertEqual(list(it), data[1:])
1397
1398 # empty iterator
1399 for i in range(1, len(orig)):
1400 next(itorig)
1401 d = pickle.dumps((itorig, orig), proto)
1402 it, b = pickle.loads(d)
1403 b[:] = data
1404 self.assertEqual(type(it), type(itorig))
1405 self.assertEqual(list(it), data[len(orig):])
1406
1407 # exhausted iterator
1408 self.assertRaises(StopIteration, next, itorig)
1409 d = pickle.dumps((itorig, orig), proto)
1410 it, b = pickle.loads(d)
1411 b[:] = data
1412 self.assertEqual(list(it), [])
1413
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001414 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001415
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001416 def test_iterator_length_hint(self):
1417 # Issue 27443: __length_hint__ can return negative integer
1418 ba = bytearray(b'ab')
1419 it = iter(ba)
1420 next(it)
1421 ba.clear()
1422 # Shouldn't raise an error
1423 self.assertEqual(list(it), [])
1424
1425
Christian Heimes510711d2008-01-30 11:57:58 +00001426class AssortedBytesTest(unittest.TestCase):
1427 #
1428 # Test various combinations of bytes and bytearray
1429 #
1430
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001431 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001432 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001433 for f in str, repr:
1434 self.assertEqual(f(bytearray()), "bytearray(b'')")
1435 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1436 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1437 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1438 self.assertEqual(f(b"abc"), "b'abc'")
1439 self.assertEqual(f(b"'"), '''b"'"''') # '''
1440 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001441
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001442 @check_bytes_warnings
1443 def test_format(self):
1444 for b in b'abc', bytearray(b'abc'):
1445 self.assertEqual(format(b), str(b))
1446 self.assertEqual(format(b, ''), str(b))
1447 with self.assertRaisesRegex(TypeError,
1448 r'\b%s\b' % re.escape(type(b).__name__)):
1449 format(b, 's')
1450
Christian Heimes510711d2008-01-30 11:57:58 +00001451 def test_compare_bytes_to_bytearray(self):
1452 self.assertEqual(b"abc" == bytes(b"abc"), True)
1453 self.assertEqual(b"ab" != bytes(b"abc"), True)
1454 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1455 self.assertEqual(b"ab" < bytes(b"abc"), True)
1456 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1457 self.assertEqual(b"abc" > bytes(b"ab"), True)
1458
1459 self.assertEqual(b"abc" != bytes(b"abc"), False)
1460 self.assertEqual(b"ab" == bytes(b"abc"), False)
1461 self.assertEqual(b"ab" > bytes(b"abc"), False)
1462 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1463 self.assertEqual(b"abc" < bytes(b"ab"), False)
1464 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1465
1466 self.assertEqual(bytes(b"abc") == b"abc", True)
1467 self.assertEqual(bytes(b"ab") != b"abc", True)
1468 self.assertEqual(bytes(b"ab") <= b"abc", True)
1469 self.assertEqual(bytes(b"ab") < b"abc", True)
1470 self.assertEqual(bytes(b"abc") >= b"ab", True)
1471 self.assertEqual(bytes(b"abc") > b"ab", True)
1472
1473 self.assertEqual(bytes(b"abc") != b"abc", False)
1474 self.assertEqual(bytes(b"ab") == b"abc", False)
1475 self.assertEqual(bytes(b"ab") > b"abc", False)
1476 self.assertEqual(bytes(b"ab") >= b"abc", False)
1477 self.assertEqual(bytes(b"abc") < b"ab", False)
1478 self.assertEqual(bytes(b"abc") <= b"ab", False)
1479
Stefan Krah6e572b82013-01-26 13:06:36 +01001480 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001481 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001482 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001483 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001484 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001485 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001486
1487 def test_from_bytearray(self):
1488 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1489 buf = memoryview(sample)
1490 b = bytearray(buf)
1491 self.assertEqual(b, bytearray(sample))
1492
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001493 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001494 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001495 self.assertEqual(str(b''), "b''")
1496 self.assertEqual(str(b'x'), "b'x'")
1497 self.assertEqual(str(b'\x80'), "b'\\x80'")
1498 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1499 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1500 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001501
1502 def test_literal(self):
1503 tests = [
1504 (b"Wonderful spam", "Wonderful spam"),
1505 (br"Wonderful spam too", "Wonderful spam too"),
1506 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1507 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1508 ]
1509 for b, s in tests:
1510 self.assertEqual(b, bytearray(s, 'latin-1'))
1511 for c in range(128, 256):
1512 self.assertRaises(SyntaxError, eval,
1513 'b"%s"' % chr(c))
1514
Christian Heimes510711d2008-01-30 11:57:58 +00001515 def test_split_bytearray(self):
1516 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1517
1518 def test_rsplit_bytearray(self):
1519 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1520
Georg Brandleb2c9642008-05-30 12:05:02 +00001521 def test_return_self(self):
1522 # bytearray.replace must always return a new bytearray
1523 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001524 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001525
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001526 @unittest.skipUnless(sys.flags.bytes_warning,
1527 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001528 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001529 def bytes_warning():
1530 return test.support.check_warnings(('', BytesWarning))
1531 with bytes_warning():
1532 b'' == ''
1533 with bytes_warning():
1534 '' == b''
1535 with bytes_warning():
1536 b'' != ''
1537 with bytes_warning():
1538 '' != b''
1539 with bytes_warning():
1540 bytearray(b'') == ''
1541 with bytes_warning():
1542 '' == bytearray(b'')
1543 with bytes_warning():
1544 bytearray(b'') != ''
1545 with bytes_warning():
1546 '' != bytearray(b'')
1547 with bytes_warning():
1548 b'\0' == 0
1549 with bytes_warning():
1550 0 == b'\0'
1551 with bytes_warning():
1552 b'\0' != 0
1553 with bytes_warning():
1554 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001555
Guido van Rossumd624f182006-04-24 13:47:05 +00001556 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001557 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001558 # __reversed__? (optimization)
1559
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001560 # XXX More string methods? (Those that don't use character properties)
1561
Neal Norwitz6968b052007-02-27 19:02:19 +00001562 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001563 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001564 # Unfortunately they are all bundled with tests that
1565 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001566
Guido van Rossum254348e2007-11-21 19:29:53 +00001567 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001568 # the rest that make sense (the code can be cleaned up to use modern
1569 # unittest methods at the same time).
1570
Martin Panter152a19c2016-04-06 06:37:17 +00001571class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001572 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001573 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001574
1575 def test_returns_new_copy(self):
1576 val = self.marshal(b'1234')
1577 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001578 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001579 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1580 method = getattr(val, methname)
1581 newval = method(3)
1582 self.assertEqual(val, newval)
1583 self.assertTrue(val is not newval,
1584 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001585 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1586 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1587 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1588 newval = eval(expr)
1589 self.assertEqual(val, newval)
1590 self.assertTrue(val is not newval,
1591 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001592 sep = self.marshal(b'')
1593 newval = sep.join([val])
1594 self.assertEqual(val, newval)
1595 self.assertIsNot(val, newval)
1596
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001597
Christian Heimes510711d2008-01-30 11:57:58 +00001598class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001599 def fixtype(self, obj):
1600 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001601 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001602 return super().fixtype(obj)
1603
Martin Panter152a19c2016-04-06 06:37:17 +00001604 contains_bytes = True
1605
Ezio Melotti0dceb562013-01-10 07:43:26 +02001606class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001607 type2test = bytearray
1608
Ezio Melotti0dceb562013-01-10 07:43:26 +02001609class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001610 type2test = bytes
1611
Georg Brandlc7885542007-03-06 19:16:20 +00001612
Ezio Melotti0dceb562013-01-10 07:43:26 +02001613class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001614
1615 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001616 self.assertTrue(issubclass(self.type2test, self.basetype))
1617 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001618
1619 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001620 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001621
1622 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001623 self.assertTrue(_a == _a)
1624 self.assertTrue(_a != _b)
1625 self.assertTrue(_a < _b)
1626 self.assertTrue(_a <= _b)
1627 self.assertTrue(_b >= _a)
1628 self.assertTrue(_b > _a)
1629 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001630
1631 # test concat of subclass instances
1632 self.assertEqual(a + b, _a + _b)
1633 self.assertEqual(a + b, a + _b)
1634 self.assertEqual(a + b, _a + b)
1635
1636 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001637 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001638
1639 def test_join(self):
1640 # Make sure join returns a NEW object for single item sequences
1641 # involving a subclass.
1642 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001643 s1 = self.type2test(b"abcd")
1644 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001645 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001646 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001647
1648 # Test reverse, calling join on subclass
1649 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001650 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001651
1652 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001653 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001654 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001655 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001656 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001657 b = pickle.loads(pickle.dumps(a, proto))
1658 self.assertNotEqual(id(a), id(b))
1659 self.assertEqual(a, b)
1660 self.assertEqual(a.x, b.x)
1661 self.assertEqual(a.y, b.y)
1662 self.assertEqual(type(a), type(b))
1663 self.assertEqual(type(a.y), type(b.y))
1664
1665 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001666 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001667 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001668 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001669 for copy_method in (copy.copy, copy.deepcopy):
1670 b = copy_method(a)
1671 self.assertNotEqual(id(a), id(b))
1672 self.assertEqual(a, b)
1673 self.assertEqual(a.x, b.x)
1674 self.assertEqual(a.y, b.y)
1675 self.assertEqual(type(a), type(b))
1676 self.assertEqual(type(a.y), type(b.y))
1677
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001678 def test_fromhex(self):
1679 b = self.type2test.fromhex('1a2B30')
1680 self.assertEqual(b, b'\x1a\x2b\x30')
1681 self.assertIs(type(b), self.type2test)
1682
1683 class B1(self.basetype):
1684 def __new__(cls, value):
1685 me = self.basetype.__new__(cls, value)
1686 me.foo = 'bar'
1687 return me
1688
1689 b = B1.fromhex('1a2B30')
1690 self.assertEqual(b, b'\x1a\x2b\x30')
1691 self.assertIs(type(b), B1)
1692 self.assertEqual(b.foo, 'bar')
1693
1694 class B2(self.basetype):
1695 def __init__(me, *args, **kwargs):
1696 if self.basetype is not bytes:
1697 self.basetype.__init__(me, *args, **kwargs)
1698 me.foo = 'bar'
1699
1700 b = B2.fromhex('1a2B30')
1701 self.assertEqual(b, b'\x1a\x2b\x30')
1702 self.assertIs(type(b), B2)
1703 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001704
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001705
1706class ByteArraySubclass(bytearray):
1707 pass
1708
1709class BytesSubclass(bytes):
1710 pass
1711
Serhiy Storchaka15095802015-11-25 15:47:01 +02001712class OtherBytesSubclass(bytes):
1713 pass
1714
Ezio Melotti0dceb562013-01-10 07:43:26 +02001715class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001716 basetype = bytearray
1717 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001718
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001719 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001720 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001721 def __init__(me, newarg=1, *args, **kwargs):
1722 bytearray.__init__(me, *args, **kwargs)
1723 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001724 x = subclass(4, source=b"abcd")
1725 self.assertEqual(x, b"abcd")
1726 x = subclass(newarg=4, source=b"abcd")
1727 self.assertEqual(x, b"abcd")
1728
1729
Ezio Melotti0dceb562013-01-10 07:43:26 +02001730class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001731 basetype = bytes
1732 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001733
1734
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001735if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001736 unittest.main()