blob: 654cb863f9f50a9b8d90b663742165776bf8bbab [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'")
Georg Brandlee91be42007-02-24 19:41:35 +000078 self.assertEqual(repr(bytes('abc')), "b'abc'")
79 self.assertEqual(repr(bytes("'")), "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")
332 self.assertEqual(b, bytes(sample[:-4]))
333
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"
352 b = bytes(sample)
353 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):
364 b1 = bytes("abc")
365 b2 = bytes("def")
366 self.assertEqual(b1 + b2, bytes("abcdef"))
Guido van Rossum4355a472007-05-04 05:00:04 +0000367 self.assertEqual(b1 + str8("def"), bytes("abcdef"))
368 self.assertEqual(str8("def") + b1, bytes("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):
373 b = bytes("abc")
374 self.assertEqual(b * 3, bytes("abcabcabc"))
375 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 Rossumd624f182006-04-24 13:47:05 +0000382 self.assertEqual(bytes('x')*100, bytes('x'*100))
383
Guido van Rossum13e57212006-04-27 22:54:26 +0000384 def test_iconcat(self):
385 b = bytes("abc")
386 b1 = b
387 b += bytes("def")
388 self.assertEqual(b, bytes("abcdef"))
389 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):
401 b = bytes("abc")
402 b1 = b
403 b *= 3
404 self.assertEqual(b, bytes("abcabcabc"))
405 self.assertEqual(b, b1)
406 self.failUnless(b is b1)
407
408 def test_irepeat_1char(self):
409 b = bytes("x")
410 b1 = b
411 b *= 100
412 self.assertEqual(b, bytes("x"*100))
413 self.assertEqual(b, b1)
414 self.failUnless(b is b1)
415
416 def test_contains(self):
417 b = bytes("abc")
418 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)
427 self.failUnless(bytes("") in b)
428 self.failUnless(bytes("a") in b)
429 self.failUnless(bytes("b") in b)
430 self.failUnless(bytes("c") in b)
431 self.failUnless(bytes("ab") in b)
432 self.failUnless(bytes("bc") in b)
433 self.failUnless(bytes("abc") in b)
434 self.failIf(bytes("ac") in b)
435 self.failIf(bytes("d") in b)
436 self.failIf(bytes("dab") in b)
437 self.failIf(bytes("abd") in b)
438
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):
445 b += bytes("x")
446 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 Rossum20188312006-05-05 15:15:40 +0000470 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000471 lst = list(map(bytes, part))
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000472 self.assertEqual(b"".join(lst), bytes("abc"))
473 self.assertEqual(b"".join(tuple(lst)), bytes("abc"))
474 self.assertEqual(b"".join(iter(lst)), bytes("abc"))
475 self.assertEqual(b".".join([b"ab", b"cd"]), b"ab.cd")
Guido van Rossum20188312006-05-05 15:15:40 +0000476 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000477
478 def test_literal(self):
479 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000480 (b"Wonderful spam", "Wonderful spam"),
481 (br"Wonderful spam too", "Wonderful spam too"),
482 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
483 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000484 ]
485 for b, s in tests:
486 self.assertEqual(b, bytes(s, 'latin-1'))
487 for c in range(128, 256):
488 self.assertRaises(SyntaxError, eval,
489 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000490
Neal Norwitz6968b052007-02-27 19:02:19 +0000491 def test_extend(self):
492 orig = b'hello'
493 a = bytes(orig)
494 a.extend(a)
495 self.assertEqual(a, orig + orig)
496 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000497
Neal Norwitz6968b052007-02-27 19:02:19 +0000498 def test_remove(self):
499 b = b'hello'
500 b.remove(ord('l'))
501 self.assertEqual(b, b'helo')
502 b.remove(ord('l'))
503 self.assertEqual(b, b'heo')
504 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
505 self.assertRaises(ValueError, lambda: b.remove(400))
506 self.assertRaises(ValueError, lambda: b.remove('e'))
507 # remove first and last
508 b.remove(ord('o'))
509 b.remove(ord('h'))
510 self.assertEqual(b, b'e')
511
512 def test_pop(self):
513 b = b'world'
514 self.assertEqual(b.pop(), ord('d'))
515 self.assertEqual(b.pop(0), ord('w'))
516 self.assertEqual(b.pop(-2), ord('r'))
517 self.assertRaises(IndexError, lambda: b.pop(10))
518 self.assertRaises(OverflowError, lambda: bytes().pop())
519
520 def test_nosort(self):
521 self.assertRaises(AttributeError, lambda: bytes().sort())
522
523 def test_index(self):
524 b = b'parrot'
525 self.assertEqual(b.index('p'), 0)
526 self.assertEqual(b.index('rr'), 2)
527 self.assertEqual(b.index('t'), 5)
528 self.assertRaises(ValueError, lambda: b.index('w'))
529
530 def test_count(self):
531 b = b'mississippi'
532 self.assertEqual(b.count('i'), 4)
533 self.assertEqual(b.count('ss'), 2)
534 self.assertEqual(b.count('w'), 0)
535
536 def test_append(self):
537 b = b'hell'
538 b.append(ord('o'))
539 self.assertEqual(b, b'hello')
540 self.assertEqual(b.append(100), None)
541 b = bytes()
542 b.append(ord('A'))
543 self.assertEqual(len(b), 1)
544
545 def test_insert(self):
546 b = b'msssspp'
547 b.insert(1, ord('i'))
548 b.insert(4, ord('i'))
549 b.insert(-2, ord('i'))
550 b.insert(1000, ord('i'))
551 self.assertEqual(b, b'mississippi')
552
553 def test_startswith(self):
554 b = b'hello'
555 self.assertFalse(bytes().startswith("anything"))
556 self.assertTrue(b.startswith("hello"))
557 self.assertTrue(b.startswith("hel"))
558 self.assertTrue(b.startswith("h"))
559 self.assertFalse(b.startswith("hellow"))
560 self.assertFalse(b.startswith("ha"))
561
562 def test_endswith(self):
563 b = b'hello'
564 self.assertFalse(bytes().endswith("anything"))
565 self.assertTrue(b.endswith("hello"))
566 self.assertTrue(b.endswith("llo"))
567 self.assertTrue(b.endswith("o"))
568 self.assertFalse(b.endswith("whello"))
569 self.assertFalse(b.endswith("no"))
570
571 def test_find(self):
572 b = b'mississippi'
573 self.assertEqual(b.find('ss'), 2)
574 self.assertEqual(b.find('ss', 3), 5)
575 self.assertEqual(b.find('ss', 1, 7), 2)
576 self.assertEqual(b.find('ss', 1, 3), -1)
577 self.assertEqual(b.find('w'), -1)
578 self.assertEqual(b.find('mississippian'), -1)
579
580 def test_rfind(self):
581 b = b'mississippi'
582 self.assertEqual(b.rfind('ss'), 5)
583 self.assertEqual(b.rfind('ss', 3), 5)
584 self.assertEqual(b.rfind('ss', 0, 6), 2)
585 self.assertEqual(b.rfind('w'), -1)
586 self.assertEqual(b.rfind('mississippian'), -1)
587
588 def test_index(self):
589 b = b'world'
590 self.assertEqual(b.index('w'), 0)
591 self.assertEqual(b.index('orl'), 1)
592 self.assertRaises(ValueError, lambda: b.index('worm'))
593 self.assertRaises(ValueError, lambda: b.index('ldo'))
594
595 def test_rindex(self):
596 # XXX could be more rigorous
597 b = b'world'
598 self.assertEqual(b.rindex('w'), 0)
599 self.assertEqual(b.rindex('orl'), 1)
600 self.assertRaises(ValueError, lambda: b.rindex('worm'))
601 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
602
603 def test_replace(self):
604 b = b'mississippi'
605 self.assertEqual(b.replace('i', 'a'), b'massassappa')
606 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
607
608 def test_translate(self):
609 b = b'hello'
610 rosetta = bytes(range(0, 256))
611 rosetta[ord('o')] = ord('e')
612 c = b.translate(rosetta, b'l')
613 self.assertEqual(b, b'hello')
614 self.assertEqual(c, b'hee')
615
616 def test_split(self):
617 b = b'mississippi'
618 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
619 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
620 self.assertEqual(b.split('w'), [b])
621 # require an arg (no magic whitespace split)
622 self.assertRaises(TypeError, lambda: b.split())
623
624 def test_rsplit(self):
625 b = b'mississippi'
626 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
627 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
628 self.assertEqual(b.rsplit('w'), [b])
629 # require an arg (no magic whitespace split)
630 self.assertRaises(TypeError, lambda: b.rsplit())
631
632 def test_partition(self):
633 b = b'mississippi'
634 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
635 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
636
637 def test_rpartition(self):
638 b = b'mississippi'
639 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
640 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
641
Guido van Rossum0ad08122007-04-11 04:37:43 +0000642 def test_pickling(self):
Guido van Rossum99603b02007-07-20 00:22:32 +0000643 for proto in range(pickle.HIGHEST_PROTOCOL):
644 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
645 ps = pickle.dumps(b, proto)
646 q = pickle.loads(ps)
647 self.assertEqual(b, q)
Guido van Rossum0ad08122007-04-11 04:37:43 +0000648
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000649 def test_strip(self):
650 b = b'mississippi'
651 self.assertEqual(b.strip(b'i'), b'mississipp')
652 self.assertEqual(b.strip(b'm'), b'ississippi')
653 self.assertEqual(b.strip(b'pi'), b'mississ')
654 self.assertEqual(b.strip(b'im'), b'ssissipp')
655 self.assertEqual(b.strip(b'pim'), b'ssiss')
Guido van Rossumeb29e9a2007-08-08 21:55:33 +0000656 self.assertEqual(b.strip(b), b'')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000657
658 def test_lstrip(self):
659 b = b'mississippi'
660 self.assertEqual(b.lstrip(b'i'), b'mississippi')
661 self.assertEqual(b.lstrip(b'm'), b'ississippi')
662 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
663 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
664 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
665
666 def test_rstrip(self):
667 b = b'mississippi'
668 self.assertEqual(b.rstrip(b'i'), b'mississipp')
669 self.assertEqual(b.rstrip(b'm'), b'mississippi')
670 self.assertEqual(b.rstrip(b'pi'), b'mississ')
671 self.assertEqual(b.rstrip(b'im'), b'mississipp')
672 self.assertEqual(b.rstrip(b'pim'), b'mississ')
673
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000674 def test_ord(self):
675 b = b'\0A\x7f\x80\xff'
676 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
677 [0, 65, 127, 128, 255])
678
Guido van Rossumd624f182006-04-24 13:47:05 +0000679 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000680 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000681 # __reversed__? (optimization)
682
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000683 # XXX More string methods? (Those that don't use character properties)
684
Neal Norwitz6968b052007-02-27 19:02:19 +0000685 # There are tests in string_tests.py that are more
686 # comprehensive for things like split, partition, etc.
687 # Unfortunately they are all bundled with tests that
688 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000689
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000690
Georg Brandlc7885542007-03-06 19:16:20 +0000691class BytesAsStringTest(test.string_tests.BaseTest):
692 type2test = bytes
693
694 def checkequal(self, result, object, methodname, *args):
695 object = bytes(object)
696 realresult = getattr(bytes, methodname)(object, *args)
697 self.assertEqual(
698 self.fixtype(result),
699 realresult
700 )
701
702 def checkraises(self, exc, object, methodname, *args):
703 object = bytes(object)
704 self.assertRaises(
705 exc,
706 getattr(bytes, methodname),
707 object,
708 *args
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000709 )
Georg Brandlc7885542007-03-06 19:16:20 +0000710
711 # Currently the bytes containment testing uses a single integer
712 # value. This may not be the final design, but until then the
713 # bytes section with in a bytes containment not valid
714 def test_contains(self):
715 pass
716 def test_find(self):
717 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000718 def test_expandtabs(self):
719 pass
720 def test_upper(self):
721 pass
722 def test_lower(self):
723 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000724
725
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000726def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000727 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000728 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000729
730
731if __name__ == "__main__":
Guido van Rossum4355a472007-05-04 05:00:04 +0000732 ##test_main()
733 unittest.main()