blob: 1d826b638024f7e5d429f2db230028810319a6e9 [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]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000228
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)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000301
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000302 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))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000320
Thomas Wouters376446d2006-12-19 08:30:14 +0000321 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"))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000374 self.assertEqual(b1 + "def", bytes("abcdef"))
375 self.assertEqual("def" + b1, bytes("defabc"))
376 self.assertRaises(TypeError, lambda: b1 + u"def")
377 ##self.assertRaises(TypeError, lambda: u"abc" + b2) # XXX FIXME
Guido van Rossumd624f182006-04-24 13:47:05 +0000378
379 def test_repeat(self):
380 b = bytes("abc")
381 self.assertEqual(b * 3, bytes("abcabcabc"))
382 self.assertEqual(b * 0, bytes())
383 self.assertEqual(b * -1, bytes())
384 self.assertRaises(TypeError, lambda: b * 3.14)
385 self.assertRaises(TypeError, lambda: 3.14 * b)
386 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000387
388 def test_repeat_1char(self):
Guido van Rossumd624f182006-04-24 13:47:05 +0000389 self.assertEqual(bytes('x')*100, bytes('x'*100))
390
Guido van Rossum13e57212006-04-27 22:54:26 +0000391 def test_iconcat(self):
392 b = bytes("abc")
393 b1 = b
394 b += bytes("def")
395 self.assertEqual(b, bytes("abcdef"))
396 self.assertEqual(b, b1)
397 self.failUnless(b is b1)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000398 b += "xyz"
399 self.assertEqual(b, b"abcdefxyz")
400 try:
401 b += u""
402 except TypeError:
403 pass
404 else:
405 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000406
407 def test_irepeat(self):
408 b = bytes("abc")
409 b1 = b
410 b *= 3
411 self.assertEqual(b, bytes("abcabcabc"))
412 self.assertEqual(b, b1)
413 self.failUnless(b is b1)
414
415 def test_irepeat_1char(self):
416 b = bytes("x")
417 b1 = b
418 b *= 100
419 self.assertEqual(b, bytes("x"*100))
420 self.assertEqual(b, b1)
421 self.failUnless(b is b1)
422
423 def test_contains(self):
424 b = bytes("abc")
425 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000426 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000427 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000428 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000429 self.assertRaises(ValueError, lambda: 300 in b)
430 self.assertRaises(ValueError, lambda: -1 in b)
431 self.assertRaises(TypeError, lambda: None in b)
432 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
433 self.assertRaises(TypeError, lambda: "a" in b)
434 self.failUnless(bytes("") in b)
435 self.failUnless(bytes("a") in b)
436 self.failUnless(bytes("b") in b)
437 self.failUnless(bytes("c") in b)
438 self.failUnless(bytes("ab") in b)
439 self.failUnless(bytes("bc") in b)
440 self.failUnless(bytes("abc") in b)
441 self.failIf(bytes("ac") in b)
442 self.failIf(bytes("d") in b)
443 self.failIf(bytes("dab") in b)
444 self.failIf(bytes("abd") in b)
445
Guido van Rossum20188312006-05-05 15:15:40 +0000446 def test_alloc(self):
447 b = bytes()
448 alloc = b.__alloc__()
449 self.assert_(alloc >= 0)
450 seq = [alloc]
451 for i in range(100):
452 b += bytes("x")
453 alloc = b.__alloc__()
454 self.assert_(alloc >= len(b))
455 if alloc not in seq:
456 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000457 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000458
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000459 def test_fromhex(self):
460 self.assertRaises(TypeError, bytes.fromhex)
461 self.assertRaises(TypeError, bytes.fromhex, 1)
462 self.assertEquals(bytes.fromhex(''), bytes())
463 b = bytes([0x1a, 0x2b, 0x30])
464 self.assertEquals(bytes.fromhex('1a2B30'), b)
465 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
466 self.assertEquals(bytes.fromhex(buffer('')), bytes())
467 self.assertEquals(bytes.fromhex(buffer('0000')), bytes([0, 0]))
468 self.assertRaises(ValueError, bytes.fromhex, 'a')
469 self.assertRaises(ValueError, bytes.fromhex, 'rt')
470 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
471 self.assertRaises(ValueError, bytes.fromhex, '\x00')
472 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
473
Guido van Rossum20188312006-05-05 15:15:40 +0000474 def test_join(self):
475 self.assertEqual(bytes.join([]), bytes())
476 self.assertEqual(bytes.join([bytes()]), bytes())
477 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
478 lst = map(bytes, part)
479 self.assertEqual(bytes.join(lst), bytes("abc"))
480 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
481 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
482 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000483
484 def test_literal(self):
485 tests = [
486 (b"Wonderful spam", u"Wonderful spam"),
487 (br"Wonderful spam too", u"Wonderful spam too"),
488 (b"\xaa\x00\000\200", u"\xaa\x00\000\200"),
489 (br"\xaa\x00\000\200", ur"\xaa\x00\000\200"),
490 ]
491 for b, s in tests:
492 self.assertEqual(b, bytes(s, 'latin-1'))
493 for c in range(128, 256):
494 self.assertRaises(SyntaxError, eval,
495 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000496
Neal Norwitz6968b052007-02-27 19:02:19 +0000497 def test_extend(self):
498 orig = b'hello'
499 a = bytes(orig)
500 a.extend(a)
501 self.assertEqual(a, orig + orig)
502 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000503
Neal Norwitz6968b052007-02-27 19:02:19 +0000504 def test_remove(self):
505 b = b'hello'
506 b.remove(ord('l'))
507 self.assertEqual(b, b'helo')
508 b.remove(ord('l'))
509 self.assertEqual(b, b'heo')
510 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
511 self.assertRaises(ValueError, lambda: b.remove(400))
512 self.assertRaises(ValueError, lambda: b.remove('e'))
513 # remove first and last
514 b.remove(ord('o'))
515 b.remove(ord('h'))
516 self.assertEqual(b, b'e')
517
518 def test_pop(self):
519 b = b'world'
520 self.assertEqual(b.pop(), ord('d'))
521 self.assertEqual(b.pop(0), ord('w'))
522 self.assertEqual(b.pop(-2), ord('r'))
523 self.assertRaises(IndexError, lambda: b.pop(10))
524 self.assertRaises(OverflowError, lambda: bytes().pop())
525
526 def test_nosort(self):
527 self.assertRaises(AttributeError, lambda: bytes().sort())
528
529 def test_index(self):
530 b = b'parrot'
531 self.assertEqual(b.index('p'), 0)
532 self.assertEqual(b.index('rr'), 2)
533 self.assertEqual(b.index('t'), 5)
534 self.assertRaises(ValueError, lambda: b.index('w'))
535
536 def test_count(self):
537 b = b'mississippi'
538 self.assertEqual(b.count('i'), 4)
539 self.assertEqual(b.count('ss'), 2)
540 self.assertEqual(b.count('w'), 0)
541
542 def test_append(self):
543 b = b'hell'
544 b.append(ord('o'))
545 self.assertEqual(b, b'hello')
546 self.assertEqual(b.append(100), None)
547 b = bytes()
548 b.append(ord('A'))
549 self.assertEqual(len(b), 1)
550
551 def test_insert(self):
552 b = b'msssspp'
553 b.insert(1, ord('i'))
554 b.insert(4, ord('i'))
555 b.insert(-2, ord('i'))
556 b.insert(1000, ord('i'))
557 self.assertEqual(b, b'mississippi')
558
559 def test_startswith(self):
560 b = b'hello'
561 self.assertFalse(bytes().startswith("anything"))
562 self.assertTrue(b.startswith("hello"))
563 self.assertTrue(b.startswith("hel"))
564 self.assertTrue(b.startswith("h"))
565 self.assertFalse(b.startswith("hellow"))
566 self.assertFalse(b.startswith("ha"))
567
568 def test_endswith(self):
569 b = b'hello'
570 self.assertFalse(bytes().endswith("anything"))
571 self.assertTrue(b.endswith("hello"))
572 self.assertTrue(b.endswith("llo"))
573 self.assertTrue(b.endswith("o"))
574 self.assertFalse(b.endswith("whello"))
575 self.assertFalse(b.endswith("no"))
576
577 def test_find(self):
578 b = b'mississippi'
579 self.assertEqual(b.find('ss'), 2)
580 self.assertEqual(b.find('ss', 3), 5)
581 self.assertEqual(b.find('ss', 1, 7), 2)
582 self.assertEqual(b.find('ss', 1, 3), -1)
583 self.assertEqual(b.find('w'), -1)
584 self.assertEqual(b.find('mississippian'), -1)
585
586 def test_rfind(self):
587 b = b'mississippi'
588 self.assertEqual(b.rfind('ss'), 5)
589 self.assertEqual(b.rfind('ss', 3), 5)
590 self.assertEqual(b.rfind('ss', 0, 6), 2)
591 self.assertEqual(b.rfind('w'), -1)
592 self.assertEqual(b.rfind('mississippian'), -1)
593
594 def test_index(self):
595 b = b'world'
596 self.assertEqual(b.index('w'), 0)
597 self.assertEqual(b.index('orl'), 1)
598 self.assertRaises(ValueError, lambda: b.index('worm'))
599 self.assertRaises(ValueError, lambda: b.index('ldo'))
600
601 def test_rindex(self):
602 # XXX could be more rigorous
603 b = b'world'
604 self.assertEqual(b.rindex('w'), 0)
605 self.assertEqual(b.rindex('orl'), 1)
606 self.assertRaises(ValueError, lambda: b.rindex('worm'))
607 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
608
609 def test_replace(self):
610 b = b'mississippi'
611 self.assertEqual(b.replace('i', 'a'), b'massassappa')
612 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
613
614 def test_translate(self):
615 b = b'hello'
616 rosetta = bytes(range(0, 256))
617 rosetta[ord('o')] = ord('e')
618 c = b.translate(rosetta, b'l')
619 self.assertEqual(b, b'hello')
620 self.assertEqual(c, b'hee')
621
622 def test_split(self):
623 b = b'mississippi'
624 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
625 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
626 self.assertEqual(b.split('w'), [b])
627 # require an arg (no magic whitespace split)
628 self.assertRaises(TypeError, lambda: b.split())
629
630 def test_rsplit(self):
631 b = b'mississippi'
632 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
633 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
634 self.assertEqual(b.rsplit('w'), [b])
635 # require an arg (no magic whitespace split)
636 self.assertRaises(TypeError, lambda: b.rsplit())
637
638 def test_partition(self):
639 b = b'mississippi'
640 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
641 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
642
643 def test_rpartition(self):
644 b = b'mississippi'
645 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
646 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
647
Guido van Rossum0ad08122007-04-11 04:37:43 +0000648 def test_pickling(self):
649 for pm in pickle, cPickle:
650 for proto in range(pm.HIGHEST_PROTOCOL):
651 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
652 ps = pm.dumps(b, proto)
653 q = pm.loads(ps)
654 self.assertEqual(b, q)
655
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000656 def test_strip(self):
657 b = b'mississippi'
658 self.assertEqual(b.strip(b'i'), b'mississipp')
659 self.assertEqual(b.strip(b'm'), b'ississippi')
660 self.assertEqual(b.strip(b'pi'), b'mississ')
661 self.assertEqual(b.strip(b'im'), b'ssissipp')
662 self.assertEqual(b.strip(b'pim'), b'ssiss')
663
664 def test_lstrip(self):
665 b = b'mississippi'
666 self.assertEqual(b.lstrip(b'i'), b'mississippi')
667 self.assertEqual(b.lstrip(b'm'), b'ississippi')
668 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
669 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
670 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
671
672 def test_rstrip(self):
673 b = b'mississippi'
674 self.assertEqual(b.rstrip(b'i'), b'mississipp')
675 self.assertEqual(b.rstrip(b'm'), b'mississippi')
676 self.assertEqual(b.rstrip(b'pi'), b'mississ')
677 self.assertEqual(b.rstrip(b'im'), b'mississipp')
678 self.assertEqual(b.rstrip(b'pim'), b'mississ')
679
Guido van Rossumd624f182006-04-24 13:47:05 +0000680 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000681 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000682 # __reversed__? (optimization)
683
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000684 # XXX More string methods? (Those that don't use character properties)
685
Neal Norwitz6968b052007-02-27 19:02:19 +0000686 # There are tests in string_tests.py that are more
687 # comprehensive for things like split, partition, etc.
688 # Unfortunately they are all bundled with tests that
689 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000690
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000691
Georg Brandlc7885542007-03-06 19:16:20 +0000692class BytesAsStringTest(test.string_tests.BaseTest):
693 type2test = bytes
694
695 def checkequal(self, result, object, methodname, *args):
696 object = bytes(object)
697 realresult = getattr(bytes, methodname)(object, *args)
698 self.assertEqual(
699 self.fixtype(result),
700 realresult
701 )
702
703 def checkraises(self, exc, object, methodname, *args):
704 object = bytes(object)
705 self.assertRaises(
706 exc,
707 getattr(bytes, methodname),
708 object,
709 *args
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000710 )
Georg Brandlc7885542007-03-06 19:16:20 +0000711
712 # Currently the bytes containment testing uses a single integer
713 # value. This may not be the final design, but until then the
714 # bytes section with in a bytes containment not valid
715 def test_contains(self):
716 pass
717 def test_find(self):
718 pass
719
720
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000721def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000722 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000723 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000724
725
726if __name__ == "__main__":
Guido van Rossumd624f182006-04-24 13:47:05 +0000727 test_main()
728 ##unittest.main()