blob: 682f5d7fb3585bcc080de84c0c2bdd35e598d986 [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
135 self.assertEqual(b"\0a\0b\0c" == u"abc", False)
136 self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == u"abc", False)
137 self.assertEqual(b"a\0b\0c\0" == u"abc", False)
138 self.assertEqual(b"a\0\0\0b\0\0\0c\0\0\0" == u"abc", False)
139
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)
166 # Test writing in text mode
167 with open(tfn, "w") as f:
168 f.write(b)
169 with open(tfn, "r") as f:
170 self.assertEqual(f.read(), sample)
171 # Can't use readinto in text mode
172 with open(tfn, "r") as f:
173 self.assertRaises(TypeError, f.readinto, b)
174 finally:
175 try:
176 os.remove(tfn)
177 except os.error:
178 pass
179
180 def test_reversed(self):
181 input = map(ord, "Hello")
182 b = bytes(input)
183 output = list(reversed(b))
184 input.reverse()
185 self.assertEqual(output, input)
186
Neal Norwitz6968b052007-02-27 19:02:19 +0000187 def test_reverse(self):
188 b = b'hello'
189 self.assertEqual(b.reverse(), None)
190 self.assertEqual(b, b'olleh')
191 b = b'hello1' # test even number of items
192 b.reverse()
193 self.assertEqual(b, b'1olleh')
194 b = bytes()
195 b.reverse()
196 self.assertFalse(b)
197
Guido van Rossumd624f182006-04-24 13:47:05 +0000198 def test_getslice(self):
199 def by(s):
200 return bytes(map(ord, s))
201 b = by("Hello, world")
202
203 self.assertEqual(b[:5], by("Hello"))
204 self.assertEqual(b[1:5], by("ello"))
205 self.assertEqual(b[5:7], by(", "))
206 self.assertEqual(b[7:], by("world"))
207 self.assertEqual(b[7:12], by("world"))
208 self.assertEqual(b[7:100], by("world"))
209
210 self.assertEqual(b[:-7], by("Hello"))
211 self.assertEqual(b[-11:-7], by("ello"))
212 self.assertEqual(b[-7:-5], by(", "))
213 self.assertEqual(b[-5:], by("world"))
214 self.assertEqual(b[-5:12], by("world"))
215 self.assertEqual(b[-5:100], by("world"))
216 self.assertEqual(b[-100:5], by("Hello"))
217
Thomas Wouters376446d2006-12-19 08:30:14 +0000218 def test_extended_getslice(self):
219 # Test extended slicing by comparing with list slicing.
220 L = list(range(255))
221 b = bytes(L)
222 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
223 for start in indices:
224 for stop in indices:
225 # Skip step 0 (invalid)
226 for step in indices[1:]:
227 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
228
Guido van Rossumd624f182006-04-24 13:47:05 +0000229 def test_regexps(self):
230 def by(s):
231 return bytes(map(ord, s))
232 b = by("Hello, world")
233 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
234
235 def test_setitem(self):
236 b = bytes([1, 2, 3])
237 b[1] = 100
238 self.assertEqual(b, bytes([1, 100, 3]))
239 b[-1] = 200
240 self.assertEqual(b, bytes([1, 100, 200]))
241 class C:
242 def __init__(self, i=0):
243 self.i = i
244 def __index__(self):
245 return self.i
246 b[0] = C(10)
247 self.assertEqual(b, bytes([10, 100, 200]))
248 try:
249 b[3] = 0
250 self.fail("Didn't raise IndexError")
251 except IndexError:
252 pass
253 try:
254 b[-10] = 0
255 self.fail("Didn't raise IndexError")
256 except IndexError:
257 pass
258 try:
259 b[0] = 256
260 self.fail("Didn't raise ValueError")
261 except ValueError:
262 pass
263 try:
264 b[0] = C(-1)
265 self.fail("Didn't raise ValueError")
266 except ValueError:
267 pass
268 try:
269 b[0] = None
270 self.fail("Didn't raise TypeError")
271 except TypeError:
272 pass
273
274 def test_delitem(self):
275 b = bytes(range(10))
276 del b[0]
277 self.assertEqual(b, bytes(range(1, 10)))
278 del b[-1]
279 self.assertEqual(b, bytes(range(1, 9)))
280 del b[4]
281 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
282
283 def test_setslice(self):
284 b = bytes(range(10))
285 self.assertEqual(list(b), list(range(10)))
286
287 b[0:5] = bytes([1, 1, 1, 1, 1])
288 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
289
290 del b[0:-5]
291 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
292
293 b[0:0] = bytes([0, 1, 2, 3, 4])
294 self.assertEqual(b, bytes(range(10)))
295
296 b[-7:-3] = bytes([100, 101])
297 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
298
299 b[3:5] = [3, 4, 5, 6]
300 self.assertEqual(b, bytes(range(10)))
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000301
302 b[3:0] = [42, 42, 42]
303 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 +0000304
Thomas Wouters376446d2006-12-19 08:30:14 +0000305 def test_extended_set_del_slice(self):
306 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
307 for start in indices:
308 for stop in indices:
309 # Skip invalid step 0
310 for step in indices[1:]:
311 L = list(range(255))
312 b = bytes(L)
313 # Make sure we have a slice of exactly the right length,
314 # but with different data.
315 data = L[start:stop:step]
316 data.reverse()
317 L[start:stop:step] = data
318 b[start:stop:step] = data
319 self.assertEquals(b, bytes(L))
320
321 del L[start:stop:step]
322 del b[start:stop:step]
323 self.assertEquals(b, bytes(L))
324
Guido van Rossumd624f182006-04-24 13:47:05 +0000325 def test_setslice_trap(self):
326 # This test verifies that we correctly handle assigning self
327 # to a slice of self (the old Lambert Meertens trap).
328 b = bytes(range(256))
329 b[8:] = b
330 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
331
332 def test_encoding(self):
333 sample = u"Hello world\n\u1234\u5678\u9abc\udef0"
334 for enc in ("utf8", "utf16"):
335 b = bytes(sample, enc)
336 self.assertEqual(b, bytes(map(ord, sample.encode(enc))))
337 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
338 b = bytes(sample, "latin1", "ignore")
339 self.assertEqual(b, bytes(sample[:-4]))
340
341 def test_decode(self):
342 sample = u"Hello world\n\u1234\u5678\u9abc\def0\def0"
343 for enc in ("utf8", "utf16"):
344 b = bytes(sample, enc)
345 self.assertEqual(b.decode(enc), sample)
346 sample = u"Hello world\n\x80\x81\xfe\xff"
347 b = bytes(sample, "latin1")
348 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
349 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
350
351 def test_from_buffer(self):
352 sample = "Hello world\n\x80\x81\xfe\xff"
353 buf = buffer(sample)
354 b = bytes(buf)
355 self.assertEqual(b, bytes(map(ord, sample)))
356
357 def test_to_str(self):
358 sample = "Hello world\n\x80\x81\xfe\xff"
359 b = bytes(sample)
360 self.assertEqual(str(b), sample)
361
362 def test_from_int(self):
363 b = bytes(0)
364 self.assertEqual(b, bytes())
365 b = bytes(10)
366 self.assertEqual(b, bytes([0]*10))
367 b = bytes(10000)
368 self.assertEqual(b, bytes([0]*10000))
369
370 def test_concat(self):
371 b1 = bytes("abc")
372 b2 = bytes("def")
373 self.assertEqual(b1 + b2, bytes("abcdef"))
374 self.assertRaises(TypeError, lambda: b1 + "def")
375 self.assertRaises(TypeError, lambda: "abc" + b2)
376
377 def test_repeat(self):
378 b = bytes("abc")
379 self.assertEqual(b * 3, bytes("abcabcabc"))
380 self.assertEqual(b * 0, bytes())
381 self.assertEqual(b * -1, bytes())
382 self.assertRaises(TypeError, lambda: b * 3.14)
383 self.assertRaises(TypeError, lambda: 3.14 * b)
384 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000385
386 def test_repeat_1char(self):
Guido van Rossumd624f182006-04-24 13:47:05 +0000387 self.assertEqual(bytes('x')*100, bytes('x'*100))
388
Guido van Rossum13e57212006-04-27 22:54:26 +0000389 def test_iconcat(self):
390 b = bytes("abc")
391 b1 = b
392 b += bytes("def")
393 self.assertEqual(b, bytes("abcdef"))
394 self.assertEqual(b, b1)
395 self.failUnless(b is b1)
396
397 def test_irepeat(self):
398 b = bytes("abc")
399 b1 = b
400 b *= 3
401 self.assertEqual(b, bytes("abcabcabc"))
402 self.assertEqual(b, b1)
403 self.failUnless(b is b1)
404
405 def test_irepeat_1char(self):
406 b = bytes("x")
407 b1 = b
408 b *= 100
409 self.assertEqual(b, bytes("x"*100))
410 self.assertEqual(b, b1)
411 self.failUnless(b is b1)
412
413 def test_contains(self):
414 b = bytes("abc")
415 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000416 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000417 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000418 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000419 self.assertRaises(ValueError, lambda: 300 in b)
420 self.assertRaises(ValueError, lambda: -1 in b)
421 self.assertRaises(TypeError, lambda: None in b)
422 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
423 self.assertRaises(TypeError, lambda: "a" in b)
424 self.failUnless(bytes("") in b)
425 self.failUnless(bytes("a") in b)
426 self.failUnless(bytes("b") in b)
427 self.failUnless(bytes("c") in b)
428 self.failUnless(bytes("ab") in b)
429 self.failUnless(bytes("bc") in b)
430 self.failUnless(bytes("abc") in b)
431 self.failIf(bytes("ac") in b)
432 self.failIf(bytes("d") in b)
433 self.failIf(bytes("dab") in b)
434 self.failIf(bytes("abd") in b)
435
Guido van Rossum20188312006-05-05 15:15:40 +0000436 def test_alloc(self):
437 b = bytes()
438 alloc = b.__alloc__()
439 self.assert_(alloc >= 0)
440 seq = [alloc]
441 for i in range(100):
442 b += bytes("x")
443 alloc = b.__alloc__()
444 self.assert_(alloc >= len(b))
445 if alloc not in seq:
446 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000447 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000448
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000449 def test_fromhex(self):
450 self.assertRaises(TypeError, bytes.fromhex)
451 self.assertRaises(TypeError, bytes.fromhex, 1)
452 self.assertEquals(bytes.fromhex(''), bytes())
453 b = bytes([0x1a, 0x2b, 0x30])
454 self.assertEquals(bytes.fromhex('1a2B30'), b)
455 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
456 self.assertEquals(bytes.fromhex(buffer('')), bytes())
457 self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
458 self.assertRaises(ValueError, bytes.fromhex, 'a')
459 self.assertRaises(ValueError, bytes.fromhex, 'rt')
460 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
461 self.assertRaises(ValueError, bytes.fromhex, '\x00')
462 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
463
Guido van Rossum20188312006-05-05 15:15:40 +0000464 def test_join(self):
465 self.assertEqual(bytes.join([]), bytes())
466 self.assertEqual(bytes.join([bytes()]), bytes())
467 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
468 lst = map(bytes, part)
469 self.assertEqual(bytes.join(lst), bytes("abc"))
470 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
471 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
472 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000473
474 def test_literal(self):
475 tests = [
476 (b"Wonderful spam", u"Wonderful spam"),
477 (br"Wonderful spam too", u"Wonderful spam too"),
478 (b"\xaa\x00\000\200", u"\xaa\x00\000\200"),
479 (br"\xaa\x00\000\200", ur"\xaa\x00\000\200"),
480 ]
481 for b, s in tests:
482 self.assertEqual(b, bytes(s, 'latin-1'))
483 for c in range(128, 256):
484 self.assertRaises(SyntaxError, eval,
485 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000486
Neal Norwitz6968b052007-02-27 19:02:19 +0000487 def test_extend(self):
488 orig = b'hello'
489 a = bytes(orig)
490 a.extend(a)
491 self.assertEqual(a, orig + orig)
492 self.assertEqual(a[5:], orig)
493
494 def test_remove(self):
495 b = b'hello'
496 b.remove(ord('l'))
497 self.assertEqual(b, b'helo')
498 b.remove(ord('l'))
499 self.assertEqual(b, b'heo')
500 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
501 self.assertRaises(ValueError, lambda: b.remove(400))
502 self.assertRaises(ValueError, lambda: b.remove('e'))
503 # remove first and last
504 b.remove(ord('o'))
505 b.remove(ord('h'))
506 self.assertEqual(b, b'e')
507
508 def test_pop(self):
509 b = b'world'
510 self.assertEqual(b.pop(), ord('d'))
511 self.assertEqual(b.pop(0), ord('w'))
512 self.assertEqual(b.pop(-2), ord('r'))
513 self.assertRaises(IndexError, lambda: b.pop(10))
514 self.assertRaises(OverflowError, lambda: bytes().pop())
515
516 def test_nosort(self):
517 self.assertRaises(AttributeError, lambda: bytes().sort())
518
519 def test_index(self):
520 b = b'parrot'
521 self.assertEqual(b.index('p'), 0)
522 self.assertEqual(b.index('rr'), 2)
523 self.assertEqual(b.index('t'), 5)
524 self.assertRaises(ValueError, lambda: b.index('w'))
525
526 def test_count(self):
527 b = b'mississippi'
528 self.assertEqual(b.count('i'), 4)
529 self.assertEqual(b.count('ss'), 2)
530 self.assertEqual(b.count('w'), 0)
531
532 def test_append(self):
533 b = b'hell'
534 b.append(ord('o'))
535 self.assertEqual(b, b'hello')
536 self.assertEqual(b.append(100), None)
537 b = bytes()
538 b.append(ord('A'))
539 self.assertEqual(len(b), 1)
540
541 def test_insert(self):
542 b = b'msssspp'
543 b.insert(1, ord('i'))
544 b.insert(4, ord('i'))
545 b.insert(-2, ord('i'))
546 b.insert(1000, ord('i'))
547 self.assertEqual(b, b'mississippi')
548
549 def test_startswith(self):
550 b = b'hello'
551 self.assertFalse(bytes().startswith("anything"))
552 self.assertTrue(b.startswith("hello"))
553 self.assertTrue(b.startswith("hel"))
554 self.assertTrue(b.startswith("h"))
555 self.assertFalse(b.startswith("hellow"))
556 self.assertFalse(b.startswith("ha"))
557
558 def test_endswith(self):
559 b = b'hello'
560 self.assertFalse(bytes().endswith("anything"))
561 self.assertTrue(b.endswith("hello"))
562 self.assertTrue(b.endswith("llo"))
563 self.assertTrue(b.endswith("o"))
564 self.assertFalse(b.endswith("whello"))
565 self.assertFalse(b.endswith("no"))
566
567 def test_find(self):
568 b = b'mississippi'
569 self.assertEqual(b.find('ss'), 2)
570 self.assertEqual(b.find('ss', 3), 5)
571 self.assertEqual(b.find('ss', 1, 7), 2)
572 self.assertEqual(b.find('ss', 1, 3), -1)
573 self.assertEqual(b.find('w'), -1)
574 self.assertEqual(b.find('mississippian'), -1)
575
576 def test_rfind(self):
577 b = b'mississippi'
578 self.assertEqual(b.rfind('ss'), 5)
579 self.assertEqual(b.rfind('ss', 3), 5)
580 self.assertEqual(b.rfind('ss', 0, 6), 2)
581 self.assertEqual(b.rfind('w'), -1)
582 self.assertEqual(b.rfind('mississippian'), -1)
583
584 def test_index(self):
585 b = b'world'
586 self.assertEqual(b.index('w'), 0)
587 self.assertEqual(b.index('orl'), 1)
588 self.assertRaises(ValueError, lambda: b.index('worm'))
589 self.assertRaises(ValueError, lambda: b.index('ldo'))
590
591 def test_rindex(self):
592 # XXX could be more rigorous
593 b = b'world'
594 self.assertEqual(b.rindex('w'), 0)
595 self.assertEqual(b.rindex('orl'), 1)
596 self.assertRaises(ValueError, lambda: b.rindex('worm'))
597 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
598
599 def test_replace(self):
600 b = b'mississippi'
601 self.assertEqual(b.replace('i', 'a'), b'massassappa')
602 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
603
604 def test_translate(self):
605 b = b'hello'
606 rosetta = bytes(range(0, 256))
607 rosetta[ord('o')] = ord('e')
608 c = b.translate(rosetta, b'l')
609 self.assertEqual(b, b'hello')
610 self.assertEqual(c, b'hee')
611
612 def test_split(self):
613 b = b'mississippi'
614 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
615 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
616 self.assertEqual(b.split('w'), [b])
617 # require an arg (no magic whitespace split)
618 self.assertRaises(TypeError, lambda: b.split())
619
620 def test_rsplit(self):
621 b = b'mississippi'
622 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
623 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
624 self.assertEqual(b.rsplit('w'), [b])
625 # require an arg (no magic whitespace split)
626 self.assertRaises(TypeError, lambda: b.rsplit())
627
628 def test_partition(self):
629 b = b'mississippi'
630 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
631 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
632
633 def test_rpartition(self):
634 b = b'mississippi'
635 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
636 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
637
Guido van Rossum0ad08122007-04-11 04:37:43 +0000638 def test_pickling(self):
639 for pm in pickle, cPickle:
640 for proto in range(pm.HIGHEST_PROTOCOL):
641 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
642 ps = pm.dumps(b, proto)
643 q = pm.loads(ps)
644 self.assertEqual(b, q)
645
Guido van Rossumd624f182006-04-24 13:47:05 +0000646 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000647 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000648 # __reversed__? (optimization)
649
Guido van Rossumd624f182006-04-24 13:47:05 +0000650 # XXX Some string methods? (Those that don't use character properties)
Neal Norwitz6968b052007-02-27 19:02:19 +0000651 # lstrip, rstrip, strip?? (currently un-pepped)
Guido van Rossumd624f182006-04-24 13:47:05 +0000652 # join
Neal Norwitz6968b052007-02-27 19:02:19 +0000653
654 # There are tests in string_tests.py that are more
655 # comprehensive for things like split, partition, etc.
656 # Unfortunately they are all bundled with tests that
657 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000658
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000659
Georg Brandlc7885542007-03-06 19:16:20 +0000660class BytesAsStringTest(test.string_tests.BaseTest):
661 type2test = bytes
662
663 def checkequal(self, result, object, methodname, *args):
664 object = bytes(object)
665 realresult = getattr(bytes, methodname)(object, *args)
666 self.assertEqual(
667 self.fixtype(result),
668 realresult
669 )
670
671 def checkraises(self, exc, object, methodname, *args):
672 object = bytes(object)
673 self.assertRaises(
674 exc,
675 getattr(bytes, methodname),
676 object,
677 *args
678 )
679
680 # Currently the bytes containment testing uses a single integer
681 # value. This may not be the final design, but until then the
682 # bytes section with in a bytes containment not valid
683 def test_contains(self):
684 pass
685 def test_find(self):
686 pass
687
688
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000689def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000690 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000691 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000692
693
694if __name__ == "__main__":
Guido van Rossumd624f182006-04-24 13:47:05 +0000695 test_main()
696 ##unittest.main()