blob: 64644e7ffba67d65edc0a27369f3cd19ef4d4ded [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
Christian Heimes510711d2008-01-30 11:57:58 +0000692
Ezio Melotti0dceb562013-01-10 07:43:26 +0200693class BytesTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000694 type2test = bytes
695
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400696 def test_getitem_error(self):
697 msg = "byte indices must be integers or slices"
698 with self.assertRaisesRegex(TypeError, msg):
699 b'python'['a']
700
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000701 def test_buffer_is_readonly(self):
Victor Stinner76119642014-07-28 22:07:07 +0200702 fd = os.open(__file__, os.O_RDONLY)
Antoine Pitrou47d305d2008-08-16 23:28:44 +0000703 with open(fd, "rb", buffering=0) as f:
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000704 self.assertRaises(TypeError, f.readinto, b"")
705
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000706 def test_custom(self):
707 class A:
708 def __bytes__(self):
709 return b'abc'
710 self.assertEqual(bytes(A()), b'abc')
711 class A: pass
712 self.assertRaises(TypeError, bytes, A())
713 class A:
714 def __bytes__(self):
715 return None
716 self.assertRaises(TypeError, bytes, A())
Benjamin Peterson5ff3f732012-12-19 15:27:41 -0600717 class A:
718 def __bytes__(self):
719 return b'a'
720 def __index__(self):
721 return 42
722 self.assertEqual(bytes(A()), b'a')
Serhiy Storchaka5aac3ed2015-12-20 16:36:34 +0200723 # Issue #25766
724 class A(str):
725 def __bytes__(self):
726 return b'abc'
727 self.assertEqual(bytes(A('\u20ac')), b'abc')
728 self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
Serhiy Storchaka15095802015-11-25 15:47:01 +0200729 # Issue #24731
730 class A:
731 def __bytes__(self):
732 return OtherBytesSubclass(b'abc')
733 self.assertEqual(bytes(A()), b'abc')
734 self.assertIs(type(bytes(A())), OtherBytesSubclass)
735 self.assertEqual(BytesSubclass(A()), b'abc')
736 self.assertIs(type(BytesSubclass(A())), BytesSubclass)
Benjamin Petersonc15a0732008-08-26 16:46:47 +0000737
Victor Stinner29e762c2011-01-05 03:33:28 +0000738 # Test PyBytes_FromFormat()
739 def test_from_format(self):
Victor Stinner7ab986d2015-10-14 02:55:12 +0200740 ctypes = test.support.import_module('ctypes')
Victor Stinner03dab782015-10-14 00:21:35 +0200741 _testcapi = test.support.import_module('_testcapi')
742 from ctypes import pythonapi, py_object
743 from ctypes import (
744 c_int, c_uint,
745 c_long, c_ulong,
746 c_size_t, c_ssize_t,
747 c_char_p)
748
Victor Stinner29e762c2011-01-05 03:33:28 +0000749 PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
750 PyBytes_FromFormat.restype = py_object
751
Victor Stinner03dab782015-10-14 00:21:35 +0200752 # basic tests
Victor Stinner29e762c2011-01-05 03:33:28 +0000753 self.assertEqual(PyBytes_FromFormat(b'format'),
754 b'format')
Victor Stinner03dab782015-10-14 00:21:35 +0200755 self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
756 b'Hello world !')
Victor Stinner29e762c2011-01-05 03:33:28 +0000757
Victor Stinner03dab782015-10-14 00:21:35 +0200758 # test formatters
759 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
760 b'c=\0')
761 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
762 b'c=@')
763 self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
764 b'c=\xff')
765 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
766 c_int(1), c_long(2),
767 c_size_t(3)),
768 b'd=1 ld=2 zd=3')
769 self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
770 c_int(-1), c_long(-2),
771 c_size_t(-3)),
772 b'd=-1 ld=-2 zd=-3')
773 self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
774 c_uint(123), c_ulong(456),
775 c_size_t(789)),
776 b'u=123 lu=456 zu=789')
777 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
778 b'i=123')
779 self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
780 b'i=-123')
781 self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
782 b'x=abc')
Victor Stinner83ff8a62015-10-14 15:28:59 +0200783
784 sizeof_ptr = ctypes.sizeof(c_char_p)
785
786 if os.name == 'nt':
787 # Windows (MSCRT)
788 ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
789 def ptr_formatter(ptr):
790 return (ptr_format % ptr)
791 else:
792 # UNIX (glibc)
793 def ptr_formatter(ptr):
794 return '%#x' % ptr
795
Victor Stinner7ab986d2015-10-14 02:55:12 +0200796 ptr = 0xabcdef
Victor Stinner83ff8a62015-10-14 15:28:59 +0200797 self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
798 ('ptr=' + ptr_formatter(ptr)).encode('ascii'))
Victor Stinner03dab782015-10-14 00:21:35 +0200799 self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
800 b's=cstr')
801
802 # test minimum and maximum integer values
803 size_max = c_size_t(-1).value
804 for formatstr, ctypes_type, value, py_formatter in (
805 (b'%d', c_int, _testcapi.INT_MIN, str),
806 (b'%d', c_int, _testcapi.INT_MAX, str),
807 (b'%ld', c_long, _testcapi.LONG_MIN, str),
808 (b'%ld', c_long, _testcapi.LONG_MAX, str),
809 (b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
810 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
811 (b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
812 (b'%zu', c_size_t, size_max, str),
Victor Stinner83ff8a62015-10-14 15:28:59 +0200813 (b'%p', c_char_p, size_max, ptr_formatter),
Victor Stinner03dab782015-10-14 00:21:35 +0200814 ):
815 self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
816 py_formatter(value).encode('ascii')),
817
818 # width and precision (width is currently ignored)
819 self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
820 b'a')
821 self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
822 b'abc')
823
824 # '%%' formatter
825 self.assertEqual(PyBytes_FromFormat(b'%%'),
826 b'%')
827 self.assertEqual(PyBytes_FromFormat(b'[%%]'),
828 b'[%]')
829 self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
830 b'%_')
831 self.assertEqual(PyBytes_FromFormat(b'%%s'),
832 b'%s')
833
834 # Invalid formats and partial formatting
Victor Stinner29e762c2011-01-05 03:33:28 +0000835 self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
Victor Stinner03dab782015-10-14 00:21:35 +0200836 self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
837 b'x=2 y=%')
Victor Stinner29e762c2011-01-05 03:33:28 +0000838
Victor Stinner03dab782015-10-14 00:21:35 +0200839 # Issue #19969: %c must raise OverflowError for values
840 # not in the range [0; 255]
Victor Stinnerc9362cf2013-12-13 12:14:44 +0100841 self.assertRaises(OverflowError,
842 PyBytes_FromFormat, b'%c', c_int(-1))
843 self.assertRaises(OverflowError,
844 PyBytes_FromFormat, b'%c', c_int(256))
845
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700846 def test_bytes_blocking(self):
847 class IterationBlocked(list):
848 __bytes__ = None
849 i = [0, 1, 2, 3]
850 self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
851 self.assertRaises(TypeError, bytes, IterationBlocked(i))
852
853 # At least in CPython, because bytes.__new__ and the C API
854 # PyBytes_FromObject have different fallback rules, integer
855 # fallback is handled specially, so test separately.
856 class IntBlocked(int):
857 __bytes__ = None
858 self.assertEqual(bytes(3), b'\0\0\0')
859 self.assertRaises(TypeError, bytes, IntBlocked(3))
860
861 # While there is no separately-defined rule for handling bytes
862 # subclasses differently from other buffer-interface classes,
863 # an implementation may well special-case them (as CPython 2.x
864 # str did), so test them separately.
865 class BytesSubclassBlocked(bytes):
866 __bytes__ = None
867 self.assertEqual(bytes(b'ab'), b'ab')
868 self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
869
870 class BufferBlocked(bytearray):
871 __bytes__ = None
872 ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
873 self.assertEqual(bytes(ba), b'ab')
874 self.assertRaises(TypeError, bytes, bb)
875
Antoine Pitrou2f89aa62008-08-02 21:02:48 +0000876
Ezio Melotti0dceb562013-01-10 07:43:26 +0200877class ByteArrayTest(BaseBytesTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +0000878 type2test = bytearray
Guido van Rossumebea9be2007-04-09 00:49:13 +0000879
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400880 def test_getitem_error(self):
881 msg = "bytearray indices must be integers or slices"
882 with self.assertRaisesRegex(TypeError, msg):
883 bytearray(b'python')['a']
884
885 def test_setitem_error(self):
886 msg = "bytearray indices must be integers or slices"
887 with self.assertRaisesRegex(TypeError, msg):
888 b = bytearray(b'python')
889 b['a'] = "python"
890
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000891 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000892 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000893
Guido van Rossum254348e2007-11-21 19:29:53 +0000894 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000895 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000896 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000897 tfn = tempfile.mktemp()
898 try:
899 # Prepare
900 with open(tfn, "wb") as f:
901 f.write(short_sample)
902 # Test readinto
903 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000904 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000905 n = f.readinto(b)
906 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000907 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000908 # Test writing in binary mode
909 with open(tfn, "wb") as f:
910 f.write(b)
911 with open(tfn, "rb") as f:
912 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000913 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000914 finally:
915 try:
916 os.remove(tfn)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +0200917 except OSError:
Guido van Rossumd624f182006-04-24 13:47:05 +0000918 pass
919
Neal Norwitz6968b052007-02-27 19:02:19 +0000920 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000921 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000922 self.assertEqual(b.reverse(), None)
923 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000924 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000925 b.reverse()
926 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000927 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000928 b.reverse()
929 self.assertFalse(b)
930
Eli Bendersky4db28d32011-03-03 18:21:02 +0000931 def test_clear(self):
932 b = bytearray(b'python')
933 b.clear()
934 self.assertEqual(b, b'')
935
936 b = bytearray(b'')
937 b.clear()
938 self.assertEqual(b, b'')
939
940 b = bytearray(b'')
941 b.append(ord('r'))
942 b.clear()
943 b.append(ord('p'))
944 self.assertEqual(b, b'p')
945
946 def test_copy(self):
947 b = bytearray(b'abc')
948 bb = b.copy()
949 self.assertEqual(bb, b'abc')
950
951 b = bytearray(b'')
952 bb = b.copy()
953 self.assertEqual(bb, b'')
954
955 # test that it's indeed a copy and not a reference
956 b = bytearray(b'abc')
957 bb = b.copy()
958 self.assertEqual(b, bb)
959 self.assertIsNot(b, bb)
960 bb.append(ord('d'))
961 self.assertEqual(bb, b'abcd')
962 self.assertEqual(b, b'abc')
963
Guido van Rossumd624f182006-04-24 13:47:05 +0000964 def test_regexps(self):
965 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000966 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000967 b = by("Hello, world")
Antoine Pitroufd036452008-08-19 17:56:33 +0000968 self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
Guido van Rossumd624f182006-04-24 13:47:05 +0000969
970 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000971 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000972 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000973 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000974 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000975 self.assertEqual(b, bytearray([1, 100, 200]))
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000976 b[0] = Indexable(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000977 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000978 try:
979 b[3] = 0
980 self.fail("Didn't raise IndexError")
981 except IndexError:
982 pass
983 try:
984 b[-10] = 0
985 self.fail("Didn't raise IndexError")
986 except IndexError:
987 pass
988 try:
989 b[0] = 256
990 self.fail("Didn't raise ValueError")
991 except ValueError:
992 pass
993 try:
Georg Brandl9a54d7c2008-07-16 23:15:30 +0000994 b[0] = Indexable(-1)
Guido van Rossumd624f182006-04-24 13:47:05 +0000995 self.fail("Didn't raise ValueError")
996 except ValueError:
997 pass
998 try:
999 b[0] = None
1000 self.fail("Didn't raise TypeError")
1001 except TypeError:
1002 pass
1003
1004 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001005 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001006 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +00001007 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001008 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +00001009 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001010 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +00001011 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001012
1013 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001014 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +00001015 self.assertEqual(list(b), list(range(10)))
1016
Guido van Rossum254348e2007-11-21 19:29:53 +00001017 b[0:5] = bytearray([1, 1, 1, 1, 1])
1018 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001019
1020 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +00001021 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001022
Guido van Rossum254348e2007-11-21 19:29:53 +00001023 b[0:0] = bytearray([0, 1, 2, 3, 4])
1024 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +00001025
Guido van Rossum254348e2007-11-21 19:29:53 +00001026 b[-7:-3] = bytearray([100, 101])
1027 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +00001028
1029 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +00001030 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001031
Thomas Wouters9a6e62b2006-08-23 23:20:29 +00001032 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +00001033 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 +00001034
Ezio Melottic64bcbe2012-11-03 21:19:06 +02001035 b[3:] = b'foo'
1036 self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
1037
1038 b[:3] = memoryview(b'foo')
1039 self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
1040
1041 b[3:4] = []
1042 self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
1043
1044 for elem in [5, -5, 0, int(10e20), 'str', 2.3,
1045 ['a', 'b'], [b'a', b'b'], [[]]]:
1046 with self.assertRaises(TypeError):
1047 b[3:4] = elem
1048
1049 for elem in [[254, 255, 256], [-256, 9000]]:
1050 with self.assertRaises(ValueError):
1051 b[3:4] = elem
1052
Antoine Pitrou5df8a8a2013-10-05 21:12:18 +02001053 def test_setslice_extend(self):
1054 # Exercise the resizing logic (see issue #19087)
1055 b = bytearray(range(100))
1056 self.assertEqual(list(b), list(range(100)))
1057 del b[:10]
1058 self.assertEqual(list(b), list(range(10, 100)))
1059 b.extend(range(100, 110))
1060 self.assertEqual(list(b), list(range(10, 110)))
1061
Antoine Pitrou25454112015-05-19 20:52:27 +02001062 def test_fifo_overrun(self):
1063 # Test for issue #23985, a buffer overrun when implementing a FIFO
1064 # Build Python in pydebug mode for best results.
1065 b = bytearray(10)
1066 b.pop() # Defeat expanding buffer off-by-one quirk
1067 del b[:1] # Advance start pointer without reallocating
1068 b += bytes(2) # Append exactly the number of deleted bytes
1069 del b # Free memory buffer, allowing pydebug verification
1070
1071 def test_del_expand(self):
1072 # Reducing the size should not expand the buffer (issue #23985)
1073 b = bytearray(10)
1074 size = sys.getsizeof(b)
1075 del b[:1]
1076 self.assertLessEqual(sys.getsizeof(b), size)
1077
Thomas Wouters376446d2006-12-19 08:30:14 +00001078 def test_extended_set_del_slice(self):
Mark Dickinsonbc099642010-01-29 17:27:24 +00001079 indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
Thomas Wouters376446d2006-12-19 08:30:14 +00001080 for start in indices:
1081 for stop in indices:
1082 # Skip invalid step 0
1083 for step in indices[1:]:
1084 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +00001085 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +00001086 # Make sure we have a slice of exactly the right length,
1087 # but with different data.
1088 data = L[start:stop:step]
1089 data.reverse()
1090 L[start:stop:step] = data
1091 b[start:stop:step] = data
Ezio Melottib3aedd42010-11-20 19:04:17 +00001092 self.assertEqual(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001093
Thomas Wouters376446d2006-12-19 08:30:14 +00001094 del L[start:stop:step]
1095 del b[start:stop:step]
Ezio Melottib3aedd42010-11-20 19:04:17 +00001096 self.assertEqual(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +00001097
Guido van Rossumd624f182006-04-24 13:47:05 +00001098 def test_setslice_trap(self):
1099 # This test verifies that we correctly handle assigning self
1100 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +00001101 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +00001102 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +00001103 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +00001104
Guido van Rossum13e57212006-04-27 22:54:26 +00001105 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001106 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001107 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +00001108 b += b"def"
1109 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +00001110 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001111 self.assertTrue(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001112 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001113 self.assertEqual(b, b"abcdefxyz")
1114 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001115 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001116 except TypeError:
1117 pass
1118 else:
1119 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +00001120
1121 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001122 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001123 b1 = b
1124 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +00001125 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +00001126 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001127 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001128
1129 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001130 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +00001131 b1 = b
1132 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +00001133 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +00001134 self.assertEqual(b, b1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001135 self.assertTrue(b is b1)
Guido van Rossum13e57212006-04-27 22:54:26 +00001136
Guido van Rossum20188312006-05-05 15:15:40 +00001137 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001138 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +00001139 alloc = b.__alloc__()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001140 self.assertTrue(alloc >= 0)
Guido van Rossum20188312006-05-05 15:15:40 +00001141 seq = [alloc]
1142 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +00001143 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +00001144 alloc = b.__alloc__()
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001145 self.assertGreater(alloc, len(b)) # including trailing null byte
Guido van Rossum20188312006-05-05 15:15:40 +00001146 if alloc not in seq:
1147 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +00001148
Serhiy Storchaka7b6e3b92015-06-29 21:14:06 +03001149 def test_init_alloc(self):
1150 b = bytearray()
1151 def g():
1152 for i in range(1, 100):
1153 yield i
1154 a = list(b)
1155 self.assertEqual(a, list(range(1, len(a)+1)))
1156 self.assertEqual(len(b), len(a))
1157 self.assertLessEqual(len(b), i)
1158 alloc = b.__alloc__()
1159 self.assertGreater(alloc, len(b)) # including trailing null byte
1160 b.__init__(g())
1161 self.assertEqual(list(b), list(range(1, 100)))
1162 self.assertEqual(len(b), 99)
1163 alloc = b.__alloc__()
1164 self.assertGreater(alloc, len(b))
1165
Neal Norwitz6968b052007-02-27 19:02:19 +00001166 def test_extend(self):
1167 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +00001168 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +00001169 a.extend(a)
1170 self.assertEqual(a, orig + orig)
1171 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +00001172 a = bytearray(b'')
1173 # Test iterators that don't have a __length_hint__
1174 a.extend(map(int, orig * 25))
1175 a.extend(int(x) for x in orig * 25)
1176 self.assertEqual(a, orig * 50)
1177 self.assertEqual(a[-5:], orig)
1178 a = bytearray(b'')
1179 a.extend(iter(map(int, orig * 50)))
1180 self.assertEqual(a, orig * 50)
1181 self.assertEqual(a[-5:], orig)
1182 a = bytearray(b'')
1183 a.extend(list(map(int, orig * 50)))
1184 self.assertEqual(a, orig * 50)
1185 self.assertEqual(a[-5:], orig)
1186 a = bytearray(b'')
1187 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
1188 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
1189 self.assertEqual(len(a), 0)
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001190 a = bytearray(b'')
1191 a.extend([Indexable(ord('a'))])
1192 self.assertEqual(a, b'a')
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001193
Neal Norwitz6968b052007-02-27 19:02:19 +00001194 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001195 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +00001196 b.remove(ord('l'))
1197 self.assertEqual(b, b'helo')
1198 b.remove(ord('l'))
1199 self.assertEqual(b, b'heo')
1200 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
1201 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001202 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +00001203 # remove first and last
1204 b.remove(ord('o'))
1205 b.remove(ord('h'))
1206 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001207 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001208 b.remove(Indexable(ord('e')))
1209 self.assertEqual(b, b'')
Neal Norwitz6968b052007-02-27 19:02:19 +00001210
Serhiy Storchaka7bf36da2016-05-16 22:15:38 +03001211 # test values outside of the ascii range: (0, 127)
1212 c = bytearray([126, 127, 128, 129])
1213 c.remove(127)
1214 self.assertEqual(c, bytes([126, 128, 129]))
1215 c.remove(129)
1216 self.assertEqual(c, bytes([126, 128]))
1217
Neal Norwitz6968b052007-02-27 19:02:19 +00001218 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001219 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +00001220 self.assertEqual(b.pop(), ord('d'))
1221 self.assertEqual(b.pop(0), ord('w'))
1222 self.assertEqual(b.pop(-2), ord('r'))
1223 self.assertRaises(IndexError, lambda: b.pop(10))
Eli Bendersky1bc4f192011-03-04 04:55:25 +00001224 self.assertRaises(IndexError, lambda: bytearray().pop())
Mark Dickinson54a3db92009-09-06 10:19:23 +00001225 # test for issue #6846
1226 self.assertEqual(bytearray(b'\xff').pop(), 0xff)
Neal Norwitz6968b052007-02-27 19:02:19 +00001227
1228 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001229 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +00001230
Neal Norwitz6968b052007-02-27 19:02:19 +00001231 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001232 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +00001233 b.append(ord('o'))
1234 self.assertEqual(b, b'hello')
1235 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +00001236 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +00001237 b.append(ord('A'))
1238 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001239 self.assertRaises(TypeError, lambda: b.append(b'o'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001240 b = bytearray()
1241 b.append(Indexable(ord('A')))
1242 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001243
1244 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001245 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +00001246 b.insert(1, ord('i'))
1247 b.insert(4, ord('i'))
1248 b.insert(-2, ord('i'))
1249 b.insert(1000, ord('i'))
1250 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001251 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Georg Brandl9a54d7c2008-07-16 23:15:30 +00001252 b = bytearray()
1253 b.insert(0, Indexable(ord('A')))
1254 self.assertEqual(b, b'A')
Neal Norwitz6968b052007-02-27 19:02:19 +00001255
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001256 def test_copied(self):
1257 # Issue 4348. Make sure that operations that don't mutate the array
1258 # copy the bytes.
1259 b = bytearray(b'abc')
Amaury Forgeot d'Arcb0c29162008-11-22 22:18:04 +00001260 self.assertFalse(b is b.replace(b'abc', b'cde', 0))
Benjamin Peterson0f3641c2008-11-19 22:05:52 +00001261
1262 t = bytearray([i for i in range(256)])
1263 x = bytearray(b'')
1264 self.assertFalse(x is x.translate(t))
1265
Guido van Rossum254348e2007-11-21 19:29:53 +00001266 def test_partition_bytearray_doesnt_share_nullstring(self):
1267 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001268 self.assertEqual(b, b"")
1269 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001270 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001271 b += b"!"
1272 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001273 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001274 self.assertEqual(b, b"")
1275 self.assertEqual(c, b"")
1276 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +00001277 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001278 self.assertEqual(b, b"")
1279 self.assertEqual(c, b"")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001280 self.assertTrue(b is not c)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001281 b += b"!"
1282 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +00001283 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +00001284 self.assertEqual(b, b"")
1285 self.assertEqual(c, b"")
1286
Antoine Pitrou5504e892008-12-06 21:27:53 +00001287 def test_resize_forbidden(self):
1288 # #4509: can't resize a bytearray when there are buffer exports, even
1289 # if it wouldn't reallocate the underlying buffer.
1290 # Furthermore, no destructive changes to the buffer may be applied
1291 # before raising the error.
1292 b = bytearray(range(10))
1293 v = memoryview(b)
1294 def resize(n):
1295 b[1:-1] = range(n + 1, 2*n - 1)
1296 resize(10)
1297 orig = b[:]
1298 self.assertRaises(BufferError, resize, 11)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001299 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001300 self.assertRaises(BufferError, resize, 9)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001301 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001302 self.assertRaises(BufferError, resize, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001303 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001304 # Other operations implying resize
1305 self.assertRaises(BufferError, b.pop, 0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001306 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001307 self.assertRaises(BufferError, b.remove, b[1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001308 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001309 def delitem():
1310 del b[1]
1311 self.assertRaises(BufferError, delitem)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001312 self.assertEqual(b, orig)
Antoine Pitrou5504e892008-12-06 21:27:53 +00001313 # deleting a non-contiguous slice
1314 def delslice():
1315 b[1:-1:2] = b""
1316 self.assertRaises(BufferError, delslice)
Ezio Melottib3aedd42010-11-20 19:04:17 +00001317 self.assertEqual(b, orig)
Guido van Rossum98297ee2007-11-06 21:34:58 +00001318
Stefan Krah650c1e82015-02-03 21:43:23 +01001319 @test.support.cpython_only
1320 def test_obsolete_write_lock(self):
1321 from _testcapi import getbuffer_with_null_view
1322 self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
Antoine Pitroufc8d6f42010-01-17 12:38:54 +00001323
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001324 def test_iterator_pickling2(self):
1325 orig = bytearray(b'abc')
1326 data = list(b'qwerty')
1327 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1328 # initial iterator
1329 itorig = iter(orig)
1330 d = pickle.dumps((itorig, orig), proto)
1331 it, b = pickle.loads(d)
1332 b[:] = data
1333 self.assertEqual(type(it), type(itorig))
1334 self.assertEqual(list(it), data)
1335
1336 # running iterator
1337 next(itorig)
1338 d = pickle.dumps((itorig, orig), proto)
1339 it, b = pickle.loads(d)
1340 b[:] = data
1341 self.assertEqual(type(it), type(itorig))
1342 self.assertEqual(list(it), data[1:])
1343
1344 # empty iterator
1345 for i in range(1, len(orig)):
1346 next(itorig)
1347 d = pickle.dumps((itorig, orig), proto)
1348 it, b = pickle.loads(d)
1349 b[:] = data
1350 self.assertEqual(type(it), type(itorig))
1351 self.assertEqual(list(it), data[len(orig):])
1352
1353 # exhausted iterator
1354 self.assertRaises(StopIteration, next, itorig)
1355 d = pickle.dumps((itorig, orig), proto)
1356 it, b = pickle.loads(d)
1357 b[:] = data
1358 self.assertEqual(list(it), [])
1359
Serhiy Storchaka8dc2ec12016-03-30 21:01:26 +03001360 test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
Serhiy Storchakaaabafe72016-03-06 14:10:24 +02001361
Serhiy Storchakaaf658722016-07-03 14:41:36 +03001362 def test_iterator_length_hint(self):
1363 # Issue 27443: __length_hint__ can return negative integer
1364 ba = bytearray(b'ab')
1365 it = iter(ba)
1366 next(it)
1367 ba.clear()
1368 # Shouldn't raise an error
1369 self.assertEqual(list(it), [])
1370
1371
Christian Heimes510711d2008-01-30 11:57:58 +00001372class AssortedBytesTest(unittest.TestCase):
1373 #
1374 # Test various combinations of bytes and bytearray
1375 #
1376
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001377 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001378 def test_repr_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001379 for f in str, repr:
1380 self.assertEqual(f(bytearray()), "bytearray(b'')")
1381 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
1382 self.assertEqual(f(bytearray([0, 1, 254, 255])),
1383 "bytearray(b'\\x00\\x01\\xfe\\xff')")
1384 self.assertEqual(f(b"abc"), "b'abc'")
1385 self.assertEqual(f(b"'"), '''b"'"''') # '''
1386 self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
Christian Heimes510711d2008-01-30 11:57:58 +00001387
1388 def test_compare_bytes_to_bytearray(self):
1389 self.assertEqual(b"abc" == bytes(b"abc"), True)
1390 self.assertEqual(b"ab" != bytes(b"abc"), True)
1391 self.assertEqual(b"ab" <= bytes(b"abc"), True)
1392 self.assertEqual(b"ab" < bytes(b"abc"), True)
1393 self.assertEqual(b"abc" >= bytes(b"ab"), True)
1394 self.assertEqual(b"abc" > bytes(b"ab"), True)
1395
1396 self.assertEqual(b"abc" != bytes(b"abc"), False)
1397 self.assertEqual(b"ab" == bytes(b"abc"), False)
1398 self.assertEqual(b"ab" > bytes(b"abc"), False)
1399 self.assertEqual(b"ab" >= bytes(b"abc"), False)
1400 self.assertEqual(b"abc" < bytes(b"ab"), False)
1401 self.assertEqual(b"abc" <= bytes(b"ab"), False)
1402
1403 self.assertEqual(bytes(b"abc") == b"abc", True)
1404 self.assertEqual(bytes(b"ab") != b"abc", True)
1405 self.assertEqual(bytes(b"ab") <= b"abc", True)
1406 self.assertEqual(bytes(b"ab") < b"abc", True)
1407 self.assertEqual(bytes(b"abc") >= b"ab", True)
1408 self.assertEqual(bytes(b"abc") > b"ab", True)
1409
1410 self.assertEqual(bytes(b"abc") != b"abc", False)
1411 self.assertEqual(bytes(b"ab") == b"abc", False)
1412 self.assertEqual(bytes(b"ab") > b"abc", False)
1413 self.assertEqual(bytes(b"ab") >= b"abc", False)
1414 self.assertEqual(bytes(b"abc") < b"ab", False)
1415 self.assertEqual(bytes(b"abc") <= b"ab", False)
1416
Stefan Krah6e572b82013-01-26 13:06:36 +01001417 @test.support.requires_docstrings
Christian Heimes510711d2008-01-30 11:57:58 +00001418 def test_doc(self):
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001419 self.assertIsNotNone(bytearray.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001420 self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Florent Xicluna9b86b9a2010-03-19 19:00:44 +00001421 self.assertIsNotNone(bytes.__doc__)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001422 self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Christian Heimes510711d2008-01-30 11:57:58 +00001423
1424 def test_from_bytearray(self):
1425 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
1426 buf = memoryview(sample)
1427 b = bytearray(buf)
1428 self.assertEqual(b, bytearray(sample))
1429
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001430 @check_bytes_warnings
Christian Heimes510711d2008-01-30 11:57:58 +00001431 def test_to_str(self):
Florent Xiclunaedf5f0d2010-09-03 20:00:37 +00001432 self.assertEqual(str(b''), "b''")
1433 self.assertEqual(str(b'x'), "b'x'")
1434 self.assertEqual(str(b'\x80'), "b'\\x80'")
1435 self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
1436 self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
1437 self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
Christian Heimes510711d2008-01-30 11:57:58 +00001438
1439 def test_literal(self):
1440 tests = [
1441 (b"Wonderful spam", "Wonderful spam"),
1442 (br"Wonderful spam too", "Wonderful spam too"),
1443 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
1444 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
1445 ]
1446 for b, s in tests:
1447 self.assertEqual(b, bytearray(s, 'latin-1'))
1448 for c in range(128, 256):
1449 self.assertRaises(SyntaxError, eval,
1450 'b"%s"' % chr(c))
1451
1452 def test_translate(self):
1453 b = b'hello'
Georg Brandlccc47b62008-12-28 11:44:14 +00001454 ba = bytearray(b)
Christian Heimes510711d2008-01-30 11:57:58 +00001455 rosetta = bytearray(range(0, 256))
1456 rosetta[ord('o')] = ord('e')
1457 c = b.translate(rosetta, b'l')
1458 self.assertEqual(b, b'hello')
1459 self.assertEqual(c, b'hee')
Georg Brandlccc47b62008-12-28 11:44:14 +00001460 c = ba.translate(rosetta, b'l')
1461 self.assertEqual(ba, b'hello')
1462 self.assertEqual(c, b'hee')
1463 c = b.translate(None, b'e')
1464 self.assertEqual(c, b'hllo')
1465 c = ba.translate(None, b'e')
1466 self.assertEqual(c, b'hllo')
1467 self.assertRaises(TypeError, b.translate, None, None)
1468 self.assertRaises(TypeError, ba.translate, None, None)
Christian Heimes510711d2008-01-30 11:57:58 +00001469
1470 def test_split_bytearray(self):
1471 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
1472
1473 def test_rsplit_bytearray(self):
1474 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
1475
Georg Brandleb2c9642008-05-30 12:05:02 +00001476 def test_return_self(self):
1477 # bytearray.replace must always return a new bytearray
1478 b = bytearray()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001479 self.assertFalse(b.replace(b'', b'') is b)
Georg Brandleb2c9642008-05-30 12:05:02 +00001480
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001481 @unittest.skipUnless(sys.flags.bytes_warning,
1482 "BytesWarning is needed for this test: use -bb option")
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001483 def test_compare(self):
Serhiy Storchaka1dd49822015-03-20 16:54:57 +02001484 def bytes_warning():
1485 return test.support.check_warnings(('', BytesWarning))
1486 with bytes_warning():
1487 b'' == ''
1488 with bytes_warning():
1489 '' == b''
1490 with bytes_warning():
1491 b'' != ''
1492 with bytes_warning():
1493 '' != b''
1494 with bytes_warning():
1495 bytearray(b'') == ''
1496 with bytes_warning():
1497 '' == bytearray(b'')
1498 with bytes_warning():
1499 bytearray(b'') != ''
1500 with bytes_warning():
1501 '' != bytearray(b'')
1502 with bytes_warning():
1503 b'\0' == 0
1504 with bytes_warning():
1505 0 == b'\0'
1506 with bytes_warning():
1507 b'\0' != 0
1508 with bytes_warning():
1509 0 != b'\0'
Barry Warsaw9e9dcd62008-10-17 01:50:37 +00001510
Guido van Rossumd624f182006-04-24 13:47:05 +00001511 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +00001512 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +00001513 # __reversed__? (optimization)
1514
Guido van Rossumad7d8d12007-04-13 01:39:34 +00001515 # XXX More string methods? (Those that don't use character properties)
1516
Neal Norwitz6968b052007-02-27 19:02:19 +00001517 # There are tests in string_tests.py that are more
Martin Panter0d0db6c2016-04-10 08:45:26 +00001518 # comprehensive for things like partition, etc.
Neal Norwitz6968b052007-02-27 19:02:19 +00001519 # Unfortunately they are all bundled with tests that
1520 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +00001521
Guido van Rossum254348e2007-11-21 19:29:53 +00001522 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001523 # the rest that make sense (the code can be cleaned up to use modern
1524 # unittest methods at the same time).
1525
Martin Panter152a19c2016-04-06 06:37:17 +00001526class BytearrayPEP3137Test(unittest.TestCase):
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001527 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +00001528 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001529
1530 def test_returns_new_copy(self):
1531 val = self.marshal(b'1234')
1532 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +00001533 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +00001534 for methname in ('zfill', 'rjust', 'ljust', 'center'):
1535 method = getattr(val, methname)
1536 newval = method(3)
1537 self.assertEqual(val, newval)
1538 self.assertTrue(val is not newval,
1539 methname+' returned self on a mutable object')
Antoine Pitroucbaa62502010-01-13 15:03:39 +00001540 for expr in ('val.split()[0]', 'val.rsplit()[0]',
1541 'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
1542 'val.splitlines()[0]', 'val.replace(b"", b"")'):
1543 newval = eval(expr)
1544 self.assertEqual(val, newval)
1545 self.assertTrue(val is not newval,
1546 expr+' returned val on a mutable object')
Antoine Pitroucfc22b42012-10-16 21:07:23 +02001547 sep = self.marshal(b'')
1548 newval = sep.join([val])
1549 self.assertEqual(val, newval)
1550 self.assertIsNot(val, newval)
1551
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001552
Christian Heimes510711d2008-01-30 11:57:58 +00001553class FixedStringTest(test.string_tests.BaseTest):
Guido van Rossum9c627722007-08-27 18:31:48 +00001554 def fixtype(self, obj):
1555 if isinstance(obj, str):
Martin Panter152a19c2016-04-06 06:37:17 +00001556 return self.type2test(obj.encode("utf-8"))
Guido van Rossum9c627722007-08-27 18:31:48 +00001557 return super().fixtype(obj)
1558
Martin Panter152a19c2016-04-06 06:37:17 +00001559 contains_bytes = True
1560
Ezio Melotti0dceb562013-01-10 07:43:26 +02001561class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001562 type2test = bytearray
1563
Ezio Melotti0dceb562013-01-10 07:43:26 +02001564class BytesAsStringTest(FixedStringTest, unittest.TestCase):
Christian Heimes510711d2008-01-30 11:57:58 +00001565 type2test = bytes
1566
Georg Brandlc7885542007-03-06 19:16:20 +00001567
Ezio Melotti0dceb562013-01-10 07:43:26 +02001568class SubclassTest:
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001569
1570 def test_basic(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001571 self.assertTrue(issubclass(self.type2test, self.basetype))
1572 self.assertIsInstance(self.type2test(), self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001573
1574 a, b = b"abcd", b"efgh"
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001575 _a, _b = self.type2test(a), self.type2test(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001576
1577 # test comparison operators with subclass instances
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001578 self.assertTrue(_a == _a)
1579 self.assertTrue(_a != _b)
1580 self.assertTrue(_a < _b)
1581 self.assertTrue(_a <= _b)
1582 self.assertTrue(_b >= _a)
1583 self.assertTrue(_b > _a)
1584 self.assertTrue(_a is not a)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001585
1586 # test concat of subclass instances
1587 self.assertEqual(a + b, _a + _b)
1588 self.assertEqual(a + b, a + _b)
1589 self.assertEqual(a + b, _a + b)
1590
1591 # test repeat
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001592 self.assertTrue(a*5 == _a*5)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001593
1594 def test_join(self):
1595 # Make sure join returns a NEW object for single item sequences
1596 # involving a subclass.
1597 # Make sure that it is of the appropriate type.
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001598 s1 = self.type2test(b"abcd")
1599 s2 = self.basetype().join([s1])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001600 self.assertTrue(s1 is not s2)
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001601 self.assertTrue(type(s2) is self.basetype, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001602
1603 # Test reverse, calling join on subclass
1604 s3 = s1.join([b"abcd"])
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001605 self.assertTrue(type(s3) is self.basetype)
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001606
1607 def test_pickle(self):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001608 a = self.type2test(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001609 a.x = 10
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001610 a.y = self.type2test(b"efgh")
Hirokazu Yamamotod0d0b652008-10-23 00:38:15 +00001611 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001612 b = pickle.loads(pickle.dumps(a, proto))
1613 self.assertNotEqual(id(a), id(b))
1614 self.assertEqual(a, b)
1615 self.assertEqual(a.x, b.x)
1616 self.assertEqual(a.y, b.y)
1617 self.assertEqual(type(a), type(b))
1618 self.assertEqual(type(a.y), type(b.y))
1619
1620 def test_copy(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")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001624 for copy_method in (copy.copy, copy.deepcopy):
1625 b = copy_method(a)
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
Serhiy Storchaka0855e702016-07-01 17:22:31 +03001633 def test_fromhex(self):
1634 b = self.type2test.fromhex('1a2B30')
1635 self.assertEqual(b, b'\x1a\x2b\x30')
1636 self.assertIs(type(b), self.type2test)
1637
1638 class B1(self.basetype):
1639 def __new__(cls, value):
1640 me = self.basetype.__new__(cls, value)
1641 me.foo = 'bar'
1642 return me
1643
1644 b = B1.fromhex('1a2B30')
1645 self.assertEqual(b, b'\x1a\x2b\x30')
1646 self.assertIs(type(b), B1)
1647 self.assertEqual(b.foo, 'bar')
1648
1649 class B2(self.basetype):
1650 def __init__(me, *args, **kwargs):
1651 if self.basetype is not bytes:
1652 self.basetype.__init__(me, *args, **kwargs)
1653 me.foo = 'bar'
1654
1655 b = B2.fromhex('1a2B30')
1656 self.assertEqual(b, b'\x1a\x2b\x30')
1657 self.assertIs(type(b), B2)
1658 self.assertEqual(b.foo, 'bar')
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001659
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001660
1661class ByteArraySubclass(bytearray):
1662 pass
1663
1664class BytesSubclass(bytes):
1665 pass
1666
Serhiy Storchaka15095802015-11-25 15:47:01 +02001667class OtherBytesSubclass(bytes):
1668 pass
1669
Ezio Melotti0dceb562013-01-10 07:43:26 +02001670class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001671 basetype = bytearray
1672 type2test = ByteArraySubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001673
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001674 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +00001675 class subclass(bytearray):
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001676 def __init__(me, newarg=1, *args, **kwargs):
1677 bytearray.__init__(me, *args, **kwargs)
1678 x = subclass(4, b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +00001679 x = subclass(4, source=b"abcd")
1680 self.assertEqual(x, b"abcd")
1681 x = subclass(newarg=4, source=b"abcd")
1682 self.assertEqual(x, b"abcd")
1683
1684
Ezio Melotti0dceb562013-01-10 07:43:26 +02001685class BytesSubclassTest(SubclassTest, unittest.TestCase):
Serhiy Storchakae78592d2016-05-12 12:33:21 +03001686 basetype = bytes
1687 type2test = BytesSubclass
Alexandre Vassalotti41f58a72010-01-12 01:23:09 +00001688
1689
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001690if __name__ == "__main__":
Ezio Melotti0dceb562013-01-10 07:43:26 +02001691 unittest.main()