blob: 01ba5e51c82e51dc402f8e6150b3b8c348b9e188 [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
3XXX This is a mess. Common tests should be moved to buffer_tests.py,
4which itself ought to be unified with string_tests.py (and the latter
5should be modernized).
6"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
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
Gregory P. Smith60d241f2007-10-16 06:31:30 +000019import test.buffer_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030020import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010021from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000022
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000023
24if sys.flags.bytes_warning:
25 def check_bytes_warnings(func):
26 @functools.wraps(func)
27 def wrapper(*args, **kw):
28 with test.support.check_warnings(('', BytesWarning)):
29 return func(*args, **kw)
30 return wrapper
31else:
32 # no-op
33 def check_bytes_warnings(func):
34 return func
35
36
Georg Brandl9a54d7c2008-07-16 23:15:30 +000037class Indexable:
38 def __init__(self, value=0):
39 self.value = value
40 def __index__(self):
41 return self.value
42
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043
Ezio Melotti0dceb562013-01-10 07:43:26 +020044class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000045
46 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000047 b = self.type2test()
48 self.assertEqual(type(b), self.type2test)
49 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000050
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000051 def test_copy(self):
52 a = self.type2test(b"abcd")
53 for copy_method in (copy.copy, copy.deepcopy):
54 b = copy_method(a)
55 self.assertEqual(a, b)
56 self.assertEqual(type(a), type(b))
57
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000059 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000060 self.assertEqual(len(b), 0)
61 self.assertRaises(IndexError, lambda: b[0])
62 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000063 self.assertRaises(IndexError, lambda: b[sys.maxsize])
64 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000065 self.assertRaises(IndexError, lambda: b[10**100])
66 self.assertRaises(IndexError, lambda: b[-1])
67 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000068 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
69 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
70 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000071 self.assertRaises(IndexError, lambda: b[-10**100])
72
73 def test_from_list(self):
74 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000075 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000076 self.assertEqual(len(b), 256)
77 self.assertEqual(list(b), ints)
78
79 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000080 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
81 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000082 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000083 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
84 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000085
86 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000087 self.assertEqual(self.type2test(0), b'')
88 self.assertEqual(self.type2test(1), b'\x00')
89 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
90 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000091
Benjamin Peterson4c045832010-04-16 22:35:32 +000092 self.assertEqual(self.type2test('0', 'ascii'), b'0')
93 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000094 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000095
96 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000097 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000098 class C:
99 pass
Christian Heimes510711d2008-01-30 11:57:58 +0000100 self.assertRaises(TypeError, self.type2test, ["0"])
101 self.assertRaises(TypeError, self.type2test, [0.0])
102 self.assertRaises(TypeError, self.type2test, [None])
103 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200104 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
105 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
106 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
107 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
108 self.assertRaises(TypeError, self.type2test, '')
109 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
110 self.assertRaises(TypeError, self.type2test, '', b'ascii')
111 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000112
113 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000114 self.assertRaises(ValueError, self.type2test, [-1])
115 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
116 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
117 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
118 self.assertRaises(ValueError, self.type2test, [-10**100])
119 self.assertRaises(ValueError, self.type2test, [256])
120 self.assertRaises(ValueError, self.type2test, [257])
121 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
122 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
123 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000124
Antoine Pitroucc231542014-11-02 18:40:09 +0100125 @bigaddrspacetest
126 def test_constructor_overflow(self):
127 size = MAX_Py_ssize_t
128 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
129 try:
130 # Should either pass or raise an error (e.g. on debug builds with
131 # additional malloc() overhead), but shouldn't crash.
132 bytearray(size - 4)
133 except (OverflowError, MemoryError):
134 pass
135
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000136 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000137 b1 = self.type2test([1, 2, 3])
138 b2 = self.type2test([1, 2, 3])
139 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000141 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000142 self.assertTrue(b2 != b3)
143 self.assertTrue(b1 <= b2)
144 self.assertTrue(b1 <= b3)
145 self.assertTrue(b1 < b3)
146 self.assertTrue(b1 >= b2)
147 self.assertTrue(b3 >= b2)
148 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000149
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000150 self.assertFalse(b1 != b2)
151 self.assertFalse(b2 == b3)
152 self.assertFalse(b1 > b2)
153 self.assertFalse(b1 > b3)
154 self.assertFalse(b1 >= b3)
155 self.assertFalse(b1 < b2)
156 self.assertFalse(b3 < b2)
157 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000158
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000159 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000160 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000161 # Byte comparisons with unicode should always fail!
162 # Test this for all expected byte orders and Unicode character
163 # sizes.
164 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
165 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
166 False)
167 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
168 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
169 False)
170 self.assertEqual(self.type2test() == str(), False)
171 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000172
173 def test_reversed(self):
174 input = list(map(ord, "Hello"))
175 b = self.type2test(input)
176 output = list(reversed(b))
177 input.reverse()
178 self.assertEqual(output, input)
179
180 def test_getslice(self):
181 def by(s):
182 return self.type2test(map(ord, s))
183 b = by("Hello, world")
184
185 self.assertEqual(b[:5], by("Hello"))
186 self.assertEqual(b[1:5], by("ello"))
187 self.assertEqual(b[5:7], by(", "))
188 self.assertEqual(b[7:], by("world"))
189 self.assertEqual(b[7:12], by("world"))
190 self.assertEqual(b[7:100], by("world"))
191
192 self.assertEqual(b[:-7], by("Hello"))
193 self.assertEqual(b[-11:-7], by("ello"))
194 self.assertEqual(b[-7:-5], by(", "))
195 self.assertEqual(b[-5:], by("world"))
196 self.assertEqual(b[-5:12], by("world"))
197 self.assertEqual(b[-5:100], by("world"))
198 self.assertEqual(b[-100:5], by("Hello"))
199
200 def test_extended_getslice(self):
201 # Test extended slicing by comparing with list slicing.
202 L = list(range(255))
203 b = self.type2test(L)
204 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
205 for start in indices:
206 for stop in indices:
207 # Skip step 0 (invalid)
208 for step in indices[1:]:
209 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
210
211 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000212 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000213 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000214 b = self.type2test(sample, enc)
215 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000216 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
217 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000218 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000219
220 def test_decode(self):
221 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000222 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000223 b = self.type2test(sample, enc)
224 self.assertEqual(b.decode(enc), sample)
225 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000226 b = self.type2test(sample, "latin-1")
227 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
228 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
229 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000230 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000231 # Default encoding is utf-8
232 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000233
234 def test_from_int(self):
235 b = self.type2test(0)
236 self.assertEqual(b, self.type2test())
237 b = self.type2test(10)
238 self.assertEqual(b, self.type2test([0]*10))
239 b = self.type2test(10000)
240 self.assertEqual(b, self.type2test([0]*10000))
241
242 def test_concat(self):
243 b1 = self.type2test(b"abc")
244 b2 = self.type2test(b"def")
245 self.assertEqual(b1 + b2, b"abcdef")
246 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
247 self.assertEqual(bytes(b"def") + b1, b"defabc")
248 self.assertRaises(TypeError, lambda: b1 + "def")
249 self.assertRaises(TypeError, lambda: "abc" + b2)
250
251 def test_repeat(self):
252 for b in b"abc", self.type2test(b"abc"):
253 self.assertEqual(b * 3, b"abcabcabc")
254 self.assertEqual(b * 0, b"")
255 self.assertEqual(b * -1, b"")
256 self.assertRaises(TypeError, lambda: b * 3.14)
257 self.assertRaises(TypeError, lambda: 3.14 * b)
258 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000259 with self.assertRaises((OverflowError, MemoryError)):
260 c = b * sys.maxsize
261 with self.assertRaises((OverflowError, MemoryError)):
262 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000263
264 def test_repeat_1char(self):
265 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
266
267 def test_contains(self):
268 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000269 self.assertIn(ord('a'), b)
270 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000271 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000272 self.assertRaises(ValueError, lambda: 300 in b)
273 self.assertRaises(ValueError, lambda: -1 in b)
274 self.assertRaises(TypeError, lambda: None in b)
275 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
276 self.assertRaises(TypeError, lambda: "a" in b)
277 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000278 self.assertIn(f(b""), b)
279 self.assertIn(f(b"a"), b)
280 self.assertIn(f(b"b"), b)
281 self.assertIn(f(b"c"), b)
282 self.assertIn(f(b"ab"), b)
283 self.assertIn(f(b"bc"), b)
284 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000285 self.assertNotIn(f(b"ac"), b)
286 self.assertNotIn(f(b"d"), b)
287 self.assertNotIn(f(b"dab"), b)
288 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000289
290 def test_fromhex(self):
291 self.assertRaises(TypeError, self.type2test.fromhex)
292 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000293 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000294 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000295 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
296 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
297 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000298 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
299 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
300 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
301 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
302 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
303 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
304
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000305 def test_hex(self):
306 self.assertRaises(TypeError, self.type2test.hex)
307 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000308 self.assertEqual(self.type2test(b"").hex(), "")
309 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
310 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
311 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000312
Christian Heimes510711d2008-01-30 11:57:58 +0000313 def test_join(self):
314 self.assertEqual(self.type2test(b"").join([]), b"")
315 self.assertEqual(self.type2test(b"").join([b""]), b"")
316 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
317 lst = list(map(self.type2test, lst))
318 self.assertEqual(self.type2test(b"").join(lst), b"abc")
319 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
320 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200321 dot_join = self.type2test(b".:").join
322 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
323 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
324 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
325 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
326 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
327 # Stress it with many items
328 seq = [b"abc"] * 1000
329 expected = b"abc" + b".:abc" * 999
330 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400331 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200332 # Error handling and cleanup when some item in the middle of the
333 # sequence has the wrong type.
334 with self.assertRaises(TypeError):
335 dot_join([bytearray(b"ab"), "cd", b"ef"])
336 with self.assertRaises(TypeError):
337 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000338
Christian Heimes510711d2008-01-30 11:57:58 +0000339 def test_count(self):
340 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200341 i = 105
342 p = 112
343 w = 119
344
Christian Heimes510711d2008-01-30 11:57:58 +0000345 self.assertEqual(b.count(b'i'), 4)
346 self.assertEqual(b.count(b'ss'), 2)
347 self.assertEqual(b.count(b'w'), 0)
348
Antoine Pitrouac65d962011-10-20 23:54:17 +0200349 self.assertEqual(b.count(i), 4)
350 self.assertEqual(b.count(w), 0)
351
352 self.assertEqual(b.count(b'i', 6), 2)
353 self.assertEqual(b.count(b'p', 6), 2)
354 self.assertEqual(b.count(b'i', 1, 3), 1)
355 self.assertEqual(b.count(b'p', 7, 9), 1)
356
357 self.assertEqual(b.count(i, 6), 2)
358 self.assertEqual(b.count(p, 6), 2)
359 self.assertEqual(b.count(i, 1, 3), 1)
360 self.assertEqual(b.count(p, 7, 9), 1)
361
Christian Heimes510711d2008-01-30 11:57:58 +0000362 def test_startswith(self):
363 b = self.type2test(b'hello')
364 self.assertFalse(self.type2test().startswith(b"anything"))
365 self.assertTrue(b.startswith(b"hello"))
366 self.assertTrue(b.startswith(b"hel"))
367 self.assertTrue(b.startswith(b"h"))
368 self.assertFalse(b.startswith(b"hellow"))
369 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300370 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300371 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300372 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300373 self.assertIn('bytes', exc)
374 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000375
376 def test_endswith(self):
377 b = self.type2test(b'hello')
378 self.assertFalse(bytearray().endswith(b"anything"))
379 self.assertTrue(b.endswith(b"hello"))
380 self.assertTrue(b.endswith(b"llo"))
381 self.assertTrue(b.endswith(b"o"))
382 self.assertFalse(b.endswith(b"whello"))
383 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300384 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300385 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300386 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300387 self.assertIn('bytes', exc)
388 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000389
390 def test_find(self):
391 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200392 i = 105
393 w = 119
394
Christian Heimes510711d2008-01-30 11:57:58 +0000395 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000396 self.assertEqual(b.find(b'w'), -1)
397 self.assertEqual(b.find(b'mississippian'), -1)
398
Antoine Pitrouac65d962011-10-20 23:54:17 +0200399 self.assertEqual(b.find(i), 1)
400 self.assertEqual(b.find(w), -1)
401
402 self.assertEqual(b.find(b'ss', 3), 5)
403 self.assertEqual(b.find(b'ss', 1, 7), 2)
404 self.assertEqual(b.find(b'ss', 1, 3), -1)
405
406 self.assertEqual(b.find(i, 6), 7)
407 self.assertEqual(b.find(i, 1, 3), 1)
408 self.assertEqual(b.find(w, 1, 3), -1)
409
Victor Stinnerf8eac002011-12-18 01:17:41 +0100410 for index in (-1, 256, sys.maxsize + 1):
411 self.assertRaisesRegex(
412 ValueError, r'byte must be in range\(0, 256\)',
413 b.find, index)
414
Christian Heimes510711d2008-01-30 11:57:58 +0000415 def test_rfind(self):
416 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200417 i = 105
418 w = 119
419
Christian Heimes510711d2008-01-30 11:57:58 +0000420 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000421 self.assertEqual(b.rfind(b'w'), -1)
422 self.assertEqual(b.rfind(b'mississippian'), -1)
423
Antoine Pitrouac65d962011-10-20 23:54:17 +0200424 self.assertEqual(b.rfind(i), 10)
425 self.assertEqual(b.rfind(w), -1)
426
427 self.assertEqual(b.rfind(b'ss', 3), 5)
428 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
429
430 self.assertEqual(b.rfind(i, 1, 3), 1)
431 self.assertEqual(b.rfind(i, 3, 9), 7)
432 self.assertEqual(b.rfind(w, 1, 3), -1)
433
Christian Heimes510711d2008-01-30 11:57:58 +0000434 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200435 b = self.type2test(b'mississippi')
436 i = 105
437 w = 119
438
439 self.assertEqual(b.index(b'ss'), 2)
440 self.assertRaises(ValueError, b.index, b'w')
441 self.assertRaises(ValueError, b.index, b'mississippian')
442
443 self.assertEqual(b.index(i), 1)
444 self.assertRaises(ValueError, b.index, w)
445
446 self.assertEqual(b.index(b'ss', 3), 5)
447 self.assertEqual(b.index(b'ss', 1, 7), 2)
448 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
449
450 self.assertEqual(b.index(i, 6), 7)
451 self.assertEqual(b.index(i, 1, 3), 1)
452 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000453
454 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200455 b = self.type2test(b'mississippi')
456 i = 105
457 w = 119
458
459 self.assertEqual(b.rindex(b'ss'), 5)
460 self.assertRaises(ValueError, b.rindex, b'w')
461 self.assertRaises(ValueError, b.rindex, b'mississippian')
462
463 self.assertEqual(b.rindex(i), 10)
464 self.assertRaises(ValueError, b.rindex, w)
465
466 self.assertEqual(b.rindex(b'ss', 3), 5)
467 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
468
469 self.assertEqual(b.rindex(i, 1, 3), 1)
470 self.assertEqual(b.rindex(i, 3, 9), 7)
471 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000472
Ethan Furmanb95b5612015-01-23 20:05:18 -0800473 def test_mod(self):
474 b = b'hello, %b!'
475 orig = b
476 b = b % b'world'
477 self.assertEqual(b, b'hello, world!')
478 self.assertEqual(orig, b'hello, %b!')
479 self.assertFalse(b is orig)
480 b = b'%s / 100 = %d%%'
481 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200482 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800483
484 def test_imod(self):
485 b = b'hello, %b!'
486 orig = b
487 b %= b'world'
488 self.assertEqual(b, b'hello, world!')
489 self.assertEqual(orig, b'hello, %b!')
490 self.assertFalse(b is orig)
491 b = b'%s / 100 = %d%%'
492 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200493 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800494
Christian Heimes510711d2008-01-30 11:57:58 +0000495 def test_replace(self):
496 b = self.type2test(b'mississippi')
497 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
498 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
499
500 def test_split(self):
501 b = self.type2test(b'mississippi')
502 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
503 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
504 self.assertEqual(b.split(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200505 # with keyword args
506 b = self.type2test(b'a|b|c|d')
507 self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
508 self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
509 self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
510 self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
511 b = self.type2test(b'a b c d')
512 self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
Christian Heimes510711d2008-01-30 11:57:58 +0000513
514 def test_split_whitespace(self):
515 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
516 b'arf\fbarf', b'arf\vbarf'):
517 b = self.type2test(b)
518 self.assertEqual(b.split(), [b'arf', b'barf'])
519 self.assertEqual(b.split(None), [b'arf', b'barf'])
520 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
521 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
522 b = self.type2test(b)
523 self.assertEqual(b.split(), [b])
524 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
525 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
526 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
527 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
528
529 def test_split_string_error(self):
530 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
531
Antoine Pitrouf8453022010-01-12 22:05:42 +0000532 def test_split_unicodewhitespace(self):
533 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
534 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
535
Christian Heimes510711d2008-01-30 11:57:58 +0000536 def test_rsplit(self):
537 b = self.type2test(b'mississippi')
538 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
539 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
540 self.assertEqual(b.rsplit(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200541 # with keyword args
542 b = self.type2test(b'a|b|c|d')
543 self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
544 self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
545 self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
546 self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
547 b = self.type2test(b'a b c d')
548 self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
Christian Heimes510711d2008-01-30 11:57:58 +0000549
550 def test_rsplit_whitespace(self):
551 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
552 b'arf\fbarf', b'arf\vbarf'):
553 b = self.type2test(b)
554 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
555 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
556 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
557 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
558 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
559 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
560 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
561
562 def test_rsplit_string_error(self):
563 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
564
565 def test_rsplit_unicodewhitespace(self):
566 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000567 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
568
569 def test_partition(self):
570 b = self.type2test(b'mississippi')
571 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000572 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000573
574 def test_rpartition(self):
575 b = self.type2test(b'mississippi')
576 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
577 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000578 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000579
580 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000581 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000582 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
583 b = self.type2test(b)
584 ps = pickle.dumps(b, proto)
585 q = pickle.loads(ps)
586 self.assertEqual(b, q)
587
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000588 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200589 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
590 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
591 it = itorg = iter(self.type2test(b))
592 data = list(self.type2test(b))
593 d = pickle.dumps(it, proto)
594 it = pickle.loads(d)
595 self.assertEqual(type(itorg), type(it))
596 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000597
Serhiy Storchakabad12572014-12-15 14:03:42 +0200598 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200599 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200600 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200601 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200602 d = pickle.dumps(it, proto)
603 it = pickle.loads(d)
604 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000605
Christian Heimes510711d2008-01-30 11:57:58 +0000606 def test_strip(self):
607 b = self.type2test(b'mississippi')
608 self.assertEqual(b.strip(b'i'), b'mississipp')
609 self.assertEqual(b.strip(b'm'), b'ississippi')
610 self.assertEqual(b.strip(b'pi'), b'mississ')
611 self.assertEqual(b.strip(b'im'), b'ssissipp')
612 self.assertEqual(b.strip(b'pim'), b'ssiss')
613 self.assertEqual(b.strip(b), b'')
614
615 def test_lstrip(self):
616 b = self.type2test(b'mississippi')
617 self.assertEqual(b.lstrip(b'i'), b'mississippi')
618 self.assertEqual(b.lstrip(b'm'), b'ississippi')
619 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
620 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
621 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
622
623 def test_rstrip(self):
624 b = self.type2test(b'mississippi')
625 self.assertEqual(b.rstrip(b'i'), b'mississipp')
626 self.assertEqual(b.rstrip(b'm'), b'mississippi')
627 self.assertEqual(b.rstrip(b'pi'), b'mississ')
628 self.assertEqual(b.rstrip(b'im'), b'mississipp')
629 self.assertEqual(b.rstrip(b'pim'), b'mississ')
630
631 def test_strip_whitespace(self):
632 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
633 self.assertEqual(b.strip(), b'abc')
634 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
635 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
636
637 def test_strip_bytearray(self):
638 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
639 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
640 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
641
642 def test_strip_string_error(self):
643 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
644 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
645 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
646
Eli Bendersky906b88f2011-07-29 07:05:08 +0300647 def test_center(self):
648 # Fill character can be either bytes or bytearray (issue 12380)
649 b = self.type2test(b'abc')
650 for fill_type in (bytes, bytearray):
651 self.assertEqual(b.center(7, fill_type(b'-')),
652 self.type2test(b'--abc--'))
653
654 def test_ljust(self):
655 # Fill character can be either bytes or bytearray (issue 12380)
656 b = self.type2test(b'abc')
657 for fill_type in (bytes, bytearray):
658 self.assertEqual(b.ljust(7, fill_type(b'-')),
659 self.type2test(b'abc----'))
660
661 def test_rjust(self):
662 # Fill character can be either bytes or bytearray (issue 12380)
663 b = self.type2test(b'abc')
664 for fill_type in (bytes, bytearray):
665 self.assertEqual(b.rjust(7, fill_type(b'-')),
666 self.type2test(b'----abc'))
667
Christian Heimes510711d2008-01-30 11:57:58 +0000668 def test_ord(self):
669 b = self.type2test(b'\0A\x7f\x80\xff')
670 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
671 [0, 65, 127, 128, 255])
672
Georg Brandlabc38772009-04-12 15:51:51 +0000673 def test_maketrans(self):
674 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 +0000675 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000676 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'
677 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000678 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
679 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
680
Jesus Ceaac451502011-04-20 17:09:23 +0200681 def test_none_arguments(self):
682 # issue 11828
683 b = self.type2test(b'hello')
684 l = self.type2test(b'l')
685 h = self.type2test(b'h')
686 x = self.type2test(b'x')
687 o = self.type2test(b'o')
688
689 self.assertEqual(2, b.find(l, None))
690 self.assertEqual(3, b.find(l, -2, None))
691 self.assertEqual(2, b.find(l, None, -2))
692 self.assertEqual(0, b.find(h, None, None))
693
694 self.assertEqual(3, b.rfind(l, None))
695 self.assertEqual(3, b.rfind(l, -2, None))
696 self.assertEqual(2, b.rfind(l, None, -2))
697 self.assertEqual(0, b.rfind(h, None, None))
698
699 self.assertEqual(2, b.index(l, None))
700 self.assertEqual(3, b.index(l, -2, None))
701 self.assertEqual(2, b.index(l, None, -2))
702 self.assertEqual(0, b.index(h, None, None))
703
704 self.assertEqual(3, b.rindex(l, None))
705 self.assertEqual(3, b.rindex(l, -2, None))
706 self.assertEqual(2, b.rindex(l, None, -2))
707 self.assertEqual(0, b.rindex(h, None, None))
708
709 self.assertEqual(2, b.count(l, None))
710 self.assertEqual(1, b.count(l, -2, None))
711 self.assertEqual(1, b.count(l, None, -2))
712 self.assertEqual(0, b.count(x, None, None))
713
714 self.assertEqual(True, b.endswith(o, None))
715 self.assertEqual(True, b.endswith(o, -2, None))
716 self.assertEqual(True, b.endswith(l, None, -2))
717 self.assertEqual(False, b.endswith(x, None, None))
718
719 self.assertEqual(True, b.startswith(h, None))
720 self.assertEqual(True, b.startswith(l, -2, None))
721 self.assertEqual(True, b.startswith(h, None, -2))
722 self.assertEqual(False, b.startswith(x, None, None))
723
Antoine Pitrouac65d962011-10-20 23:54:17 +0200724 def test_integer_arguments_out_of_byte_range(self):
725 b = self.type2test(b'hello')
726
727 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
728 self.assertRaises(ValueError, method, -1)
729 self.assertRaises(ValueError, method, 256)
730 self.assertRaises(ValueError, method, 9999)
731
Jesus Ceaac451502011-04-20 17:09:23 +0200732 def test_find_etc_raise_correct_error_messages(self):
733 # issue 11828
734 b = self.type2test(b'hello')
735 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300736 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200737 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300738 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200739 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300740 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200741 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300742 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200743 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300744 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200745 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300746 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200747 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300748 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200749 x, None, None, None)
750
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300751 def test_free_after_iterating(self):
752 test.support.check_free_after_iterating(self, iter, self.type2test)
753 test.support.check_free_after_iterating(self, reversed, self.type2test)
754
Christian Heimes510711d2008-01-30 11:57:58 +0000755
Ezio Melotti0dceb562013-01-10 07:43:26 +0200756class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000757 type2test = bytes
758
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400759 def test_getitem_error(self):
760 msg = "byte indices must be integers or slices"
761 with self.assertRaisesRegex(TypeError, msg):
762 b'python'['a']
763
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000764 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200765 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000766 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000767 self.assertRaises(TypeError, f.readinto, b"")
768
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000769 def test_custom(self):
770 class A:
771 def __bytes__(self):
772 return b'abc'
773 self.assertEqual(bytes(A()), b'abc')
774 class A: pass
775 self.assertRaises(TypeError, bytes, A())
776 class A:
777 def __bytes__(self):
778 return None
779 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600780 class A:
781 def __bytes__(self):
782 return b'a'
783 def __index__(self):
784 return 42
785 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200786 # Issue #25766
787 class A(str):
788 def __bytes__(self):
789 return b'abc'
790 self.assertEqual(bytes(A('\u20ac')), b'abc')
791 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200792 # Issue #24731
793 class A:
794 def __bytes__(self):
795 return OtherBytesSubclass(b'abc')
796 self.assertEqual(bytes(A()), b'abc')
797 self.assertIs(type(bytes(A())), OtherBytesSubclass)
798 self.assertEqual(BytesSubclass(A()), b'abc')
799 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000800
Victor Stinner29e762c2011-01-05 03:33:28 +0000801 # Test PyBytes_FromFormat()
802 def test_from_format(self):
803 test.support.import_module('ctypes')
804 from ctypes import pythonapi, py_object, c_int, c_char_p
805 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
806 PyBytes_FromFormat.restype = py_object
807
808 self.assertEqual(PyBytes_FromFormat(b'format'),
809 b'format')
810
811 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
812 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
813 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
814 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
815 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
816
817 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
818 b'c:\xff')
819 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
820 b's:cstr')
821
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100822 # Issue #19969
823 self.assertRaises(OverflowError,
824 PyBytes_FromFormat, b'%c', c_int(-1))
825 self.assertRaises(OverflowError,
826 PyBytes_FromFormat, b'%c', c_int(256))
827
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000828
Ezio Melotti0dceb562013-01-10 07:43:26 +0200829class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000830 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000831
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400832 def test_getitem_error(self):
833 msg = "bytearray indices must be integers or slices"
834 with self.assertRaisesRegex(TypeError, msg):
835 bytearray(b'python')['a']
836
837 def test_setitem_error(self):
838 msg = "bytearray indices must be integers or slices"
839 with self.assertRaisesRegex(TypeError, msg):
840 b = bytearray(b'python')
841 b['a'] = "python"
842
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000843 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000844 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000845
Guido van Rossum254348e2007-11-21 19:29:53 +0000846 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000847 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000848 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000849 tfn = tempfile.mktemp()
850 try:
851 # Prepare
852 with open(tfn, "wb") as f:
853 f.write(short_sample)
854 # Test readinto
855 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000856 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000857 n = f.readinto(b)
858 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000859 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000860 # Test writing in binary mode
861 with open(tfn, "wb") as f:
862 f.write(b)
863 with open(tfn, "rb") as f:
864 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000865 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000866 finally:
867 try:
868 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200869 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000870 pass
871
Neal Norwitz6968b052007-02-27 19:02:19 +0000872 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000873 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000874 self.assertEqual(b.reverse(), None)
875 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000876 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000877 b.reverse()
878 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000879 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000880 b.reverse()
881 self.assertFalse(b)
882
Eli Bendersky4db28d32011-03-03 18:21:02 +0000883 def test_clear(self):
884 b = bytearray(b'python')
885 b.clear()
886 self.assertEqual(b, b'')
887
888 b = bytearray(b'')
889 b.clear()
890 self.assertEqual(b, b'')
891
892 b = bytearray(b'')
893 b.append(ord('r'))
894 b.clear()
895 b.append(ord('p'))
896 self.assertEqual(b, b'p')
897
898 def test_copy(self):
899 b = bytearray(b'abc')
900 bb = b.copy()
901 self.assertEqual(bb, b'abc')
902
903 b = bytearray(b'')
904 bb = b.copy()
905 self.assertEqual(bb, b'')
906
907 # test that it's indeed a copy and not a reference
908 b = bytearray(b'abc')
909 bb = b.copy()
910 self.assertEqual(b, bb)
911 self.assertIsNot(b, bb)
912 bb.append(ord('d'))
913 self.assertEqual(bb, b'abcd')
914 self.assertEqual(b, b'abc')
915
Guido van Rossumd624f182006-04-24 13:47:05 +0000916 def test_regexps(self):
917 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000918 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000919 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000920 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000921
922 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000923 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000924 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000925 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000926 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000927 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000928 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000929 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000930 try:
931 b[3] = 0
932 self.fail("Didn't raise IndexError")
933 except IndexError:
934 pass
935 try:
936 b[-10] = 0
937 self.fail("Didn't raise IndexError")
938 except IndexError:
939 pass
940 try:
941 b[0] = 256
942 self.fail("Didn't raise ValueError")
943 except ValueError:
944 pass
945 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000946 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000947 self.fail("Didn't raise ValueError")
948 except ValueError:
949 pass
950 try:
951 b[0] = None
952 self.fail("Didn't raise TypeError")
953 except TypeError:
954 pass
955
956 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000957 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000958 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000959 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000960 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000961 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000962 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000963 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000964
965 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000966 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000967 self.assertEqual(list(b), list(range(10)))
968
Guido van Rossum254348e2007-11-21 19:29:53 +0000969 b[0:5] = bytearray([1, 1, 1, 1, 1])
970 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000971
972 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000973 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000974
Guido van Rossum254348e2007-11-21 19:29:53 +0000975 b[0:0] = bytearray([0, 1, 2, 3, 4])
976 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000977
Guido van Rossum254348e2007-11-21 19:29:53 +0000978 b[-7:-3] = bytearray([100, 101])
979 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000980
981 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000982 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000983
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000984 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000985 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 +0000986
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200987 b[3:] = b'foo'
988 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
989
990 b[:3] = memoryview(b'foo')
991 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
992
993 b[3:4] = []
994 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
995
996 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
997 ['a', 'b'], [b'a', b'b'], [[]]]:
998 with self.assertRaises(TypeError):
999 b[3:4] = elem
1000
1001 for elem in [[254, 255, 256], [-256, 9000]]:
1002 with self.assertRaises(ValueError):
1003 b[3:4] = elem
1004
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001005 def test_setslice_extend(self):
1006 # Exercise the resizing logic (see issue #19087)
1007 b = bytearray(range(100))
1008 self.assertEqual(list(b), list(range(100)))
1009 del b[:10]
1010 self.assertEqual(list(b), list(range(10, 100)))
1011 b.extend(range(100, 110))
1012 self.assertEqual(list(b), list(range(10, 110)))
1013
Antoine Pitrou25454112015-05-19 20:52:27 +02001014 def test_fifo_overrun(self):
1015 # Test for issue #23985, a buffer overrun when implementing a FIFO
1016 # Build Python in pydebug mode for best results.
1017 b = bytearray(10)
1018 b.pop() # Defeat expanding buffer off-by-one quirk
1019 del b[:1] # Advance start pointer without reallocating
1020 b += bytes(2) # Append exactly the number of deleted bytes
1021 del b # Free memory buffer, allowing pydebug verification
1022
1023 def test_del_expand(self):
1024 # Reducing the size should not expand the buffer (issue #23985)
1025 b = bytearray(10)
1026 size = sys.getsizeof(b)
1027 del b[:1]
1028 self.assertLessEqual(sys.getsizeof(b), size)
1029
Thomas Wouters376446d2006-12-19 08:30:14 +00001030 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001031 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001032 for start in indices:
1033 for stop in indices:
1034 # Skip invalid step 0
1035 for step in indices[1:]:
1036 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001037 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001038 # Make sure we have a slice of exactly the right length,
1039 # but with different data.
1040 data = L[start:stop:step]
1041 data.reverse()
1042 L[start:stop:step] = data
1043 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001044 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001045
Thomas Wouters376446d2006-12-19 08:30:14 +00001046 del L[start:stop:step]
1047 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001048 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001049
Guido van Rossumd624f182006-04-24 13:47:05 +00001050 def test_setslice_trap(self):
1051 # This test verifies that we correctly handle assigning self
1052 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001053 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001054 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001055 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001056
Ethan Furmanb95b5612015-01-23 20:05:18 -08001057 def test_mod(self):
1058 b = bytearray(b'hello, %b!')
1059 orig = b
1060 b = b % b'world'
1061 self.assertEqual(b, b'hello, world!')
1062 self.assertEqual(orig, bytearray(b'hello, %b!'))
1063 self.assertFalse(b is orig)
1064 b = bytearray(b'%s / 100 = %d%%')
1065 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +02001066 self.assertEqual(a, bytearray(b'seventy-nine / 100 = 79%'))
Ethan Furmanb95b5612015-01-23 20:05:18 -08001067
1068 def test_imod(self):
1069 b = bytearray(b'hello, %b!')
1070 orig = b
1071 b %= b'world'
1072 self.assertEqual(b, b'hello, world!')
1073 self.assertEqual(orig, bytearray(b'hello, %b!'))
1074 self.assertFalse(b is orig)
1075 b = bytearray(b'%s / 100 = %d%%')
1076 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +02001077 self.assertEqual(b, bytearray(b'seventy-nine / 100 = 79%'))
Ethan Furmanb95b5612015-01-23 20:05:18 -08001078
Guido van Rossum13e57212006-04-27 22:54:26 +00001079 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001080 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001081 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001082 b += b"def"
1083 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001084 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001085 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001086 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001087 self.assertEqual(b, b"abcdefxyz")
1088 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001089 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001090 except TypeError:
1091 pass
1092 else:
1093 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001094
1095 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001096 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001097 b1 = b
1098 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001099 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001100 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001101 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001102
1103 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001104 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001105 b1 = b
1106 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001107 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001108 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001109 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001110
Guido van Rossum20188312006-05-05 15:15:40 +00001111 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001112 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001113 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001114 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001115 seq = [alloc]
1116 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001117 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001118 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001119 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001120 if alloc not in seq:
1121 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001122
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001123 def test_init_alloc(self):
1124 b = bytearray()
1125 def g():
1126 for i in range(1, 100):
1127 yield i
1128 a = list(b)
1129 self.assertEqual(a, list(range(1, len(a)+1)))
1130 self.assertEqual(len(b), len(a))
1131 self.assertLessEqual(len(b), i)
1132 alloc = b.__alloc__()
1133 self.assertGreater(alloc, len(b)) # including trailing null byte
1134 b.__init__(g())
1135 self.assertEqual(list(b), list(range(1, 100)))
1136 self.assertEqual(len(b), 99)
1137 alloc = b.__alloc__()
1138 self.assertGreater(alloc, len(b))
1139
Neal Norwitz6968b052007-02-27 19:02:19 +00001140 def test_extend(self):
1141 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001142 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001143 a.extend(a)
1144 self.assertEqual(a, orig + orig)
1145 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001146 a = bytearray(b'')
1147 # Test iterators that don't have a __length_hint__
1148 a.extend(map(int, orig * 25))
1149 a.extend(int(x) for x in orig * 25)
1150 self.assertEqual(a, orig * 50)
1151 self.assertEqual(a[-5:], orig)
1152 a = bytearray(b'')
1153 a.extend(iter(map(int, orig * 50)))
1154 self.assertEqual(a, orig * 50)
1155 self.assertEqual(a[-5:], orig)
1156 a = bytearray(b'')
1157 a.extend(list(map(int, orig * 50)))
1158 self.assertEqual(a, orig * 50)
1159 self.assertEqual(a[-5:], orig)
1160 a = bytearray(b'')
1161 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1162 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1163 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001164 a = bytearray(b'')
1165 a.extend([Indexable(ord('a'))])
1166 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001167
Neal Norwitz6968b052007-02-27 19:02:19 +00001168 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001170 b.remove(ord('l'))
1171 self.assertEqual(b, b'helo')
1172 b.remove(ord('l'))
1173 self.assertEqual(b, b'heo')
1174 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1175 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001176 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001177 # remove first and last
1178 b.remove(ord('o'))
1179 b.remove(ord('h'))
1180 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001181 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001182 b.remove(Indexable(ord('e')))
1183 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001184
1185 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001186 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001187 self.assertEqual(b.pop(), ord('d'))
1188 self.assertEqual(b.pop(0), ord('w'))
1189 self.assertEqual(b.pop(-2), ord('r'))
1190 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001191 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001192 # test for issue #6846
1193 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001194
1195 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001196 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001197
Neal Norwitz6968b052007-02-27 19:02:19 +00001198 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001199 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001200 b.append(ord('o'))
1201 self.assertEqual(b, b'hello')
1202 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001203 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001204 b.append(ord('A'))
1205 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001206 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001207 b = bytearray()
1208 b.append(Indexable(ord('A')))
1209 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001210
1211 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001212 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001213 b.insert(1, ord('i'))
1214 b.insert(4, ord('i'))
1215 b.insert(-2, ord('i'))
1216 b.insert(1000, ord('i'))
1217 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001218 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001219 b = bytearray()
1220 b.insert(0, Indexable(ord('A')))
1221 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001222
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001223 def test_copied(self):
1224 # Issue 4348. Make sure that operations that don't mutate the array
1225 # copy the bytes.
1226 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001227 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001228
1229 t = bytearray([i for i in range(256)])
1230 x = bytearray(b'')
1231 self.assertFalse(x is x.translate(t))
1232
Guido van Rossum254348e2007-11-21 19:29:53 +00001233 def test_partition_bytearray_doesnt_share_nullstring(self):
1234 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001235 self.assertEqual(b, b"")
1236 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001237 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001238 b += b"!"
1239 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001240 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001241 self.assertEqual(b, b"")
1242 self.assertEqual(c, b"")
1243 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001244 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001245 self.assertEqual(b, b"")
1246 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001247 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001248 b += b"!"
1249 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001250 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001251 self.assertEqual(b, b"")
1252 self.assertEqual(c, b"")
1253
Antoine Pitrou5504e892008-12-06 21:27:53 +00001254 def test_resize_forbidden(self):
1255 # #4509: can't resize a bytearray when there are buffer exports, even
1256 # if it wouldn't reallocate the underlying buffer.
1257 # Furthermore, no destructive changes to the buffer may be applied
1258 # before raising the error.
1259 b = bytearray(range(10))
1260 v = memoryview(b)
1261 def resize(n):
1262 b[1:-1] = range(n + 1, 2*n - 1)
1263 resize(10)
1264 orig = b[:]
1265 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001266 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001267 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001268 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001269 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001270 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001271 # Other operations implying resize
1272 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001273 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001274 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001275 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001276 def delitem():
1277 del b[1]
1278 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001279 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001280 # deleting a non-contiguous slice
1281 def delslice():
1282 b[1:-1:2] = b""
1283 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001284 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001285
Stefan Krah650c1e82015-02-03 21:43:23 +01001286 @test.support.cpython_only
1287 def test_obsolete_write_lock(self):
1288 from _testcapi import getbuffer_with_null_view
1289 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001290
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001291 def test_iterator_pickling2(self):
1292 orig = bytearray(b'abc')
1293 data = list(b'qwerty')
1294 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1295 # initial iterator
1296 itorig = iter(orig)
1297 d = pickle.dumps((itorig, orig), proto)
1298 it, b = pickle.loads(d)
1299 b[:] = data
1300 self.assertEqual(type(it), type(itorig))
1301 self.assertEqual(list(it), data)
1302
1303 # running iterator
1304 next(itorig)
1305 d = pickle.dumps((itorig, orig), proto)
1306 it, b = pickle.loads(d)
1307 b[:] = data
1308 self.assertEqual(type(it), type(itorig))
1309 self.assertEqual(list(it), data[1:])
1310
1311 # empty iterator
1312 for i in range(1, len(orig)):
1313 next(itorig)
1314 d = pickle.dumps((itorig, orig), proto)
1315 it, b = pickle.loads(d)
1316 b[:] = data
1317 self.assertEqual(type(it), type(itorig))
1318 self.assertEqual(list(it), data[len(orig):])
1319
1320 # exhausted iterator
1321 self.assertRaises(StopIteration, next, itorig)
1322 d = pickle.dumps((itorig, orig), proto)
1323 it, b = pickle.loads(d)
1324 b[:] = data
1325 self.assertEqual(list(it), [])
1326
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001327 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001328
Christian Heimes510711d2008-01-30 11:57:58 +00001329class AssortedBytesTest(unittest.TestCase):
1330 #
1331 # Test various combinations of bytes and bytearray
1332 #
1333
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001334 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001335 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001336 for f in str, repr:
1337 self.assertEqual(f(bytearray()), "bytearray(b'')")
1338 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1339 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1340 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1341 self.assertEqual(f(b"abc"), "b'abc'")
1342 self.assertEqual(f(b"'"), '''b"'"''') # '''
1343 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001344
1345 def test_compare_bytes_to_bytearray(self):
1346 self.assertEqual(b"abc" == bytes(b"abc"), True)
1347 self.assertEqual(b"ab" != bytes(b"abc"), True)
1348 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1349 self.assertEqual(b"ab" < bytes(b"abc"), True)
1350 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1351 self.assertEqual(b"abc" > bytes(b"ab"), True)
1352
1353 self.assertEqual(b"abc" != bytes(b"abc"), False)
1354 self.assertEqual(b"ab" == bytes(b"abc"), False)
1355 self.assertEqual(b"ab" > bytes(b"abc"), False)
1356 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1357 self.assertEqual(b"abc" < bytes(b"ab"), False)
1358 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1359
1360 self.assertEqual(bytes(b"abc") == b"abc", True)
1361 self.assertEqual(bytes(b"ab") != b"abc", True)
1362 self.assertEqual(bytes(b"ab") <= b"abc", True)
1363 self.assertEqual(bytes(b"ab") < b"abc", True)
1364 self.assertEqual(bytes(b"abc") >= b"ab", True)
1365 self.assertEqual(bytes(b"abc") > b"ab", True)
1366
1367 self.assertEqual(bytes(b"abc") != b"abc", False)
1368 self.assertEqual(bytes(b"ab") == b"abc", False)
1369 self.assertEqual(bytes(b"ab") > b"abc", False)
1370 self.assertEqual(bytes(b"ab") >= b"abc", False)
1371 self.assertEqual(bytes(b"abc") < b"ab", False)
1372 self.assertEqual(bytes(b"abc") <= b"ab", False)
1373
Stefan Krah6e572b82013-01-26 13:06:36 +01001374 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001375 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001376 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001377 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001378 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001379 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001380
1381 def test_from_bytearray(self):
1382 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1383 buf = memoryview(sample)
1384 b = bytearray(buf)
1385 self.assertEqual(b, bytearray(sample))
1386
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001387 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001388 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001389 self.assertEqual(str(b''), "b''")
1390 self.assertEqual(str(b'x'), "b'x'")
1391 self.assertEqual(str(b'\x80'), "b'\\x80'")
1392 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1393 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1394 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001395
1396 def test_literal(self):
1397 tests = [
1398 (b"Wonderful spam", "Wonderful spam"),
1399 (br"Wonderful spam too", "Wonderful spam too"),
1400 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1401 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1402 ]
1403 for b, s in tests:
1404 self.assertEqual(b, bytearray(s, 'latin-1'))
1405 for c in range(128, 256):
1406 self.assertRaises(SyntaxError, eval,
1407 'b"%s"' % chr(c))
1408
1409 def test_translate(self):
1410 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001411 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001412 rosetta = bytearray(range(0, 256))
1413 rosetta[ord('o')] = ord('e')
1414 c = b.translate(rosetta, b'l')
1415 self.assertEqual(b, b'hello')
1416 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001417 c = ba.translate(rosetta, b'l')
1418 self.assertEqual(ba, b'hello')
1419 self.assertEqual(c, b'hee')
1420 c = b.translate(None, b'e')
1421 self.assertEqual(c, b'hllo')
1422 c = ba.translate(None, b'e')
1423 self.assertEqual(c, b'hllo')
1424 self.assertRaises(TypeError, b.translate, None, None)
1425 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001426
1427 def test_split_bytearray(self):
1428 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1429
1430 def test_rsplit_bytearray(self):
1431 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1432
Georg Brandleb2c9642008-05-30 12:05:02 +00001433 def test_return_self(self):
1434 # bytearray.replace must always return a new bytearray
1435 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001436 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001437
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001438 @unittest.skipUnless(sys.flags.bytes_warning,
1439 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001440 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001441 def bytes_warning():
1442 return test.support.check_warnings(('', BytesWarning))
1443 with bytes_warning():
1444 b'' == ''
1445 with bytes_warning():
1446 '' == b''
1447 with bytes_warning():
1448 b'' != ''
1449 with bytes_warning():
1450 '' != b''
1451 with bytes_warning():
1452 bytearray(b'') == ''
1453 with bytes_warning():
1454 '' == bytearray(b'')
1455 with bytes_warning():
1456 bytearray(b'') != ''
1457 with bytes_warning():
1458 '' != bytearray(b'')
1459 with bytes_warning():
1460 b'\0' == 0
1461 with bytes_warning():
1462 0 == b'\0'
1463 with bytes_warning():
1464 b'\0' != 0
1465 with bytes_warning():
1466 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001467
Guido van Rossumd624f182006-04-24 13:47:05 +00001468 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001469 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001470 # __reversed__? (optimization)
1471
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001472 # XXX More string methods? (Those that don't use character properties)
1473
Neal Norwitz6968b052007-02-27 19:02:19 +00001474 # There are tests in string_tests.py that are more
1475 # comprehensive for things like split, partition, etc.
1476 # Unfortunately they are all bundled with tests that
1477 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001478
Guido van Rossum254348e2007-11-21 19:29:53 +00001479 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001480 # the rest that make sense (the code can be cleaned up to use modern
1481 # unittest methods at the same time).
1482
Guido van Rossum254348e2007-11-21 19:29:53 +00001483class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001484 test.buffer_tests.MixinBytesBufferCommonTests):
1485 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001486 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001487
1488 def test_returns_new_copy(self):
1489 val = self.marshal(b'1234')
1490 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001491 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001492 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1493 method = getattr(val, methname)
1494 newval = method(3)
1495 self.assertEqual(val, newval)
1496 self.assertTrue(val is not newval,
1497 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001498 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1499 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1500 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1501 newval = eval(expr)
1502 self.assertEqual(val, newval)
1503 self.assertTrue(val is not newval,
1504 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001505 sep = self.marshal(b'')
1506 newval = sep.join([val])
1507 self.assertEqual(val, newval)
1508 self.assertIsNot(val, newval)
1509
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001510
Christian Heimes510711d2008-01-30 11:57:58 +00001511class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001512 def fixtype(self, obj):
1513 if isinstance(obj, str):
1514 return obj.encode("utf-8")
1515 return super().fixtype(obj)
1516
Ezio Melotti0dceb562013-01-10 07:43:26 +02001517class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001518 type2test = bytearray
Antoine Pitrouac65d962011-10-20 23:54:17 +02001519 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001520
Ezio Melotti0dceb562013-01-10 07:43:26 +02001521class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001522 type2test = bytes
Antoine Pitrouac65d962011-10-20 23:54:17 +02001523 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001524
Georg Brandlc7885542007-03-06 19:16:20 +00001525
Ezio Melotti0dceb562013-01-10 07:43:26 +02001526class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001527
1528 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001529 self.assertTrue(issubclass(self.subclass2test, self.type2test))
Ezio Melottie9615932010-01-24 19:26:24 +00001530 self.assertIsInstance(self.subclass2test(), self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001531
1532 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001533 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001534
1535 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001536 self.assertTrue(_a == _a)
1537 self.assertTrue(_a != _b)
1538 self.assertTrue(_a < _b)
1539 self.assertTrue(_a <= _b)
1540 self.assertTrue(_b >= _a)
1541 self.assertTrue(_b > _a)
1542 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001543
1544 # test concat of subclass instances
1545 self.assertEqual(a + b, _a + _b)
1546 self.assertEqual(a + b, a + _b)
1547 self.assertEqual(a + b, _a + b)
1548
1549 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001550 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001551
1552 def test_join(self):
1553 # Make sure join returns a NEW object for single item sequences
1554 # involving a subclass.
1555 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001556 s1 = self.subclass2test(b"abcd")
1557 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001558 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001559 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001560
1561 # Test reverse, calling join on subclass
1562 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001563 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001564
1565 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001566 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001567 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001568 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001569 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001570 b = pickle.loads(pickle.dumps(a, proto))
1571 self.assertNotEqual(id(a), id(b))
1572 self.assertEqual(a, b)
1573 self.assertEqual(a.x, b.x)
1574 self.assertEqual(a.y, b.y)
1575 self.assertEqual(type(a), type(b))
1576 self.assertEqual(type(a.y), type(b.y))
1577
1578 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001579 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001580 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001581 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001582 for copy_method in (copy.copy, copy.deepcopy):
1583 b = copy_method(a)
1584 self.assertNotEqual(id(a), id(b))
1585 self.assertEqual(a, b)
1586 self.assertEqual(a.x, b.x)
1587 self.assertEqual(a.y, b.y)
1588 self.assertEqual(type(a), type(b))
1589 self.assertEqual(type(a.y), type(b.y))
1590
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001591
1592class ByteArraySubclass(bytearray):
1593 pass
1594
1595class BytesSubclass(bytes):
1596 pass
1597
Serhiy Storchaka15095802015-11-25 15:47:01 +02001598class OtherBytesSubclass(bytes):
1599 pass
1600
Ezio Melotti0dceb562013-01-10 07:43:26 +02001601class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001602 type2test = bytearray
1603 subclass2test = ByteArraySubclass
1604
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001605 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001606 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001607 def __init__(me, newarg=1, *args, **kwargs):
1608 bytearray.__init__(me, *args, **kwargs)
1609 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001610 x = subclass(4, source=b"abcd")
1611 self.assertEqual(x, b"abcd")
1612 x = subclass(newarg=4, source=b"abcd")
1613 self.assertEqual(x, b"abcd")
1614
1615
Ezio Melotti0dceb562013-01-10 07:43:26 +02001616class BytesSubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001617 type2test = bytes
1618 subclass2test = BytesSubclass
1619
1620
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001621if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001622 unittest.main()