blob: 7178c06ff360b54d5ab0e8c0725c60e786fe329b [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
7import cPickle
Guido van Rossumd624f182006-04-24 13:47:05 +00008import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00009import unittest
10import test.test_support
Georg Brandlc7885542007-03-06 19:16:20 +000011import test.string_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000012
13
14class BytesTest(unittest.TestCase):
15
16 def test_basics(self):
17 b = bytes()
18 self.assertEqual(type(b), bytes)
19 self.assertEqual(b.__class__, bytes)
20
21 def test_empty_sequence(self):
22 b = bytes()
23 self.assertEqual(len(b), 0)
24 self.assertRaises(IndexError, lambda: b[0])
25 self.assertRaises(IndexError, lambda: b[1])
26 self.assertRaises(IndexError, lambda: b[sys.maxint])
27 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
28 self.assertRaises(IndexError, lambda: b[10**100])
29 self.assertRaises(IndexError, lambda: b[-1])
30 self.assertRaises(IndexError, lambda: b[-2])
31 self.assertRaises(IndexError, lambda: b[-sys.maxint])
32 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
33 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
34 self.assertRaises(IndexError, lambda: b[-10**100])
35
36 def test_from_list(self):
37 ints = list(range(256))
38 b = bytes(i for i in ints)
39 self.assertEqual(len(b), 256)
40 self.assertEqual(list(b), ints)
41
42 def test_from_index(self):
43 class C:
44 def __init__(self, i=0):
45 self.i = i
46 def __index__(self):
47 return self.i
48 b = bytes([C(), C(1), C(254), C(255)])
49 self.assertEqual(list(b), [0, 1, 254, 255])
Guido van Rossume06b6b82006-04-23 07:43:54 +000050 self.assertRaises(ValueError, bytes, [C(-1)])
51 self.assertRaises(ValueError, bytes, [C(256)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000052
53 def test_constructor_type_errors(self):
Guido van Rossumd624f182006-04-24 13:47:05 +000054 self.assertRaises(TypeError, bytes, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000055 class C:
56 pass
Guido van Rossume06b6b82006-04-23 07:43:54 +000057 self.assertRaises(TypeError, bytes, ["0"])
58 self.assertRaises(TypeError, bytes, [0.0])
59 self.assertRaises(TypeError, bytes, [None])
60 self.assertRaises(TypeError, bytes, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000061
62 def test_constructor_value_errors(self):
Guido van Rossume06b6b82006-04-23 07:43:54 +000063 self.assertRaises(ValueError, bytes, [-1])
64 self.assertRaises(ValueError, bytes, [-sys.maxint])
65 self.assertRaises(ValueError, bytes, [-sys.maxint-1])
Thomas Woutersd204a712006-08-22 13:41:17 +000066 self.assertRaises(ValueError, bytes, [-sys.maxint-2])
67 self.assertRaises(ValueError, bytes, [-10**100])
Guido van Rossume06b6b82006-04-23 07:43:54 +000068 self.assertRaises(ValueError, bytes, [256])
69 self.assertRaises(ValueError, bytes, [257])
70 self.assertRaises(ValueError, bytes, [sys.maxint])
Thomas Woutersd204a712006-08-22 13:41:17 +000071 self.assertRaises(ValueError, bytes, [sys.maxint+1])
72 self.assertRaises(ValueError, bytes, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000073
74 def test_repr(self):
Georg Brandlee91be42007-02-24 19:41:35 +000075 self.assertEqual(repr(bytes()), "b''")
76 self.assertEqual(repr(bytes([0])), "b'\\0'")
77 self.assertEqual(repr(bytes([0, 1, 254, 255])), "b'\\0\\x01\\xfe\\xff'")
78 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
86 self.failUnless(b1 == b2)
87 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):
105 self.assertEqual(b"abc" == "abc", True)
106 self.assertEqual(b"ab" != "abc", True)
107 self.assertEqual(b"ab" <= "abc", True)
108 self.assertEqual(b"ab" < "abc", True)
109 self.assertEqual(b"abc" >= "ab", True)
110 self.assertEqual(b"abc" > "ab", True)
111
112 self.assertEqual(b"abc" != "abc", False)
113 self.assertEqual(b"ab" == "abc", False)
114 self.assertEqual(b"ab" > "abc", False)
115 self.assertEqual(b"ab" >= "abc", False)
116 self.assertEqual(b"abc" < "ab", False)
117 self.assertEqual(b"abc" <= "ab", False)
118
Guido van Rossumebea9be2007-04-09 00:49:13 +0000119 self.assertEqual("abc" == b"abc", True)
120 self.assertEqual("ab" != b"abc", True)
121 self.assertEqual("ab" <= b"abc", True)
122 self.assertEqual("ab" < b"abc", True)
123 self.assertEqual("abc" >= b"ab", True)
124 self.assertEqual("abc" > b"ab", True)
125
126 self.assertEqual("abc" != b"abc", False)
127 self.assertEqual("ab" == b"abc", False)
128 self.assertEqual("ab" > b"abc", False)
129 self.assertEqual("ab" >= b"abc", False)
130 self.assertEqual("abc" < b"ab", False)
131 self.assertEqual("abc" <= b"ab", False)
132
133 # But they should never compare equal to Unicode!
134 # 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):
148 short_sample = "Hello world\n"
149 sample = short_sample + "x"*(20 - len(short_sample))
150 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:
157 b = bytes([ord('x')]*20)
158 n = f.readinto(b)
159 self.assertEqual(n, len(short_sample))
160 self.assertEqual(list(b), map(ord, sample))
161 # 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):
174 input = map(ord, "Hello")
175 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)
329 self.assertEqual(b, bytes(map(ord, sample.encode(enc))))
330 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):
345 sample = "Hello world\n\x80\x81\xfe\xff"
346 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 Rossumad7d8d12007-04-13 01:39:34 +0000367 self.assertEqual(b1 + "def", bytes("abcdef"))
368 self.assertEqual("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 Rossumad7d8d12007-04-13 01:39:34 +0000391 b += "xyz"
392 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)
459 self.assertEquals(bytes.fromhex(buffer('')), bytes())
460 self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
461 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):
468 self.assertEqual(bytes.join([]), bytes())
469 self.assertEqual(bytes.join([bytes()]), bytes())
470 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
471 lst = map(bytes, part)
472 self.assertEqual(bytes.join(lst), bytes("abc"))
473 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
474 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
475 # 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):
642 for pm in pickle, cPickle:
643 for proto in range(pm.HIGHEST_PROTOCOL):
644 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
645 ps = pm.dumps(b, proto)
646 q = pm.loads(ps)
647 self.assertEqual(b, q)
648
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')
656
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 Rossumd624f182006-04-24 13:47:05 +0000673 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000674 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000675 # __reversed__? (optimization)
676
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000677 # XXX More string methods? (Those that don't use character properties)
678
Neal Norwitz6968b052007-02-27 19:02:19 +0000679 # There are tests in string_tests.py that are more
680 # comprehensive for things like split, partition, etc.
681 # Unfortunately they are all bundled with tests that
682 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000683
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000684
Georg Brandlc7885542007-03-06 19:16:20 +0000685class BytesAsStringTest(test.string_tests.BaseTest):
686 type2test = bytes
687
688 def checkequal(self, result, object, methodname, *args):
689 object = bytes(object)
690 realresult = getattr(bytes, methodname)(object, *args)
691 self.assertEqual(
692 self.fixtype(result),
693 realresult
694 )
695
696 def checkraises(self, exc, object, methodname, *args):
697 object = bytes(object)
698 self.assertRaises(
699 exc,
700 getattr(bytes, methodname),
701 object,
702 *args
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000703 )
Georg Brandlc7885542007-03-06 19:16:20 +0000704
705 # Currently the bytes containment testing uses a single integer
706 # value. This may not be the final design, but until then the
707 # bytes section with in a bytes containment not valid
708 def test_contains(self):
709 pass
710 def test_find(self):
711 pass
712
713
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000714def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000715 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000716 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000717
718
719if __name__ == "__main__":
Guido van Rossumd624f182006-04-24 13:47:05 +0000720 test_main()
721 ##unittest.main()