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