blob: 39d92edfd17a3dc97804e2de8eb5000eb4e972dd [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 Rossum4355a472007-05-04 05:00:04 +0000133 # Bytes should never compare equal to Unicode!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000134 # Test this for all expected byte orders and Unicode character sizes
Guido van Rossumef87d6e2007-05-02 19:09:54 +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)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000139
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000140 def test_nohash(self):
141 self.assertRaises(TypeError, hash, bytes())
142
143 def test_doc(self):
144 self.failUnless(bytes.__doc__ != None)
145 self.failUnless(bytes.__doc__.startswith("bytes("))
146
Guido van Rossumd624f182006-04-24 13:47:05 +0000147 def test_buffer_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000148 short_sample = b"Hello world\n"
149 sample = short_sample + b"x"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000150 tfn = tempfile.mktemp()
151 try:
152 # Prepare
153 with open(tfn, "wb") as f:
154 f.write(short_sample)
155 # Test readinto
156 with open(tfn, "rb") as f:
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000157 b = b"x"*20
Guido van Rossumd624f182006-04-24 13:47:05 +0000158 n = f.readinto(b)
159 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000160 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000161 # Test writing in binary mode
162 with open(tfn, "wb") as f:
163 f.write(b)
164 with open(tfn, "rb") as f:
165 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000166 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000167 finally:
168 try:
169 os.remove(tfn)
170 except os.error:
171 pass
172
173 def test_reversed(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000174 input = list(map(ord, "Hello"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000175 b = bytes(input)
176 output = list(reversed(b))
177 input.reverse()
178 self.assertEqual(output, input)
179
Neal Norwitz6968b052007-02-27 19:02:19 +0000180 def test_reverse(self):
181 b = b'hello'
182 self.assertEqual(b.reverse(), None)
183 self.assertEqual(b, b'olleh')
184 b = b'hello1' # test even number of items
185 b.reverse()
186 self.assertEqual(b, b'1olleh')
187 b = bytes()
188 b.reverse()
189 self.assertFalse(b)
190
Guido van Rossumd624f182006-04-24 13:47:05 +0000191 def test_getslice(self):
192 def by(s):
193 return bytes(map(ord, s))
194 b = by("Hello, world")
195
196 self.assertEqual(b[:5], by("Hello"))
197 self.assertEqual(b[1:5], by("ello"))
198 self.assertEqual(b[5:7], by(", "))
199 self.assertEqual(b[7:], by("world"))
200 self.assertEqual(b[7:12], by("world"))
201 self.assertEqual(b[7:100], by("world"))
202
203 self.assertEqual(b[:-7], by("Hello"))
204 self.assertEqual(b[-11:-7], by("ello"))
205 self.assertEqual(b[-7:-5], by(", "))
206 self.assertEqual(b[-5:], by("world"))
207 self.assertEqual(b[-5:12], by("world"))
208 self.assertEqual(b[-5:100], by("world"))
209 self.assertEqual(b[-100:5], by("Hello"))
210
Thomas Wouters376446d2006-12-19 08:30:14 +0000211 def test_extended_getslice(self):
212 # Test extended slicing by comparing with list slicing.
213 L = list(range(255))
214 b = bytes(L)
215 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
216 for start in indices:
217 for stop in indices:
218 # Skip step 0 (invalid)
219 for step in indices[1:]:
220 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000221
Guido van Rossumd624f182006-04-24 13:47:05 +0000222 def test_regexps(self):
223 def by(s):
224 return bytes(map(ord, s))
225 b = by("Hello, world")
226 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
227
228 def test_setitem(self):
229 b = bytes([1, 2, 3])
230 b[1] = 100
231 self.assertEqual(b, bytes([1, 100, 3]))
232 b[-1] = 200
233 self.assertEqual(b, bytes([1, 100, 200]))
234 class C:
235 def __init__(self, i=0):
236 self.i = i
237 def __index__(self):
238 return self.i
239 b[0] = C(10)
240 self.assertEqual(b, bytes([10, 100, 200]))
241 try:
242 b[3] = 0
243 self.fail("Didn't raise IndexError")
244 except IndexError:
245 pass
246 try:
247 b[-10] = 0
248 self.fail("Didn't raise IndexError")
249 except IndexError:
250 pass
251 try:
252 b[0] = 256
253 self.fail("Didn't raise ValueError")
254 except ValueError:
255 pass
256 try:
257 b[0] = C(-1)
258 self.fail("Didn't raise ValueError")
259 except ValueError:
260 pass
261 try:
262 b[0] = None
263 self.fail("Didn't raise TypeError")
264 except TypeError:
265 pass
266
267 def test_delitem(self):
268 b = bytes(range(10))
269 del b[0]
270 self.assertEqual(b, bytes(range(1, 10)))
271 del b[-1]
272 self.assertEqual(b, bytes(range(1, 9)))
273 del b[4]
274 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
275
276 def test_setslice(self):
277 b = bytes(range(10))
278 self.assertEqual(list(b), list(range(10)))
279
280 b[0:5] = bytes([1, 1, 1, 1, 1])
281 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
282
283 del b[0:-5]
284 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
285
286 b[0:0] = bytes([0, 1, 2, 3, 4])
287 self.assertEqual(b, bytes(range(10)))
288
289 b[-7:-3] = bytes([100, 101])
290 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
291
292 b[3:5] = [3, 4, 5, 6]
293 self.assertEqual(b, bytes(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000294
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000295 b[3:0] = [42, 42, 42]
296 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 +0000297
Thomas Wouters376446d2006-12-19 08:30:14 +0000298 def test_extended_set_del_slice(self):
299 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
300 for start in indices:
301 for stop in indices:
302 # Skip invalid step 0
303 for step in indices[1:]:
304 L = list(range(255))
305 b = bytes(L)
306 # Make sure we have a slice of exactly the right length,
307 # but with different data.
308 data = L[start:stop:step]
309 data.reverse()
310 L[start:stop:step] = data
311 b[start:stop:step] = data
312 self.assertEquals(b, bytes(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000313
Thomas Wouters376446d2006-12-19 08:30:14 +0000314 del L[start:stop:step]
315 del b[start:stop:step]
316 self.assertEquals(b, bytes(L))
317
Guido van Rossumd624f182006-04-24 13:47:05 +0000318 def test_setslice_trap(self):
319 # This test verifies that we correctly handle assigning self
320 # to a slice of self (the old Lambert Meertens trap).
321 b = bytes(range(256))
322 b[8:] = b
323 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
324
325 def test_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000326 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000327 for enc in ("utf8", "utf16"):
328 b = bytes(sample, enc)
Guido van Rossum4355a472007-05-04 05:00:04 +0000329 self.assertEqual(b, bytes(sample.encode(enc)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000330 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
331 b = bytes(sample, "latin1", "ignore")
Guido van Rossum9c627722007-08-27 18:31:48 +0000332 self.assertEqual(b, bytes(sample[:-4], "utf-8"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000333
334 def test_decode(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000335 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000336 for enc in ("utf8", "utf16"):
337 b = bytes(sample, enc)
338 self.assertEqual(b.decode(enc), sample)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000339 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossumd624f182006-04-24 13:47:05 +0000340 b = bytes(sample, "latin1")
341 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
342 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
343
344 def test_from_buffer(self):
Guido van Rossum4355a472007-05-04 05:00:04 +0000345 sample = str8("Hello world\n\x80\x81\xfe\xff")
Guido van Rossumd624f182006-04-24 13:47:05 +0000346 buf = buffer(sample)
347 b = bytes(buf)
348 self.assertEqual(b, bytes(map(ord, sample)))
349
350 def test_to_str(self):
351 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossum9c627722007-08-27 18:31:48 +0000352 b = bytes(sample, "utf-8")
Guido van Rossumd624f182006-04-24 13:47:05 +0000353 self.assertEqual(str(b), sample)
354
355 def test_from_int(self):
356 b = bytes(0)
357 self.assertEqual(b, bytes())
358 b = bytes(10)
359 self.assertEqual(b, bytes([0]*10))
360 b = bytes(10000)
361 self.assertEqual(b, bytes([0]*10000))
362
363 def test_concat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000364 b1 = b"abc"
365 b2 = b"def"
366 self.assertEqual(b1 + b2, b"abcdef")
367 self.assertEqual(b1 + str8("def"), b"abcdef")
368 self.assertEqual(str8("def") + b1, b"defabc")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000369 self.assertRaises(TypeError, lambda: b1 + "def")
370 self.assertRaises(TypeError, lambda: "abc" + b2)
Guido van Rossumd624f182006-04-24 13:47:05 +0000371
372 def test_repeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000373 b = b"abc"
374 self.assertEqual(b * 3, b"abcabcabc")
Guido van Rossumd624f182006-04-24 13:47:05 +0000375 self.assertEqual(b * 0, bytes())
376 self.assertEqual(b * -1, bytes())
377 self.assertRaises(TypeError, lambda: b * 3.14)
378 self.assertRaises(TypeError, lambda: 3.14 * b)
379 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000380
381 def test_repeat_1char(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000382 self.assertEqual(b'x'*100, bytes([ord('x')]*100))
Guido van Rossumd624f182006-04-24 13:47:05 +0000383
Guido van Rossum13e57212006-04-27 22:54:26 +0000384 def test_iconcat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000385 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000386 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000387 b += b"def"
388 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000389 self.assertEqual(b, b1)
390 self.failUnless(b is b1)
Guido van Rossum4355a472007-05-04 05:00:04 +0000391 b += str8("xyz")
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000392 self.assertEqual(b, b"abcdefxyz")
393 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000394 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000395 except TypeError:
396 pass
397 else:
398 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000399
400 def test_irepeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000401 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000402 b1 = b
403 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000404 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000405 self.assertEqual(b, b1)
406 self.failUnless(b is b1)
407
408 def test_irepeat_1char(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000409 b = b"x"
Guido van Rossum13e57212006-04-27 22:54:26 +0000410 b1 = b
411 b *= 100
Guido van Rossum9c627722007-08-27 18:31:48 +0000412 self.assertEqual(b, bytes([ord("x")]*100))
Guido van Rossum13e57212006-04-27 22:54:26 +0000413 self.assertEqual(b, b1)
414 self.failUnless(b is b1)
415
416 def test_contains(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000417 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000418 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000419 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000420 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000421 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000422 self.assertRaises(ValueError, lambda: 300 in b)
423 self.assertRaises(ValueError, lambda: -1 in b)
424 self.assertRaises(TypeError, lambda: None in b)
425 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
426 self.assertRaises(TypeError, lambda: "a" in b)
Guido van Rossum9c627722007-08-27 18:31:48 +0000427 self.failUnless(b"" in b)
428 self.failUnless(b"a" in b)
429 self.failUnless(b"b" in b)
430 self.failUnless(b"c" in b)
431 self.failUnless(b"ab" in b)
432 self.failUnless(b"bc" in b)
433 self.failUnless(b"abc" in b)
434 self.failIf(b"ac" in b)
435 self.failIf(b"d" in b)
436 self.failIf(b"dab" in b)
437 self.failIf(b"abd" in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000438
Guido van Rossum20188312006-05-05 15:15:40 +0000439 def test_alloc(self):
440 b = bytes()
441 alloc = b.__alloc__()
442 self.assert_(alloc >= 0)
443 seq = [alloc]
444 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000445 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000446 alloc = b.__alloc__()
447 self.assert_(alloc >= len(b))
448 if alloc not in seq:
449 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000450 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000451
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000452 def test_fromhex(self):
453 self.assertRaises(TypeError, bytes.fromhex)
454 self.assertRaises(TypeError, bytes.fromhex, 1)
455 self.assertEquals(bytes.fromhex(''), bytes())
456 b = bytes([0x1a, 0x2b, 0x30])
457 self.assertEquals(bytes.fromhex('1a2B30'), b)
458 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
Guido van Rossum4355a472007-05-04 05:00:04 +0000459 self.assertEquals(bytes.fromhex(buffer(b'')), bytes())
460 self.assertEquals(bytes.fromhex(buffer(b'0000')), bytes([0, 0]))
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000461 self.assertRaises(ValueError, bytes.fromhex, 'a')
462 self.assertRaises(ValueError, bytes.fromhex, 'rt')
463 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
464 self.assertRaises(ValueError, bytes.fromhex, '\x00')
465 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
466
Guido van Rossum20188312006-05-05 15:15:40 +0000467 def test_join(self):
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000468 self.assertEqual(b"".join([]), bytes())
469 self.assertEqual(b"".join([bytes()]), bytes())
Guido van Rossum9c627722007-08-27 18:31:48 +0000470 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
471 self.assertEqual(b"".join(lst), b"abc")
472 self.assertEqual(b"".join(tuple(lst)), b"abc")
473 self.assertEqual(b"".join(iter(lst)), b"abc")
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000474 self.assertEqual(b".".join([b"ab", b"cd"]), b"ab.cd")
Guido van Rossum20188312006-05-05 15:15:40 +0000475 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000476
477 def test_literal(self):
478 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000479 (b"Wonderful spam", "Wonderful spam"),
480 (br"Wonderful spam too", "Wonderful spam too"),
481 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
482 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000483 ]
484 for b, s in tests:
485 self.assertEqual(b, bytes(s, 'latin-1'))
486 for c in range(128, 256):
487 self.assertRaises(SyntaxError, eval,
488 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000489
Neal Norwitz6968b052007-02-27 19:02:19 +0000490 def test_extend(self):
491 orig = b'hello'
492 a = bytes(orig)
493 a.extend(a)
494 self.assertEqual(a, orig + orig)
495 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000496
Neal Norwitz6968b052007-02-27 19:02:19 +0000497 def test_remove(self):
498 b = b'hello'
499 b.remove(ord('l'))
500 self.assertEqual(b, b'helo')
501 b.remove(ord('l'))
502 self.assertEqual(b, b'heo')
503 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
504 self.assertRaises(ValueError, lambda: b.remove(400))
505 self.assertRaises(ValueError, lambda: b.remove('e'))
506 # remove first and last
507 b.remove(ord('o'))
508 b.remove(ord('h'))
509 self.assertEqual(b, b'e')
510
511 def test_pop(self):
512 b = b'world'
513 self.assertEqual(b.pop(), ord('d'))
514 self.assertEqual(b.pop(0), ord('w'))
515 self.assertEqual(b.pop(-2), ord('r'))
516 self.assertRaises(IndexError, lambda: b.pop(10))
517 self.assertRaises(OverflowError, lambda: bytes().pop())
518
519 def test_nosort(self):
520 self.assertRaises(AttributeError, lambda: bytes().sort())
521
522 def test_index(self):
523 b = b'parrot'
524 self.assertEqual(b.index('p'), 0)
525 self.assertEqual(b.index('rr'), 2)
526 self.assertEqual(b.index('t'), 5)
527 self.assertRaises(ValueError, lambda: b.index('w'))
528
529 def test_count(self):
530 b = b'mississippi'
531 self.assertEqual(b.count('i'), 4)
532 self.assertEqual(b.count('ss'), 2)
533 self.assertEqual(b.count('w'), 0)
534
535 def test_append(self):
536 b = b'hell'
537 b.append(ord('o'))
538 self.assertEqual(b, b'hello')
539 self.assertEqual(b.append(100), None)
540 b = bytes()
541 b.append(ord('A'))
542 self.assertEqual(len(b), 1)
543
544 def test_insert(self):
545 b = b'msssspp'
546 b.insert(1, ord('i'))
547 b.insert(4, ord('i'))
548 b.insert(-2, ord('i'))
549 b.insert(1000, ord('i'))
550 self.assertEqual(b, b'mississippi')
551
552 def test_startswith(self):
553 b = b'hello'
554 self.assertFalse(bytes().startswith("anything"))
555 self.assertTrue(b.startswith("hello"))
556 self.assertTrue(b.startswith("hel"))
557 self.assertTrue(b.startswith("h"))
558 self.assertFalse(b.startswith("hellow"))
559 self.assertFalse(b.startswith("ha"))
560
561 def test_endswith(self):
562 b = b'hello'
563 self.assertFalse(bytes().endswith("anything"))
564 self.assertTrue(b.endswith("hello"))
565 self.assertTrue(b.endswith("llo"))
566 self.assertTrue(b.endswith("o"))
567 self.assertFalse(b.endswith("whello"))
568 self.assertFalse(b.endswith("no"))
569
570 def test_find(self):
571 b = b'mississippi'
572 self.assertEqual(b.find('ss'), 2)
573 self.assertEqual(b.find('ss', 3), 5)
574 self.assertEqual(b.find('ss', 1, 7), 2)
575 self.assertEqual(b.find('ss', 1, 3), -1)
576 self.assertEqual(b.find('w'), -1)
577 self.assertEqual(b.find('mississippian'), -1)
578
579 def test_rfind(self):
580 b = b'mississippi'
581 self.assertEqual(b.rfind('ss'), 5)
582 self.assertEqual(b.rfind('ss', 3), 5)
583 self.assertEqual(b.rfind('ss', 0, 6), 2)
584 self.assertEqual(b.rfind('w'), -1)
585 self.assertEqual(b.rfind('mississippian'), -1)
586
587 def test_index(self):
588 b = b'world'
589 self.assertEqual(b.index('w'), 0)
590 self.assertEqual(b.index('orl'), 1)
591 self.assertRaises(ValueError, lambda: b.index('worm'))
592 self.assertRaises(ValueError, lambda: b.index('ldo'))
593
594 def test_rindex(self):
595 # XXX could be more rigorous
596 b = b'world'
597 self.assertEqual(b.rindex('w'), 0)
598 self.assertEqual(b.rindex('orl'), 1)
599 self.assertRaises(ValueError, lambda: b.rindex('worm'))
600 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
601
602 def test_replace(self):
603 b = b'mississippi'
604 self.assertEqual(b.replace('i', 'a'), b'massassappa')
605 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
606
607 def test_translate(self):
608 b = b'hello'
609 rosetta = bytes(range(0, 256))
610 rosetta[ord('o')] = ord('e')
611 c = b.translate(rosetta, b'l')
612 self.assertEqual(b, b'hello')
613 self.assertEqual(c, b'hee')
614
615 def test_split(self):
616 b = b'mississippi'
617 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
618 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
619 self.assertEqual(b.split('w'), [b])
620 # require an arg (no magic whitespace split)
621 self.assertRaises(TypeError, lambda: b.split())
622
623 def test_rsplit(self):
624 b = b'mississippi'
625 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
626 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
627 self.assertEqual(b.rsplit('w'), [b])
628 # require an arg (no magic whitespace split)
629 self.assertRaises(TypeError, lambda: b.rsplit())
630
631 def test_partition(self):
632 b = b'mississippi'
633 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
634 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
635
636 def test_rpartition(self):
637 b = b'mississippi'
638 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
639 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
640
Guido van Rossum0ad08122007-04-11 04:37:43 +0000641 def test_pickling(self):
Guido van Rossum99603b02007-07-20 00:22:32 +0000642 for proto in range(pickle.HIGHEST_PROTOCOL):
643 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
644 ps = pickle.dumps(b, proto)
645 q = pickle.loads(ps)
646 self.assertEqual(b, q)
Guido van Rossum0ad08122007-04-11 04:37:43 +0000647
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000648 def test_strip(self):
649 b = b'mississippi'
650 self.assertEqual(b.strip(b'i'), b'mississipp')
651 self.assertEqual(b.strip(b'm'), b'ississippi')
652 self.assertEqual(b.strip(b'pi'), b'mississ')
653 self.assertEqual(b.strip(b'im'), b'ssissipp')
654 self.assertEqual(b.strip(b'pim'), b'ssiss')
Guido van Rossumeb29e9a2007-08-08 21:55:33 +0000655 self.assertEqual(b.strip(b), b'')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000656
657 def test_lstrip(self):
658 b = b'mississippi'
659 self.assertEqual(b.lstrip(b'i'), b'mississippi')
660 self.assertEqual(b.lstrip(b'm'), b'ississippi')
661 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
662 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
663 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
664
665 def test_rstrip(self):
666 b = b'mississippi'
667 self.assertEqual(b.rstrip(b'i'), b'mississipp')
668 self.assertEqual(b.rstrip(b'm'), b'mississippi')
669 self.assertEqual(b.rstrip(b'pi'), b'mississ')
670 self.assertEqual(b.rstrip(b'im'), b'mississipp')
671 self.assertEqual(b.rstrip(b'pim'), b'mississ')
672
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000673 def test_ord(self):
674 b = b'\0A\x7f\x80\xff'
675 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
676 [0, 65, 127, 128, 255])
677
Guido van Rossumd624f182006-04-24 13:47:05 +0000678 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000679 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000680 # __reversed__? (optimization)
681
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000682 # XXX More string methods? (Those that don't use character properties)
683
Neal Norwitz6968b052007-02-27 19:02:19 +0000684 # There are tests in string_tests.py that are more
685 # comprehensive for things like split, partition, etc.
686 # Unfortunately they are all bundled with tests that
687 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000688
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000689
Georg Brandlc7885542007-03-06 19:16:20 +0000690class BytesAsStringTest(test.string_tests.BaseTest):
691 type2test = bytes
692
Guido van Rossum9c627722007-08-27 18:31:48 +0000693 def fixtype(self, obj):
694 if isinstance(obj, str):
695 return obj.encode("utf-8")
696 return super().fixtype(obj)
697
Georg Brandlc7885542007-03-06 19:16:20 +0000698 def checkequal(self, result, object, methodname, *args):
Guido van Rossum9c627722007-08-27 18:31:48 +0000699 object = bytes(object, "utf-8")
Georg Brandlc7885542007-03-06 19:16:20 +0000700 realresult = getattr(bytes, methodname)(object, *args)
701 self.assertEqual(
702 self.fixtype(result),
703 realresult
704 )
705
706 def checkraises(self, exc, object, methodname, *args):
Guido van Rossum9c627722007-08-27 18:31:48 +0000707 object = bytes(object, "utf-8")
Georg Brandlc7885542007-03-06 19:16:20 +0000708 self.assertRaises(
709 exc,
710 getattr(bytes, methodname),
711 object,
712 *args
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000713 )
Georg Brandlc7885542007-03-06 19:16:20 +0000714
715 # Currently the bytes containment testing uses a single integer
716 # value. This may not be the final design, but until then the
717 # bytes section with in a bytes containment not valid
718 def test_contains(self):
719 pass
720 def test_find(self):
721 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000722 def test_expandtabs(self):
723 pass
724 def test_upper(self):
725 pass
726 def test_lower(self):
727 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000728
729
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000730def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000731 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000732 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000733
734
735if __name__ == "__main__":
Guido van Rossum4355a472007-05-04 05:00:04 +0000736 ##test_main()
737 unittest.main()