blob: 2aa53399a717f19d783becb9a207d5ff2c4a16fb [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 Rossumd624f182006-04-24 13:47:05 +00006import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007import unittest
8import test.test_support
9
10
11class BytesTest(unittest.TestCase):
12
13 def test_basics(self):
14 b = bytes()
15 self.assertEqual(type(b), bytes)
16 self.assertEqual(b.__class__, bytes)
17
18 def test_empty_sequence(self):
19 b = bytes()
20 self.assertEqual(len(b), 0)
21 self.assertRaises(IndexError, lambda: b[0])
22 self.assertRaises(IndexError, lambda: b[1])
23 self.assertRaises(IndexError, lambda: b[sys.maxint])
24 self.assertRaises(IndexError, lambda: b[sys.maxint+1])
25 self.assertRaises(IndexError, lambda: b[10**100])
26 self.assertRaises(IndexError, lambda: b[-1])
27 self.assertRaises(IndexError, lambda: b[-2])
28 self.assertRaises(IndexError, lambda: b[-sys.maxint])
29 self.assertRaises(IndexError, lambda: b[-sys.maxint-1])
30 self.assertRaises(IndexError, lambda: b[-sys.maxint-2])
31 self.assertRaises(IndexError, lambda: b[-10**100])
32
33 def test_from_list(self):
34 ints = list(range(256))
35 b = bytes(i for i in ints)
36 self.assertEqual(len(b), 256)
37 self.assertEqual(list(b), ints)
38
39 def test_from_index(self):
40 class C:
41 def __init__(self, i=0):
42 self.i = i
43 def __index__(self):
44 return self.i
45 b = bytes([C(), C(1), C(254), C(255)])
46 self.assertEqual(list(b), [0, 1, 254, 255])
Guido van Rossume06b6b82006-04-23 07:43:54 +000047 self.assertRaises(ValueError, bytes, [C(-1)])
48 self.assertRaises(ValueError, bytes, [C(256)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000049
50 def test_constructor_type_errors(self):
Guido van Rossumd624f182006-04-24 13:47:05 +000051 self.assertRaises(TypeError, bytes, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000052 class C:
53 pass
Guido van Rossume06b6b82006-04-23 07:43:54 +000054 self.assertRaises(TypeError, bytes, ["0"])
55 self.assertRaises(TypeError, bytes, [0.0])
56 self.assertRaises(TypeError, bytes, [None])
57 self.assertRaises(TypeError, bytes, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000058
59 def test_constructor_value_errors(self):
Guido van Rossume06b6b82006-04-23 07:43:54 +000060 self.assertRaises(ValueError, bytes, [-1])
61 self.assertRaises(ValueError, bytes, [-sys.maxint])
62 self.assertRaises(ValueError, bytes, [-sys.maxint-1])
Thomas Woutersd204a712006-08-22 13:41:17 +000063 self.assertRaises(ValueError, bytes, [-sys.maxint-2])
64 self.assertRaises(ValueError, bytes, [-10**100])
Guido van Rossume06b6b82006-04-23 07:43:54 +000065 self.assertRaises(ValueError, bytes, [256])
66 self.assertRaises(ValueError, bytes, [257])
67 self.assertRaises(ValueError, bytes, [sys.maxint])
Thomas Woutersd204a712006-08-22 13:41:17 +000068 self.assertRaises(ValueError, bytes, [sys.maxint+1])
69 self.assertRaises(ValueError, bytes, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000070
71 def test_repr(self):
Georg Brandlee91be42007-02-24 19:41:35 +000072 self.assertEqual(repr(bytes()), "b''")
73 self.assertEqual(repr(bytes([0])), "b'\\0'")
74 self.assertEqual(repr(bytes([0, 1, 254, 255])), "b'\\0\\x01\\xfe\\xff'")
75 self.assertEqual(repr(bytes('abc')), "b'abc'")
76 self.assertEqual(repr(bytes("'")), "b'\\''")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000077
78 def test_compare(self):
79 b1 = bytes([1, 2, 3])
80 b2 = bytes([1, 2, 3])
81 b3 = bytes([1, 3])
82
83 self.failUnless(b1 == b2)
84 self.failUnless(b2 != b3)
85 self.failUnless(b1 <= b2)
86 self.failUnless(b1 <= b3)
87 self.failUnless(b1 < b3)
88 self.failUnless(b1 >= b2)
89 self.failUnless(b3 >= b2)
90 self.failUnless(b3 > b2)
91
92 self.failIf(b1 != b2)
93 self.failIf(b2 == b3)
94 self.failIf(b1 > b2)
95 self.failIf(b1 > b3)
96 self.failIf(b1 >= b3)
97 self.failIf(b1 < b2)
98 self.failIf(b3 < b2)
99 self.failIf(b3 <= b2)
100
101 def test_nohash(self):
102 self.assertRaises(TypeError, hash, bytes())
103
104 def test_doc(self):
105 self.failUnless(bytes.__doc__ != None)
106 self.failUnless(bytes.__doc__.startswith("bytes("))
107
Guido van Rossumd624f182006-04-24 13:47:05 +0000108 def test_buffer_api(self):
109 short_sample = "Hello world\n"
110 sample = short_sample + "x"*(20 - len(short_sample))
111 tfn = tempfile.mktemp()
112 try:
113 # Prepare
114 with open(tfn, "wb") as f:
115 f.write(short_sample)
116 # Test readinto
117 with open(tfn, "rb") as f:
118 b = bytes([ord('x')]*20)
119 n = f.readinto(b)
120 self.assertEqual(n, len(short_sample))
121 self.assertEqual(list(b), map(ord, sample))
122 # Test writing in binary mode
123 with open(tfn, "wb") as f:
124 f.write(b)
125 with open(tfn, "rb") as f:
126 self.assertEqual(f.read(), sample)
127 # Test writing in text mode
128 with open(tfn, "w") as f:
129 f.write(b)
130 with open(tfn, "r") as f:
131 self.assertEqual(f.read(), sample)
132 # Can't use readinto in text mode
133 with open(tfn, "r") as f:
134 self.assertRaises(TypeError, f.readinto, b)
135 finally:
136 try:
137 os.remove(tfn)
138 except os.error:
139 pass
140
141 def test_reversed(self):
142 input = map(ord, "Hello")
143 b = bytes(input)
144 output = list(reversed(b))
145 input.reverse()
146 self.assertEqual(output, input)
147
Neal Norwitz6968b052007-02-27 19:02:19 +0000148 def test_reverse(self):
149 b = b'hello'
150 self.assertEqual(b.reverse(), None)
151 self.assertEqual(b, b'olleh')
152 b = b'hello1' # test even number of items
153 b.reverse()
154 self.assertEqual(b, b'1olleh')
155 b = bytes()
156 b.reverse()
157 self.assertFalse(b)
158
Guido van Rossumd624f182006-04-24 13:47:05 +0000159 def test_getslice(self):
160 def by(s):
161 return bytes(map(ord, s))
162 b = by("Hello, world")
163
164 self.assertEqual(b[:5], by("Hello"))
165 self.assertEqual(b[1:5], by("ello"))
166 self.assertEqual(b[5:7], by(", "))
167 self.assertEqual(b[7:], by("world"))
168 self.assertEqual(b[7:12], by("world"))
169 self.assertEqual(b[7:100], by("world"))
170
171 self.assertEqual(b[:-7], by("Hello"))
172 self.assertEqual(b[-11:-7], by("ello"))
173 self.assertEqual(b[-7:-5], by(", "))
174 self.assertEqual(b[-5:], by("world"))
175 self.assertEqual(b[-5:12], by("world"))
176 self.assertEqual(b[-5:100], by("world"))
177 self.assertEqual(b[-100:5], by("Hello"))
178
Thomas Wouters376446d2006-12-19 08:30:14 +0000179 def test_extended_getslice(self):
180 # Test extended slicing by comparing with list slicing.
181 L = list(range(255))
182 b = bytes(L)
183 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
184 for start in indices:
185 for stop in indices:
186 # Skip step 0 (invalid)
187 for step in indices[1:]:
188 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
189
Guido van Rossumd624f182006-04-24 13:47:05 +0000190 def test_regexps(self):
191 def by(s):
192 return bytes(map(ord, s))
193 b = by("Hello, world")
194 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
195
196 def test_setitem(self):
197 b = bytes([1, 2, 3])
198 b[1] = 100
199 self.assertEqual(b, bytes([1, 100, 3]))
200 b[-1] = 200
201 self.assertEqual(b, bytes([1, 100, 200]))
202 class C:
203 def __init__(self, i=0):
204 self.i = i
205 def __index__(self):
206 return self.i
207 b[0] = C(10)
208 self.assertEqual(b, bytes([10, 100, 200]))
209 try:
210 b[3] = 0
211 self.fail("Didn't raise IndexError")
212 except IndexError:
213 pass
214 try:
215 b[-10] = 0
216 self.fail("Didn't raise IndexError")
217 except IndexError:
218 pass
219 try:
220 b[0] = 256
221 self.fail("Didn't raise ValueError")
222 except ValueError:
223 pass
224 try:
225 b[0] = C(-1)
226 self.fail("Didn't raise ValueError")
227 except ValueError:
228 pass
229 try:
230 b[0] = None
231 self.fail("Didn't raise TypeError")
232 except TypeError:
233 pass
234
235 def test_delitem(self):
236 b = bytes(range(10))
237 del b[0]
238 self.assertEqual(b, bytes(range(1, 10)))
239 del b[-1]
240 self.assertEqual(b, bytes(range(1, 9)))
241 del b[4]
242 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
243
244 def test_setslice(self):
245 b = bytes(range(10))
246 self.assertEqual(list(b), list(range(10)))
247
248 b[0:5] = bytes([1, 1, 1, 1, 1])
249 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
250
251 del b[0:-5]
252 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
253
254 b[0:0] = bytes([0, 1, 2, 3, 4])
255 self.assertEqual(b, bytes(range(10)))
256
257 b[-7:-3] = bytes([100, 101])
258 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
259
260 b[3:5] = [3, 4, 5, 6]
261 self.assertEqual(b, bytes(range(10)))
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000262
263 b[3:0] = [42, 42, 42]
264 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 +0000265
Thomas Wouters376446d2006-12-19 08:30:14 +0000266 def test_extended_set_del_slice(self):
267 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
268 for start in indices:
269 for stop in indices:
270 # Skip invalid step 0
271 for step in indices[1:]:
272 L = list(range(255))
273 b = bytes(L)
274 # Make sure we have a slice of exactly the right length,
275 # but with different data.
276 data = L[start:stop:step]
277 data.reverse()
278 L[start:stop:step] = data
279 b[start:stop:step] = data
280 self.assertEquals(b, bytes(L))
281
282 del L[start:stop:step]
283 del b[start:stop:step]
284 self.assertEquals(b, bytes(L))
285
Guido van Rossumd624f182006-04-24 13:47:05 +0000286 def test_setslice_trap(self):
287 # This test verifies that we correctly handle assigning self
288 # to a slice of self (the old Lambert Meertens trap).
289 b = bytes(range(256))
290 b[8:] = b
291 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
292
293 def test_encoding(self):
294 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
295 for enc in ("utf8", "utf16"):
296 b = bytes(sample, enc)
297 self.assertEqual(b, bytes(map(ord, sample.encode(enc))))
298 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
299 b = bytes(sample, "latin1", "ignore")
300 self.assertEqual(b, bytes(sample[:-4]))
301
302 def test_decode(self):
303 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
304 for enc in ("utf8", "utf16"):
305 b = bytes(sample, enc)
306 self.assertEqual(b.decode(enc), sample)
307 sample = u"Hello world\n\x80\x81\xfe\xff"
308 b = bytes(sample, "latin1")
309 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
310 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
311
312 def test_from_buffer(self):
313 sample = "Hello world\n\x80\x81\xfe\xff"
314 buf = buffer(sample)
315 b = bytes(buf)
316 self.assertEqual(b, bytes(map(ord, sample)))
317
318 def test_to_str(self):
319 sample = "Hello world\n\x80\x81\xfe\xff"
320 b = bytes(sample)
321 self.assertEqual(str(b), sample)
322
323 def test_from_int(self):
324 b = bytes(0)
325 self.assertEqual(b, bytes())
326 b = bytes(10)
327 self.assertEqual(b, bytes([0]*10))
328 b = bytes(10000)
329 self.assertEqual(b, bytes([0]*10000))
330
331 def test_concat(self):
332 b1 = bytes("abc")
333 b2 = bytes("def")
334 self.assertEqual(b1 + b2, bytes("abcdef"))
335 self.assertRaises(TypeError, lambda: b1 + "def")
336 self.assertRaises(TypeError, lambda: "abc" + b2)
337
338 def test_repeat(self):
339 b = bytes("abc")
340 self.assertEqual(b * 3, bytes("abcabcabc"))
341 self.assertEqual(b * 0, bytes())
342 self.assertEqual(b * -1, bytes())
343 self.assertRaises(TypeError, lambda: b * 3.14)
344 self.assertRaises(TypeError, lambda: 3.14 * b)
345 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000346
347 def test_repeat_1char(self):
Guido van Rossumd624f182006-04-24 13:47:05 +0000348 self.assertEqual(bytes('x')*100, bytes('x'*100))
349
Guido van Rossum13e57212006-04-27 22:54:26 +0000350 def test_iconcat(self):
351 b = bytes("abc")
352 b1 = b
353 b += bytes("def")
354 self.assertEqual(b, bytes("abcdef"))
355 self.assertEqual(b, b1)
356 self.failUnless(b is b1)
357
358 def test_irepeat(self):
359 b = bytes("abc")
360 b1 = b
361 b *= 3
362 self.assertEqual(b, bytes("abcabcabc"))
363 self.assertEqual(b, b1)
364 self.failUnless(b is b1)
365
366 def test_irepeat_1char(self):
367 b = bytes("x")
368 b1 = b
369 b *= 100
370 self.assertEqual(b, bytes("x"*100))
371 self.assertEqual(b, b1)
372 self.failUnless(b is b1)
373
374 def test_contains(self):
375 b = bytes("abc")
376 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000377 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000378 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000379 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000380 self.assertRaises(ValueError, lambda: 300 in b)
381 self.assertRaises(ValueError, lambda: -1 in b)
382 self.assertRaises(TypeError, lambda: None in b)
383 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
384 self.assertRaises(TypeError, lambda: "a" in b)
385 self.failUnless(bytes("") in b)
386 self.failUnless(bytes("a") in b)
387 self.failUnless(bytes("b") in b)
388 self.failUnless(bytes("c") in b)
389 self.failUnless(bytes("ab") in b)
390 self.failUnless(bytes("bc") in b)
391 self.failUnless(bytes("abc") in b)
392 self.failIf(bytes("ac") in b)
393 self.failIf(bytes("d") in b)
394 self.failIf(bytes("dab") in b)
395 self.failIf(bytes("abd") in b)
396
Guido van Rossum20188312006-05-05 15:15:40 +0000397 def test_alloc(self):
398 b = bytes()
399 alloc = b.__alloc__()
400 self.assert_(alloc >= 0)
401 seq = [alloc]
402 for i in range(100):
403 b += bytes("x")
404 alloc = b.__alloc__()
405 self.assert_(alloc >= len(b))
406 if alloc not in seq:
407 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000408 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000409
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000410 def test_fromhex(self):
411 self.assertRaises(TypeError, bytes.fromhex)
412 self.assertRaises(TypeError, bytes.fromhex, 1)
413 self.assertEquals(bytes.fromhex(''), bytes())
414 b = bytes([0x1a, 0x2b, 0x30])
415 self.assertEquals(bytes.fromhex('1a2B30'), b)
416 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
417 self.assertEquals(bytes.fromhex(buffer('')), bytes())
418 self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
419 self.assertRaises(ValueError, bytes.fromhex, 'a')
420 self.assertRaises(ValueError, bytes.fromhex, 'rt')
421 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
422 self.assertRaises(ValueError, bytes.fromhex, '\x00')
423 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
424
Guido van Rossum20188312006-05-05 15:15:40 +0000425 def test_join(self):
426 self.assertEqual(bytes.join([]), bytes())
427 self.assertEqual(bytes.join([bytes()]), bytes())
428 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
429 lst = map(bytes, part)
430 self.assertEqual(bytes.join(lst), bytes("abc"))
431 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
432 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
433 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000434
435 def test_literal(self):
436 tests = [
437 (b"Wonderful spam", u"Wonderful spam"),
438 (br"Wonderful spam too", u"Wonderful spam too"),
439 (b"\xaa\x00\000\200", u"\xaa\x00\000\200"),
440 (br"\xaa\x00\000\200", ur"\xaa\x00\000\200"),
441 ]
442 for b, s in tests:
443 self.assertEqual(b, bytes(s, 'latin-1'))
444 for c in range(128, 256):
445 self.assertRaises(SyntaxError, eval,
446 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000447
Neal Norwitz6968b052007-02-27 19:02:19 +0000448 def test_extend(self):
449 orig = b'hello'
450 a = bytes(orig)
451 a.extend(a)
452 self.assertEqual(a, orig + orig)
453 self.assertEqual(a[5:], orig)
454
455 def test_remove(self):
456 b = b'hello'
457 b.remove(ord('l'))
458 self.assertEqual(b, b'helo')
459 b.remove(ord('l'))
460 self.assertEqual(b, b'heo')
461 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
462 self.assertRaises(ValueError, lambda: b.remove(400))
463 self.assertRaises(ValueError, lambda: b.remove('e'))
464 # remove first and last
465 b.remove(ord('o'))
466 b.remove(ord('h'))
467 self.assertEqual(b, b'e')
468
469 def test_pop(self):
470 b = b'world'
471 self.assertEqual(b.pop(), ord('d'))
472 self.assertEqual(b.pop(0), ord('w'))
473 self.assertEqual(b.pop(-2), ord('r'))
474 self.assertRaises(IndexError, lambda: b.pop(10))
475 self.assertRaises(OverflowError, lambda: bytes().pop())
476
477 def test_nosort(self):
478 self.assertRaises(AttributeError, lambda: bytes().sort())
479
480 def test_index(self):
481 b = b'parrot'
482 self.assertEqual(b.index('p'), 0)
483 self.assertEqual(b.index('rr'), 2)
484 self.assertEqual(b.index('t'), 5)
485 self.assertRaises(ValueError, lambda: b.index('w'))
486
487 def test_count(self):
488 b = b'mississippi'
489 self.assertEqual(b.count('i'), 4)
490 self.assertEqual(b.count('ss'), 2)
491 self.assertEqual(b.count('w'), 0)
492
493 def test_append(self):
494 b = b'hell'
495 b.append(ord('o'))
496 self.assertEqual(b, b'hello')
497 self.assertEqual(b.append(100), None)
498 b = bytes()
499 b.append(ord('A'))
500 self.assertEqual(len(b), 1)
501
502 def test_insert(self):
503 b = b'msssspp'
504 b.insert(1, ord('i'))
505 b.insert(4, ord('i'))
506 b.insert(-2, ord('i'))
507 b.insert(1000, ord('i'))
508 self.assertEqual(b, b'mississippi')
509
510 def test_startswith(self):
511 b = b'hello'
512 self.assertFalse(bytes().startswith("anything"))
513 self.assertTrue(b.startswith("hello"))
514 self.assertTrue(b.startswith("hel"))
515 self.assertTrue(b.startswith("h"))
516 self.assertFalse(b.startswith("hellow"))
517 self.assertFalse(b.startswith("ha"))
518
519 def test_endswith(self):
520 b = b'hello'
521 self.assertFalse(bytes().endswith("anything"))
522 self.assertTrue(b.endswith("hello"))
523 self.assertTrue(b.endswith("llo"))
524 self.assertTrue(b.endswith("o"))
525 self.assertFalse(b.endswith("whello"))
526 self.assertFalse(b.endswith("no"))
527
528 def test_find(self):
529 b = b'mississippi'
530 self.assertEqual(b.find('ss'), 2)
531 self.assertEqual(b.find('ss', 3), 5)
532 self.assertEqual(b.find('ss', 1, 7), 2)
533 self.assertEqual(b.find('ss', 1, 3), -1)
534 self.assertEqual(b.find('w'), -1)
535 self.assertEqual(b.find('mississippian'), -1)
536
537 def test_rfind(self):
538 b = b'mississippi'
539 self.assertEqual(b.rfind('ss'), 5)
540 self.assertEqual(b.rfind('ss', 3), 5)
541 self.assertEqual(b.rfind('ss', 0, 6), 2)
542 self.assertEqual(b.rfind('w'), -1)
543 self.assertEqual(b.rfind('mississippian'), -1)
544
545 def test_index(self):
546 b = b'world'
547 self.assertEqual(b.index('w'), 0)
548 self.assertEqual(b.index('orl'), 1)
549 self.assertRaises(ValueError, lambda: b.index('worm'))
550 self.assertRaises(ValueError, lambda: b.index('ldo'))
551
552 def test_rindex(self):
553 # XXX could be more rigorous
554 b = b'world'
555 self.assertEqual(b.rindex('w'), 0)
556 self.assertEqual(b.rindex('orl'), 1)
557 self.assertRaises(ValueError, lambda: b.rindex('worm'))
558 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
559
560 def test_replace(self):
561 b = b'mississippi'
562 self.assertEqual(b.replace('i', 'a'), b'massassappa')
563 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
564
565 def test_translate(self):
566 b = b'hello'
567 rosetta = bytes(range(0, 256))
568 rosetta[ord('o')] = ord('e')
569 c = b.translate(rosetta, b'l')
570 self.assertEqual(b, b'hello')
571 self.assertEqual(c, b'hee')
572
573 def test_split(self):
574 b = b'mississippi'
575 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
576 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
577 self.assertEqual(b.split('w'), [b])
578 # require an arg (no magic whitespace split)
579 self.assertRaises(TypeError, lambda: b.split())
580
581 def test_rsplit(self):
582 b = b'mississippi'
583 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
584 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
585 self.assertEqual(b.rsplit('w'), [b])
586 # require an arg (no magic whitespace split)
587 self.assertRaises(TypeError, lambda: b.rsplit())
588
589 def test_partition(self):
590 b = b'mississippi'
591 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
592 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
593
594 def test_rpartition(self):
595 b = b'mississippi'
596 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
597 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
598
Guido van Rossumd624f182006-04-24 13:47:05 +0000599 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000600 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000601 # __reversed__? (optimization)
602
Guido van Rossumd624f182006-04-24 13:47:05 +0000603 # XXX Some string methods? (Those that don't use character properties)
Neal Norwitz6968b052007-02-27 19:02:19 +0000604 # lstrip, rstrip, strip?? (currently un-pepped)
Guido van Rossumd624f182006-04-24 13:47:05 +0000605 # join
Guido van Rossumd624f182006-04-24 13:47:05 +0000606
607 # XXX pickle and marshal support?
Neal Norwitz6968b052007-02-27 19:02:19 +0000608
609 # There are tests in string_tests.py that are more
610 # comprehensive for things like split, partition, etc.
611 # Unfortunately they are all bundled with tests that
612 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000613
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000614
615def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000616 test.test_support.run_unittest(BytesTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000617
618
619if __name__ == "__main__":
Guido van Rossumd624f182006-04-24 13:47:05 +0000620 test_main()
621 ##unittest.main()