blob: ad283002da88bef492266fdacb8901aa237bab3d [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
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
85 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000086 self.assertEqual(self.type2test(0), b'')
87 self.assertEqual(self.type2test(1), b'\x00')
88 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
89 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000090
Benjamin Peterson4c045832010-04-16 22:35:32 +000091 self.assertEqual(self.type2test('0', 'ascii'), b'0')
92 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000093 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000094
95 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000096 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000097 class C:
98 pass
Christian Heimes510711d2008-01-30 11:57:58 +000099 self.assertRaises(TypeError, self.type2test, ["0"])
100 self.assertRaises(TypeError, self.type2test, [0.0])
101 self.assertRaises(TypeError, self.type2test, [None])
102 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200103 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
104 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
105 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
106 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
107 self.assertRaises(TypeError, self.type2test, '')
108 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
109 self.assertRaises(TypeError, self.type2test, '', b'ascii')
110 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000111
112 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000113 self.assertRaises(ValueError, self.type2test, [-1])
114 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
115 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
116 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
117 self.assertRaises(ValueError, self.type2test, [-10**100])
118 self.assertRaises(ValueError, self.type2test, [256])
119 self.assertRaises(ValueError, self.type2test, [257])
120 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
121 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
122 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000123
Antoine Pitroucc231542014-11-02 18:40:09 +0100124 @bigaddrspacetest
125 def test_constructor_overflow(self):
126 size = MAX_Py_ssize_t
127 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
128 try:
129 # Should either pass or raise an error (e.g. on debug builds with
130 # additional malloc() overhead), but shouldn't crash.
131 bytearray(size - 4)
132 except (OverflowError, MemoryError):
133 pass
134
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000135 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000136 b1 = self.type2test([1, 2, 3])
137 b2 = self.type2test([1, 2, 3])
138 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000139
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000140 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000141 self.assertTrue(b2 != b3)
142 self.assertTrue(b1 <= b2)
143 self.assertTrue(b1 <= b3)
144 self.assertTrue(b1 < b3)
145 self.assertTrue(b1 >= b2)
146 self.assertTrue(b3 >= b2)
147 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000148
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000149 self.assertFalse(b1 != b2)
150 self.assertFalse(b2 == b3)
151 self.assertFalse(b1 > b2)
152 self.assertFalse(b1 > b3)
153 self.assertFalse(b1 >= b3)
154 self.assertFalse(b1 < b2)
155 self.assertFalse(b3 < b2)
156 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000157
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000158 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000159 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000160 # Byte comparisons with unicode should always fail!
161 # Test this for all expected byte orders and Unicode character
162 # sizes.
163 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
164 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
165 False)
166 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
167 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
168 False)
169 self.assertEqual(self.type2test() == str(), False)
170 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000171
172 def test_reversed(self):
173 input = list(map(ord, "Hello"))
174 b = self.type2test(input)
175 output = list(reversed(b))
176 input.reverse()
177 self.assertEqual(output, input)
178
179 def test_getslice(self):
180 def by(s):
181 return self.type2test(map(ord, s))
182 b = by("Hello, world")
183
184 self.assertEqual(b[:5], by("Hello"))
185 self.assertEqual(b[1:5], by("ello"))
186 self.assertEqual(b[5:7], by(", "))
187 self.assertEqual(b[7:], by("world"))
188 self.assertEqual(b[7:12], by("world"))
189 self.assertEqual(b[7:100], by("world"))
190
191 self.assertEqual(b[:-7], by("Hello"))
192 self.assertEqual(b[-11:-7], by("ello"))
193 self.assertEqual(b[-7:-5], by(", "))
194 self.assertEqual(b[-5:], by("world"))
195 self.assertEqual(b[-5:12], by("world"))
196 self.assertEqual(b[-5:100], by("world"))
197 self.assertEqual(b[-100:5], by("Hello"))
198
199 def test_extended_getslice(self):
200 # Test extended slicing by comparing with list slicing.
201 L = list(range(255))
202 b = self.type2test(L)
203 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
204 for start in indices:
205 for stop in indices:
206 # Skip step 0 (invalid)
207 for step in indices[1:]:
208 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
209
210 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000211 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000212 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000213 b = self.type2test(sample, enc)
214 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000215 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
216 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000217 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000218
219 def test_decode(self):
220 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000221 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000222 b = self.type2test(sample, enc)
223 self.assertEqual(b.decode(enc), sample)
224 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000225 b = self.type2test(sample, "latin-1")
226 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
227 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
228 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000229 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000230 # Default encoding is utf-8
231 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000232
233 def test_from_int(self):
234 b = self.type2test(0)
235 self.assertEqual(b, self.type2test())
236 b = self.type2test(10)
237 self.assertEqual(b, self.type2test([0]*10))
238 b = self.type2test(10000)
239 self.assertEqual(b, self.type2test([0]*10000))
240
241 def test_concat(self):
242 b1 = self.type2test(b"abc")
243 b2 = self.type2test(b"def")
244 self.assertEqual(b1 + b2, b"abcdef")
245 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
246 self.assertEqual(bytes(b"def") + b1, b"defabc")
247 self.assertRaises(TypeError, lambda: b1 + "def")
248 self.assertRaises(TypeError, lambda: "abc" + b2)
249
250 def test_repeat(self):
251 for b in b"abc", self.type2test(b"abc"):
252 self.assertEqual(b * 3, b"abcabcabc")
253 self.assertEqual(b * 0, b"")
254 self.assertEqual(b * -1, b"")
255 self.assertRaises(TypeError, lambda: b * 3.14)
256 self.assertRaises(TypeError, lambda: 3.14 * b)
257 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000258 with self.assertRaises((OverflowError, MemoryError)):
259 c = b * sys.maxsize
260 with self.assertRaises((OverflowError, MemoryError)):
261 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000262
263 def test_repeat_1char(self):
264 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
265
266 def test_contains(self):
267 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000268 self.assertIn(ord('a'), b)
269 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000270 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000271 self.assertRaises(ValueError, lambda: 300 in b)
272 self.assertRaises(ValueError, lambda: -1 in b)
273 self.assertRaises(TypeError, lambda: None in b)
274 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
275 self.assertRaises(TypeError, lambda: "a" in b)
276 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000277 self.assertIn(f(b""), b)
278 self.assertIn(f(b"a"), b)
279 self.assertIn(f(b"b"), b)
280 self.assertIn(f(b"c"), b)
281 self.assertIn(f(b"ab"), b)
282 self.assertIn(f(b"bc"), b)
283 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000284 self.assertNotIn(f(b"ac"), b)
285 self.assertNotIn(f(b"d"), b)
286 self.assertNotIn(f(b"dab"), b)
287 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000288
289 def test_fromhex(self):
290 self.assertRaises(TypeError, self.type2test.fromhex)
291 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000292 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000293 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000294 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
295 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
296 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000297 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
298 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
299 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
300 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
301 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
302 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
303
304 def test_join(self):
305 self.assertEqual(self.type2test(b"").join([]), b"")
306 self.assertEqual(self.type2test(b"").join([b""]), b"")
307 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
308 lst = list(map(self.type2test, lst))
309 self.assertEqual(self.type2test(b"").join(lst), b"abc")
310 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
311 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200312 dot_join = self.type2test(b".:").join
313 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
314 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
315 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
316 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
317 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
318 # Stress it with many items
319 seq = [b"abc"] * 1000
320 expected = b"abc" + b".:abc" * 999
321 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400322 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200323 # Error handling and cleanup when some item in the middle of the
324 # sequence has the wrong type.
325 with self.assertRaises(TypeError):
326 dot_join([bytearray(b"ab"), "cd", b"ef"])
327 with self.assertRaises(TypeError):
328 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000329
Christian Heimes510711d2008-01-30 11:57:58 +0000330 def test_count(self):
331 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200332 i = 105
333 p = 112
334 w = 119
335
Christian Heimes510711d2008-01-30 11:57:58 +0000336 self.assertEqual(b.count(b'i'), 4)
337 self.assertEqual(b.count(b'ss'), 2)
338 self.assertEqual(b.count(b'w'), 0)
339
Antoine Pitrouac65d962011-10-20 23:54:17 +0200340 self.assertEqual(b.count(i), 4)
341 self.assertEqual(b.count(w), 0)
342
343 self.assertEqual(b.count(b'i', 6), 2)
344 self.assertEqual(b.count(b'p', 6), 2)
345 self.assertEqual(b.count(b'i', 1, 3), 1)
346 self.assertEqual(b.count(b'p', 7, 9), 1)
347
348 self.assertEqual(b.count(i, 6), 2)
349 self.assertEqual(b.count(p, 6), 2)
350 self.assertEqual(b.count(i, 1, 3), 1)
351 self.assertEqual(b.count(p, 7, 9), 1)
352
Christian Heimes510711d2008-01-30 11:57:58 +0000353 def test_startswith(self):
354 b = self.type2test(b'hello')
355 self.assertFalse(self.type2test().startswith(b"anything"))
356 self.assertTrue(b.startswith(b"hello"))
357 self.assertTrue(b.startswith(b"hel"))
358 self.assertTrue(b.startswith(b"h"))
359 self.assertFalse(b.startswith(b"hellow"))
360 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300361 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300362 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300363 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300364 self.assertIn('bytes', exc)
365 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000366
367 def test_endswith(self):
368 b = self.type2test(b'hello')
369 self.assertFalse(bytearray().endswith(b"anything"))
370 self.assertTrue(b.endswith(b"hello"))
371 self.assertTrue(b.endswith(b"llo"))
372 self.assertTrue(b.endswith(b"o"))
373 self.assertFalse(b.endswith(b"whello"))
374 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300375 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300376 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300377 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300378 self.assertIn('bytes', exc)
379 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000380
381 def test_find(self):
382 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200383 i = 105
384 w = 119
385
Christian Heimes510711d2008-01-30 11:57:58 +0000386 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000387 self.assertEqual(b.find(b'w'), -1)
388 self.assertEqual(b.find(b'mississippian'), -1)
389
Antoine Pitrouac65d962011-10-20 23:54:17 +0200390 self.assertEqual(b.find(i), 1)
391 self.assertEqual(b.find(w), -1)
392
393 self.assertEqual(b.find(b'ss', 3), 5)
394 self.assertEqual(b.find(b'ss', 1, 7), 2)
395 self.assertEqual(b.find(b'ss', 1, 3), -1)
396
397 self.assertEqual(b.find(i, 6), 7)
398 self.assertEqual(b.find(i, 1, 3), 1)
399 self.assertEqual(b.find(w, 1, 3), -1)
400
Victor Stinnerf8eac002011-12-18 01:17:41 +0100401 for index in (-1, 256, sys.maxsize + 1):
402 self.assertRaisesRegex(
403 ValueError, r'byte must be in range\(0, 256\)',
404 b.find, index)
405
Christian Heimes510711d2008-01-30 11:57:58 +0000406 def test_rfind(self):
407 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200408 i = 105
409 w = 119
410
Christian Heimes510711d2008-01-30 11:57:58 +0000411 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000412 self.assertEqual(b.rfind(b'w'), -1)
413 self.assertEqual(b.rfind(b'mississippian'), -1)
414
Antoine Pitrouac65d962011-10-20 23:54:17 +0200415 self.assertEqual(b.rfind(i), 10)
416 self.assertEqual(b.rfind(w), -1)
417
418 self.assertEqual(b.rfind(b'ss', 3), 5)
419 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
420
421 self.assertEqual(b.rfind(i, 1, 3), 1)
422 self.assertEqual(b.rfind(i, 3, 9), 7)
423 self.assertEqual(b.rfind(w, 1, 3), -1)
424
Christian Heimes510711d2008-01-30 11:57:58 +0000425 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200426 b = self.type2test(b'mississippi')
427 i = 105
428 w = 119
429
430 self.assertEqual(b.index(b'ss'), 2)
431 self.assertRaises(ValueError, b.index, b'w')
432 self.assertRaises(ValueError, b.index, b'mississippian')
433
434 self.assertEqual(b.index(i), 1)
435 self.assertRaises(ValueError, b.index, w)
436
437 self.assertEqual(b.index(b'ss', 3), 5)
438 self.assertEqual(b.index(b'ss', 1, 7), 2)
439 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
440
441 self.assertEqual(b.index(i, 6), 7)
442 self.assertEqual(b.index(i, 1, 3), 1)
443 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000444
445 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200446 b = self.type2test(b'mississippi')
447 i = 105
448 w = 119
449
450 self.assertEqual(b.rindex(b'ss'), 5)
451 self.assertRaises(ValueError, b.rindex, b'w')
452 self.assertRaises(ValueError, b.rindex, b'mississippian')
453
454 self.assertEqual(b.rindex(i), 10)
455 self.assertRaises(ValueError, b.rindex, w)
456
457 self.assertEqual(b.rindex(b'ss', 3), 5)
458 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
459
460 self.assertEqual(b.rindex(i, 1, 3), 1)
461 self.assertEqual(b.rindex(i, 3, 9), 7)
462 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000463
Ethan Furmanb95b5612015-01-23 20:05:18 -0800464 def test_mod(self):
465 b = b'hello, %b!'
466 orig = b
467 b = b % b'world'
468 self.assertEqual(b, b'hello, world!')
469 self.assertEqual(orig, b'hello, %b!')
470 self.assertFalse(b is orig)
471 b = b'%s / 100 = %d%%'
472 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200473 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800474
475 def test_imod(self):
476 b = b'hello, %b!'
477 orig = b
478 b %= b'world'
479 self.assertEqual(b, b'hello, world!')
480 self.assertEqual(orig, b'hello, %b!')
481 self.assertFalse(b is orig)
482 b = b'%s / 100 = %d%%'
483 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200484 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800485
Christian Heimes510711d2008-01-30 11:57:58 +0000486 def test_replace(self):
487 b = self.type2test(b'mississippi')
488 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
489 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
490
491 def test_split(self):
492 b = self.type2test(b'mississippi')
493 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
494 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
495 self.assertEqual(b.split(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200496 # with keyword args
497 b = self.type2test(b'a|b|c|d')
498 self.assertEqual(b.split(sep=b'|'), [b'a', b'b', b'c', b'd'])
499 self.assertEqual(b.split(b'|', maxsplit=1), [b'a', b'b|c|d'])
500 self.assertEqual(b.split(sep=b'|', maxsplit=1), [b'a', b'b|c|d'])
501 self.assertEqual(b.split(maxsplit=1, sep=b'|'), [b'a', b'b|c|d'])
502 b = self.type2test(b'a b c d')
503 self.assertEqual(b.split(maxsplit=1), [b'a', b'b c d'])
Christian Heimes510711d2008-01-30 11:57:58 +0000504
505 def test_split_whitespace(self):
506 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
507 b'arf\fbarf', b'arf\vbarf'):
508 b = self.type2test(b)
509 self.assertEqual(b.split(), [b'arf', b'barf'])
510 self.assertEqual(b.split(None), [b'arf', b'barf'])
511 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
512 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
513 b = self.type2test(b)
514 self.assertEqual(b.split(), [b])
515 self.assertEqual(self.type2test(b' a bb c ').split(None, 0), [b'a bb c '])
516 self.assertEqual(self.type2test(b' a bb c ').split(None, 1), [b'a', b'bb c '])
517 self.assertEqual(self.type2test(b' a bb c ').split(None, 2), [b'a', b'bb', b'c '])
518 self.assertEqual(self.type2test(b' a bb c ').split(None, 3), [b'a', b'bb', b'c'])
519
520 def test_split_string_error(self):
521 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
522
Antoine Pitrouf8453022010-01-12 22:05:42 +0000523 def test_split_unicodewhitespace(self):
524 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
525 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
526
Christian Heimes510711d2008-01-30 11:57:58 +0000527 def test_rsplit(self):
528 b = self.type2test(b'mississippi')
529 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
530 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
531 self.assertEqual(b.rsplit(b'w'), [b])
Ezio Melotticda6b6d2012-02-26 09:39:55 +0200532 # with keyword args
533 b = self.type2test(b'a|b|c|d')
534 self.assertEqual(b.rsplit(sep=b'|'), [b'a', b'b', b'c', b'd'])
535 self.assertEqual(b.rsplit(b'|', maxsplit=1), [b'a|b|c', b'd'])
536 self.assertEqual(b.rsplit(sep=b'|', maxsplit=1), [b'a|b|c', b'd'])
537 self.assertEqual(b.rsplit(maxsplit=1, sep=b'|'), [b'a|b|c', b'd'])
538 b = self.type2test(b'a b c d')
539 self.assertEqual(b.rsplit(maxsplit=1), [b'a b c', b'd'])
Christian Heimes510711d2008-01-30 11:57:58 +0000540
541 def test_rsplit_whitespace(self):
542 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
543 b'arf\fbarf', b'arf\vbarf'):
544 b = self.type2test(b)
545 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
546 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
547 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
548 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 0), [b' a bb c'])
549 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 1), [b' a bb', b'c'])
550 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 2), [b' a', b'bb', b'c'])
551 self.assertEqual(self.type2test(b' a bb c ').rsplit(None, 3), [b'a', b'bb', b'c'])
552
553 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)
590 try:
591 next(it)
592 except StopIteration:
593 continue
594 d = pickle.dumps(it, proto)
595 it = pickle.loads(d)
596 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000597
Christian Heimes510711d2008-01-30 11:57:58 +0000598 def test_strip(self):
599 b = self.type2test(b'mississippi')
600 self.assertEqual(b.strip(b'i'), b'mississipp')
601 self.assertEqual(b.strip(b'm'), b'ississippi')
602 self.assertEqual(b.strip(b'pi'), b'mississ')
603 self.assertEqual(b.strip(b'im'), b'ssissipp')
604 self.assertEqual(b.strip(b'pim'), b'ssiss')
605 self.assertEqual(b.strip(b), b'')
606
607 def test_lstrip(self):
608 b = self.type2test(b'mississippi')
609 self.assertEqual(b.lstrip(b'i'), b'mississippi')
610 self.assertEqual(b.lstrip(b'm'), b'ississippi')
611 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
612 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
613 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
614
615 def test_rstrip(self):
616 b = self.type2test(b'mississippi')
617 self.assertEqual(b.rstrip(b'i'), b'mississipp')
618 self.assertEqual(b.rstrip(b'm'), b'mississippi')
619 self.assertEqual(b.rstrip(b'pi'), b'mississ')
620 self.assertEqual(b.rstrip(b'im'), b'mississipp')
621 self.assertEqual(b.rstrip(b'pim'), b'mississ')
622
623 def test_strip_whitespace(self):
624 b = self.type2test(b' \t\n\r\f\vabc \t\n\r\f\v')
625 self.assertEqual(b.strip(), b'abc')
626 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
627 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
628
629 def test_strip_bytearray(self):
630 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
631 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
632 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
633
634 def test_strip_string_error(self):
635 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
636 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
637 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
638
Eli Bendersky906b88f2011-07-29 07:05:08 +0300639 def test_center(self):
640 # Fill character can be either bytes or bytearray (issue 12380)
641 b = self.type2test(b'abc')
642 for fill_type in (bytes, bytearray):
643 self.assertEqual(b.center(7, fill_type(b'-')),
644 self.type2test(b'--abc--'))
645
646 def test_ljust(self):
647 # Fill character can be either bytes or bytearray (issue 12380)
648 b = self.type2test(b'abc')
649 for fill_type in (bytes, bytearray):
650 self.assertEqual(b.ljust(7, fill_type(b'-')),
651 self.type2test(b'abc----'))
652
653 def test_rjust(self):
654 # Fill character can be either bytes or bytearray (issue 12380)
655 b = self.type2test(b'abc')
656 for fill_type in (bytes, bytearray):
657 self.assertEqual(b.rjust(7, fill_type(b'-')),
658 self.type2test(b'----abc'))
659
Christian Heimes510711d2008-01-30 11:57:58 +0000660 def test_ord(self):
661 b = self.type2test(b'\0A\x7f\x80\xff')
662 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
663 [0, 65, 127, 128, 255])
664
Georg Brandlabc38772009-04-12 15:51:51 +0000665 def test_maketrans(self):
666 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 +0000667 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000668 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'
669 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000670 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
671 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
672
Jesus Ceaac451502011-04-20 17:09:23 +0200673 def test_none_arguments(self):
674 # issue 11828
675 b = self.type2test(b'hello')
676 l = self.type2test(b'l')
677 h = self.type2test(b'h')
678 x = self.type2test(b'x')
679 o = self.type2test(b'o')
680
681 self.assertEqual(2, b.find(l, None))
682 self.assertEqual(3, b.find(l, -2, None))
683 self.assertEqual(2, b.find(l, None, -2))
684 self.assertEqual(0, b.find(h, None, None))
685
686 self.assertEqual(3, b.rfind(l, None))
687 self.assertEqual(3, b.rfind(l, -2, None))
688 self.assertEqual(2, b.rfind(l, None, -2))
689 self.assertEqual(0, b.rfind(h, None, None))
690
691 self.assertEqual(2, b.index(l, None))
692 self.assertEqual(3, b.index(l, -2, None))
693 self.assertEqual(2, b.index(l, None, -2))
694 self.assertEqual(0, b.index(h, None, None))
695
696 self.assertEqual(3, b.rindex(l, None))
697 self.assertEqual(3, b.rindex(l, -2, None))
698 self.assertEqual(2, b.rindex(l, None, -2))
699 self.assertEqual(0, b.rindex(h, None, None))
700
701 self.assertEqual(2, b.count(l, None))
702 self.assertEqual(1, b.count(l, -2, None))
703 self.assertEqual(1, b.count(l, None, -2))
704 self.assertEqual(0, b.count(x, None, None))
705
706 self.assertEqual(True, b.endswith(o, None))
707 self.assertEqual(True, b.endswith(o, -2, None))
708 self.assertEqual(True, b.endswith(l, None, -2))
709 self.assertEqual(False, b.endswith(x, None, None))
710
711 self.assertEqual(True, b.startswith(h, None))
712 self.assertEqual(True, b.startswith(l, -2, None))
713 self.assertEqual(True, b.startswith(h, None, -2))
714 self.assertEqual(False, b.startswith(x, None, None))
715
Antoine Pitrouac65d962011-10-20 23:54:17 +0200716 def test_integer_arguments_out_of_byte_range(self):
717 b = self.type2test(b'hello')
718
719 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
720 self.assertRaises(ValueError, method, -1)
721 self.assertRaises(ValueError, method, 256)
722 self.assertRaises(ValueError, method, 9999)
723
Jesus Ceaac451502011-04-20 17:09:23 +0200724 def test_find_etc_raise_correct_error_messages(self):
725 # issue 11828
726 b = self.type2test(b'hello')
727 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300728 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200729 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300730 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200731 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300732 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200733 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300734 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200735 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300736 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200737 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300738 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200739 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300740 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200741 x, None, None, None)
742
Christian Heimes510711d2008-01-30 11:57:58 +0000743
Ezio Melotti0dceb562013-01-10 07:43:26 +0200744class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000745 type2test = bytes
746
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400747 def test_getitem_error(self):
748 msg = "byte indices must be integers or slices"
749 with self.assertRaisesRegex(TypeError, msg):
750 b'python'['a']
751
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000752 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200753 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000754 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000755 self.assertRaises(TypeError, f.readinto, b"")
756
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000757 def test_custom(self):
758 class A:
759 def __bytes__(self):
760 return b'abc'
761 self.assertEqual(bytes(A()), b'abc')
762 class A: pass
763 self.assertRaises(TypeError, bytes, A())
764 class A:
765 def __bytes__(self):
766 return None
767 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600768 class A:
769 def __bytes__(self):
770 return b'a'
771 def __index__(self):
772 return 42
773 self.assertEqual(bytes(A()), b'a')
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000774
Victor Stinner29e762c2011-01-05 03:33:28 +0000775 # Test PyBytes_FromFormat()
776 def test_from_format(self):
777 test.support.import_module('ctypes')
778 from ctypes import pythonapi, py_object, c_int, c_char_p
779 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
780 PyBytes_FromFormat.restype = py_object
781
782 self.assertEqual(PyBytes_FromFormat(b'format'),
783 b'format')
784
785 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
786 self.assertEqual(PyBytes_FromFormat(b'%%'), b'%')
787 self.assertEqual(PyBytes_FromFormat(b'%%s'), b'%s')
788 self.assertEqual(PyBytes_FromFormat(b'[%%]'), b'[%]')
789 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))), b'%_')
790
791 self.assertEqual(PyBytes_FromFormat(b'c:%c', c_int(255)),
792 b'c:\xff')
793 self.assertEqual(PyBytes_FromFormat(b's:%s', c_char_p(b'cstr')),
794 b's:cstr')
795
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100796 # Issue #19969
797 self.assertRaises(OverflowError,
798 PyBytes_FromFormat, b'%c', c_int(-1))
799 self.assertRaises(OverflowError,
800 PyBytes_FromFormat, b'%c', c_int(256))
801
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000802
Ezio Melotti0dceb562013-01-10 07:43:26 +0200803class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000804 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000805
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400806 def test_getitem_error(self):
807 msg = "bytearray indices must be integers or slices"
808 with self.assertRaisesRegex(TypeError, msg):
809 bytearray(b'python')['a']
810
811 def test_setitem_error(self):
812 msg = "bytearray indices must be integers or slices"
813 with self.assertRaisesRegex(TypeError, msg):
814 b = bytearray(b'python')
815 b['a'] = "python"
816
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000817 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000818 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000819
Guido van Rossum254348e2007-11-21 19:29:53 +0000820 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000821 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000822 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000823 tfn = tempfile.mktemp()
824 try:
825 # Prepare
826 with open(tfn, "wb") as f:
827 f.write(short_sample)
828 # Test readinto
829 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000830 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000831 n = f.readinto(b)
832 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000833 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000834 # Test writing in binary mode
835 with open(tfn, "wb") as f:
836 f.write(b)
837 with open(tfn, "rb") as f:
838 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000839 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000840 finally:
841 try:
842 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200843 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000844 pass
845
Neal Norwitz6968b052007-02-27 19:02:19 +0000846 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000847 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000848 self.assertEqual(b.reverse(), None)
849 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000850 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000851 b.reverse()
852 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000853 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000854 b.reverse()
855 self.assertFalse(b)
856
Eli Bendersky4db28d32011-03-03 18:21:02 +0000857 def test_clear(self):
858 b = bytearray(b'python')
859 b.clear()
860 self.assertEqual(b, b'')
861
862 b = bytearray(b'')
863 b.clear()
864 self.assertEqual(b, b'')
865
866 b = bytearray(b'')
867 b.append(ord('r'))
868 b.clear()
869 b.append(ord('p'))
870 self.assertEqual(b, b'p')
871
872 def test_copy(self):
873 b = bytearray(b'abc')
874 bb = b.copy()
875 self.assertEqual(bb, b'abc')
876
877 b = bytearray(b'')
878 bb = b.copy()
879 self.assertEqual(bb, b'')
880
881 # test that it's indeed a copy and not a reference
882 b = bytearray(b'abc')
883 bb = b.copy()
884 self.assertEqual(b, bb)
885 self.assertIsNot(b, bb)
886 bb.append(ord('d'))
887 self.assertEqual(bb, b'abcd')
888 self.assertEqual(b, b'abc')
889
Guido van Rossumd624f182006-04-24 13:47:05 +0000890 def test_regexps(self):
891 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000892 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000893 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000894 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000895
896 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000897 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000898 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000899 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000900 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000901 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000902 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000903 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000904 try:
905 b[3] = 0
906 self.fail("Didn't raise IndexError")
907 except IndexError:
908 pass
909 try:
910 b[-10] = 0
911 self.fail("Didn't raise IndexError")
912 except IndexError:
913 pass
914 try:
915 b[0] = 256
916 self.fail("Didn't raise ValueError")
917 except ValueError:
918 pass
919 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000920 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000921 self.fail("Didn't raise ValueError")
922 except ValueError:
923 pass
924 try:
925 b[0] = None
926 self.fail("Didn't raise TypeError")
927 except TypeError:
928 pass
929
930 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000931 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000932 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000933 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000934 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000935 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000936 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000937 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000938
939 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000940 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000941 self.assertEqual(list(b), list(range(10)))
942
Guido van Rossum254348e2007-11-21 19:29:53 +0000943 b[0:5] = bytearray([1, 1, 1, 1, 1])
944 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000945
946 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000947 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000948
Guido van Rossum254348e2007-11-21 19:29:53 +0000949 b[0:0] = bytearray([0, 1, 2, 3, 4])
950 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000951
Guido van Rossum254348e2007-11-21 19:29:53 +0000952 b[-7:-3] = bytearray([100, 101])
953 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000954
955 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000956 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000957
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000958 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000959 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 +0000960
Ezio Melottic64bcbe2012-11-03 21:19:06 +0200961 b[3:] = b'foo'
962 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
963
964 b[:3] = memoryview(b'foo')
965 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
966
967 b[3:4] = []
968 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
969
970 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
971 ['a', 'b'], [b'a', b'b'], [[]]]:
972 with self.assertRaises(TypeError):
973 b[3:4] = elem
974
975 for elem in [[254, 255, 256], [-256, 9000]]:
976 with self.assertRaises(ValueError):
977 b[3:4] = elem
978
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +0200979 def test_setslice_extend(self):
980 # Exercise the resizing logic (see issue #19087)
981 b = bytearray(range(100))
982 self.assertEqual(list(b), list(range(100)))
983 del b[:10]
984 self.assertEqual(list(b), list(range(10, 100)))
985 b.extend(range(100, 110))
986 self.assertEqual(list(b), list(range(10, 110)))
987
Thomas Wouters376446d2006-12-19 08:30:14 +0000988 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +0000989 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +0000990 for start in indices:
991 for stop in indices:
992 # Skip invalid step 0
993 for step in indices[1:]:
994 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000995 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000996 # Make sure we have a slice of exactly the right length,
997 # but with different data.
998 data = L[start:stop:step]
999 data.reverse()
1000 L[start:stop:step] = data
1001 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001002 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001003
Thomas Wouters376446d2006-12-19 08:30:14 +00001004 del L[start:stop:step]
1005 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001006 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001007
Guido van Rossumd624f182006-04-24 13:47:05 +00001008 def test_setslice_trap(self):
1009 # This test verifies that we correctly handle assigning self
1010 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001011 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001012 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001013 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001014
Ethan Furmanb95b5612015-01-23 20:05:18 -08001015 def test_mod(self):
1016 b = bytearray(b'hello, %b!')
1017 orig = b
1018 b = b % b'world'
1019 self.assertEqual(b, b'hello, world!')
1020 self.assertEqual(orig, bytearray(b'hello, %b!'))
1021 self.assertFalse(b is orig)
1022 b = bytearray(b'%s / 100 = %d%%')
1023 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +02001024 self.assertEqual(a, bytearray(b'seventy-nine / 100 = 79%'))
Ethan Furmanb95b5612015-01-23 20:05:18 -08001025
1026 def test_imod(self):
1027 b = bytearray(b'hello, %b!')
1028 orig = b
1029 b %= b'world'
1030 self.assertEqual(b, b'hello, world!')
1031 self.assertEqual(orig, bytearray(b'hello, %b!'))
1032 self.assertFalse(b is orig)
1033 b = bytearray(b'%s / 100 = %d%%')
1034 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +02001035 self.assertEqual(b, bytearray(b'seventy-nine / 100 = 79%'))
Ethan Furmanb95b5612015-01-23 20:05:18 -08001036
Guido van Rossum13e57212006-04-27 22:54:26 +00001037 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001038 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001039 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001040 b += b"def"
1041 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001042 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001043 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001044 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001045 self.assertEqual(b, b"abcdefxyz")
1046 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001047 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001048 except TypeError:
1049 pass
1050 else:
1051 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001052
1053 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001054 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001055 b1 = b
1056 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001057 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001058 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001059 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001060
1061 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001062 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001063 b1 = b
1064 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001065 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001066 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001067 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001068
Guido van Rossum20188312006-05-05 15:15:40 +00001069 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001070 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001071 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001072 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001073 seq = [alloc]
1074 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001075 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001076 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001077 self.assertTrue(alloc >= len(b))
Guido van Rossum20188312006-05-05 15:15:40 +00001078 if alloc not in seq:
1079 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001080
Neal Norwitz6968b052007-02-27 19:02:19 +00001081 def test_extend(self):
1082 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001083 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001084 a.extend(a)
1085 self.assertEqual(a, orig + orig)
1086 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001087 a = bytearray(b'')
1088 # Test iterators that don't have a __length_hint__
1089 a.extend(map(int, orig * 25))
1090 a.extend(int(x) for x in orig * 25)
1091 self.assertEqual(a, orig * 50)
1092 self.assertEqual(a[-5:], orig)
1093 a = bytearray(b'')
1094 a.extend(iter(map(int, orig * 50)))
1095 self.assertEqual(a, orig * 50)
1096 self.assertEqual(a[-5:], orig)
1097 a = bytearray(b'')
1098 a.extend(list(map(int, orig * 50)))
1099 self.assertEqual(a, orig * 50)
1100 self.assertEqual(a[-5:], orig)
1101 a = bytearray(b'')
1102 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1103 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1104 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001105 a = bytearray(b'')
1106 a.extend([Indexable(ord('a'))])
1107 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001108
Neal Norwitz6968b052007-02-27 19:02:19 +00001109 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001110 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001111 b.remove(ord('l'))
1112 self.assertEqual(b, b'helo')
1113 b.remove(ord('l'))
1114 self.assertEqual(b, b'heo')
1115 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1116 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001117 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001118 # remove first and last
1119 b.remove(ord('o'))
1120 b.remove(ord('h'))
1121 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001122 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001123 b.remove(Indexable(ord('e')))
1124 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001125
1126 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001127 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001128 self.assertEqual(b.pop(), ord('d'))
1129 self.assertEqual(b.pop(0), ord('w'))
1130 self.assertEqual(b.pop(-2), ord('r'))
1131 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001132 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001133 # test for issue #6846
1134 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001135
1136 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001138
Neal Norwitz6968b052007-02-27 19:02:19 +00001139 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001140 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001141 b.append(ord('o'))
1142 self.assertEqual(b, b'hello')
1143 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001144 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001145 b.append(ord('A'))
1146 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001147 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001148 b = bytearray()
1149 b.append(Indexable(ord('A')))
1150 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001151
1152 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001153 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001154 b.insert(1, ord('i'))
1155 b.insert(4, ord('i'))
1156 b.insert(-2, ord('i'))
1157 b.insert(1000, ord('i'))
1158 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001159 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001160 b = bytearray()
1161 b.insert(0, Indexable(ord('A')))
1162 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001163
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001164 def test_copied(self):
1165 # Issue 4348. Make sure that operations that don't mutate the array
1166 # copy the bytes.
1167 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001168 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001169
1170 t = bytearray([i for i in range(256)])
1171 x = bytearray(b'')
1172 self.assertFalse(x is x.translate(t))
1173
Guido van Rossum254348e2007-11-21 19:29:53 +00001174 def test_partition_bytearray_doesnt_share_nullstring(self):
1175 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001176 self.assertEqual(b, b"")
1177 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001178 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001179 b += b"!"
1180 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001181 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001182 self.assertEqual(b, b"")
1183 self.assertEqual(c, b"")
1184 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001185 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001186 self.assertEqual(b, b"")
1187 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001188 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001189 b += b"!"
1190 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001191 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001192 self.assertEqual(b, b"")
1193 self.assertEqual(c, b"")
1194
Antoine Pitrou5504e892008-12-06 21:27:53 +00001195 def test_resize_forbidden(self):
1196 # #4509: can't resize a bytearray when there are buffer exports, even
1197 # if it wouldn't reallocate the underlying buffer.
1198 # Furthermore, no destructive changes to the buffer may be applied
1199 # before raising the error.
1200 b = bytearray(range(10))
1201 v = memoryview(b)
1202 def resize(n):
1203 b[1:-1] = range(n + 1, 2*n - 1)
1204 resize(10)
1205 orig = b[:]
1206 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001207 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001208 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001209 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001210 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001211 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001212 # Other operations implying resize
1213 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001214 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001215 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001216 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001217 def delitem():
1218 del b[1]
1219 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001220 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001221 # deleting a non-contiguous slice
1222 def delslice():
1223 b[1:-1:2] = b""
1224 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001225 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001226
Stefan Krah650c1e82015-02-03 21:43:23 +01001227 @test.support.cpython_only
1228 def test_obsolete_write_lock(self):
1229 from _testcapi import getbuffer_with_null_view
1230 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001231
Christian Heimes510711d2008-01-30 11:57:58 +00001232class AssortedBytesTest(unittest.TestCase):
1233 #
1234 # Test various combinations of bytes and bytearray
1235 #
1236
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001237 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001238 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001239 for f in str, repr:
1240 self.assertEqual(f(bytearray()), "bytearray(b'')")
1241 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1242 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1243 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1244 self.assertEqual(f(b"abc"), "b'abc'")
1245 self.assertEqual(f(b"'"), '''b"'"''') # '''
1246 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001247
1248 def test_compare_bytes_to_bytearray(self):
1249 self.assertEqual(b"abc" == bytes(b"abc"), True)
1250 self.assertEqual(b"ab" != bytes(b"abc"), True)
1251 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1252 self.assertEqual(b"ab" < bytes(b"abc"), True)
1253 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1254 self.assertEqual(b"abc" > bytes(b"ab"), True)
1255
1256 self.assertEqual(b"abc" != bytes(b"abc"), False)
1257 self.assertEqual(b"ab" == bytes(b"abc"), False)
1258 self.assertEqual(b"ab" > bytes(b"abc"), False)
1259 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1260 self.assertEqual(b"abc" < bytes(b"ab"), False)
1261 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1262
1263 self.assertEqual(bytes(b"abc") == b"abc", True)
1264 self.assertEqual(bytes(b"ab") != b"abc", True)
1265 self.assertEqual(bytes(b"ab") <= b"abc", True)
1266 self.assertEqual(bytes(b"ab") < b"abc", True)
1267 self.assertEqual(bytes(b"abc") >= b"ab", True)
1268 self.assertEqual(bytes(b"abc") > b"ab", True)
1269
1270 self.assertEqual(bytes(b"abc") != b"abc", False)
1271 self.assertEqual(bytes(b"ab") == b"abc", False)
1272 self.assertEqual(bytes(b"ab") > b"abc", False)
1273 self.assertEqual(bytes(b"ab") >= b"abc", False)
1274 self.assertEqual(bytes(b"abc") < b"ab", False)
1275 self.assertEqual(bytes(b"abc") <= b"ab", False)
1276
Stefan Krah6e572b82013-01-26 13:06:36 +01001277 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001278 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001279 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001280 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001281 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001282 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001283
1284 def test_from_bytearray(self):
1285 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1286 buf = memoryview(sample)
1287 b = bytearray(buf)
1288 self.assertEqual(b, bytearray(sample))
1289
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001290 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001291 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001292 self.assertEqual(str(b''), "b''")
1293 self.assertEqual(str(b'x'), "b'x'")
1294 self.assertEqual(str(b'\x80'), "b'\\x80'")
1295 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1296 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1297 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001298
1299 def test_literal(self):
1300 tests = [
1301 (b"Wonderful spam", "Wonderful spam"),
1302 (br"Wonderful spam too", "Wonderful spam too"),
1303 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1304 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1305 ]
1306 for b, s in tests:
1307 self.assertEqual(b, bytearray(s, 'latin-1'))
1308 for c in range(128, 256):
1309 self.assertRaises(SyntaxError, eval,
1310 'b"%s"' % chr(c))
1311
1312 def test_translate(self):
1313 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001314 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001315 rosetta = bytearray(range(0, 256))
1316 rosetta[ord('o')] = ord('e')
1317 c = b.translate(rosetta, b'l')
1318 self.assertEqual(b, b'hello')
1319 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001320 c = ba.translate(rosetta, b'l')
1321 self.assertEqual(ba, b'hello')
1322 self.assertEqual(c, b'hee')
1323 c = b.translate(None, b'e')
1324 self.assertEqual(c, b'hllo')
1325 c = ba.translate(None, b'e')
1326 self.assertEqual(c, b'hllo')
1327 self.assertRaises(TypeError, b.translate, None, None)
1328 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001329
1330 def test_split_bytearray(self):
1331 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1332
1333 def test_rsplit_bytearray(self):
1334 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1335
Georg Brandleb2c9642008-05-30 12:05:02 +00001336 def test_return_self(self):
1337 # bytearray.replace must always return a new bytearray
1338 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001339 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001340
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001341 @unittest.skipUnless(sys.flags.bytes_warning,
1342 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001343 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001344 def bytes_warning():
1345 return test.support.check_warnings(('', BytesWarning))
1346 with bytes_warning():
1347 b'' == ''
1348 with bytes_warning():
1349 '' == b''
1350 with bytes_warning():
1351 b'' != ''
1352 with bytes_warning():
1353 '' != b''
1354 with bytes_warning():
1355 bytearray(b'') == ''
1356 with bytes_warning():
1357 '' == bytearray(b'')
1358 with bytes_warning():
1359 bytearray(b'') != ''
1360 with bytes_warning():
1361 '' != bytearray(b'')
1362 with bytes_warning():
1363 b'\0' == 0
1364 with bytes_warning():
1365 0 == b'\0'
1366 with bytes_warning():
1367 b'\0' != 0
1368 with bytes_warning():
1369 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001370
Guido van Rossumd624f182006-04-24 13:47:05 +00001371 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001372 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001373 # __reversed__? (optimization)
1374
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001375 # XXX More string methods? (Those that don't use character properties)
1376
Neal Norwitz6968b052007-02-27 19:02:19 +00001377 # There are tests in string_tests.py that are more
1378 # comprehensive for things like split, partition, etc.
1379 # Unfortunately they are all bundled with tests that
1380 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001381
Guido van Rossum254348e2007-11-21 19:29:53 +00001382 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001383 # the rest that make sense (the code can be cleaned up to use modern
1384 # unittest methods at the same time).
1385
Guido van Rossum254348e2007-11-21 19:29:53 +00001386class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001387 test.buffer_tests.MixinBytesBufferCommonTests):
1388 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001389 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001390
1391 def test_returns_new_copy(self):
1392 val = self.marshal(b'1234')
1393 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001394 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001395 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1396 method = getattr(val, methname)
1397 newval = method(3)
1398 self.assertEqual(val, newval)
1399 self.assertTrue(val is not newval,
1400 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001401 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1402 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1403 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1404 newval = eval(expr)
1405 self.assertEqual(val, newval)
1406 self.assertTrue(val is not newval,
1407 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001408 sep = self.marshal(b'')
1409 newval = sep.join([val])
1410 self.assertEqual(val, newval)
1411 self.assertIsNot(val, newval)
1412
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001413
Christian Heimes510711d2008-01-30 11:57:58 +00001414class FixedStringTest(test.string_tests.BaseTest):
Georg Brandlc7885542007-03-06 19:16:20 +00001415
Guido van Rossum9c627722007-08-27 18:31:48 +00001416 def fixtype(self, obj):
1417 if isinstance(obj, str):
1418 return obj.encode("utf-8")
1419 return super().fixtype(obj)
1420
Georg Brandlc7885542007-03-06 19:16:20 +00001421 # Currently the bytes containment testing uses a single integer
1422 # value. This may not be the final design, but until then the
1423 # bytes section with in a bytes containment not valid
1424 def test_contains(self):
1425 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001426 def test_expandtabs(self):
1427 pass
1428 def test_upper(self):
1429 pass
1430 def test_lower(self):
1431 pass
Georg Brandlc7885542007-03-06 19:16:20 +00001432
Ezio Melotti0dceb562013-01-10 07:43:26 +02001433class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001434 type2test = bytearray
Antoine Pitrouac65d962011-10-20 23:54:17 +02001435 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001436
Ezio Melotti0dceb562013-01-10 07:43:26 +02001437class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001438 type2test = bytes
Antoine Pitrouac65d962011-10-20 23:54:17 +02001439 contains_bytes = True
Christian Heimes510711d2008-01-30 11:57:58 +00001440
Georg Brandlc7885542007-03-06 19:16:20 +00001441
Ezio Melotti0dceb562013-01-10 07:43:26 +02001442class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001443
1444 def test_basic(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001445 self.assertTrue(issubclass(self.subclass2test, self.type2test))
Ezio Melottie9615932010-01-24 19:26:24 +00001446 self.assertIsInstance(self.subclass2test(), self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001447
1448 a, b = b"abcd", b"efgh"
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001449 _a, _b = self.subclass2test(a), self.subclass2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001450
1451 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001452 self.assertTrue(_a == _a)
1453 self.assertTrue(_a != _b)
1454 self.assertTrue(_a < _b)
1455 self.assertTrue(_a <= _b)
1456 self.assertTrue(_b >= _a)
1457 self.assertTrue(_b > _a)
1458 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001459
1460 # test concat of subclass instances
1461 self.assertEqual(a + b, _a + _b)
1462 self.assertEqual(a + b, a + _b)
1463 self.assertEqual(a + b, _a + b)
1464
1465 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001466 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001467
1468 def test_join(self):
1469 # Make sure join returns a NEW object for single item sequences
1470 # involving a subclass.
1471 # Make sure that it is of the appropriate type.
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001472 s1 = self.subclass2test(b"abcd")
1473 s2 = self.type2test().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001474 self.assertTrue(s1 is not s2)
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001475 self.assertTrue(type(s2) is self.type2test, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001476
1477 # Test reverse, calling join on subclass
1478 s3 = s1.join([b"abcd"])
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001479 self.assertTrue(type(s3) is self.type2test)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001480
1481 def test_pickle(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001482 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001483 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001484 a.y = self.subclass2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001485 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001486 b = pickle.loads(pickle.dumps(a, proto))
1487 self.assertNotEqual(id(a), id(b))
1488 self.assertEqual(a, b)
1489 self.assertEqual(a.x, b.x)
1490 self.assertEqual(a.y, b.y)
1491 self.assertEqual(type(a), type(b))
1492 self.assertEqual(type(a.y), type(b.y))
1493
1494 def test_copy(self):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001495 a = self.subclass2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001496 a.x = 10
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001497 a.y = self.subclass2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001498 for copy_method in (copy.copy, copy.deepcopy):
1499 b = copy_method(a)
1500 self.assertNotEqual(id(a), id(b))
1501 self.assertEqual(a, b)
1502 self.assertEqual(a.x, b.x)
1503 self.assertEqual(a.y, b.y)
1504 self.assertEqual(type(a), type(b))
1505 self.assertEqual(type(a.y), type(b.y))
1506
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001507
1508class ByteArraySubclass(bytearray):
1509 pass
1510
1511class BytesSubclass(bytes):
1512 pass
1513
Ezio Melotti0dceb562013-01-10 07:43:26 +02001514class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001515 type2test = bytearray
1516 subclass2test = ByteArraySubclass
1517
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001518 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001519 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001520 def __init__(me, newarg=1, *args, **kwargs):
1521 bytearray.__init__(me, *args, **kwargs)
1522 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001523 x = subclass(4, source=b"abcd")
1524 self.assertEqual(x, b"abcd")
1525 x = subclass(newarg=4, source=b"abcd")
1526 self.assertEqual(x, b"abcd")
1527
1528
Ezio Melotti0dceb562013-01-10 07:43:26 +02001529class BytesSubclassTest(SubclassTest, unittest.TestCase):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001530 type2test = bytes
1531 subclass2test = BytesSubclass
1532
1533
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001534if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001535 unittest.main()