blob: 2999aa6545f8f2d7b596c767bdbc8c7d31252401 [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
Guido van Rossum343e97f2007-04-09 00:43:24 +0000102 def test_compare_to_str(self):
103 self.assertEqual(b"abc" == "abc", True)
104 self.assertEqual(b"ab" != "abc", True)
105 self.assertEqual(b"ab" <= "abc", True)
106 self.assertEqual(b"ab" < "abc", True)
107 self.assertEqual(b"abc" >= "ab", True)
108 self.assertEqual(b"abc" > "ab", True)
109
110 self.assertEqual(b"abc" != "abc", False)
111 self.assertEqual(b"ab" == "abc", False)
112 self.assertEqual(b"ab" > "abc", False)
113 self.assertEqual(b"ab" >= "abc", False)
114 self.assertEqual(b"abc" < "ab", False)
115 self.assertEqual(b"abc" <= "ab", False)
116
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000117 def test_nohash(self):
118 self.assertRaises(TypeError, hash, bytes())
119
120 def test_doc(self):
121 self.failUnless(bytes.__doc__ != None)
122 self.failUnless(bytes.__doc__.startswith("bytes("))
123
Guido van Rossumd624f182006-04-24 13:47:05 +0000124 def test_buffer_api(self):
125 short_sample = "Hello world\n"
126 sample = short_sample + "x"*(20 - len(short_sample))
127 tfn = tempfile.mktemp()
128 try:
129 # Prepare
130 with open(tfn, "wb") as f:
131 f.write(short_sample)
132 # Test readinto
133 with open(tfn, "rb") as f:
134 b = bytes([ord('x')]*20)
135 n = f.readinto(b)
136 self.assertEqual(n, len(short_sample))
137 self.assertEqual(list(b), map(ord, sample))
138 # Test writing in binary mode
139 with open(tfn, "wb") as f:
140 f.write(b)
141 with open(tfn, "rb") as f:
142 self.assertEqual(f.read(), sample)
143 # Test writing in text mode
144 with open(tfn, "w") as f:
145 f.write(b)
146 with open(tfn, "r") as f:
147 self.assertEqual(f.read(), sample)
148 # Can't use readinto in text mode
149 with open(tfn, "r") as f:
150 self.assertRaises(TypeError, f.readinto, b)
151 finally:
152 try:
153 os.remove(tfn)
154 except os.error:
155 pass
156
157 def test_reversed(self):
158 input = map(ord, "Hello")
159 b = bytes(input)
160 output = list(reversed(b))
161 input.reverse()
162 self.assertEqual(output, input)
163
Neal Norwitz6968b052007-02-27 19:02:19 +0000164 def test_reverse(self):
165 b = b'hello'
166 self.assertEqual(b.reverse(), None)
167 self.assertEqual(b, b'olleh')
168 b = b'hello1' # test even number of items
169 b.reverse()
170 self.assertEqual(b, b'1olleh')
171 b = bytes()
172 b.reverse()
173 self.assertFalse(b)
174
Guido van Rossumd624f182006-04-24 13:47:05 +0000175 def test_getslice(self):
176 def by(s):
177 return bytes(map(ord, s))
178 b = by("Hello, world")
179
180 self.assertEqual(b[:5], by("Hello"))
181 self.assertEqual(b[1:5], by("ello"))
182 self.assertEqual(b[5:7], by(", "))
183 self.assertEqual(b[7:], by("world"))
184 self.assertEqual(b[7:12], by("world"))
185 self.assertEqual(b[7:100], by("world"))
186
187 self.assertEqual(b[:-7], by("Hello"))
188 self.assertEqual(b[-11:-7], by("ello"))
189 self.assertEqual(b[-7:-5], by(", "))
190 self.assertEqual(b[-5:], by("world"))
191 self.assertEqual(b[-5:12], by("world"))
192 self.assertEqual(b[-5:100], by("world"))
193 self.assertEqual(b[-100:5], by("Hello"))
194
Thomas Wouters376446d2006-12-19 08:30:14 +0000195 def test_extended_getslice(self):
196 # Test extended slicing by comparing with list slicing.
197 L = list(range(255))
198 b = bytes(L)
199 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
200 for start in indices:
201 for stop in indices:
202 # Skip step 0 (invalid)
203 for step in indices[1:]:
204 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
205
Guido van Rossumd624f182006-04-24 13:47:05 +0000206 def test_regexps(self):
207 def by(s):
208 return bytes(map(ord, s))
209 b = by("Hello, world")
210 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
211
212 def test_setitem(self):
213 b = bytes([1, 2, 3])
214 b[1] = 100
215 self.assertEqual(b, bytes([1, 100, 3]))
216 b[-1] = 200
217 self.assertEqual(b, bytes([1, 100, 200]))
218 class C:
219 def __init__(self, i=0):
220 self.i = i
221 def __index__(self):
222 return self.i
223 b[0] = C(10)
224 self.assertEqual(b, bytes([10, 100, 200]))
225 try:
226 b[3] = 0
227 self.fail("Didn't raise IndexError")
228 except IndexError:
229 pass
230 try:
231 b[-10] = 0
232 self.fail("Didn't raise IndexError")
233 except IndexError:
234 pass
235 try:
236 b[0] = 256
237 self.fail("Didn't raise ValueError")
238 except ValueError:
239 pass
240 try:
241 b[0] = C(-1)
242 self.fail("Didn't raise ValueError")
243 except ValueError:
244 pass
245 try:
246 b[0] = None
247 self.fail("Didn't raise TypeError")
248 except TypeError:
249 pass
250
251 def test_delitem(self):
252 b = bytes(range(10))
253 del b[0]
254 self.assertEqual(b, bytes(range(1, 10)))
255 del b[-1]
256 self.assertEqual(b, bytes(range(1, 9)))
257 del b[4]
258 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
259
260 def test_setslice(self):
261 b = bytes(range(10))
262 self.assertEqual(list(b), list(range(10)))
263
264 b[0:5] = bytes([1, 1, 1, 1, 1])
265 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
266
267 del b[0:-5]
268 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
269
270 b[0:0] = bytes([0, 1, 2, 3, 4])
271 self.assertEqual(b, bytes(range(10)))
272
273 b[-7:-3] = bytes([100, 101])
274 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
275
276 b[3:5] = [3, 4, 5, 6]
277 self.assertEqual(b, bytes(range(10)))
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000278
279 b[3:0] = [42, 42, 42]
280 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 +0000281
Thomas Wouters376446d2006-12-19 08:30:14 +0000282 def test_extended_set_del_slice(self):
283 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
284 for start in indices:
285 for stop in indices:
286 # Skip invalid step 0
287 for step in indices[1:]:
288 L = list(range(255))
289 b = bytes(L)
290 # Make sure we have a slice of exactly the right length,
291 # but with different data.
292 data = L[start:stop:step]
293 data.reverse()
294 L[start:stop:step] = data
295 b[start:stop:step] = data
296 self.assertEquals(b, bytes(L))
297
298 del L[start:stop:step]
299 del b[start:stop:step]
300 self.assertEquals(b, bytes(L))
301
Guido van Rossumd624f182006-04-24 13:47:05 +0000302 def test_setslice_trap(self):
303 # This test verifies that we correctly handle assigning self
304 # to a slice of self (the old Lambert Meertens trap).
305 b = bytes(range(256))
306 b[8:] = b
307 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
308
309 def test_encoding(self):
310 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
311 for enc in ("utf8", "utf16"):
312 b = bytes(sample, enc)
313 self.assertEqual(b, bytes(map(ord, sample.encode(enc))))
314 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
315 b = bytes(sample, "latin1", "ignore")
316 self.assertEqual(b, bytes(sample[:-4]))
317
318 def test_decode(self):
319 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
320 for enc in ("utf8", "utf16"):
321 b = bytes(sample, enc)
322 self.assertEqual(b.decode(enc), sample)
323 sample = u"Hello world\n\x80\x81\xfe\xff"
324 b = bytes(sample, "latin1")
325 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
326 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
327
328 def test_from_buffer(self):
329 sample = "Hello world\n\x80\x81\xfe\xff"
330 buf = buffer(sample)
331 b = bytes(buf)
332 self.assertEqual(b, bytes(map(ord, sample)))
333
334 def test_to_str(self):
335 sample = "Hello world\n\x80\x81\xfe\xff"
336 b = bytes(sample)
337 self.assertEqual(str(b), sample)
338
339 def test_from_int(self):
340 b = bytes(0)
341 self.assertEqual(b, bytes())
342 b = bytes(10)
343 self.assertEqual(b, bytes([0]*10))
344 b = bytes(10000)
345 self.assertEqual(b, bytes([0]*10000))
346
347 def test_concat(self):
348 b1 = bytes("abc")
349 b2 = bytes("def")
350 self.assertEqual(b1 + b2, bytes("abcdef"))
351 self.assertRaises(TypeError, lambda: b1 + "def")
352 self.assertRaises(TypeError, lambda: "abc" + b2)
353
354 def test_repeat(self):
355 b = bytes("abc")
356 self.assertEqual(b * 3, bytes("abcabcabc"))
357 self.assertEqual(b * 0, bytes())
358 self.assertEqual(b * -1, bytes())
359 self.assertRaises(TypeError, lambda: b * 3.14)
360 self.assertRaises(TypeError, lambda: 3.14 * b)
361 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000362
363 def test_repeat_1char(self):
Guido van Rossumd624f182006-04-24 13:47:05 +0000364 self.assertEqual(bytes('x')*100, bytes('x'*100))
365
Guido van Rossum13e57212006-04-27 22:54:26 +0000366 def test_iconcat(self):
367 b = bytes("abc")
368 b1 = b
369 b += bytes("def")
370 self.assertEqual(b, bytes("abcdef"))
371 self.assertEqual(b, b1)
372 self.failUnless(b is b1)
373
374 def test_irepeat(self):
375 b = bytes("abc")
376 b1 = b
377 b *= 3
378 self.assertEqual(b, bytes("abcabcabc"))
379 self.assertEqual(b, b1)
380 self.failUnless(b is b1)
381
382 def test_irepeat_1char(self):
383 b = bytes("x")
384 b1 = b
385 b *= 100
386 self.assertEqual(b, bytes("x"*100))
387 self.assertEqual(b, b1)
388 self.failUnless(b is b1)
389
390 def test_contains(self):
391 b = bytes("abc")
392 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000393 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000394 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000395 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000396 self.assertRaises(ValueError, lambda: 300 in b)
397 self.assertRaises(ValueError, lambda: -1 in b)
398 self.assertRaises(TypeError, lambda: None in b)
399 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
400 self.assertRaises(TypeError, lambda: "a" in b)
401 self.failUnless(bytes("") in b)
402 self.failUnless(bytes("a") in b)
403 self.failUnless(bytes("b") in b)
404 self.failUnless(bytes("c") in b)
405 self.failUnless(bytes("ab") in b)
406 self.failUnless(bytes("bc") in b)
407 self.failUnless(bytes("abc") in b)
408 self.failIf(bytes("ac") in b)
409 self.failIf(bytes("d") in b)
410 self.failIf(bytes("dab") in b)
411 self.failIf(bytes("abd") in b)
412
Guido van Rossum20188312006-05-05 15:15:40 +0000413 def test_alloc(self):
414 b = bytes()
415 alloc = b.__alloc__()
416 self.assert_(alloc >= 0)
417 seq = [alloc]
418 for i in range(100):
419 b += bytes("x")
420 alloc = b.__alloc__()
421 self.assert_(alloc >= len(b))
422 if alloc not in seq:
423 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000424 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000425
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000426 def test_fromhex(self):
427 self.assertRaises(TypeError, bytes.fromhex)
428 self.assertRaises(TypeError, bytes.fromhex, 1)
429 self.assertEquals(bytes.fromhex(''), bytes())
430 b = bytes([0x1a, 0x2b, 0x30])
431 self.assertEquals(bytes.fromhex('1a2B30'), b)
432 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
433 self.assertEquals(bytes.fromhex(buffer('')), bytes())
434 self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
435 self.assertRaises(ValueError, bytes.fromhex, 'a')
436 self.assertRaises(ValueError, bytes.fromhex, 'rt')
437 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
438 self.assertRaises(ValueError, bytes.fromhex, '\x00')
439 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
440
Guido van Rossum20188312006-05-05 15:15:40 +0000441 def test_join(self):
442 self.assertEqual(bytes.join([]), bytes())
443 self.assertEqual(bytes.join([bytes()]), bytes())
444 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
445 lst = map(bytes, part)
446 self.assertEqual(bytes.join(lst), bytes("abc"))
447 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
448 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
449 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000450
451 def test_literal(self):
452 tests = [
453 (b"Wonderful spam", u"Wonderful spam"),
454 (br"Wonderful spam too", u"Wonderful spam too"),
455 (b"\xaa\x00\000\200", u"\xaa\x00\000\200"),
456 (br"\xaa\x00\000\200", ur"\xaa\x00\000\200"),
457 ]
458 for b, s in tests:
459 self.assertEqual(b, bytes(s, 'latin-1'))
460 for c in range(128, 256):
461 self.assertRaises(SyntaxError, eval,
462 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000463
Neal Norwitz6968b052007-02-27 19:02:19 +0000464 def test_extend(self):
465 orig = b'hello'
466 a = bytes(orig)
467 a.extend(a)
468 self.assertEqual(a, orig + orig)
469 self.assertEqual(a[5:], orig)
470
471 def test_remove(self):
472 b = b'hello'
473 b.remove(ord('l'))
474 self.assertEqual(b, b'helo')
475 b.remove(ord('l'))
476 self.assertEqual(b, b'heo')
477 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
478 self.assertRaises(ValueError, lambda: b.remove(400))
479 self.assertRaises(ValueError, lambda: b.remove('e'))
480 # remove first and last
481 b.remove(ord('o'))
482 b.remove(ord('h'))
483 self.assertEqual(b, b'e')
484
485 def test_pop(self):
486 b = b'world'
487 self.assertEqual(b.pop(), ord('d'))
488 self.assertEqual(b.pop(0), ord('w'))
489 self.assertEqual(b.pop(-2), ord('r'))
490 self.assertRaises(IndexError, lambda: b.pop(10))
491 self.assertRaises(OverflowError, lambda: bytes().pop())
492
493 def test_nosort(self):
494 self.assertRaises(AttributeError, lambda: bytes().sort())
495
496 def test_index(self):
497 b = b'parrot'
498 self.assertEqual(b.index('p'), 0)
499 self.assertEqual(b.index('rr'), 2)
500 self.assertEqual(b.index('t'), 5)
501 self.assertRaises(ValueError, lambda: b.index('w'))
502
503 def test_count(self):
504 b = b'mississippi'
505 self.assertEqual(b.count('i'), 4)
506 self.assertEqual(b.count('ss'), 2)
507 self.assertEqual(b.count('w'), 0)
508
509 def test_append(self):
510 b = b'hell'
511 b.append(ord('o'))
512 self.assertEqual(b, b'hello')
513 self.assertEqual(b.append(100), None)
514 b = bytes()
515 b.append(ord('A'))
516 self.assertEqual(len(b), 1)
517
518 def test_insert(self):
519 b = b'msssspp'
520 b.insert(1, ord('i'))
521 b.insert(4, ord('i'))
522 b.insert(-2, ord('i'))
523 b.insert(1000, ord('i'))
524 self.assertEqual(b, b'mississippi')
525
526 def test_startswith(self):
527 b = b'hello'
528 self.assertFalse(bytes().startswith("anything"))
529 self.assertTrue(b.startswith("hello"))
530 self.assertTrue(b.startswith("hel"))
531 self.assertTrue(b.startswith("h"))
532 self.assertFalse(b.startswith("hellow"))
533 self.assertFalse(b.startswith("ha"))
534
535 def test_endswith(self):
536 b = b'hello'
537 self.assertFalse(bytes().endswith("anything"))
538 self.assertTrue(b.endswith("hello"))
539 self.assertTrue(b.endswith("llo"))
540 self.assertTrue(b.endswith("o"))
541 self.assertFalse(b.endswith("whello"))
542 self.assertFalse(b.endswith("no"))
543
544 def test_find(self):
545 b = b'mississippi'
546 self.assertEqual(b.find('ss'), 2)
547 self.assertEqual(b.find('ss', 3), 5)
548 self.assertEqual(b.find('ss', 1, 7), 2)
549 self.assertEqual(b.find('ss', 1, 3), -1)
550 self.assertEqual(b.find('w'), -1)
551 self.assertEqual(b.find('mississippian'), -1)
552
553 def test_rfind(self):
554 b = b'mississippi'
555 self.assertEqual(b.rfind('ss'), 5)
556 self.assertEqual(b.rfind('ss', 3), 5)
557 self.assertEqual(b.rfind('ss', 0, 6), 2)
558 self.assertEqual(b.rfind('w'), -1)
559 self.assertEqual(b.rfind('mississippian'), -1)
560
561 def test_index(self):
562 b = b'world'
563 self.assertEqual(b.index('w'), 0)
564 self.assertEqual(b.index('orl'), 1)
565 self.assertRaises(ValueError, lambda: b.index('worm'))
566 self.assertRaises(ValueError, lambda: b.index('ldo'))
567
568 def test_rindex(self):
569 # XXX could be more rigorous
570 b = b'world'
571 self.assertEqual(b.rindex('w'), 0)
572 self.assertEqual(b.rindex('orl'), 1)
573 self.assertRaises(ValueError, lambda: b.rindex('worm'))
574 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
575
576 def test_replace(self):
577 b = b'mississippi'
578 self.assertEqual(b.replace('i', 'a'), b'massassappa')
579 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
580
581 def test_translate(self):
582 b = b'hello'
583 rosetta = bytes(range(0, 256))
584 rosetta[ord('o')] = ord('e')
585 c = b.translate(rosetta, b'l')
586 self.assertEqual(b, b'hello')
587 self.assertEqual(c, b'hee')
588
589 def test_split(self):
590 b = b'mississippi'
591 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
592 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
593 self.assertEqual(b.split('w'), [b])
594 # require an arg (no magic whitespace split)
595 self.assertRaises(TypeError, lambda: b.split())
596
597 def test_rsplit(self):
598 b = b'mississippi'
599 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
600 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
601 self.assertEqual(b.rsplit('w'), [b])
602 # require an arg (no magic whitespace split)
603 self.assertRaises(TypeError, lambda: b.rsplit())
604
605 def test_partition(self):
606 b = b'mississippi'
607 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
608 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
609
610 def test_rpartition(self):
611 b = b'mississippi'
612 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
613 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
614
Guido van Rossumd624f182006-04-24 13:47:05 +0000615 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000616 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000617 # __reversed__? (optimization)
618
Guido van Rossumd624f182006-04-24 13:47:05 +0000619 # XXX Some string methods? (Those that don't use character properties)
Neal Norwitz6968b052007-02-27 19:02:19 +0000620 # lstrip, rstrip, strip?? (currently un-pepped)
Guido van Rossumd624f182006-04-24 13:47:05 +0000621 # join
Guido van Rossumd624f182006-04-24 13:47:05 +0000622
623 # XXX pickle and marshal support?
Neal Norwitz6968b052007-02-27 19:02:19 +0000624
625 # There are tests in string_tests.py that are more
626 # comprehensive for things like split, partition, etc.
627 # Unfortunately they are all bundled with tests that
628 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000629
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000630
Georg Brandlc7885542007-03-06 19:16:20 +0000631class BytesAsStringTest(test.string_tests.BaseTest):
632 type2test = bytes
633
634 def checkequal(self, result, object, methodname, *args):
635 object = bytes(object)
636 realresult = getattr(bytes, methodname)(object, *args)
637 self.assertEqual(
638 self.fixtype(result),
639 realresult
640 )
641
642 def checkraises(self, exc, object, methodname, *args):
643 object = bytes(object)
644 self.assertRaises(
645 exc,
646 getattr(bytes, methodname),
647 object,
648 *args
649 )
650
651 # Currently the bytes containment testing uses a single integer
652 # value. This may not be the final design, but until then the
653 # bytes section with in a bytes containment not valid
654 def test_contains(self):
655 pass
656 def test_find(self):
657 pass
658
659
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000660def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000661 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000662 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000663
664
665if __name__ == "__main__":
Guido van Rossumd624f182006-04-24 13:47:05 +0000666 test_main()
667 ##unittest.main()