blob: 278cfccdf637f55e3f7a0d57dd819072e7e44bf2 [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):
Serhiy Storchakac49a5162016-09-08 15:47:27 +0300219 sample = "Hello world\n\u1234\u5678\u9abc"
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)
Serhiy Storchakadd1da7f2016-12-19 18:51:37 +0200296
297 # check that ASCII whitespace is ignored
298 self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
299 for c in "\x09\x0A\x0B\x0C\x0D\x20":
300 self.assertEqual(self.type2test.fromhex(c), self.type2test())
301 for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
302 self.assertRaises(ValueError, self.type2test.fromhex, c)
303
Ezio Melottib3aedd42010-11-20 19:04:17 +0000304 self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
Christian Heimes510711d2008-01-30 11:57:58 +0000305 self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
306 self.assertRaises(ValueError, self.type2test.fromhex, 'a')
307 self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
308 self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
309 self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
310 self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
311
Victor Stinner2bf89932015-10-14 11:25:33 +0200312 for data, pos in (
313 # invalid first hexadecimal character
314 ('12 x4 56', 3),
315 # invalid second hexadecimal character
316 ('12 3x 56', 4),
317 # two invalid hexadecimal characters
318 ('12 xy 56', 3),
319 # test non-ASCII string
320 ('12 3\xff 56', 4),
321 ):
322 with self.assertRaises(ValueError) as cm:
323 self.type2test.fromhex(data)
324 self.assertIn('at position %s' % pos, str(cm.exception))
325
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000326 def test_hex(self):
327 self.assertRaises(TypeError, self.type2test.hex)
328 self.assertRaises(TypeError, self.type2test.hex, 1)
Gregory P. Smith32d34bc2015-04-26 05:05:53 +0000329 self.assertEqual(self.type2test(b"").hex(), "")
330 self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
331 self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
332 self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
Gregory P. Smith8cb65692015-04-25 23:22:26 +0000333
Christian Heimes510711d2008-01-30 11:57:58 +0000334 def test_join(self):
335 self.assertEqual(self.type2test(b"").join([]), b"")
336 self.assertEqual(self.type2test(b"").join([b""]), b"")
337 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
338 lst = list(map(self.type2test, lst))
339 self.assertEqual(self.type2test(b"").join(lst), b"abc")
340 self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
341 self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200342 dot_join = self.type2test(b".:").join
343 self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
344 self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
345 self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
346 self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
347 self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
348 # Stress it with many items
349 seq = [b"abc"] * 1000
350 expected = b"abc" + b".:abc" * 999
351 self.assertEqual(dot_join(seq), expected)
Benjamin Petersonc31f12d2014-09-28 12:56:42 -0400352 self.assertRaises(TypeError, self.type2test(b" ").join, None)
Antoine Pitroucfc22b42012-10-16 21:07:23 +0200353 # Error handling and cleanup when some item in the middle of the
354 # sequence has the wrong type.
355 with self.assertRaises(TypeError):
356 dot_join([bytearray(b"ab"), "cd", b"ef"])
357 with self.assertRaises(TypeError):
358 dot_join([memoryview(b"ab"), "cd", b"ef"])
Christian Heimes510711d2008-01-30 11:57:58 +0000359
Christian Heimes510711d2008-01-30 11:57:58 +0000360 def test_count(self):
361 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200362 i = 105
363 p = 112
364 w = 119
365
Christian Heimes510711d2008-01-30 11:57:58 +0000366 self.assertEqual(b.count(b'i'), 4)
367 self.assertEqual(b.count(b'ss'), 2)
368 self.assertEqual(b.count(b'w'), 0)
369
Antoine Pitrouac65d962011-10-20 23:54:17 +0200370 self.assertEqual(b.count(i), 4)
371 self.assertEqual(b.count(w), 0)
372
373 self.assertEqual(b.count(b'i', 6), 2)
374 self.assertEqual(b.count(b'p', 6), 2)
375 self.assertEqual(b.count(b'i', 1, 3), 1)
376 self.assertEqual(b.count(b'p', 7, 9), 1)
377
378 self.assertEqual(b.count(i, 6), 2)
379 self.assertEqual(b.count(p, 6), 2)
380 self.assertEqual(b.count(i, 1, 3), 1)
381 self.assertEqual(b.count(p, 7, 9), 1)
382
Christian Heimes510711d2008-01-30 11:57:58 +0000383 def test_startswith(self):
384 b = self.type2test(b'hello')
385 self.assertFalse(self.type2test().startswith(b"anything"))
386 self.assertTrue(b.startswith(b"hello"))
387 self.assertTrue(b.startswith(b"hel"))
388 self.assertTrue(b.startswith(b"h"))
389 self.assertFalse(b.startswith(b"hellow"))
390 self.assertFalse(b.startswith(b"ha"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300391 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300392 b.startswith([b'h'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300393 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300394 self.assertIn('bytes', exc)
395 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000396
397 def test_endswith(self):
398 b = self.type2test(b'hello')
399 self.assertFalse(bytearray().endswith(b"anything"))
400 self.assertTrue(b.endswith(b"hello"))
401 self.assertTrue(b.endswith(b"llo"))
402 self.assertTrue(b.endswith(b"o"))
403 self.assertFalse(b.endswith(b"whello"))
404 self.assertFalse(b.endswith(b"no"))
Ezio Melottif2b3f782011-04-26 06:40:59 +0300405 with self.assertRaises(TypeError) as cm:
Ezio Melottiba42fd52011-04-26 06:09:45 +0300406 b.endswith([b'o'])
Ezio Melottif2b3f782011-04-26 06:40:59 +0300407 exc = str(cm.exception)
Ezio Melottiba42fd52011-04-26 06:09:45 +0300408 self.assertIn('bytes', exc)
409 self.assertIn('tuple', exc)
Christian Heimes510711d2008-01-30 11:57:58 +0000410
411 def test_find(self):
412 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200413 i = 105
414 w = 119
415
Christian Heimes510711d2008-01-30 11:57:58 +0000416 self.assertEqual(b.find(b'ss'), 2)
Christian Heimes510711d2008-01-30 11:57:58 +0000417 self.assertEqual(b.find(b'w'), -1)
418 self.assertEqual(b.find(b'mississippian'), -1)
419
Antoine Pitrouac65d962011-10-20 23:54:17 +0200420 self.assertEqual(b.find(i), 1)
421 self.assertEqual(b.find(w), -1)
422
423 self.assertEqual(b.find(b'ss', 3), 5)
424 self.assertEqual(b.find(b'ss', 1, 7), 2)
425 self.assertEqual(b.find(b'ss', 1, 3), -1)
426
427 self.assertEqual(b.find(i, 6), 7)
428 self.assertEqual(b.find(i, 1, 3), 1)
429 self.assertEqual(b.find(w, 1, 3), -1)
430
Victor Stinnerf8eac002011-12-18 01:17:41 +0100431 for index in (-1, 256, sys.maxsize + 1):
432 self.assertRaisesRegex(
433 ValueError, r'byte must be in range\(0, 256\)',
434 b.find, index)
435
Christian Heimes510711d2008-01-30 11:57:58 +0000436 def test_rfind(self):
437 b = self.type2test(b'mississippi')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200438 i = 105
439 w = 119
440
Christian Heimes510711d2008-01-30 11:57:58 +0000441 self.assertEqual(b.rfind(b'ss'), 5)
Christian Heimes510711d2008-01-30 11:57:58 +0000442 self.assertEqual(b.rfind(b'w'), -1)
443 self.assertEqual(b.rfind(b'mississippian'), -1)
444
Antoine Pitrouac65d962011-10-20 23:54:17 +0200445 self.assertEqual(b.rfind(i), 10)
446 self.assertEqual(b.rfind(w), -1)
447
448 self.assertEqual(b.rfind(b'ss', 3), 5)
449 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
450
451 self.assertEqual(b.rfind(i, 1, 3), 1)
452 self.assertEqual(b.rfind(i, 3, 9), 7)
453 self.assertEqual(b.rfind(w, 1, 3), -1)
454
Christian Heimes510711d2008-01-30 11:57:58 +0000455 def test_index(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200456 b = self.type2test(b'mississippi')
457 i = 105
458 w = 119
459
460 self.assertEqual(b.index(b'ss'), 2)
461 self.assertRaises(ValueError, b.index, b'w')
462 self.assertRaises(ValueError, b.index, b'mississippian')
463
464 self.assertEqual(b.index(i), 1)
465 self.assertRaises(ValueError, b.index, w)
466
467 self.assertEqual(b.index(b'ss', 3), 5)
468 self.assertEqual(b.index(b'ss', 1, 7), 2)
469 self.assertRaises(ValueError, b.index, b'ss', 1, 3)
470
471 self.assertEqual(b.index(i, 6), 7)
472 self.assertEqual(b.index(i, 1, 3), 1)
473 self.assertRaises(ValueError, b.index, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000474
475 def test_rindex(self):
Antoine Pitrouac65d962011-10-20 23:54:17 +0200476 b = self.type2test(b'mississippi')
477 i = 105
478 w = 119
479
480 self.assertEqual(b.rindex(b'ss'), 5)
481 self.assertRaises(ValueError, b.rindex, b'w')
482 self.assertRaises(ValueError, b.rindex, b'mississippian')
483
484 self.assertEqual(b.rindex(i), 10)
485 self.assertRaises(ValueError, b.rindex, w)
486
487 self.assertEqual(b.rindex(b'ss', 3), 5)
488 self.assertEqual(b.rindex(b'ss', 0, 6), 2)
489
490 self.assertEqual(b.rindex(i, 1, 3), 1)
491 self.assertEqual(b.rindex(i, 3, 9), 7)
492 self.assertRaises(ValueError, b.rindex, w, 1, 3)
Christian Heimes510711d2008-01-30 11:57:58 +0000493
Ethan Furmanb95b5612015-01-23 20:05:18 -0800494 def test_mod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300495 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800496 orig = b
497 b = b % b'world'
498 self.assertEqual(b, b'hello, world!')
499 self.assertEqual(orig, b'hello, %b!')
500 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300501 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800502 a = b % (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200503 self.assertEqual(a, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200504 self.assertIs(type(a), self.type2test)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800505
506 def test_imod(self):
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300507 b = self.type2test(b'hello, %b!')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800508 orig = b
509 b %= b'world'
510 self.assertEqual(b, b'hello, world!')
511 self.assertEqual(orig, b'hello, %b!')
512 self.assertFalse(b is orig)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300513 b = self.type2test(b'%s / 100 = %d%%')
Ethan Furmanb95b5612015-01-23 20:05:18 -0800514 b %= (b'seventy-nine', 79)
Serhiy Storchaka4e1942b2015-01-26 09:28:11 +0200515 self.assertEqual(b, b'seventy-nine / 100 = 79%')
Victor Stinnere914d412016-04-15 17:52:27 +0200516 self.assertIs(type(b), self.type2test)
Serhiy Storchakac9a59e62016-04-15 14:11:10 +0300517
518 def test_rmod(self):
519 with self.assertRaises(TypeError):
520 object() % self.type2test(b'abc')
521 self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
Ethan Furmanb95b5612015-01-23 20:05:18 -0800522
Christian Heimes510711d2008-01-30 11:57:58 +0000523 def test_replace(self):
524 b = self.type2test(b'mississippi')
525 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
526 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
527
Christian Heimes510711d2008-01-30 11:57:58 +0000528 def test_split_string_error(self):
529 self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
530
Antoine Pitrouf8453022010-01-12 22:05:42 +0000531 def test_split_unicodewhitespace(self):
Martin Panter0d0db6c2016-04-10 08:45:26 +0000532 for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
533 b = self.type2test(b)
534 self.assertEqual(b.split(), [b])
Antoine Pitrouf8453022010-01-12 22:05:42 +0000535 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
536 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
537
Christian Heimes510711d2008-01-30 11:57:58 +0000538 def test_rsplit_string_error(self):
539 self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
540
541 def test_rsplit_unicodewhitespace(self):
542 b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
Christian Heimes510711d2008-01-30 11:57:58 +0000543 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
544
545 def test_partition(self):
546 b = self.type2test(b'mississippi')
547 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000548 self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
Christian Heimes510711d2008-01-30 11:57:58 +0000549
550 def test_rpartition(self):
551 b = self.type2test(b'mississippi')
552 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
553 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
Antoine Pitrouf8453022010-01-12 22:05:42 +0000554 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
Christian Heimes510711d2008-01-30 11:57:58 +0000555
556 def test_pickling(self):
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +0000557 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Christian Heimes510711d2008-01-30 11:57:58 +0000558 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
559 b = self.type2test(b)
560 ps = pickle.dumps(b, proto)
561 q = pickle.loads(ps)
562 self.assertEqual(b, q)
563
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000564 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200565 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
566 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
567 it = itorg = iter(self.type2test(b))
568 data = list(self.type2test(b))
569 d = pickle.dumps(it, proto)
570 it = pickle.loads(d)
571 self.assertEqual(type(itorg), type(it))
572 self.assertEqual(list(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000573
Serhiy Storchakabad12572014-12-15 14:03:42 +0200574 it = pickle.loads(d)
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200575 if not b:
Serhiy Storchakabad12572014-12-15 14:03:42 +0200576 continue
Serhiy Storchakaaabafe72016-03-06 14:10:24 +0200577 next(it)
Serhiy Storchakabad12572014-12-15 14:03:42 +0200578 d = pickle.dumps(it, proto)
579 it = pickle.loads(d)
580 self.assertEqual(list(it), data[1:])
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000581
Christian Heimes510711d2008-01-30 11:57:58 +0000582 def test_strip_bytearray(self):
583 self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
584 self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
585 self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
586
587 def test_strip_string_error(self):
588 self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
589 self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
590 self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
591
Eli Bendersky906b88f2011-07-29 07:05:08 +0300592 def test_center(self):
593 # Fill character can be either bytes or bytearray (issue 12380)
594 b = self.type2test(b'abc')
595 for fill_type in (bytes, bytearray):
596 self.assertEqual(b.center(7, fill_type(b'-')),
597 self.type2test(b'--abc--'))
598
599 def test_ljust(self):
600 # Fill character can be either bytes or bytearray (issue 12380)
601 b = self.type2test(b'abc')
602 for fill_type in (bytes, bytearray):
603 self.assertEqual(b.ljust(7, fill_type(b'-')),
604 self.type2test(b'abc----'))
605
606 def test_rjust(self):
607 # Fill character can be either bytes or bytearray (issue 12380)
608 b = self.type2test(b'abc')
609 for fill_type in (bytes, bytearray):
610 self.assertEqual(b.rjust(7, fill_type(b'-')),
611 self.type2test(b'----abc'))
612
Christian Heimes510711d2008-01-30 11:57:58 +0000613 def test_ord(self):
614 b = self.type2test(b'\0A\x7f\x80\xff')
615 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
616 [0, 65, 127, 128, 255])
617
Georg Brandlabc38772009-04-12 15:51:51 +0000618 def test_maketrans(self):
619 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 +0000620 self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
Antoine Pitrou403ce782009-10-14 17:14:16 +0000621 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'
622 self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
Georg Brandlabc38772009-04-12 15:51:51 +0000623 self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
624 self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
625
Jesus Ceaac451502011-04-20 17:09:23 +0200626 def test_none_arguments(self):
627 # issue 11828
628 b = self.type2test(b'hello')
629 l = self.type2test(b'l')
630 h = self.type2test(b'h')
631 x = self.type2test(b'x')
632 o = self.type2test(b'o')
633
634 self.assertEqual(2, b.find(l, None))
635 self.assertEqual(3, b.find(l, -2, None))
636 self.assertEqual(2, b.find(l, None, -2))
637 self.assertEqual(0, b.find(h, None, None))
638
639 self.assertEqual(3, b.rfind(l, None))
640 self.assertEqual(3, b.rfind(l, -2, None))
641 self.assertEqual(2, b.rfind(l, None, -2))
642 self.assertEqual(0, b.rfind(h, None, None))
643
644 self.assertEqual(2, b.index(l, None))
645 self.assertEqual(3, b.index(l, -2, None))
646 self.assertEqual(2, b.index(l, None, -2))
647 self.assertEqual(0, b.index(h, None, None))
648
649 self.assertEqual(3, b.rindex(l, None))
650 self.assertEqual(3, b.rindex(l, -2, None))
651 self.assertEqual(2, b.rindex(l, None, -2))
652 self.assertEqual(0, b.rindex(h, None, None))
653
654 self.assertEqual(2, b.count(l, None))
655 self.assertEqual(1, b.count(l, -2, None))
656 self.assertEqual(1, b.count(l, None, -2))
657 self.assertEqual(0, b.count(x, None, None))
658
659 self.assertEqual(True, b.endswith(o, None))
660 self.assertEqual(True, b.endswith(o, -2, None))
661 self.assertEqual(True, b.endswith(l, None, -2))
662 self.assertEqual(False, b.endswith(x, None, None))
663
664 self.assertEqual(True, b.startswith(h, None))
665 self.assertEqual(True, b.startswith(l, -2, None))
666 self.assertEqual(True, b.startswith(h, None, -2))
667 self.assertEqual(False, b.startswith(x, None, None))
668
Antoine Pitrouac65d962011-10-20 23:54:17 +0200669 def test_integer_arguments_out_of_byte_range(self):
670 b = self.type2test(b'hello')
671
672 for method in (b.count, b.find, b.index, b.rfind, b.rindex):
673 self.assertRaises(ValueError, method, -1)
674 self.assertRaises(ValueError, method, 256)
675 self.assertRaises(ValueError, method, 9999)
676
Jesus Ceaac451502011-04-20 17:09:23 +0200677 def test_find_etc_raise_correct_error_messages(self):
678 # issue 11828
679 b = self.type2test(b'hello')
680 x = self.type2test(b'x')
Ezio Melottiaf928422011-04-20 21:56:21 +0300681 self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
Jesus Ceaac451502011-04-20 17:09:23 +0200682 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300683 self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +0200684 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300685 self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
Jesus Ceaac451502011-04-20 17:09:23 +0200686 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300687 self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +0200688 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300689 self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
Jesus Ceaac451502011-04-20 17:09:23 +0200690 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300691 self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200692 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +0300693 self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +0200694 x, None, None, None)
695
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +0300696 def test_free_after_iterating(self):
697 test.support.check_free_after_iterating(self, iter, self.type2test)
698 test.support.check_free_after_iterating(self, reversed, self.type2test)
699
Martin Panter1b6c6da2016-08-27 08:35:02 +0000700 def test_translate(self):
701 b = self.type2test(b'hello')
702 rosetta = bytearray(range(256))
703 rosetta[ord('o')] = ord('e')
704
705 self.assertRaises(TypeError, b.translate)
706 self.assertRaises(TypeError, b.translate, None, None)
707 self.assertRaises(ValueError, b.translate, bytes(range(255)))
708
709 c = b.translate(rosetta, b'hello')
710 self.assertEqual(b, b'hello')
711 self.assertIsInstance(c, self.type2test)
712
713 c = b.translate(rosetta)
714 d = b.translate(rosetta, b'')
715 self.assertEqual(c, d)
716 self.assertEqual(c, b'helle')
717
718 c = b.translate(rosetta, b'l')
719 self.assertEqual(c, b'hee')
720 c = b.translate(None, b'e')
721 self.assertEqual(c, b'hllo')
722
723 # test delete as a keyword argument
724 c = b.translate(rosetta, delete=b'')
725 self.assertEqual(c, b'helle')
726 c = b.translate(rosetta, delete=b'l')
727 self.assertEqual(c, b'hee')
728 c = b.translate(None, delete=b'e')
729 self.assertEqual(c, b'hllo')
730
Christian Heimes510711d2008-01-30 11:57:58 +0000731
Ezio Melotti0dceb562013-01-10 07:43:26 +0200732class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000733 type2test = bytes
734
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400735 def test_getitem_error(self):
736 msg = "byte indices must be integers or slices"
737 with self.assertRaisesRegex(TypeError, msg):
738 b'python'['a']
739
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000740 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200741 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000742 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000743 self.assertRaises(TypeError, f.readinto, b"")
744
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000745 def test_custom(self):
746 class A:
747 def __bytes__(self):
748 return b'abc'
749 self.assertEqual(bytes(A()), b'abc')
750 class A: pass
751 self.assertRaises(TypeError, bytes, A())
752 class A:
753 def __bytes__(self):
754 return None
755 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600756 class A:
757 def __bytes__(self):
758 return b'a'
759 def __index__(self):
760 return 42
761 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200762 # Issue #25766
763 class A(str):
764 def __bytes__(self):
765 return b'abc'
766 self.assertEqual(bytes(A('\u20ac')), b'abc')
767 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200768 # Issue #24731
769 class A:
770 def __bytes__(self):
771 return OtherBytesSubclass(b'abc')
772 self.assertEqual(bytes(A()), b'abc')
773 self.assertIs(type(bytes(A())), OtherBytesSubclass)
774 self.assertEqual(BytesSubclass(A()), b'abc')
775 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000776
Victor Stinner29e762c2011-01-05 03:33:28 +0000777 # Test PyBytes_FromFormat()
778 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200779 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200780 _testcapi = test.support.import_module('_testcapi')
781 from ctypes import pythonapi, py_object
782 from ctypes import (
783 c_int, c_uint,
784 c_long, c_ulong,
785 c_size_t, c_ssize_t,
786 c_char_p)
787
Victor Stinner29e762c2011-01-05 03:33:28 +0000788 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
789 PyBytes_FromFormat.restype = py_object
790
Victor Stinner03dab782015-10-14 00:21:35 +0200791 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000792 self.assertEqual(PyBytes_FromFormat(b'format'),
793 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200794 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
795 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000796
Victor Stinner03dab782015-10-14 00:21:35 +0200797 # test formatters
798 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
799 b'c=\0')
800 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
801 b'c=@')
802 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
803 b'c=\xff')
804 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
805 c_int(1), c_long(2),
806 c_size_t(3)),
807 b'd=1 ld=2 zd=3')
808 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
809 c_int(-1), c_long(-2),
810 c_size_t(-3)),
811 b'd=-1 ld=-2 zd=-3')
812 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
813 c_uint(123), c_ulong(456),
814 c_size_t(789)),
815 b'u=123 lu=456 zu=789')
816 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
817 b'i=123')
818 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
819 b'i=-123')
820 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
821 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200822
823 sizeof_ptr = ctypes.sizeof(c_char_p)
824
825 if os.name == 'nt':
826 # Windows (MSCRT)
827 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
828 def ptr_formatter(ptr):
829 return (ptr_format % ptr)
830 else:
831 # UNIX (glibc)
832 def ptr_formatter(ptr):
833 return '%#x' % ptr
834
Victor Stinner7ab986d2015-10-14 02:55:12 +0200835 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200836 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
837 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200838 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
839 b's=cstr')
840
841 # test minimum and maximum integer values
842 size_max = c_size_t(-1).value
843 for formatstr, ctypes_type, value, py_formatter in (
844 (b'%d', c_int, _testcapi.INT_MIN, str),
845 (b'%d', c_int, _testcapi.INT_MAX, str),
846 (b'%ld', c_long, _testcapi.LONG_MIN, str),
847 (b'%ld', c_long, _testcapi.LONG_MAX, str),
848 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
849 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
850 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
851 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200852 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200853 ):
854 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
855 py_formatter(value).encode('ascii')),
856
857 # width and precision (width is currently ignored)
858 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
859 b'a')
860 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
861 b'abc')
862
863 # '%%' formatter
864 self.assertEqual(PyBytes_FromFormat(b'%%'),
865 b'%')
866 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
867 b'[%]')
868 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
869 b'%_')
870 self.assertEqual(PyBytes_FromFormat(b'%%s'),
871 b'%s')
872
873 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000874 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200875 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
876 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000877
Victor Stinner03dab782015-10-14 00:21:35 +0200878 # Issue #19969: %c must raise OverflowError for values
879 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100880 self.assertRaises(OverflowError,
881 PyBytes_FromFormat, b'%c', c_int(-1))
882 self.assertRaises(OverflowError,
883 PyBytes_FromFormat, b'%c', c_int(256))
884
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700885 def test_bytes_blocking(self):
886 class IterationBlocked(list):
887 __bytes__ = None
888 i = [0, 1, 2, 3]
889 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
890 self.assertRaises(TypeError, bytes, IterationBlocked(i))
891
892 # At least in CPython, because bytes.__new__ and the C API
893 # PyBytes_FromObject have different fallback rules, integer
894 # fallback is handled specially, so test separately.
895 class IntBlocked(int):
896 __bytes__ = None
897 self.assertEqual(bytes(3), b'\0\0\0')
898 self.assertRaises(TypeError, bytes, IntBlocked(3))
899
900 # While there is no separately-defined rule for handling bytes
901 # subclasses differently from other buffer-interface classes,
902 # an implementation may well special-case them (as CPython 2.x
903 # str did), so test them separately.
904 class BytesSubclassBlocked(bytes):
905 __bytes__ = None
906 self.assertEqual(bytes(b'ab'), b'ab')
907 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
908
909 class BufferBlocked(bytearray):
910 __bytes__ = None
911 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
912 self.assertEqual(bytes(ba), b'ab')
913 self.assertRaises(TypeError, bytes, bb)
914
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000915
Ezio Melotti0dceb562013-01-10 07:43:26 +0200916class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000917 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000918
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400919 def test_getitem_error(self):
920 msg = "bytearray indices must be integers or slices"
921 with self.assertRaisesRegex(TypeError, msg):
922 bytearray(b'python')['a']
923
924 def test_setitem_error(self):
925 msg = "bytearray indices must be integers or slices"
926 with self.assertRaisesRegex(TypeError, msg):
927 b = bytearray(b'python')
928 b['a'] = "python"
929
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000930 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000931 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000932
Guido van Rossum254348e2007-11-21 19:29:53 +0000933 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000934 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000935 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000936 tfn = tempfile.mktemp()
937 try:
938 # Prepare
939 with open(tfn, "wb") as f:
940 f.write(short_sample)
941 # Test readinto
942 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000943 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000944 n = f.readinto(b)
945 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000946 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000947 # Test writing in binary mode
948 with open(tfn, "wb") as f:
949 f.write(b)
950 with open(tfn, "rb") as f:
951 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000952 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000953 finally:
954 try:
955 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200956 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000957 pass
958
Neal Norwitz6968b052007-02-27 19:02:19 +0000959 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000960 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000961 self.assertEqual(b.reverse(), None)
962 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000963 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000964 b.reverse()
965 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000966 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000967 b.reverse()
968 self.assertFalse(b)
969
Eli Bendersky4db28d32011-03-03 18:21:02 +0000970 def test_clear(self):
971 b = bytearray(b'python')
972 b.clear()
973 self.assertEqual(b, b'')
974
975 b = bytearray(b'')
976 b.clear()
977 self.assertEqual(b, b'')
978
979 b = bytearray(b'')
980 b.append(ord('r'))
981 b.clear()
982 b.append(ord('p'))
983 self.assertEqual(b, b'p')
984
985 def test_copy(self):
986 b = bytearray(b'abc')
987 bb = b.copy()
988 self.assertEqual(bb, b'abc')
989
990 b = bytearray(b'')
991 bb = b.copy()
992 self.assertEqual(bb, b'')
993
994 # test that it's indeed a copy and not a reference
995 b = bytearray(b'abc')
996 bb = b.copy()
997 self.assertEqual(b, bb)
998 self.assertIsNot(b, bb)
999 bb.append(ord('d'))
1000 self.assertEqual(bb, b'abcd')
1001 self.assertEqual(b, b'abc')
1002
Guido van Rossumd624f182006-04-24 13:47:05 +00001003 def test_regexps(self):
1004 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +00001005 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +00001006 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +00001007 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +00001008
1009 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001010 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +00001011 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +00001012 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001013 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +00001014 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001015 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +00001016 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001017 try:
1018 b[3] = 0
1019 self.fail("Didn't raise IndexError")
1020 except IndexError:
1021 pass
1022 try:
1023 b[-10] = 0
1024 self.fail("Didn't raise IndexError")
1025 except IndexError:
1026 pass
1027 try:
1028 b[0] = 256
1029 self.fail("Didn't raise ValueError")
1030 except ValueError:
1031 pass
1032 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001033 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +00001034 self.fail("Didn't raise ValueError")
1035 except ValueError:
1036 pass
1037 try:
1038 b[0] = None
1039 self.fail("Didn't raise TypeError")
1040 except TypeError:
1041 pass
1042
1043 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001044 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001045 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001046 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001047 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001048 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001049 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001050 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001051
1052 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001053 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001054 self.assertEqual(list(b), list(range(10)))
1055
Guido van Rossum254348e2007-11-21 19:29:53 +00001056 b[0:5] = bytearray([1, 1, 1, 1, 1])
1057 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001058
1059 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001060 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001061
Guido van Rossum254348e2007-11-21 19:29:53 +00001062 b[0:0] = bytearray([0, 1, 2, 3, 4])
1063 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001064
Guido van Rossum254348e2007-11-21 19:29:53 +00001065 b[-7:-3] = bytearray([100, 101])
1066 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001067
1068 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001069 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001070
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001071 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001072 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 +00001073
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001074 b[3:] = b'foo'
1075 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1076
1077 b[:3] = memoryview(b'foo')
1078 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1079
1080 b[3:4] = []
1081 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1082
1083 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1084 ['a', 'b'], [b'a', b'b'], [[]]]:
1085 with self.assertRaises(TypeError):
1086 b[3:4] = elem
1087
1088 for elem in [[254, 255, 256], [-256, 9000]]:
1089 with self.assertRaises(ValueError):
1090 b[3:4] = elem
1091
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001092 def test_setslice_extend(self):
1093 # Exercise the resizing logic (see issue #19087)
1094 b = bytearray(range(100))
1095 self.assertEqual(list(b), list(range(100)))
1096 del b[:10]
1097 self.assertEqual(list(b), list(range(10, 100)))
1098 b.extend(range(100, 110))
1099 self.assertEqual(list(b), list(range(10, 110)))
1100
Antoine Pitrou25454112015-05-19 20:52:27 +02001101 def test_fifo_overrun(self):
1102 # Test for issue #23985, a buffer overrun when implementing a FIFO
1103 # Build Python in pydebug mode for best results.
1104 b = bytearray(10)
1105 b.pop() # Defeat expanding buffer off-by-one quirk
1106 del b[:1] # Advance start pointer without reallocating
1107 b += bytes(2) # Append exactly the number of deleted bytes
1108 del b # Free memory buffer, allowing pydebug verification
1109
1110 def test_del_expand(self):
1111 # Reducing the size should not expand the buffer (issue #23985)
1112 b = bytearray(10)
1113 size = sys.getsizeof(b)
1114 del b[:1]
1115 self.assertLessEqual(sys.getsizeof(b), size)
1116
Thomas Wouters376446d2006-12-19 08:30:14 +00001117 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001118 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001119 for start in indices:
1120 for stop in indices:
1121 # Skip invalid step 0
1122 for step in indices[1:]:
1123 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001124 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001125 # Make sure we have a slice of exactly the right length,
1126 # but with different data.
1127 data = L[start:stop:step]
1128 data.reverse()
1129 L[start:stop:step] = data
1130 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001131 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001132
Thomas Wouters376446d2006-12-19 08:30:14 +00001133 del L[start:stop:step]
1134 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001135 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001136
Guido van Rossumd624f182006-04-24 13:47:05 +00001137 def test_setslice_trap(self):
1138 # This test verifies that we correctly handle assigning self
1139 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001140 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001141 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001142 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001143
Guido van Rossum13e57212006-04-27 22:54:26 +00001144 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001145 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001146 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001147 b += b"def"
1148 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001149 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001150 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001151 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001152 self.assertEqual(b, b"abcdefxyz")
1153 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001154 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001155 except TypeError:
1156 pass
1157 else:
1158 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001159
1160 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001161 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001162 b1 = b
1163 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001164 self.assertEqual(b, b"abcabcabc")
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
1168 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001169 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001170 b1 = b
1171 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001172 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001173 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001174 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001175
Guido van Rossum20188312006-05-05 15:15:40 +00001176 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001177 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001178 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001179 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001180 seq = [alloc]
1181 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001182 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001183 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001184 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001185 if alloc not in seq:
1186 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001187
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001188 def test_init_alloc(self):
1189 b = bytearray()
1190 def g():
1191 for i in range(1, 100):
1192 yield i
1193 a = list(b)
1194 self.assertEqual(a, list(range(1, len(a)+1)))
1195 self.assertEqual(len(b), len(a))
1196 self.assertLessEqual(len(b), i)
1197 alloc = b.__alloc__()
1198 self.assertGreater(alloc, len(b)) # including trailing null byte
1199 b.__init__(g())
1200 self.assertEqual(list(b), list(range(1, 100)))
1201 self.assertEqual(len(b), 99)
1202 alloc = b.__alloc__()
1203 self.assertGreater(alloc, len(b))
1204
Neal Norwitz6968b052007-02-27 19:02:19 +00001205 def test_extend(self):
1206 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001207 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001208 a.extend(a)
1209 self.assertEqual(a, orig + orig)
1210 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001211 a = bytearray(b'')
1212 # Test iterators that don't have a __length_hint__
1213 a.extend(map(int, orig * 25))
1214 a.extend(int(x) for x in orig * 25)
1215 self.assertEqual(a, orig * 50)
1216 self.assertEqual(a[-5:], orig)
1217 a = bytearray(b'')
1218 a.extend(iter(map(int, orig * 50)))
1219 self.assertEqual(a, orig * 50)
1220 self.assertEqual(a[-5:], orig)
1221 a = bytearray(b'')
1222 a.extend(list(map(int, orig * 50)))
1223 self.assertEqual(a, orig * 50)
1224 self.assertEqual(a[-5:], orig)
1225 a = bytearray(b'')
1226 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1227 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1228 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001229 a = bytearray(b'')
1230 a.extend([Indexable(ord('a'))])
1231 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001232
Neal Norwitz6968b052007-02-27 19:02:19 +00001233 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001234 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001235 b.remove(ord('l'))
1236 self.assertEqual(b, b'helo')
1237 b.remove(ord('l'))
1238 self.assertEqual(b, b'heo')
1239 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1240 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001241 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001242 # remove first and last
1243 b.remove(ord('o'))
1244 b.remove(ord('h'))
1245 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001246 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001247 b.remove(Indexable(ord('e')))
1248 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001249
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001250 # test values outside of the ascii range: (0, 127)
1251 c = bytearray([126, 127, 128, 129])
1252 c.remove(127)
1253 self.assertEqual(c, bytes([126, 128, 129]))
1254 c.remove(129)
1255 self.assertEqual(c, bytes([126, 128]))
1256
Neal Norwitz6968b052007-02-27 19:02:19 +00001257 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001258 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001259 self.assertEqual(b.pop(), ord('d'))
1260 self.assertEqual(b.pop(0), ord('w'))
1261 self.assertEqual(b.pop(-2), ord('r'))
1262 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001263 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001264 # test for issue #6846
1265 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001266
1267 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001268 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001269
Neal Norwitz6968b052007-02-27 19:02:19 +00001270 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001271 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001272 b.append(ord('o'))
1273 self.assertEqual(b, b'hello')
1274 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001275 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001276 b.append(ord('A'))
1277 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001278 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001279 b = bytearray()
1280 b.append(Indexable(ord('A')))
1281 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001282
1283 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001284 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001285 b.insert(1, ord('i'))
1286 b.insert(4, ord('i'))
1287 b.insert(-2, ord('i'))
1288 b.insert(1000, ord('i'))
1289 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001290 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001291 b = bytearray()
1292 b.insert(0, Indexable(ord('A')))
1293 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001294
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001295 def test_copied(self):
1296 # Issue 4348. Make sure that operations that don't mutate the array
1297 # copy the bytes.
1298 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001299 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001300
1301 t = bytearray([i for i in range(256)])
1302 x = bytearray(b'')
1303 self.assertFalse(x is x.translate(t))
1304
Guido van Rossum254348e2007-11-21 19:29:53 +00001305 def test_partition_bytearray_doesnt_share_nullstring(self):
1306 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001307 self.assertEqual(b, b"")
1308 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001309 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001310 b += b"!"
1311 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001312 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001313 self.assertEqual(b, b"")
1314 self.assertEqual(c, b"")
1315 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001316 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001317 self.assertEqual(b, b"")
1318 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001319 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001320 b += b"!"
1321 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001322 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001323 self.assertEqual(b, b"")
1324 self.assertEqual(c, b"")
1325
Antoine Pitrou5504e892008-12-06 21:27:53 +00001326 def test_resize_forbidden(self):
1327 # #4509: can't resize a bytearray when there are buffer exports, even
1328 # if it wouldn't reallocate the underlying buffer.
1329 # Furthermore, no destructive changes to the buffer may be applied
1330 # before raising the error.
1331 b = bytearray(range(10))
1332 v = memoryview(b)
1333 def resize(n):
1334 b[1:-1] = range(n + 1, 2*n - 1)
1335 resize(10)
1336 orig = b[:]
1337 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001338 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001339 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001340 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001341 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001342 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001343 # Other operations implying resize
1344 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001345 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001346 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001347 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001348 def delitem():
1349 del b[1]
1350 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001351 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001352 # deleting a non-contiguous slice
1353 def delslice():
1354 b[1:-1:2] = b""
1355 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001356 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001357
Stefan Krah650c1e82015-02-03 21:43:23 +01001358 @test.support.cpython_only
1359 def test_obsolete_write_lock(self):
1360 from _testcapi import getbuffer_with_null_view
1361 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001362
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001363 def test_iterator_pickling2(self):
1364 orig = bytearray(b'abc')
1365 data = list(b'qwerty')
1366 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1367 # initial iterator
1368 itorig = iter(orig)
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)
1374
1375 # running iterator
1376 next(itorig)
1377 d = pickle.dumps((itorig, orig), proto)
1378 it, b = pickle.loads(d)
1379 b[:] = data
1380 self.assertEqual(type(it), type(itorig))
1381 self.assertEqual(list(it), data[1:])
1382
1383 # empty iterator
1384 for i in range(1, len(orig)):
1385 next(itorig)
1386 d = pickle.dumps((itorig, orig), proto)
1387 it, b = pickle.loads(d)
1388 b[:] = data
1389 self.assertEqual(type(it), type(itorig))
1390 self.assertEqual(list(it), data[len(orig):])
1391
1392 # exhausted iterator
1393 self.assertRaises(StopIteration, next, itorig)
1394 d = pickle.dumps((itorig, orig), proto)
1395 it, b = pickle.loads(d)
1396 b[:] = data
1397 self.assertEqual(list(it), [])
1398
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001399 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001400
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001401 def test_iterator_length_hint(self):
1402 # Issue 27443: __length_hint__ can return negative integer
1403 ba = bytearray(b'ab')
1404 it = iter(ba)
1405 next(it)
1406 ba.clear()
1407 # Shouldn't raise an error
1408 self.assertEqual(list(it), [])
1409
1410
Christian Heimes510711d2008-01-30 11:57:58 +00001411class AssortedBytesTest(unittest.TestCase):
1412 #
1413 # Test various combinations of bytes and bytearray
1414 #
1415
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001416 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001417 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001418 for f in str, repr:
1419 self.assertEqual(f(bytearray()), "bytearray(b'')")
1420 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1421 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1422 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1423 self.assertEqual(f(b"abc"), "b'abc'")
1424 self.assertEqual(f(b"'"), '''b"'"''') # '''
1425 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001426
Serhiy Storchakad1af5ef2016-10-30 19:33:54 +02001427 @check_bytes_warnings
1428 def test_format(self):
1429 for b in b'abc', bytearray(b'abc'):
1430 self.assertEqual(format(b), str(b))
1431 self.assertEqual(format(b, ''), str(b))
1432 with self.assertRaisesRegex(TypeError,
1433 r'\b%s\b' % re.escape(type(b).__name__)):
1434 format(b, 's')
1435
Christian Heimes510711d2008-01-30 11:57:58 +00001436 def test_compare_bytes_to_bytearray(self):
1437 self.assertEqual(b"abc" == bytes(b"abc"), True)
1438 self.assertEqual(b"ab" != bytes(b"abc"), True)
1439 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1440 self.assertEqual(b"ab" < bytes(b"abc"), True)
1441 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1442 self.assertEqual(b"abc" > bytes(b"ab"), True)
1443
1444 self.assertEqual(b"abc" != bytes(b"abc"), False)
1445 self.assertEqual(b"ab" == bytes(b"abc"), False)
1446 self.assertEqual(b"ab" > bytes(b"abc"), False)
1447 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1448 self.assertEqual(b"abc" < bytes(b"ab"), False)
1449 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1450
1451 self.assertEqual(bytes(b"abc") == b"abc", True)
1452 self.assertEqual(bytes(b"ab") != b"abc", True)
1453 self.assertEqual(bytes(b"ab") <= b"abc", True)
1454 self.assertEqual(bytes(b"ab") < b"abc", True)
1455 self.assertEqual(bytes(b"abc") >= b"ab", True)
1456 self.assertEqual(bytes(b"abc") > b"ab", True)
1457
1458 self.assertEqual(bytes(b"abc") != b"abc", False)
1459 self.assertEqual(bytes(b"ab") == b"abc", False)
1460 self.assertEqual(bytes(b"ab") > b"abc", False)
1461 self.assertEqual(bytes(b"ab") >= b"abc", False)
1462 self.assertEqual(bytes(b"abc") < b"ab", False)
1463 self.assertEqual(bytes(b"abc") <= b"ab", False)
1464
Stefan Krah6e572b82013-01-26 13:06:36 +01001465 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001466 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001467 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001468 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001469 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001470 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001471
1472 def test_from_bytearray(self):
1473 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1474 buf = memoryview(sample)
1475 b = bytearray(buf)
1476 self.assertEqual(b, bytearray(sample))
1477
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001478 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001479 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001480 self.assertEqual(str(b''), "b''")
1481 self.assertEqual(str(b'x'), "b'x'")
1482 self.assertEqual(str(b'\x80'), "b'\\x80'")
1483 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1484 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1485 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001486
1487 def test_literal(self):
1488 tests = [
1489 (b"Wonderful spam", "Wonderful spam"),
1490 (br"Wonderful spam too", "Wonderful spam too"),
1491 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1492 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1493 ]
1494 for b, s in tests:
1495 self.assertEqual(b, bytearray(s, 'latin-1'))
1496 for c in range(128, 256):
1497 self.assertRaises(SyntaxError, eval,
1498 'b"%s"' % chr(c))
1499
Christian Heimes510711d2008-01-30 11:57:58 +00001500 def test_split_bytearray(self):
1501 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1502
1503 def test_rsplit_bytearray(self):
1504 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1505
Georg Brandleb2c9642008-05-30 12:05:02 +00001506 def test_return_self(self):
1507 # bytearray.replace must always return a new bytearray
1508 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001509 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001510
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001511 @unittest.skipUnless(sys.flags.bytes_warning,
1512 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001513 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001514 def bytes_warning():
1515 return test.support.check_warnings(('', BytesWarning))
1516 with bytes_warning():
1517 b'' == ''
1518 with bytes_warning():
1519 '' == b''
1520 with bytes_warning():
1521 b'' != ''
1522 with bytes_warning():
1523 '' != b''
1524 with bytes_warning():
1525 bytearray(b'') == ''
1526 with bytes_warning():
1527 '' == bytearray(b'')
1528 with bytes_warning():
1529 bytearray(b'') != ''
1530 with bytes_warning():
1531 '' != bytearray(b'')
1532 with bytes_warning():
1533 b'\0' == 0
1534 with bytes_warning():
1535 0 == b'\0'
1536 with bytes_warning():
1537 b'\0' != 0
1538 with bytes_warning():
1539 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001540
Guido van Rossumd624f182006-04-24 13:47:05 +00001541 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001542 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001543 # __reversed__? (optimization)
1544
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001545 # XXX More string methods? (Those that don't use character properties)
1546
Neal Norwitz6968b052007-02-27 19:02:19 +00001547 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001548 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001549 # Unfortunately they are all bundled with tests that
1550 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001551
Guido van Rossum254348e2007-11-21 19:29:53 +00001552 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001553 # the rest that make sense (the code can be cleaned up to use modern
1554 # unittest methods at the same time).
1555
Martin Panter152a19c2016-04-06 06:37:17 +00001556class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001557 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001558 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001559
1560 def test_returns_new_copy(self):
1561 val = self.marshal(b'1234')
1562 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001563 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001564 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1565 method = getattr(val, methname)
1566 newval = method(3)
1567 self.assertEqual(val, newval)
1568 self.assertTrue(val is not newval,
1569 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001570 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1571 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1572 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1573 newval = eval(expr)
1574 self.assertEqual(val, newval)
1575 self.assertTrue(val is not newval,
1576 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001577 sep = self.marshal(b'')
1578 newval = sep.join([val])
1579 self.assertEqual(val, newval)
1580 self.assertIsNot(val, newval)
1581
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001582
Christian Heimes510711d2008-01-30 11:57:58 +00001583class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001584 def fixtype(self, obj):
1585 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001586 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001587 return super().fixtype(obj)
1588
Martin Panter152a19c2016-04-06 06:37:17 +00001589 contains_bytes = True
1590
Ezio Melotti0dceb562013-01-10 07:43:26 +02001591class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001592 type2test = bytearray
1593
Ezio Melotti0dceb562013-01-10 07:43:26 +02001594class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001595 type2test = bytes
1596
Georg Brandlc7885542007-03-06 19:16:20 +00001597
Ezio Melotti0dceb562013-01-10 07:43:26 +02001598class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001599
1600 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001601 self.assertTrue(issubclass(self.type2test, self.basetype))
1602 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001603
1604 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001605 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001606
1607 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001608 self.assertTrue(_a == _a)
1609 self.assertTrue(_a != _b)
1610 self.assertTrue(_a < _b)
1611 self.assertTrue(_a <= _b)
1612 self.assertTrue(_b >= _a)
1613 self.assertTrue(_b > _a)
1614 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001615
1616 # test concat of subclass instances
1617 self.assertEqual(a + b, _a + _b)
1618 self.assertEqual(a + b, a + _b)
1619 self.assertEqual(a + b, _a + b)
1620
1621 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001622 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001623
1624 def test_join(self):
1625 # Make sure join returns a NEW object for single item sequences
1626 # involving a subclass.
1627 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001628 s1 = self.type2test(b"abcd")
1629 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001630 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001631 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001632
1633 # Test reverse, calling join on subclass
1634 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001635 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001636
1637 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001638 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001639 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001640 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001641 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001642 b = pickle.loads(pickle.dumps(a, proto))
1643 self.assertNotEqual(id(a), id(b))
1644 self.assertEqual(a, b)
1645 self.assertEqual(a.x, b.x)
1646 self.assertEqual(a.y, b.y)
1647 self.assertEqual(type(a), type(b))
1648 self.assertEqual(type(a.y), type(b.y))
1649
1650 def test_copy(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001651 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001652 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001653 a.y = self.type2test(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001654 for copy_method in (copy.copy, copy.deepcopy):
1655 b = copy_method(a)
1656 self.assertNotEqual(id(a), id(b))
1657 self.assertEqual(a, b)
1658 self.assertEqual(a.x, b.x)
1659 self.assertEqual(a.y, b.y)
1660 self.assertEqual(type(a), type(b))
1661 self.assertEqual(type(a.y), type(b.y))
1662
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001663 def test_fromhex(self):
1664 b = self.type2test.fromhex('1a2B30')
1665 self.assertEqual(b, b'\x1a\x2b\x30')
1666 self.assertIs(type(b), self.type2test)
1667
1668 class B1(self.basetype):
1669 def __new__(cls, value):
1670 me = self.basetype.__new__(cls, value)
1671 me.foo = 'bar'
1672 return me
1673
1674 b = B1.fromhex('1a2B30')
1675 self.assertEqual(b, b'\x1a\x2b\x30')
1676 self.assertIs(type(b), B1)
1677 self.assertEqual(b.foo, 'bar')
1678
1679 class B2(self.basetype):
1680 def __init__(me, *args, **kwargs):
1681 if self.basetype is not bytes:
1682 self.basetype.__init__(me, *args, **kwargs)
1683 me.foo = 'bar'
1684
1685 b = B2.fromhex('1a2B30')
1686 self.assertEqual(b, b'\x1a\x2b\x30')
1687 self.assertIs(type(b), B2)
1688 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001689
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001690
1691class ByteArraySubclass(bytearray):
1692 pass
1693
1694class BytesSubclass(bytes):
1695 pass
1696
Serhiy Storchaka15095802015-11-25 15:47:01 +02001697class OtherBytesSubclass(bytes):
1698 pass
1699
Ezio Melotti0dceb562013-01-10 07:43:26 +02001700class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001701 basetype = bytearray
1702 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001703
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001704 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001705 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001706 def __init__(me, newarg=1, *args, **kwargs):
1707 bytearray.__init__(me, *args, **kwargs)
1708 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001709 x = subclass(4, source=b"abcd")
1710 self.assertEqual(x, b"abcd")
1711 x = subclass(newarg=4, source=b"abcd")
1712 self.assertEqual(x, b"abcd")
1713
1714
Ezio Melotti0dceb562013-01-10 07:43:26 +02001715class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001716 basetype = bytes
1717 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001718
1719
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001720if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001721 unittest.main()