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