blob: 8bbd669fc2a33656a9878d660f5fa4cfa49b03df [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
Martin Panter152a19c2016-04-06 06:37:17 +00003XXX This is a mess. Common tests should be unified with string_tests.py (and
4the latter should be modernized).
Guido van Rossum98297ee2007-11-06 21:34:58 +00005"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00006
Guido van Rossumd624f182006-04-24 13:47:05 +00007import os
8import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00009import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000010import copy
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000011import functools
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Antoine Pitroucc231542014-11-02 18:40:09 +010015
Benjamin Petersonee8712c2008-05-20 21:35:26 +000016import test.support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +030018import test.list_tests
Antoine Pitroucc231542014-11-02 18:40:09 +010019from test.support import bigaddrspacetest, MAX_Py_ssize_t
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000020
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +000021
22if sys.flags.bytes_warning:
23 def check_bytes_warnings(func):
24 @functools.wraps(func)
25 def wrapper(*args, **kw):
26 with test.support.check_warnings(('', BytesWarning)):
27 return func(*args, **kw)
28 return wrapper
29else:
30 # no-op
31 def check_bytes_warnings(func):
32 return func
33
34
Georg Brandl9a54d7c2008-07-16 23:15:30 +000035class Indexable:
36 def __init__(self, value=0):
37 self.value = value
38 def __index__(self):
39 return self.value
40
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000041
Ezio Melotti0dceb562013-01-10 07:43:26 +020042class BaseBytesTest:
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000043
44 def test_basics(self):
Christian Heimes510711d2008-01-30 11:57:58 +000045 b = self.type2test()
46 self.assertEqual(type(b), self.type2test)
47 self.assertEqual(b.__class__, self.type2test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000048
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +000049 def test_copy(self):
50 a = self.type2test(b"abcd")
51 for copy_method in (copy.copy, copy.deepcopy):
52 b = copy_method(a)
53 self.assertEqual(a, b)
54 self.assertEqual(type(a), type(b))
55
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000056 def test_empty_sequence(self):
Christian Heimes510711d2008-01-30 11:57:58 +000057 b = self.type2test()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058 self.assertEqual(len(b), 0)
59 self.assertRaises(IndexError, lambda: b[0])
60 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000061 self.assertRaises(IndexError, lambda: b[sys.maxsize])
62 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000063 self.assertRaises(IndexError, lambda: b[10**100])
64 self.assertRaises(IndexError, lambda: b[-1])
65 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000066 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
67 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
68 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000069 self.assertRaises(IndexError, lambda: b[-10**100])
70
71 def test_from_list(self):
72 ints = list(range(256))
Christian Heimes510711d2008-01-30 11:57:58 +000073 b = self.type2test(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074 self.assertEqual(len(b), 256)
75 self.assertEqual(list(b), ints)
76
77 def test_from_index(self):
Georg Brandl9a54d7c2008-07-16 23:15:30 +000078 b = self.type2test([Indexable(), Indexable(1), Indexable(254),
79 Indexable(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000080 self.assertEqual(list(b), [0, 1, 254, 255])
Benjamin Peterson4c045832010-04-16 22:35:32 +000081 self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
82 self.assertRaises(ValueError, self.type2test, [Indexable(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000083
84 def test_from_ssize(self):
Benjamin Peterson4c045832010-04-16 22:35:32 +000085 self.assertEqual(self.type2test(0), b'')
86 self.assertEqual(self.type2test(1), b'\x00')
87 self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
88 self.assertRaises(ValueError, self.type2test, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000089
Benjamin Peterson4c045832010-04-16 22:35:32 +000090 self.assertEqual(self.type2test('0', 'ascii'), b'0')
91 self.assertEqual(self.type2test(b'0'), b'0')
Benjamin Peterson8380dd52010-04-16 22:51:37 +000092 self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000093
94 def test_constructor_type_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +000095 self.assertRaises(TypeError, self.type2test, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000096 class C:
97 pass
Christian Heimes510711d2008-01-30 11:57:58 +000098 self.assertRaises(TypeError, self.type2test, ["0"])
99 self.assertRaises(TypeError, self.type2test, [0.0])
100 self.assertRaises(TypeError, self.type2test, [None])
101 self.assertRaises(TypeError, self.type2test, [C()])
Serhiy Storchaka83cf99d2014-12-02 09:24:06 +0200102 self.assertRaises(TypeError, self.type2test, 0, 'ascii')
103 self.assertRaises(TypeError, self.type2test, b'', 'ascii')
104 self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
105 self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
106 self.assertRaises(TypeError, self.type2test, '')
107 self.assertRaises(TypeError, self.type2test, '', errors='ignore')
108 self.assertRaises(TypeError, self.type2test, '', b'ascii')
109 self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000110
111 def test_constructor_value_errors(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000112 self.assertRaises(ValueError, self.type2test, [-1])
113 self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
114 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
115 self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
116 self.assertRaises(ValueError, self.type2test, [-10**100])
117 self.assertRaises(ValueError, self.type2test, [256])
118 self.assertRaises(ValueError, self.type2test, [257])
119 self.assertRaises(ValueError, self.type2test, [sys.maxsize])
120 self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
121 self.assertRaises(ValueError, self.type2test, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000122
Antoine Pitroucc231542014-11-02 18:40:09 +0100123 @bigaddrspacetest
124 def test_constructor_overflow(self):
125 size = MAX_Py_ssize_t
126 self.assertRaises((OverflowError, MemoryError), self.type2test, size)
127 try:
128 # Should either pass or raise an error (e.g. on debug builds with
129 # additional malloc() overhead), but shouldn't crash.
130 bytearray(size - 4)
131 except (OverflowError, MemoryError):
132 pass
133
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000134 def test_compare(self):
Christian Heimes510711d2008-01-30 11:57:58 +0000135 b1 = self.type2test([1, 2, 3])
136 b2 = self.type2test([1, 2, 3])
137 b3 = self.type2test([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000138
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000139 self.assertEqual(b1, b2)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000140 self.assertTrue(b2 != b3)
141 self.assertTrue(b1 <= b2)
142 self.assertTrue(b1 <= b3)
143 self.assertTrue(b1 < b3)
144 self.assertTrue(b1 >= b2)
145 self.assertTrue(b3 >= b2)
146 self.assertTrue(b3 > b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000147
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000148 self.assertFalse(b1 != b2)
149 self.assertFalse(b2 == b3)
150 self.assertFalse(b1 > b2)
151 self.assertFalse(b1 > b3)
152 self.assertFalse(b1 >= b3)
153 self.assertFalse(b1 < b2)
154 self.assertFalse(b3 < b2)
155 self.assertFalse(b3 <= b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000156
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000157 @check_bytes_warnings
Guido van Rossum343e97f2007-04-09 00:43:24 +0000158 def test_compare_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +0000159 # Byte comparisons with unicode should always fail!
160 # Test this for all expected byte orders and Unicode character
161 # sizes.
162 self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
163 self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
164 False)
165 self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
166 self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
167 False)
168 self.assertEqual(self.type2test() == str(), False)
169 self.assertEqual(self.type2test() != str(), True)
Christian Heimes510711d2008-01-30 11:57:58 +0000170
171 def test_reversed(self):
172 input = list(map(ord, "Hello"))
173 b = self.type2test(input)
174 output = list(reversed(b))
175 input.reverse()
176 self.assertEqual(output, input)
177
178 def test_getslice(self):
179 def by(s):
180 return self.type2test(map(ord, s))
181 b = by("Hello, world")
182
183 self.assertEqual(b[:5], by("Hello"))
184 self.assertEqual(b[1:5], by("ello"))
185 self.assertEqual(b[5:7], by(", "))
186 self.assertEqual(b[7:], by("world"))
187 self.assertEqual(b[7:12], by("world"))
188 self.assertEqual(b[7:100], by("world"))
189
190 self.assertEqual(b[:-7], by("Hello"))
191 self.assertEqual(b[-11:-7], by("ello"))
192 self.assertEqual(b[-7:-5], by(", "))
193 self.assertEqual(b[-5:], by("world"))
194 self.assertEqual(b[-5:12], by("world"))
195 self.assertEqual(b[-5:100], by("world"))
196 self.assertEqual(b[-100:5], by("Hello"))
197
198 def test_extended_getslice(self):
199 # Test extended slicing by comparing with list slicing.
200 L = list(range(255))
201 b = self.type2test(L)
202 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
203 for start in indices:
204 for stop in indices:
205 # Skip step 0 (invalid)
206 for step in indices[1:]:
207 self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
208
209 def test_encoding(self):
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000210 sample = "Hello world\n\u1234\u5678\u9abc"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000211 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000212 b = self.type2test(sample, enc)
213 self.assertEqual(b, self.type2test(sample.encode(enc)))
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000214 self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
215 b = self.type2test(sample, "latin-1", "ignore")
Martin v. Löwisdb12d452009-05-02 18:52:14 +0000216 self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
Christian Heimes510711d2008-01-30 11:57:58 +0000217
218 def test_decode(self):
219 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000220 for enc in ("utf-8", "utf-16"):
Christian Heimes510711d2008-01-30 11:57:58 +0000221 b = self.type2test(sample, enc)
222 self.assertEqual(b.decode(enc), sample)
223 sample = "Hello world\n\x80\x81\xfe\xff"
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000224 b = self.type2test(sample, "latin-1")
225 self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
226 self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
227 self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
Benjamin Peterson308d6372009-09-18 21:42:35 +0000228 "Hello world\n")
Marc-André Lemburg8f36af72011-02-25 15:42:01 +0000229 # Default encoding is utf-8
230 self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
Christian Heimes510711d2008-01-30 11:57:58 +0000231
232 def test_from_int(self):
233 b = self.type2test(0)
234 self.assertEqual(b, self.type2test())
235 b = self.type2test(10)
236 self.assertEqual(b, self.type2test([0]*10))
237 b = self.type2test(10000)
238 self.assertEqual(b, self.type2test([0]*10000))
239
240 def test_concat(self):
241 b1 = self.type2test(b"abc")
242 b2 = self.type2test(b"def")
243 self.assertEqual(b1 + b2, b"abcdef")
244 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
245 self.assertEqual(bytes(b"def") + b1, b"defabc")
246 self.assertRaises(TypeError, lambda: b1 + "def")
247 self.assertRaises(TypeError, lambda: "abc" + b2)
248
249 def test_repeat(self):
250 for b in b"abc", self.type2test(b"abc"):
251 self.assertEqual(b * 3, b"abcabcabc")
252 self.assertEqual(b * 0, b"")
253 self.assertEqual(b * -1, b"")
254 self.assertRaises(TypeError, lambda: b * 3.14)
255 self.assertRaises(TypeError, lambda: 3.14 * b)
256 # XXX Shouldn't bytes and bytearray agree on what to raise?
Mark Dickinsoncf940c72010-08-10 18:35:01 +0000257 with self.assertRaises((OverflowError, MemoryError)):
258 c = b * sys.maxsize
259 with self.assertRaises((OverflowError, MemoryError)):
260 b *= sys.maxsize
Christian Heimes510711d2008-01-30 11:57:58 +0000261
262 def test_repeat_1char(self):
263 self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
264
265 def test_contains(self):
266 b = self.type2test(b"abc")
Benjamin Peterson577473f2010-01-19 00:09:57 +0000267 self.assertIn(ord('a'), b)
268 self.assertIn(int(ord('a')), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000269 self.assertNotIn(200, b)
Christian Heimes510711d2008-01-30 11:57:58 +0000270 self.assertRaises(ValueError, lambda: 300 in b)
271 self.assertRaises(ValueError, lambda: -1 in b)
Serhiy Storchakaf9efb8b2016-07-10 12:37:30 +0300272 self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
Christian Heimes510711d2008-01-30 11:57:58 +0000273 self.assertRaises(TypeError, lambda: None in b)
274 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
275 self.assertRaises(TypeError, lambda: "a" in b)
276 for f in bytes, bytearray:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000277 self.assertIn(f(b""), b)
278 self.assertIn(f(b"a"), b)
279 self.assertIn(f(b"b"), b)
280 self.assertIn(f(b"c"), b)
281 self.assertIn(f(b"ab"), b)
282 self.assertIn(f(b"bc"), b)
283 self.assertIn(f(b"abc"), b)
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000284 self.assertNotIn(f(b"ac"), b)
285 self.assertNotIn(f(b"d"), b)
286 self.assertNotIn(f(b"dab"), b)
287 self.assertNotIn(f(b"abd"), b)
Christian Heimes510711d2008-01-30 11:57:58 +0000288
289 def test_fromhex(self):
290 self.assertRaises(TypeError, self.type2test.fromhex)
291 self.assertRaises(TypeError, self.type2test.fromhex, 1)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000292 self.assertEqual(self.type2test.fromhex(''), self.type2test())
Christian Heimes510711d2008-01-30 11:57:58 +0000293 b = bytearray([0x1a, 0x2b, 0x30])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000294 self.assertEqual(self.type2test.fromhex('1a2B30'), b)
295 self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
296 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000297 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
298 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
299 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
300 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
301 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
302 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
303
Victor Stinner2bf89932015-10-14 11:25:33 +0200304 for data, pos in (
305 # invalid first hexadecimal character
306 ('12 x4 56', 3),
307 # invalid second hexadecimal character
308 ('12 3x 56', 4),
309 # two invalid hexadecimal characters
310 ('12 xy 56', 3),
311 # test non-ASCII string
312 ('12 3\xff 56', 4),
313 ):
314 with self.assertRaises(ValueError) as cm:
315 self.type2test.fromhex(data)
316 self.assertIn('at position %s' % pos, str(cm.exception))
317
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000318 def test_hex(self):
319 self.assertRaises(TypeError, self.type2test.hex)
320 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000321 self.assertEqual(self.type2test(b"").hex(), "")
322 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
323 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
324 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000325
Christian Heimes510711d2008-01-30 11:57:58 +0000326 def test_join(self):
327 self.assertEqual(self.type2test(b"").join([]), b"")
328 self.assertEqual(self.type2test(b"").join([b""]), b"")
329 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
330 lst = list(map(self.type2test, lst))
331 self.assertEqual(self.type2test(b"").join(lst), b"abc")
332 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
333 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200334 dot_join = self.type2test(b".:").join
335 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
336 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
337 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
338 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
339 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
340 # Stress it with many items
341 seq = [b"abc"] * 1000
342 expected = b"abc" + b".:abc" * 999
343 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400344 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200345 # Error handling and cleanup when some item in the middle of the
346 # sequence has the wrong type.
347 with self.assertRaises(TypeError):
348 dot_join([bytearray(b"ab"), "cd", b"ef"])
349 with self.assertRaises(TypeError):
350 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000351
Christian Heimes510711d2008-01-30 11:57:58 +0000352 def test_count(self):
353 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200354 i = 105
355 p = 112
356 w = 119
357
Christian Heimes510711d2008-01-30 11:57:58 +0000358 self.assertEqual(b.count(b'i'), 4)
359 self.assertEqual(b.count(b'ss'), 2)
360 self.assertEqual(b.count(b'w'), 0)
361
Antoine Pitrouac65d962011-10-20 23:54:17 +0200362 self.assertEqual(b.count(i), 4)
363 self.assertEqual(b.count(w), 0)
364
365 self.assertEqual(b.count(b'i', 6), 2)
366 self.assertEqual(b.count(b'p', 6), 2)
367 self.assertEqual(b.count(b'i', 1, 3), 1)
368 self.assertEqual(b.count(b'p', 7, 9), 1)
369
370 self.assertEqual(b.count(i, 6), 2)
371 self.assertEqual(b.count(p, 6), 2)
372 self.assertEqual(b.count(i, 1, 3), 1)
373 self.assertEqual(b.count(p, 7, 9), 1)
374
Christian Heimes510711d2008-01-30 11:57:58 +0000375 def test_startswith(self):
376 b = self.type2test(b'hello')
377 self.assertFalse(self.type2test().startswith(b"anything"))
378 self.assertTrue(b.startswith(b"hello"))
379 self.assertTrue(b.startswith(b"hel"))
380 self.assertTrue(b.startswith(b"h"))
381 self.assertFalse(b.startswith(b"hellow"))
382 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300383 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300384 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300385 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300386 self.assertIn('bytes', exc)
387 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000388
389 def test_endswith(self):
390 b = self.type2test(b'hello')
391 self.assertFalse(bytearray().endswith(b"anything"))
392 self.assertTrue(b.endswith(b"hello"))
393 self.assertTrue(b.endswith(b"llo"))
394 self.assertTrue(b.endswith(b"o"))
395 self.assertFalse(b.endswith(b"whello"))
396 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300397 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300398 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300399 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300400 self.assertIn('bytes', exc)
401 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000402
403 def test_find(self):
404 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200405 i = 105
406 w = 119
407
Christian Heimes510711d2008-01-30 11:57:58 +0000408 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000409 self.assertEqual(b.find(b'w'), -1)
410 self.assertEqual(b.find(b'mississippian'), -1)
411
Antoine Pitrouac65d962011-10-20 23:54:17 +0200412 self.assertEqual(b.find(i), 1)
413 self.assertEqual(b.find(w), -1)
414
415 self.assertEqual(b.find(b'ss', 3), 5)
416 self.assertEqual(b.find(b'ss', 1, 7), 2)
417 self.assertEqual(b.find(b'ss', 1, 3), -1)
418
419 self.assertEqual(b.find(i, 6), 7)
420 self.assertEqual(b.find(i, 1, 3), 1)
421 self.assertEqual(b.find(w, 1, 3), -1)
422
Victor Stinnerf8eac002011-12-18 01:17:41 +0100423 for index in (-1, 256, sys.maxsize + 1):
424 self.assertRaisesRegex(
425 ValueError, r'byte must be in range\(0, 256\)',
426 b.find, index)
427
Christian Heimes510711d2008-01-30 11:57:58 +0000428 def test_rfind(self):
429 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200430 i = 105
431 w = 119
432
Christian Heimes510711d2008-01-30 11:57:58 +0000433 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000434 self.assertEqual(b.rfind(b'w'), -1)
435 self.assertEqual(b.rfind(b'mississippian'), -1)
436
Antoine Pitrouac65d962011-10-20 23:54:17 +0200437 self.assertEqual(b.rfind(i), 10)
438 self.assertEqual(b.rfind(w), -1)
439
440 self.assertEqual(b.rfind(b'ss', 3), 5)
441 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
442
443 self.assertEqual(b.rfind(i, 1, 3), 1)
444 self.assertEqual(b.rfind(i, 3, 9), 7)
445 self.assertEqual(b.rfind(w, 1, 3), -1)
446
Christian Heimes510711d2008-01-30 11:57:58 +0000447 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200448 b = self.type2test(b'mississippi')
449 i = 105
450 w = 119
451
452 self.assertEqual(b.index(b'ss'), 2)
453 self.assertRaises(ValueError, b.index, b'w')
454 self.assertRaises(ValueError, b.index, b'mississippian')
455
456 self.assertEqual(b.index(i), 1)
457 self.assertRaises(ValueError, b.index, w)
458
459 self.assertEqual(b.index(b'ss', 3), 5)
460 self.assertEqual(b.index(b'ss', 1, 7), 2)
461 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
462
463 self.assertEqual(b.index(i, 6), 7)
464 self.assertEqual(b.index(i, 1, 3), 1)
465 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000466
467 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200468 b = self.type2test(b'mississippi')
469 i = 105
470 w = 119
471
472 self.assertEqual(b.rindex(b'ss'), 5)
473 self.assertRaises(ValueError, b.rindex, b'w')
474 self.assertRaises(ValueError, b.rindex, b'mississippian')
475
476 self.assertEqual(b.rindex(i), 10)
477 self.assertRaises(ValueError, b.rindex, w)
478
479 self.assertEqual(b.rindex(b'ss', 3), 5)
480 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
481
482 self.assertEqual(b.rindex(i, 1, 3), 1)
483 self.assertEqual(b.rindex(i, 3, 9), 7)
484 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000485
Ethan Furmanb95b5612015-01-23 20:05:18 -0800486 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300487 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800488 orig = b
489 b = b % b'world'
490 self.assertEqual(b, b'hello, world!')
491 self.assertEqual(orig, b'hello, %b!')
492 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300493 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800494 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200495 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200496 self.assertIs(type(a), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800497
498 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300499 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800500 orig = b
501 b %= b'world'
502 self.assertEqual(b, b'hello, world!')
503 self.assertEqual(orig, b'hello, %b!')
504 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300505 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800506 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200507 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200508 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300509
510 def test_rmod(self):
511 with self.assertRaises(TypeError):
512 object() % self.type2test(b'abc')
513 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800514
Christian Heimes510711d2008-01-30 11:57:58 +0000515 def test_replace(self):
516 b = self.type2test(b'mississippi')
517 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
518 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
519
Christian Heimes510711d2008-01-30 11:57:58 +0000520 def test_split_string_error(self):
521 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
522
Antoine Pitrouf8453022010-01-12 22:05:42 +0000523 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000524 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
525 b = self.type2test(b)
526 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000527 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
528 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
529
Christian Heimes510711d2008-01-30 11:57:58 +0000530 def test_rsplit_string_error(self):
531 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
532
533 def test_rsplit_unicodewhitespace(self):
534 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000535 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
536
537 def test_partition(self):
538 b = self.type2test(b'mississippi')
539 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000540 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000541
542 def test_rpartition(self):
543 b = self.type2test(b'mississippi')
544 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
545 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000546 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000547
548 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000549 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000550 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
551 b = self.type2test(b)
552 ps = pickle.dumps(b, proto)
553 q = pickle.loads(ps)
554 self.assertEqual(b, q)
555
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000556 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200557 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
558 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
559 it = itorg = iter(self.type2test(b))
560 data = list(self.type2test(b))
561 d = pickle.dumps(it, proto)
562 it = pickle.loads(d)
563 self.assertEqual(type(itorg), type(it))
564 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000565
Serhiy Storchakabad12572014-12-15 14:03:42 +0200566 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200567 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200568 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200569 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200570 d = pickle.dumps(it, proto)
571 it = pickle.loads(d)
572 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000573
Christian Heimes510711d2008-01-30 11:57:58 +0000574 def test_strip_bytearray(self):
575 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
576 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
577 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
578
579 def test_strip_string_error(self):
580 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
581 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
582 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
583
Eli Bendersky906b88f2011-07-29 07:05:08 +0300584 def test_center(self):
585 # Fill character can be either bytes or bytearray (issue 12380)
586 b = self.type2test(b'abc')
587 for fill_type in (bytes, bytearray):
588 self.assertEqual(b.center(7, fill_type(b'-')),
589 self.type2test(b'--abc--'))
590
591 def test_ljust(self):
592 # Fill character can be either bytes or bytearray (issue 12380)
593 b = self.type2test(b'abc')
594 for fill_type in (bytes, bytearray):
595 self.assertEqual(b.ljust(7, fill_type(b'-')),
596 self.type2test(b'abc----'))
597
598 def test_rjust(self):
599 # Fill character can be either bytes or bytearray (issue 12380)
600 b = self.type2test(b'abc')
601 for fill_type in (bytes, bytearray):
602 self.assertEqual(b.rjust(7, fill_type(b'-')),
603 self.type2test(b'----abc'))
604
Christian Heimes510711d2008-01-30 11:57:58 +0000605 def test_ord(self):
606 b = self.type2test(b'\0A\x7f\x80\xff')
607 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
608 [0, 65, 127, 128, 255])
609
Georg Brandlabc38772009-04-12 15:51:51 +0000610 def test_maketrans(self):
611 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
Georg Brandlabc38772009-04-12 15:51:51 +0000612 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000613 transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
614 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000615 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
616 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
617
Jesus Ceaac451502011-04-20 17:09:23 +0200618 def test_none_arguments(self):
619 # issue 11828
620 b = self.type2test(b'hello')
621 l = self.type2test(b'l')
622 h = self.type2test(b'h')
623 x = self.type2test(b'x')
624 o = self.type2test(b'o')
625
626 self.assertEqual(2, b.find(l, None))
627 self.assertEqual(3, b.find(l, -2, None))
628 self.assertEqual(2, b.find(l, None, -2))
629 self.assertEqual(0, b.find(h, None, None))
630
631 self.assertEqual(3, b.rfind(l, None))
632 self.assertEqual(3, b.rfind(l, -2, None))
633 self.assertEqual(2, b.rfind(l, None, -2))
634 self.assertEqual(0, b.rfind(h, None, None))
635
636 self.assertEqual(2, b.index(l, None))
637 self.assertEqual(3, b.index(l, -2, None))
638 self.assertEqual(2, b.index(l, None, -2))
639 self.assertEqual(0, b.index(h, None, None))
640
641 self.assertEqual(3, b.rindex(l, None))
642 self.assertEqual(3, b.rindex(l, -2, None))
643 self.assertEqual(2, b.rindex(l, None, -2))
644 self.assertEqual(0, b.rindex(h, None, None))
645
646 self.assertEqual(2, b.count(l, None))
647 self.assertEqual(1, b.count(l, -2, None))
648 self.assertEqual(1, b.count(l, None, -2))
649 self.assertEqual(0, b.count(x, None, None))
650
651 self.assertEqual(True, b.endswith(o, None))
652 self.assertEqual(True, b.endswith(o, -2, None))
653 self.assertEqual(True, b.endswith(l, None, -2))
654 self.assertEqual(False, b.endswith(x, None, None))
655
656 self.assertEqual(True, b.startswith(h, None))
657 self.assertEqual(True, b.startswith(l, -2, None))
658 self.assertEqual(True, b.startswith(h, None, -2))
659 self.assertEqual(False, b.startswith(x, None, None))
660
Antoine Pitrouac65d962011-10-20 23:54:17 +0200661 def test_integer_arguments_out_of_byte_range(self):
662 b = self.type2test(b'hello')
663
664 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
665 self.assertRaises(ValueError, method, -1)
666 self.assertRaises(ValueError, method, 256)
667 self.assertRaises(ValueError, method, 9999)
668
Jesus Ceaac451502011-04-20 17:09:23 +0200669 def test_find_etc_raise_correct_error_messages(self):
670 # issue 11828
671 b = self.type2test(b'hello')
672 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300673 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200674 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300675 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200676 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300677 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200678 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300679 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200680 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300681 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200682 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300683 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200684 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300685 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200686 x, None, None, None)
687
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300688 def test_free_after_iterating(self):
689 test.support.check_free_after_iterating(self, iter, self.type2test)
690 test.support.check_free_after_iterating(self, reversed, self.type2test)
691
Martin Panter1b6c6da2016-08-27 08:35:02 +0000692 def test_translate(self):
693 b = self.type2test(b'hello')
694 rosetta = bytearray(range(256))
695 rosetta[ord('o')] = ord('e')
696
697 self.assertRaises(TypeError, b.translate)
698 self.assertRaises(TypeError, b.translate, None, None)
699 self.assertRaises(ValueError, b.translate, bytes(range(255)))
700
701 c = b.translate(rosetta, b'hello')
702 self.assertEqual(b, b'hello')
703 self.assertIsInstance(c, self.type2test)
704
705 c = b.translate(rosetta)
706 d = b.translate(rosetta, b'')
707 self.assertEqual(c, d)
708 self.assertEqual(c, b'helle')
709
710 c = b.translate(rosetta, b'l')
711 self.assertEqual(c, b'hee')
712 c = b.translate(None, b'e')
713 self.assertEqual(c, b'hllo')
714
715 # test delete as a keyword argument
716 c = b.translate(rosetta, delete=b'')
717 self.assertEqual(c, b'helle')
718 c = b.translate(rosetta, delete=b'l')
719 self.assertEqual(c, b'hee')
720 c = b.translate(None, delete=b'e')
721 self.assertEqual(c, b'hllo')
722
Christian Heimes510711d2008-01-30 11:57:58 +0000723
Ezio Melotti0dceb562013-01-10 07:43:26 +0200724class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000725 type2test = bytes
726
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400727 def test_getitem_error(self):
728 msg = "byte indices must be integers or slices"
729 with self.assertRaisesRegex(TypeError, msg):
730 b'python'['a']
731
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000732 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200733 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000734 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000735 self.assertRaises(TypeError, f.readinto, b"")
736
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000737 def test_custom(self):
738 class A:
739 def __bytes__(self):
740 return b'abc'
741 self.assertEqual(bytes(A()), b'abc')
742 class A: pass
743 self.assertRaises(TypeError, bytes, A())
744 class A:
745 def __bytes__(self):
746 return None
747 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600748 class A:
749 def __bytes__(self):
750 return b'a'
751 def __index__(self):
752 return 42
753 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200754 # Issue #25766
755 class A(str):
756 def __bytes__(self):
757 return b'abc'
758 self.assertEqual(bytes(A('\u20ac')), b'abc')
759 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200760 # Issue #24731
761 class A:
762 def __bytes__(self):
763 return OtherBytesSubclass(b'abc')
764 self.assertEqual(bytes(A()), b'abc')
765 self.assertIs(type(bytes(A())), OtherBytesSubclass)
766 self.assertEqual(BytesSubclass(A()), b'abc')
767 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000768
Victor Stinner29e762c2011-01-05 03:33:28 +0000769 # Test PyBytes_FromFormat()
770 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200771 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200772 _testcapi = test.support.import_module('_testcapi')
773 from ctypes import pythonapi, py_object
774 from ctypes import (
775 c_int, c_uint,
776 c_long, c_ulong,
777 c_size_t, c_ssize_t,
778 c_char_p)
779
Victor Stinner29e762c2011-01-05 03:33:28 +0000780 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
781 PyBytes_FromFormat.restype = py_object
782
Victor Stinner03dab782015-10-14 00:21:35 +0200783 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000784 self.assertEqual(PyBytes_FromFormat(b'format'),
785 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200786 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
787 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000788
Victor Stinner03dab782015-10-14 00:21:35 +0200789 # test formatters
790 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
791 b'c=\0')
792 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
793 b'c=@')
794 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
795 b'c=\xff')
796 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
797 c_int(1), c_long(2),
798 c_size_t(3)),
799 b'd=1 ld=2 zd=3')
800 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
801 c_int(-1), c_long(-2),
802 c_size_t(-3)),
803 b'd=-1 ld=-2 zd=-3')
804 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
805 c_uint(123), c_ulong(456),
806 c_size_t(789)),
807 b'u=123 lu=456 zu=789')
808 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
809 b'i=123')
810 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
811 b'i=-123')
812 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
813 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200814
815 sizeof_ptr = ctypes.sizeof(c_char_p)
816
817 if os.name == 'nt':
818 # Windows (MSCRT)
819 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
820 def ptr_formatter(ptr):
821 return (ptr_format % ptr)
822 else:
823 # UNIX (glibc)
824 def ptr_formatter(ptr):
825 return '%#x' % ptr
826
Victor Stinner7ab986d2015-10-14 02:55:12 +0200827 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200828 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
829 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200830 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
831 b's=cstr')
832
833 # test minimum and maximum integer values
834 size_max = c_size_t(-1).value
835 for formatstr, ctypes_type, value, py_formatter in (
836 (b'%d', c_int, _testcapi.INT_MIN, str),
837 (b'%d', c_int, _testcapi.INT_MAX, str),
838 (b'%ld', c_long, _testcapi.LONG_MIN, str),
839 (b'%ld', c_long, _testcapi.LONG_MAX, str),
840 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
841 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
842 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
843 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200844 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200845 ):
846 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
847 py_formatter(value).encode('ascii')),
848
849 # width and precision (width is currently ignored)
850 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
851 b'a')
852 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
853 b'abc')
854
855 # '%%' formatter
856 self.assertEqual(PyBytes_FromFormat(b'%%'),
857 b'%')
858 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
859 b'[%]')
860 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
861 b'%_')
862 self.assertEqual(PyBytes_FromFormat(b'%%s'),
863 b'%s')
864
865 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000866 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200867 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
868 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000869
Victor Stinner03dab782015-10-14 00:21:35 +0200870 # Issue #19969: %c must raise OverflowError for values
871 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100872 self.assertRaises(OverflowError,
873 PyBytes_FromFormat, b'%c', c_int(-1))
874 self.assertRaises(OverflowError,
875 PyBytes_FromFormat, b'%c', c_int(256))
876
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700877 def test_bytes_blocking(self):
878 class IterationBlocked(list):
879 __bytes__ = None
880 i = [0, 1, 2, 3]
881 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
882 self.assertRaises(TypeError, bytes, IterationBlocked(i))
883
884 # At least in CPython, because bytes.__new__ and the C API
885 # PyBytes_FromObject have different fallback rules, integer
886 # fallback is handled specially, so test separately.
887 class IntBlocked(int):
888 __bytes__ = None
889 self.assertEqual(bytes(3), b'\0\0\0')
890 self.assertRaises(TypeError, bytes, IntBlocked(3))
891
892 # While there is no separately-defined rule for handling bytes
893 # subclasses differently from other buffer-interface classes,
894 # an implementation may well special-case them (as CPython 2.x
895 # str did), so test them separately.
896 class BytesSubclassBlocked(bytes):
897 __bytes__ = None
898 self.assertEqual(bytes(b'ab'), b'ab')
899 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
900
901 class BufferBlocked(bytearray):
902 __bytes__ = None
903 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
904 self.assertEqual(bytes(ba), b'ab')
905 self.assertRaises(TypeError, bytes, bb)
906
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000907
Ezio Melotti0dceb562013-01-10 07:43:26 +0200908class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000909 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000910
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400911 def test_getitem_error(self):
912 msg = "bytearray indices must be integers or slices"
913 with self.assertRaisesRegex(TypeError, msg):
914 bytearray(b'python')['a']
915
916 def test_setitem_error(self):
917 msg = "bytearray indices must be integers or slices"
918 with self.assertRaisesRegex(TypeError, msg):
919 b = bytearray(b'python')
920 b['a'] = "python"
921
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000922 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000923 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000924
Guido van Rossum254348e2007-11-21 19:29:53 +0000925 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000926 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000927 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000928 tfn = tempfile.mktemp()
929 try:
930 # Prepare
931 with open(tfn, "wb") as f:
932 f.write(short_sample)
933 # Test readinto
934 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000935 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000936 n = f.readinto(b)
937 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000938 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000939 # Test writing in binary mode
940 with open(tfn, "wb") as f:
941 f.write(b)
942 with open(tfn, "rb") as f:
943 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000944 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000945 finally:
946 try:
947 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200948 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000949 pass
950
Neal Norwitz6968b052007-02-27 19:02:19 +0000951 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000952 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000953 self.assertEqual(b.reverse(), None)
954 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000955 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000956 b.reverse()
957 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000958 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000959 b.reverse()
960 self.assertFalse(b)
961
Eli Bendersky4db28d32011-03-03 18:21:02 +0000962 def test_clear(self):
963 b = bytearray(b'python')
964 b.clear()
965 self.assertEqual(b, b'')
966
967 b = bytearray(b'')
968 b.clear()
969 self.assertEqual(b, b'')
970
971 b = bytearray(b'')
972 b.append(ord('r'))
973 b.clear()
974 b.append(ord('p'))
975 self.assertEqual(b, b'p')
976
977 def test_copy(self):
978 b = bytearray(b'abc')
979 bb = b.copy()
980 self.assertEqual(bb, b'abc')
981
982 b = bytearray(b'')
983 bb = b.copy()
984 self.assertEqual(bb, b'')
985
986 # test that it's indeed a copy and not a reference
987 b = bytearray(b'abc')
988 bb = b.copy()
989 self.assertEqual(b, bb)
990 self.assertIsNot(b, bb)
991 bb.append(ord('d'))
992 self.assertEqual(bb, b'abcd')
993 self.assertEqual(b, b'abc')
994
Guido van Rossumd624f182006-04-24 13:47:05 +0000995 def test_regexps(self):
996 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000997 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000998 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000999 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001000
1001 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001002 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001003 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001004 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001005 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001006 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001007 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001008 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001009 try:
1010 b[3] = 0
1011 self.fail("Didn't raise IndexError")
1012 except IndexError:
1013 pass
1014 try:
1015 b[-10] = 0
1016 self.fail("Didn't raise IndexError")
1017 except IndexError:
1018 pass
1019 try:
1020 b[0] = 256
1021 self.fail("Didn't raise ValueError")
1022 except ValueError:
1023 pass
1024 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001025 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001026 self.fail("Didn't raise ValueError")
1027 except ValueError:
1028 pass
1029 try:
1030 b[0] = None
1031 self.fail("Didn't raise TypeError")
1032 except TypeError:
1033 pass
1034
1035 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001036 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001037 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001038 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001039 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001040 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001041 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001042 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001043
1044 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001045 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001046 self.assertEqual(list(b), list(range(10)))
1047
Guido van Rossum254348e2007-11-21 19:29:53 +00001048 b[0:5] = bytearray([1, 1, 1, 1, 1])
1049 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001050
1051 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001052 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001053
Guido van Rossum254348e2007-11-21 19:29:53 +00001054 b[0:0] = bytearray([0, 1, 2, 3, 4])
1055 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001056
Guido van Rossum254348e2007-11-21 19:29:53 +00001057 b[-7:-3] = bytearray([100, 101])
1058 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001059
1060 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001061 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001062
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001063 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001064 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 +00001065
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001066 b[3:] = b'foo'
1067 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1068
1069 b[:3] = memoryview(b'foo')
1070 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1071
1072 b[3:4] = []
1073 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1074
1075 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1076 ['a', 'b'], [b'a', b'b'], [[]]]:
1077 with self.assertRaises(TypeError):
1078 b[3:4] = elem
1079
1080 for elem in [[254, 255, 256], [-256, 9000]]:
1081 with self.assertRaises(ValueError):
1082 b[3:4] = elem
1083
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001084 def test_setslice_extend(self):
1085 # Exercise the resizing logic (see issue #19087)
1086 b = bytearray(range(100))
1087 self.assertEqual(list(b), list(range(100)))
1088 del b[:10]
1089 self.assertEqual(list(b), list(range(10, 100)))
1090 b.extend(range(100, 110))
1091 self.assertEqual(list(b), list(range(10, 110)))
1092
Antoine Pitrou25454112015-05-19 20:52:27 +02001093 def test_fifo_overrun(self):
1094 # Test for issue #23985, a buffer overrun when implementing a FIFO
1095 # Build Python in pydebug mode for best results.
1096 b = bytearray(10)
1097 b.pop() # Defeat expanding buffer off-by-one quirk
1098 del b[:1] # Advance start pointer without reallocating
1099 b += bytes(2) # Append exactly the number of deleted bytes
1100 del b # Free memory buffer, allowing pydebug verification
1101
1102 def test_del_expand(self):
1103 # Reducing the size should not expand the buffer (issue #23985)
1104 b = bytearray(10)
1105 size = sys.getsizeof(b)
1106 del b[:1]
1107 self.assertLessEqual(sys.getsizeof(b), size)
1108
Thomas Wouters376446d2006-12-19 08:30:14 +00001109 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001110 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001111 for start in indices:
1112 for stop in indices:
1113 # Skip invalid step 0
1114 for step in indices[1:]:
1115 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001116 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001117 # Make sure we have a slice of exactly the right length,
1118 # but with different data.
1119 data = L[start:stop:step]
1120 data.reverse()
1121 L[start:stop:step] = data
1122 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001123 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001124
Thomas Wouters376446d2006-12-19 08:30:14 +00001125 del L[start:stop:step]
1126 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001127 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001128
Guido van Rossumd624f182006-04-24 13:47:05 +00001129 def test_setslice_trap(self):
1130 # This test verifies that we correctly handle assigning self
1131 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001132 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001133 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001134 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001135
Guido van Rossum13e57212006-04-27 22:54:26 +00001136 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001137 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001138 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001139 b += b"def"
1140 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001141 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001142 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001143 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001144 self.assertEqual(b, b"abcdefxyz")
1145 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001146 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001147 except TypeError:
1148 pass
1149 else:
1150 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001151
1152 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001153 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001154 b1 = b
1155 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001156 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001157 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001158 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001159
1160 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001161 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001162 b1 = b
1163 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001164 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001165 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001166 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001167
Guido van Rossum20188312006-05-05 15:15:40 +00001168 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001170 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001171 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001172 seq = [alloc]
1173 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001174 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001175 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001176 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001177 if alloc not in seq:
1178 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001179
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001180 def test_init_alloc(self):
1181 b = bytearray()
1182 def g():
1183 for i in range(1, 100):
1184 yield i
1185 a = list(b)
1186 self.assertEqual(a, list(range(1, len(a)+1)))
1187 self.assertEqual(len(b), len(a))
1188 self.assertLessEqual(len(b), i)
1189 alloc = b.__alloc__()
1190 self.assertGreater(alloc, len(b)) # including trailing null byte
1191 b.__init__(g())
1192 self.assertEqual(list(b), list(range(1, 100)))
1193 self.assertEqual(len(b), 99)
1194 alloc = b.__alloc__()
1195 self.assertGreater(alloc, len(b))
1196
Neal Norwitz6968b052007-02-27 19:02:19 +00001197 def test_extend(self):
1198 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001199 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001200 a.extend(a)
1201 self.assertEqual(a, orig + orig)
1202 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001203 a = bytearray(b'')
1204 # Test iterators that don't have a __length_hint__
1205 a.extend(map(int, orig * 25))
1206 a.extend(int(x) for x in orig * 25)
1207 self.assertEqual(a, orig * 50)
1208 self.assertEqual(a[-5:], orig)
1209 a = bytearray(b'')
1210 a.extend(iter(map(int, orig * 50)))
1211 self.assertEqual(a, orig * 50)
1212 self.assertEqual(a[-5:], orig)
1213 a = bytearray(b'')
1214 a.extend(list(map(int, orig * 50)))
1215 self.assertEqual(a, orig * 50)
1216 self.assertEqual(a[-5:], orig)
1217 a = bytearray(b'')
1218 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1219 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1220 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001221 a = bytearray(b'')
1222 a.extend([Indexable(ord('a'))])
1223 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001224
Neal Norwitz6968b052007-02-27 19:02:19 +00001225 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001226 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001227 b.remove(ord('l'))
1228 self.assertEqual(b, b'helo')
1229 b.remove(ord('l'))
1230 self.assertEqual(b, b'heo')
1231 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1232 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001233 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001234 # remove first and last
1235 b.remove(ord('o'))
1236 b.remove(ord('h'))
1237 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001238 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001239 b.remove(Indexable(ord('e')))
1240 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001241
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001242 # test values outside of the ascii range: (0, 127)
1243 c = bytearray([126, 127, 128, 129])
1244 c.remove(127)
1245 self.assertEqual(c, bytes([126, 128, 129]))
1246 c.remove(129)
1247 self.assertEqual(c, bytes([126, 128]))
1248
Neal Norwitz6968b052007-02-27 19:02:19 +00001249 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001250 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001251 self.assertEqual(b.pop(), ord('d'))
1252 self.assertEqual(b.pop(0), ord('w'))
1253 self.assertEqual(b.pop(-2), ord('r'))
1254 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001255 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001256 # test for issue #6846
1257 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001258
1259 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001260 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001261
Neal Norwitz6968b052007-02-27 19:02:19 +00001262 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001263 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001264 b.append(ord('o'))
1265 self.assertEqual(b, b'hello')
1266 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001267 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001268 b.append(ord('A'))
1269 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001270 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001271 b = bytearray()
1272 b.append(Indexable(ord('A')))
1273 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001274
1275 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001276 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001277 b.insert(1, ord('i'))
1278 b.insert(4, ord('i'))
1279 b.insert(-2, ord('i'))
1280 b.insert(1000, ord('i'))
1281 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001282 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001283 b = bytearray()
1284 b.insert(0, Indexable(ord('A')))
1285 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001286
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001287 def test_copied(self):
1288 # Issue 4348. Make sure that operations that don't mutate the array
1289 # copy the bytes.
1290 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001291 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001292
1293 t = bytearray([i for i in range(256)])
1294 x = bytearray(b'')
1295 self.assertFalse(x is x.translate(t))
1296
Guido van Rossum254348e2007-11-21 19:29:53 +00001297 def test_partition_bytearray_doesnt_share_nullstring(self):
1298 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001299 self.assertEqual(b, b"")
1300 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001301 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001302 b += b"!"
1303 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001304 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001305 self.assertEqual(b, b"")
1306 self.assertEqual(c, b"")
1307 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001308 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001309 self.assertEqual(b, b"")
1310 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001311 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001312 b += b"!"
1313 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001314 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001315 self.assertEqual(b, b"")
1316 self.assertEqual(c, b"")
1317
Antoine Pitrou5504e892008-12-06 21:27:53 +00001318 def test_resize_forbidden(self):
1319 # #4509: can't resize a bytearray when there are buffer exports, even
1320 # if it wouldn't reallocate the underlying buffer.
1321 # Furthermore, no destructive changes to the buffer may be applied
1322 # before raising the error.
1323 b = bytearray(range(10))
1324 v = memoryview(b)
1325 def resize(n):
1326 b[1:-1] = range(n + 1, 2*n - 1)
1327 resize(10)
1328 orig = b[:]
1329 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001330 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001331 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001332 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001333 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001334 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001335 # Other operations implying resize
1336 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001337 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001338 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001339 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001340 def delitem():
1341 del b[1]
1342 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001343 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001344 # deleting a non-contiguous slice
1345 def delslice():
1346 b[1:-1:2] = b""
1347 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001348 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001349
Stefan Krah650c1e82015-02-03 21:43:23 +01001350 @test.support.cpython_only
1351 def test_obsolete_write_lock(self):
1352 from _testcapi import getbuffer_with_null_view
1353 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001354
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001355 def test_iterator_pickling2(self):
1356 orig = bytearray(b'abc')
1357 data = list(b'qwerty')
1358 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1359 # initial iterator
1360 itorig = iter(orig)
1361 d = pickle.dumps((itorig, orig), proto)
1362 it, b = pickle.loads(d)
1363 b[:] = data
1364 self.assertEqual(type(it), type(itorig))
1365 self.assertEqual(list(it), data)
1366
1367 # running iterator
1368 next(itorig)
1369 d = pickle.dumps((itorig, orig), proto)
1370 it, b = pickle.loads(d)
1371 b[:] = data
1372 self.assertEqual(type(it), type(itorig))
1373 self.assertEqual(list(it), data[1:])
1374
1375 # empty iterator
1376 for i in range(1, len(orig)):
1377 next(itorig)
1378 d = pickle.dumps((itorig, orig), proto)
1379 it, b = pickle.loads(d)
1380 b[:] = data
1381 self.assertEqual(type(it), type(itorig))
1382 self.assertEqual(list(it), data[len(orig):])
1383
1384 # exhausted iterator
1385 self.assertRaises(StopIteration, next, itorig)
1386 d = pickle.dumps((itorig, orig), proto)
1387 it, b = pickle.loads(d)
1388 b[:] = data
1389 self.assertEqual(list(it), [])
1390
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001391 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001392
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001393 def test_iterator_length_hint(self):
1394 # Issue 27443: __length_hint__ can return negative integer
1395 ba = bytearray(b'ab')
1396 it = iter(ba)
1397 next(it)
1398 ba.clear()
1399 # Shouldn't raise an error
1400 self.assertEqual(list(it), [])
1401
1402
Christian Heimes510711d2008-01-30 11:57:58 +00001403class AssortedBytesTest(unittest.TestCase):
1404 #
1405 # Test various combinations of bytes and bytearray
1406 #
1407
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001408 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001409 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001410 for f in str, repr:
1411 self.assertEqual(f(bytearray()), "bytearray(b'')")
1412 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1413 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1414 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1415 self.assertEqual(f(b"abc"), "b'abc'")
1416 self.assertEqual(f(b"'"), '''b"'"''') # '''
1417 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001418
1419 def test_compare_bytes_to_bytearray(self):
1420 self.assertEqual(b"abc" == bytes(b"abc"), True)
1421 self.assertEqual(b"ab" != bytes(b"abc"), True)
1422 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1423 self.assertEqual(b"ab" < bytes(b"abc"), True)
1424 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1425 self.assertEqual(b"abc" > bytes(b"ab"), True)
1426
1427 self.assertEqual(b"abc" != bytes(b"abc"), False)
1428 self.assertEqual(b"ab" == bytes(b"abc"), False)
1429 self.assertEqual(b"ab" > bytes(b"abc"), False)
1430 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1431 self.assertEqual(b"abc" < bytes(b"ab"), False)
1432 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1433
1434 self.assertEqual(bytes(b"abc") == b"abc", True)
1435 self.assertEqual(bytes(b"ab") != b"abc", True)
1436 self.assertEqual(bytes(b"ab") <= b"abc", True)
1437 self.assertEqual(bytes(b"ab") < b"abc", True)
1438 self.assertEqual(bytes(b"abc") >= b"ab", True)
1439 self.assertEqual(bytes(b"abc") > b"ab", True)
1440
1441 self.assertEqual(bytes(b"abc") != b"abc", False)
1442 self.assertEqual(bytes(b"ab") == b"abc", False)
1443 self.assertEqual(bytes(b"ab") > b"abc", False)
1444 self.assertEqual(bytes(b"ab") >= b"abc", False)
1445 self.assertEqual(bytes(b"abc") < b"ab", False)
1446 self.assertEqual(bytes(b"abc") <= b"ab", False)
1447
Stefan Krah6e572b82013-01-26 13:06:36 +01001448 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001449 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001450 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001451 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001452 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001453 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001454
1455 def test_from_bytearray(self):
1456 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1457 buf = memoryview(sample)
1458 b = bytearray(buf)
1459 self.assertEqual(b, bytearray(sample))
1460
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001461 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001462 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001463 self.assertEqual(str(b''), "b''")
1464 self.assertEqual(str(b'x'), "b'x'")
1465 self.assertEqual(str(b'\x80'), "b'\\x80'")
1466 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1467 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1468 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001469
1470 def test_literal(self):
1471 tests = [
1472 (b"Wonderful spam", "Wonderful spam"),
1473 (br"Wonderful spam too", "Wonderful spam too"),
1474 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1475 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1476 ]
1477 for b, s in tests:
1478 self.assertEqual(b, bytearray(s, 'latin-1'))
1479 for c in range(128, 256):
1480 self.assertRaises(SyntaxError, eval,
1481 'b"%s"' % chr(c))
1482
Christian Heimes510711d2008-01-30 11:57:58 +00001483 def test_split_bytearray(self):
1484 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1485
1486 def test_rsplit_bytearray(self):
1487 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1488
Georg Brandleb2c9642008-05-30 12:05:02 +00001489 def test_return_self(self):
1490 # bytearray.replace must always return a new bytearray
1491 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001492 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001493
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001494 @unittest.skipUnless(sys.flags.bytes_warning,
1495 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001496 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001497 def bytes_warning():
1498 return test.support.check_warnings(('', BytesWarning))
1499 with bytes_warning():
1500 b'' == ''
1501 with bytes_warning():
1502 '' == b''
1503 with bytes_warning():
1504 b'' != ''
1505 with bytes_warning():
1506 '' != b''
1507 with bytes_warning():
1508 bytearray(b'') == ''
1509 with bytes_warning():
1510 '' == bytearray(b'')
1511 with bytes_warning():
1512 bytearray(b'') != ''
1513 with bytes_warning():
1514 '' != bytearray(b'')
1515 with bytes_warning():
1516 b'\0' == 0
1517 with bytes_warning():
1518 0 == b'\0'
1519 with bytes_warning():
1520 b'\0' != 0
1521 with bytes_warning():
1522 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001523
Guido van Rossumd624f182006-04-24 13:47:05 +00001524 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001525 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001526 # __reversed__? (optimization)
1527
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001528 # XXX More string methods? (Those that don't use character properties)
1529
Neal Norwitz6968b052007-02-27 19:02:19 +00001530 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001531 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001532 # Unfortunately they are all bundled with tests that
1533 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001534
Guido van Rossum254348e2007-11-21 19:29:53 +00001535 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001536 # the rest that make sense (the code can be cleaned up to use modern
1537 # unittest methods at the same time).
1538
Martin Panter152a19c2016-04-06 06:37:17 +00001539class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001540 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001541 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001542
1543 def test_returns_new_copy(self):
1544 val = self.marshal(b'1234')
1545 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001546 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001547 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1548 method = getattr(val, methname)
1549 newval = method(3)
1550 self.assertEqual(val, newval)
1551 self.assertTrue(val is not newval,
1552 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001553 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1554 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1555 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1556 newval = eval(expr)
1557 self.assertEqual(val, newval)
1558 self.assertTrue(val is not newval,
1559 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001560 sep = self.marshal(b'')
1561 newval = sep.join([val])
1562 self.assertEqual(val, newval)
1563 self.assertIsNot(val, newval)
1564
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001565
Christian Heimes510711d2008-01-30 11:57:58 +00001566class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001567 def fixtype(self, obj):
1568 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001569 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001570 return super().fixtype(obj)
1571
Martin Panter152a19c2016-04-06 06:37:17 +00001572 contains_bytes = True
1573
Ezio Melotti0dceb562013-01-10 07:43:26 +02001574class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001575 type2test = bytearray
1576
Ezio Melotti0dceb562013-01-10 07:43:26 +02001577class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001578 type2test = bytes
1579
Georg Brandlc7885542007-03-06 19:16:20 +00001580
Ezio Melotti0dceb562013-01-10 07:43:26 +02001581class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001582
1583 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001584 self.assertTrue(issubclass(self.type2test, self.basetype))
1585 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001586
1587 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001588 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001589
1590 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001591 self.assertTrue(_a == _a)
1592 self.assertTrue(_a != _b)
1593 self.assertTrue(_a < _b)
1594 self.assertTrue(_a <= _b)
1595 self.assertTrue(_b >= _a)
1596 self.assertTrue(_b > _a)
1597 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001598
1599 # test concat of subclass instances
1600 self.assertEqual(a + b, _a + _b)
1601 self.assertEqual(a + b, a + _b)
1602 self.assertEqual(a + b, _a + b)
1603
1604 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001605 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001606
1607 def test_join(self):
1608 # Make sure join returns a NEW object for single item sequences
1609 # involving a subclass.
1610 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001611 s1 = self.type2test(b"abcd")
1612 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001613 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001614 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001615
1616 # Test reverse, calling join on subclass
1617 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001618 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001619
1620 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001621 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001622 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001623 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001624 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001625 b = pickle.loads(pickle.dumps(a, proto))
1626 self.assertNotEqual(id(a), id(b))
1627 self.assertEqual(a, b)
1628 self.assertEqual(a.x, b.x)
1629 self.assertEqual(a.y, b.y)
1630 self.assertEqual(type(a), type(b))
1631 self.assertEqual(type(a.y), type(b.y))
1632
1633 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001634 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001635 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001636 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001637 for copy_method in (copy.copy, copy.deepcopy):
1638 b = copy_method(a)
1639 self.assertNotEqual(id(a), id(b))
1640 self.assertEqual(a, b)
1641 self.assertEqual(a.x, b.x)
1642 self.assertEqual(a.y, b.y)
1643 self.assertEqual(type(a), type(b))
1644 self.assertEqual(type(a.y), type(b.y))
1645
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001646 def test_fromhex(self):
1647 b = self.type2test.fromhex('1a2B30')
1648 self.assertEqual(b, b'\x1a\x2b\x30')
1649 self.assertIs(type(b), self.type2test)
1650
1651 class B1(self.basetype):
1652 def __new__(cls, value):
1653 me = self.basetype.__new__(cls, value)
1654 me.foo = 'bar'
1655 return me
1656
1657 b = B1.fromhex('1a2B30')
1658 self.assertEqual(b, b'\x1a\x2b\x30')
1659 self.assertIs(type(b), B1)
1660 self.assertEqual(b.foo, 'bar')
1661
1662 class B2(self.basetype):
1663 def __init__(me, *args, **kwargs):
1664 if self.basetype is not bytes:
1665 self.basetype.__init__(me, *args, **kwargs)
1666 me.foo = 'bar'
1667
1668 b = B2.fromhex('1a2B30')
1669 self.assertEqual(b, b'\x1a\x2b\x30')
1670 self.assertIs(type(b), B2)
1671 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001672
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001673
1674class ByteArraySubclass(bytearray):
1675 pass
1676
1677class BytesSubclass(bytes):
1678 pass
1679
Serhiy Storchaka15095802015-11-25 15:47:01 +02001680class OtherBytesSubclass(bytes):
1681 pass
1682
Ezio Melotti0dceb562013-01-10 07:43:26 +02001683class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001684 basetype = bytearray
1685 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001686
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001687 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001688 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001689 def __init__(me, newarg=1, *args, **kwargs):
1690 bytearray.__init__(me, *args, **kwargs)
1691 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001692 x = subclass(4, source=b"abcd")
1693 self.assertEqual(x, b"abcd")
1694 x = subclass(newarg=4, source=b"abcd")
1695 self.assertEqual(x, b"abcd")
1696
1697
Ezio Melotti0dceb562013-01-10 07:43:26 +02001698class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001699 basetype = bytes
1700 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001701
1702
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001703if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001704 unittest.main()