blob: c51a3202e104a203067b2e454718a8b40fd70645 [file] [log] [blame]
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001"""Unit tests for the bytes type."""
2
Guido van Rossumd624f182006-04-24 13:47:05 +00003import os
4import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00005import sys
Guido van Rossum0ad08122007-04-11 04:37:43 +00006import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +00007import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00008import unittest
9import test.test_support
Georg Brandlc7885542007-03-06 19:16:20 +000010import test.string_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000011
12
13class BytesTest(unittest.TestCase):
14
15 def test_basics(self):
16 b = bytes()
17 self.assertEqual(type(b), bytes)
18 self.assertEqual(b.__class__, bytes)
19
20 def test_empty_sequence(self):
21 b = bytes()
22 self.assertEqual(len(b), 0)
23 self.assertRaises(IndexError, lambda: b[0])
24 self.assertRaises(IndexError, lambda: b[1])
25 self.assertRaises(IndexError, lambda: b[sys.maxint])
26 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
27 self.assertRaises(IndexError, lambda: b[10**100])
28 self.assertRaises(IndexError, lambda: b[-1])
29 self.assertRaises(IndexError, lambda: b[-2])
30 self.assertRaises(IndexError, lambda: b[-sys.maxint])
31 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
32 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
33 self.assertRaises(IndexError, lambda: b[-10**100])
34
35 def test_from_list(self):
36 ints = list(range(256))
37 b = bytes(i for i in ints)
38 self.assertEqual(len(b), 256)
39 self.assertEqual(list(b), ints)
40
41 def test_from_index(self):
42 class C:
43 def __init__(self, i=0):
44 self.i = i
45 def __index__(self):
46 return self.i
47 b = bytes([C(), C(1), C(254), C(255)])
48 self.assertEqual(list(b), [0, 1, 254, 255])
Guido van Rossume06b6b82006-04-23 07:43:54 +000049 self.assertRaises(ValueError, bytes, [C(-1)])
50 self.assertRaises(ValueError, bytes, [C(256)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000051
52 def test_constructor_type_errors(self):
Guido van Rossumd624f182006-04-24 13:47:05 +000053 self.assertRaises(TypeError, bytes, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000054 class C:
55 pass
Guido van Rossume06b6b82006-04-23 07:43:54 +000056 self.assertRaises(TypeError, bytes, ["0"])
57 self.assertRaises(TypeError, bytes, [0.0])
58 self.assertRaises(TypeError, bytes, [None])
59 self.assertRaises(TypeError, bytes, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000060
61 def test_constructor_value_errors(self):
Guido van Rossume06b6b82006-04-23 07:43:54 +000062 self.assertRaises(ValueError, bytes, [-1])
63 self.assertRaises(ValueError, bytes, [-sys.maxint])
64 self.assertRaises(ValueError, bytes, [-sys.maxint-1])
Thomas Woutersd204a712006-08-22 13:41:17 +000065 self.assertRaises(ValueError, bytes, [-sys.maxint-2])
66 self.assertRaises(ValueError, bytes, [-10**100])
Guido van Rossume06b6b82006-04-23 07:43:54 +000067 self.assertRaises(ValueError, bytes, [256])
68 self.assertRaises(ValueError, bytes, [257])
69 self.assertRaises(ValueError, bytes, [sys.maxint])
Thomas Woutersd204a712006-08-22 13:41:17 +000070 self.assertRaises(ValueError, bytes, [sys.maxint+1])
71 self.assertRaises(ValueError, bytes, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000072
73 def test_repr(self):
Georg Brandlee91be42007-02-24 19:41:35 +000074 self.assertEqual(repr(bytes()), "b''")
Guido van Rossum57b93ad2007-05-08 19:09:34 +000075 self.assertEqual(repr(bytes([0])), "b'\\x00'")
76 self.assertEqual(repr(bytes([0, 1, 254, 255])),
77 "b'\\x00\\x01\\xfe\\xff'")
Guido van Rossum9c627722007-08-27 18:31:48 +000078 self.assertEqual(repr(b"abc"), "b'abc'")
79 self.assertEqual(repr(b"'"), "b'\\''")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000080
81 def test_compare(self):
82 b1 = bytes([1, 2, 3])
83 b2 = bytes([1, 2, 3])
84 b3 = bytes([1, 3])
85
Guido van Rossume61fd5b2007-07-11 12:20:59 +000086 self.assertEqual(b1, b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000087 self.failUnless(b2 != b3)
88 self.failUnless(b1 <= b2)
89 self.failUnless(b1 <= b3)
90 self.failUnless(b1 < b3)
91 self.failUnless(b1 >= b2)
92 self.failUnless(b3 >= b2)
93 self.failUnless(b3 > b2)
94
95 self.failIf(b1 != b2)
96 self.failIf(b2 == b3)
97 self.failIf(b1 > b2)
98 self.failIf(b1 > b3)
99 self.failIf(b1 >= b3)
100 self.failIf(b1 < b2)
101 self.failIf(b3 < b2)
102 self.failIf(b3 <= b2)
103
Guido van Rossum343e97f2007-04-09 00:43:24 +0000104 def test_compare_to_str(self):
Guido van Rossum4355a472007-05-04 05:00:04 +0000105 self.assertEqual(b"abc" == str8("abc"), True)
106 self.assertEqual(b"ab" != str8("abc"), True)
107 self.assertEqual(b"ab" <= str8("abc"), True)
108 self.assertEqual(b"ab" < str8("abc"), True)
109 self.assertEqual(b"abc" >= str8("ab"), True)
110 self.assertEqual(b"abc" > str8("ab"), True)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000111
Guido van Rossum4355a472007-05-04 05:00:04 +0000112 self.assertEqual(b"abc" != str8("abc"), False)
113 self.assertEqual(b"ab" == str8("abc"), False)
114 self.assertEqual(b"ab" > str8("abc"), False)
115 self.assertEqual(b"ab" >= str8("abc"), False)
116 self.assertEqual(b"abc" < str8("ab"), False)
117 self.assertEqual(b"abc" <= str8("ab"), False)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000118
Guido van Rossum4355a472007-05-04 05:00:04 +0000119 self.assertEqual(str8("abc") == b"abc", True)
120 self.assertEqual(str8("ab") != b"abc", True)
121 self.assertEqual(str8("ab") <= b"abc", True)
122 self.assertEqual(str8("ab") < b"abc", True)
123 self.assertEqual(str8("abc") >= b"ab", True)
124 self.assertEqual(str8("abc") > b"ab", True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000125
Guido van Rossum4355a472007-05-04 05:00:04 +0000126 self.assertEqual(str8("abc") != b"abc", False)
127 self.assertEqual(str8("ab") == b"abc", False)
128 self.assertEqual(str8("ab") > b"abc", False)
129 self.assertEqual(str8("ab") >= b"abc", False)
130 self.assertEqual(str8("abc") < b"ab", False)
131 self.assertEqual(str8("abc") <= b"ab", False)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000132
Guido van Rossum1e35e762007-10-09 17:21:10 +0000133 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000134 # Test this for all expected byte orders and Unicode character sizes
Guido van Rossum1e35e762007-10-09 17:21:10 +0000135 self.assertEqual(b"\0a\0b\0c" == "abc", False)
136 self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == "abc", False)
137 self.assertEqual(b"a\0b\0c\0" == "abc", False)
138 self.assertEqual(b"a\0\0\0b\0\0\0c\0\0\0" == "abc", False)
139 self.assertEqual(bytes() == str(), False)
140 self.assertEqual(bytes() != str(), True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000141
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000142 def test_nohash(self):
143 self.assertRaises(TypeError, hash, bytes())
144
145 def test_doc(self):
146 self.failUnless(bytes.__doc__ != None)
147 self.failUnless(bytes.__doc__.startswith("bytes("))
148
Guido van Rossumd624f182006-04-24 13:47:05 +0000149 def test_buffer_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000150 short_sample = b"Hello world\n"
151 sample = short_sample + b"x"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000152 tfn = tempfile.mktemp()
153 try:
154 # Prepare
155 with open(tfn, "wb") as f:
156 f.write(short_sample)
157 # Test readinto
158 with open(tfn, "rb") as f:
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000159 b = b"x"*20
Guido van Rossumd624f182006-04-24 13:47:05 +0000160 n = f.readinto(b)
161 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000162 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000163 # Test writing in binary mode
164 with open(tfn, "wb") as f:
165 f.write(b)
166 with open(tfn, "rb") as f:
167 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000168 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000169 finally:
170 try:
171 os.remove(tfn)
172 except os.error:
173 pass
174
175 def test_reversed(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000176 input = list(map(ord, "Hello"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000177 b = bytes(input)
178 output = list(reversed(b))
179 input.reverse()
180 self.assertEqual(output, input)
181
Neal Norwitz6968b052007-02-27 19:02:19 +0000182 def test_reverse(self):
183 b = b'hello'
184 self.assertEqual(b.reverse(), None)
185 self.assertEqual(b, b'olleh')
186 b = b'hello1' # test even number of items
187 b.reverse()
188 self.assertEqual(b, b'1olleh')
189 b = bytes()
190 b.reverse()
191 self.assertFalse(b)
192
Guido van Rossumd624f182006-04-24 13:47:05 +0000193 def test_getslice(self):
194 def by(s):
195 return bytes(map(ord, s))
196 b = by("Hello, world")
197
198 self.assertEqual(b[:5], by("Hello"))
199 self.assertEqual(b[1:5], by("ello"))
200 self.assertEqual(b[5:7], by(", "))
201 self.assertEqual(b[7:], by("world"))
202 self.assertEqual(b[7:12], by("world"))
203 self.assertEqual(b[7:100], by("world"))
204
205 self.assertEqual(b[:-7], by("Hello"))
206 self.assertEqual(b[-11:-7], by("ello"))
207 self.assertEqual(b[-7:-5], by(", "))
208 self.assertEqual(b[-5:], by("world"))
209 self.assertEqual(b[-5:12], by("world"))
210 self.assertEqual(b[-5:100], by("world"))
211 self.assertEqual(b[-100:5], by("Hello"))
212
Thomas Wouters376446d2006-12-19 08:30:14 +0000213 def test_extended_getslice(self):
214 # Test extended slicing by comparing with list slicing.
215 L = list(range(255))
216 b = bytes(L)
217 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
218 for start in indices:
219 for stop in indices:
220 # Skip step 0 (invalid)
221 for step in indices[1:]:
222 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000223
Guido van Rossumd624f182006-04-24 13:47:05 +0000224 def test_regexps(self):
225 def by(s):
226 return bytes(map(ord, s))
227 b = by("Hello, world")
228 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
229
230 def test_setitem(self):
231 b = bytes([1, 2, 3])
232 b[1] = 100
233 self.assertEqual(b, bytes([1, 100, 3]))
234 b[-1] = 200
235 self.assertEqual(b, bytes([1, 100, 200]))
236 class C:
237 def __init__(self, i=0):
238 self.i = i
239 def __index__(self):
240 return self.i
241 b[0] = C(10)
242 self.assertEqual(b, bytes([10, 100, 200]))
243 try:
244 b[3] = 0
245 self.fail("Didn't raise IndexError")
246 except IndexError:
247 pass
248 try:
249 b[-10] = 0
250 self.fail("Didn't raise IndexError")
251 except IndexError:
252 pass
253 try:
254 b[0] = 256
255 self.fail("Didn't raise ValueError")
256 except ValueError:
257 pass
258 try:
259 b[0] = C(-1)
260 self.fail("Didn't raise ValueError")
261 except ValueError:
262 pass
263 try:
264 b[0] = None
265 self.fail("Didn't raise TypeError")
266 except TypeError:
267 pass
268
269 def test_delitem(self):
270 b = bytes(range(10))
271 del b[0]
272 self.assertEqual(b, bytes(range(1, 10)))
273 del b[-1]
274 self.assertEqual(b, bytes(range(1, 9)))
275 del b[4]
276 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
277
278 def test_setslice(self):
279 b = bytes(range(10))
280 self.assertEqual(list(b), list(range(10)))
281
282 b[0:5] = bytes([1, 1, 1, 1, 1])
283 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
284
285 del b[0:-5]
286 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
287
288 b[0:0] = bytes([0, 1, 2, 3, 4])
289 self.assertEqual(b, bytes(range(10)))
290
291 b[-7:-3] = bytes([100, 101])
292 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
293
294 b[3:5] = [3, 4, 5, 6]
295 self.assertEqual(b, bytes(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000296
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000297 b[3:0] = [42, 42, 42]
298 self.assertEqual(b, bytes([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000299
Thomas Wouters376446d2006-12-19 08:30:14 +0000300 def test_extended_set_del_slice(self):
301 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
302 for start in indices:
303 for stop in indices:
304 # Skip invalid step 0
305 for step in indices[1:]:
306 L = list(range(255))
307 b = bytes(L)
308 # Make sure we have a slice of exactly the right length,
309 # but with different data.
310 data = L[start:stop:step]
311 data.reverse()
312 L[start:stop:step] = data
313 b[start:stop:step] = data
314 self.assertEquals(b, bytes(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000315
Thomas Wouters376446d2006-12-19 08:30:14 +0000316 del L[start:stop:step]
317 del b[start:stop:step]
318 self.assertEquals(b, bytes(L))
319
Guido van Rossumd624f182006-04-24 13:47:05 +0000320 def test_setslice_trap(self):
321 # This test verifies that we correctly handle assigning self
322 # to a slice of self (the old Lambert Meertens trap).
323 b = bytes(range(256))
324 b[8:] = b
325 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
326
327 def test_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000328 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000329 for enc in ("utf8", "utf16"):
330 b = bytes(sample, enc)
Guido van Rossum4355a472007-05-04 05:00:04 +0000331 self.assertEqual(b, bytes(sample.encode(enc)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000332 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
333 b = bytes(sample, "latin1", "ignore")
Guido van Rossum9c627722007-08-27 18:31:48 +0000334 self.assertEqual(b, bytes(sample[:-4], "utf-8"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000335
336 def test_decode(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000337 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000338 for enc in ("utf8", "utf16"):
339 b = bytes(sample, enc)
340 self.assertEqual(b.decode(enc), sample)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000341 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossumd624f182006-04-24 13:47:05 +0000342 b = bytes(sample, "latin1")
343 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
344 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
345
346 def test_from_buffer(self):
Guido van Rossum4355a472007-05-04 05:00:04 +0000347 sample = str8("Hello world\n\x80\x81\xfe\xff")
Guido van Rossumbae07c92007-10-08 02:46:15 +0000348 buf = memoryview(sample)
Guido van Rossumd624f182006-04-24 13:47:05 +0000349 b = bytes(buf)
350 self.assertEqual(b, bytes(map(ord, sample)))
351
352 def test_to_str(self):
353 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossum9c627722007-08-27 18:31:48 +0000354 b = bytes(sample, "utf-8")
Guido van Rossumd624f182006-04-24 13:47:05 +0000355 self.assertEqual(str(b), sample)
356
357 def test_from_int(self):
358 b = bytes(0)
359 self.assertEqual(b, bytes())
360 b = bytes(10)
361 self.assertEqual(b, bytes([0]*10))
362 b = bytes(10000)
363 self.assertEqual(b, bytes([0]*10000))
364
365 def test_concat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000366 b1 = b"abc"
367 b2 = b"def"
368 self.assertEqual(b1 + b2, b"abcdef")
369 self.assertEqual(b1 + str8("def"), b"abcdef")
370 self.assertEqual(str8("def") + b1, b"defabc")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000371 self.assertRaises(TypeError, lambda: b1 + "def")
372 self.assertRaises(TypeError, lambda: "abc" + b2)
Guido van Rossumd624f182006-04-24 13:47:05 +0000373
374 def test_repeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000375 b = b"abc"
376 self.assertEqual(b * 3, b"abcabcabc")
Guido van Rossumd624f182006-04-24 13:47:05 +0000377 self.assertEqual(b * 0, bytes())
378 self.assertEqual(b * -1, bytes())
379 self.assertRaises(TypeError, lambda: b * 3.14)
380 self.assertRaises(TypeError, lambda: 3.14 * b)
381 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000382
383 def test_repeat_1char(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000384 self.assertEqual(b'x'*100, bytes([ord('x')]*100))
Guido van Rossumd624f182006-04-24 13:47:05 +0000385
Guido van Rossum13e57212006-04-27 22:54:26 +0000386 def test_iconcat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000387 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000388 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000389 b += b"def"
390 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000391 self.assertEqual(b, b1)
392 self.failUnless(b is b1)
Guido van Rossum4355a472007-05-04 05:00:04 +0000393 b += str8("xyz")
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000394 self.assertEqual(b, b"abcdefxyz")
395 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000396 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000397 except TypeError:
398 pass
399 else:
400 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000401
402 def test_irepeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000403 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000404 b1 = b
405 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000406 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000407 self.assertEqual(b, b1)
408 self.failUnless(b is b1)
409
410 def test_irepeat_1char(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000411 b = b"x"
Guido van Rossum13e57212006-04-27 22:54:26 +0000412 b1 = b
413 b *= 100
Guido van Rossum9c627722007-08-27 18:31:48 +0000414 self.assertEqual(b, bytes([ord("x")]*100))
Guido van Rossum13e57212006-04-27 22:54:26 +0000415 self.assertEqual(b, b1)
416 self.failUnless(b is b1)
417
418 def test_contains(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000419 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000420 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000421 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000422 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000423 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000424 self.assertRaises(ValueError, lambda: 300 in b)
425 self.assertRaises(ValueError, lambda: -1 in b)
426 self.assertRaises(TypeError, lambda: None in b)
427 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
428 self.assertRaises(TypeError, lambda: "a" in b)
Guido van Rossum9c627722007-08-27 18:31:48 +0000429 self.failUnless(b"" in b)
430 self.failUnless(b"a" in b)
431 self.failUnless(b"b" in b)
432 self.failUnless(b"c" in b)
433 self.failUnless(b"ab" in b)
434 self.failUnless(b"bc" in b)
435 self.failUnless(b"abc" in b)
436 self.failIf(b"ac" in b)
437 self.failIf(b"d" in b)
438 self.failIf(b"dab" in b)
439 self.failIf(b"abd" in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000440
Guido van Rossum20188312006-05-05 15:15:40 +0000441 def test_alloc(self):
442 b = bytes()
443 alloc = b.__alloc__()
444 self.assert_(alloc >= 0)
445 seq = [alloc]
446 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000447 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000448 alloc = b.__alloc__()
449 self.assert_(alloc >= len(b))
450 if alloc not in seq:
451 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000452 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000453
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000454 def test_fromhex(self):
455 self.assertRaises(TypeError, bytes.fromhex)
456 self.assertRaises(TypeError, bytes.fromhex, 1)
457 self.assertEquals(bytes.fromhex(''), bytes())
458 b = bytes([0x1a, 0x2b, 0x30])
459 self.assertEquals(bytes.fromhex('1a2B30'), b)
460 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
Guido van Rossumbae07c92007-10-08 02:46:15 +0000461 self.assertEquals(bytes.fromhex(memoryview(b'')), bytes())
462 self.assertEquals(bytes.fromhex(memoryview(b'0000')), bytes([0, 0]))
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000463 self.assertRaises(ValueError, bytes.fromhex, 'a')
464 self.assertRaises(ValueError, bytes.fromhex, 'rt')
465 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
466 self.assertRaises(ValueError, bytes.fromhex, '\x00')
467 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
468
Guido van Rossum20188312006-05-05 15:15:40 +0000469 def test_join(self):
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000470 self.assertEqual(b"".join([]), bytes())
471 self.assertEqual(b"".join([bytes()]), bytes())
Guido van Rossum9c627722007-08-27 18:31:48 +0000472 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
473 self.assertEqual(b"".join(lst), b"abc")
474 self.assertEqual(b"".join(tuple(lst)), b"abc")
475 self.assertEqual(b"".join(iter(lst)), b"abc")
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000476 self.assertEqual(b".".join([b"ab", b"cd"]), b"ab.cd")
Guido van Rossum20188312006-05-05 15:15:40 +0000477 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000478
479 def test_literal(self):
480 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000481 (b"Wonderful spam", "Wonderful spam"),
482 (br"Wonderful spam too", "Wonderful spam too"),
483 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
484 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000485 ]
486 for b, s in tests:
487 self.assertEqual(b, bytes(s, 'latin-1'))
488 for c in range(128, 256):
489 self.assertRaises(SyntaxError, eval,
490 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000491
Neal Norwitz6968b052007-02-27 19:02:19 +0000492 def test_extend(self):
493 orig = b'hello'
494 a = bytes(orig)
495 a.extend(a)
496 self.assertEqual(a, orig + orig)
497 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000498
Neal Norwitz6968b052007-02-27 19:02:19 +0000499 def test_remove(self):
500 b = b'hello'
501 b.remove(ord('l'))
502 self.assertEqual(b, b'helo')
503 b.remove(ord('l'))
504 self.assertEqual(b, b'heo')
505 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
506 self.assertRaises(ValueError, lambda: b.remove(400))
507 self.assertRaises(ValueError, lambda: b.remove('e'))
508 # remove first and last
509 b.remove(ord('o'))
510 b.remove(ord('h'))
511 self.assertEqual(b, b'e')
512
513 def test_pop(self):
514 b = b'world'
515 self.assertEqual(b.pop(), ord('d'))
516 self.assertEqual(b.pop(0), ord('w'))
517 self.assertEqual(b.pop(-2), ord('r'))
518 self.assertRaises(IndexError, lambda: b.pop(10))
519 self.assertRaises(OverflowError, lambda: bytes().pop())
520
521 def test_nosort(self):
522 self.assertRaises(AttributeError, lambda: bytes().sort())
523
524 def test_index(self):
525 b = b'parrot'
526 self.assertEqual(b.index('p'), 0)
527 self.assertEqual(b.index('rr'), 2)
528 self.assertEqual(b.index('t'), 5)
529 self.assertRaises(ValueError, lambda: b.index('w'))
530
531 def test_count(self):
532 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000533 self.assertEqual(b.count(b'i'), 4)
534 self.assertEqual(b.count(b'ss'), 2)
535 self.assertEqual(b.count(b'w'), 0)
Neal Norwitz6968b052007-02-27 19:02:19 +0000536
537 def test_append(self):
538 b = b'hell'
539 b.append(ord('o'))
540 self.assertEqual(b, b'hello')
541 self.assertEqual(b.append(100), None)
542 b = bytes()
543 b.append(ord('A'))
544 self.assertEqual(len(b), 1)
545
546 def test_insert(self):
547 b = b'msssspp'
548 b.insert(1, ord('i'))
549 b.insert(4, ord('i'))
550 b.insert(-2, ord('i'))
551 b.insert(1000, ord('i'))
552 self.assertEqual(b, b'mississippi')
553
554 def test_startswith(self):
555 b = b'hello'
Guido van Rossum09549f42007-08-27 20:40:10 +0000556 self.assertFalse(bytes().startswith(b"anything"))
557 self.assertTrue(b.startswith(b"hello"))
558 self.assertTrue(b.startswith(b"hel"))
559 self.assertTrue(b.startswith(b"h"))
560 self.assertFalse(b.startswith(b"hellow"))
561 self.assertFalse(b.startswith(b"ha"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000562
563 def test_endswith(self):
564 b = b'hello'
Guido van Rossum09549f42007-08-27 20:40:10 +0000565 self.assertFalse(bytes().endswith(b"anything"))
566 self.assertTrue(b.endswith(b"hello"))
567 self.assertTrue(b.endswith(b"llo"))
568 self.assertTrue(b.endswith(b"o"))
569 self.assertFalse(b.endswith(b"whello"))
570 self.assertFalse(b.endswith(b"no"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000571
572 def test_find(self):
573 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000574 self.assertEqual(b.find(b'ss'), 2)
575 self.assertEqual(b.find(b'ss', 3), 5)
576 self.assertEqual(b.find(b'ss', 1, 7), 2)
577 self.assertEqual(b.find(b'ss', 1, 3), -1)
578 self.assertEqual(b.find(b'w'), -1)
579 self.assertEqual(b.find(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000580
581 def test_rfind(self):
582 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000583 self.assertEqual(b.rfind(b'ss'), 5)
584 self.assertEqual(b.rfind(b'ss', 3), 5)
585 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
586 self.assertEqual(b.rfind(b'w'), -1)
587 self.assertEqual(b.rfind(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000588
589 def test_index(self):
590 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000591 self.assertEqual(b.index(b'w'), 0)
592 self.assertEqual(b.index(b'orl'), 1)
593 self.assertRaises(ValueError, b.index, b'worm')
594 self.assertRaises(ValueError, b.index, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000595
596 def test_rindex(self):
597 # XXX could be more rigorous
598 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000599 self.assertEqual(b.rindex(b'w'), 0)
600 self.assertEqual(b.rindex(b'orl'), 1)
601 self.assertRaises(ValueError, b.rindex, b'worm')
602 self.assertRaises(ValueError, b.rindex, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000603
604 def test_replace(self):
605 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000606 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
607 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
Neal Norwitz6968b052007-02-27 19:02:19 +0000608
609 def test_translate(self):
610 b = b'hello'
611 rosetta = bytes(range(0, 256))
612 rosetta[ord('o')] = ord('e')
613 c = b.translate(rosetta, b'l')
614 self.assertEqual(b, b'hello')
615 self.assertEqual(c, b'hee')
616
617 def test_split(self):
618 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000619 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
620 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
621 self.assertEqual(b.split(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000622
623 def test_split_whitespace(self):
624 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
625 b'arf\fbarf', b'arf\vbarf'):
626 self.assertEqual(b.split(), [b'arf', b'barf'])
627 self.assertEqual(b.split(None), [b'arf', b'barf'])
628 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
629 self.assertEqual(b' a bb c '.split(None, 0), [b'a bb c '])
630 self.assertEqual(b' a bb c '.split(None, 1), [b'a', b'bb c '])
631 self.assertEqual(b' a bb c '.split(None, 2), [b'a', b'bb', b'c '])
632 self.assertEqual(b' a bb c '.split(None, 3), [b'a', b'bb', b'c'])
633
634 def test_split_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000635 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000636
637 def test_split_string_error(self):
638 self.assertRaises(TypeError, b'a b'.split, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000639
640 def test_rsplit(self):
641 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000642 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
643 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
644 self.assertEqual(b.rsplit(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000645
646 def test_rsplit_whitespace(self):
647 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
648 b'arf\fbarf', b'arf\vbarf'):
649 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
650 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
651 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
652 self.assertEqual(b' a bb c '.rsplit(None, 0), [b' a bb c'])
653 self.assertEqual(b' a bb c '.rsplit(None, 1), [b' a bb', b'c'])
654 self.assertEqual(b' a bb c '.rsplit(None,2), [b' a', b'bb', b'c'])
655 self.assertEqual(b' a bb c '.rsplit(None, 3), [b'a', b'bb', b'c'])
656
657 def test_rplit_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000658 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000659
660 def test_rplit_string_error(self):
661 self.assertRaises(TypeError, b'a b'.rsplit, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000662
663 def test_partition(self):
664 b = b'mississippi'
665 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
666 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
667
668 def test_rpartition(self):
669 b = b'mississippi'
670 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
671 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
672
Guido van Rossum0ad08122007-04-11 04:37:43 +0000673 def test_pickling(self):
Guido van Rossum99603b02007-07-20 00:22:32 +0000674 for proto in range(pickle.HIGHEST_PROTOCOL):
675 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
676 ps = pickle.dumps(b, proto)
677 q = pickle.loads(ps)
678 self.assertEqual(b, q)
Guido van Rossum0ad08122007-04-11 04:37:43 +0000679
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000680 def test_strip(self):
681 b = b'mississippi'
682 self.assertEqual(b.strip(b'i'), b'mississipp')
683 self.assertEqual(b.strip(b'm'), b'ississippi')
684 self.assertEqual(b.strip(b'pi'), b'mississ')
685 self.assertEqual(b.strip(b'im'), b'ssissipp')
686 self.assertEqual(b.strip(b'pim'), b'ssiss')
Guido van Rossumeb29e9a2007-08-08 21:55:33 +0000687 self.assertEqual(b.strip(b), b'')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000688
689 def test_lstrip(self):
690 b = b'mississippi'
691 self.assertEqual(b.lstrip(b'i'), b'mississippi')
692 self.assertEqual(b.lstrip(b'm'), b'ississippi')
693 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
694 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
695 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
696
697 def test_rstrip(self):
698 b = b'mississippi'
699 self.assertEqual(b.rstrip(b'i'), b'mississipp')
700 self.assertEqual(b.rstrip(b'm'), b'mississippi')
701 self.assertEqual(b.rstrip(b'pi'), b'mississ')
702 self.assertEqual(b.rstrip(b'im'), b'mississipp')
703 self.assertEqual(b.rstrip(b'pim'), b'mississ')
704
Guido van Rossum8f950672007-09-10 16:53:45 +0000705 def test_strip_whitespace(self):
706 b = b' \t\n\r\f\vabc \t\n\r\f\v'
707 self.assertEqual(b.strip(), b'abc')
708 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
709 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
710
711 def test_strip_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000712 self.assertEqual(b'abc'.strip(memoryview(b'ac')), b'b')
713 self.assertEqual(b'abc'.lstrip(memoryview(b'ac')), b'bc')
714 self.assertEqual(b'abc'.rstrip(memoryview(b'ac')), b'ab')
Guido van Rossum8f950672007-09-10 16:53:45 +0000715
716 def test_strip_string_error(self):
717 self.assertRaises(TypeError, b'abc'.strip, 'b')
718 self.assertRaises(TypeError, b'abc'.lstrip, 'b')
719 self.assertRaises(TypeError, b'abc'.rstrip, 'b')
720
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000721 def test_ord(self):
722 b = b'\0A\x7f\x80\xff'
723 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
724 [0, 65, 127, 128, 255])
725
Guido van Rossumd624f182006-04-24 13:47:05 +0000726 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000727 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000728 # __reversed__? (optimization)
729
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000730 # XXX More string methods? (Those that don't use character properties)
731
Neal Norwitz6968b052007-02-27 19:02:19 +0000732 # There are tests in string_tests.py that are more
733 # comprehensive for things like split, partition, etc.
734 # Unfortunately they are all bundled with tests that
735 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000736
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000737
Georg Brandlc7885542007-03-06 19:16:20 +0000738class BytesAsStringTest(test.string_tests.BaseTest):
739 type2test = bytes
740
Guido van Rossum9c627722007-08-27 18:31:48 +0000741 def fixtype(self, obj):
742 if isinstance(obj, str):
743 return obj.encode("utf-8")
744 return super().fixtype(obj)
745
Georg Brandlc7885542007-03-06 19:16:20 +0000746 # Currently the bytes containment testing uses a single integer
747 # value. This may not be the final design, but until then the
748 # bytes section with in a bytes containment not valid
749 def test_contains(self):
750 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000751 def test_expandtabs(self):
752 pass
753 def test_upper(self):
754 pass
755 def test_lower(self):
756 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000757
758
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000759def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000760 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000761 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000762
763
764if __name__ == "__main__":
Guido van Rossum4355a472007-05-04 05:00:04 +0000765 ##test_main()
766 unittest.main()