blob: ded049100eb2c3efdc160aa16a4b649b7ee54e52 [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''")
Guido van Rossum57b93ad2007-05-08 19:09:34 +000076 self.assertEqual(repr(bytes([0])), "b'\\x00'")
77 self.assertEqual(repr(bytes([0, 1, 254, 255])),
78 "b'\\x00\\x01\\xfe\\xff'")
Georg Brandlee91be42007-02-24 19:41:35 +000079 self.assertEqual(repr(bytes('abc')), "b'abc'")
80 self.assertEqual(repr(bytes("'")), "b'\\''")
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000081
82 def test_compare(self):
83 b1 = bytes([1, 2, 3])
84 b2 = bytes([1, 2, 3])
85 b3 = bytes([1, 3])
86
87 self.failUnless(b1 == b2)
88 self.failUnless(b2 != b3)
89 self.failUnless(b1 <= b2)
90 self.failUnless(b1 <= b3)
91 self.failUnless(b1 < b3)
92 self.failUnless(b1 >= b2)
93 self.failUnless(b3 >= b2)
94 self.failUnless(b3 > b2)
95
96 self.failIf(b1 != b2)
97 self.failIf(b2 == b3)
98 self.failIf(b1 > b2)
99 self.failIf(b1 > b3)
100 self.failIf(b1 >= b3)
101 self.failIf(b1 < b2)
102 self.failIf(b3 < b2)
103 self.failIf(b3 <= b2)
104
Guido van Rossum343e97f2007-04-09 00:43:24 +0000105 def test_compare_to_str(self):
Guido van Rossum4355a472007-05-04 05:00:04 +0000106 self.assertEqual(b"abc" == str8("abc"), True)
107 self.assertEqual(b"ab" != str8("abc"), True)
108 self.assertEqual(b"ab" <= str8("abc"), True)
109 self.assertEqual(b"ab" < str8("abc"), True)
110 self.assertEqual(b"abc" >= str8("ab"), True)
111 self.assertEqual(b"abc" > str8("ab"), True)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000112
Guido van Rossum4355a472007-05-04 05:00:04 +0000113 self.assertEqual(b"abc" != str8("abc"), False)
114 self.assertEqual(b"ab" == str8("abc"), False)
115 self.assertEqual(b"ab" > str8("abc"), False)
116 self.assertEqual(b"ab" >= str8("abc"), False)
117 self.assertEqual(b"abc" < str8("ab"), False)
118 self.assertEqual(b"abc" <= str8("ab"), False)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000119
Guido van Rossum4355a472007-05-04 05:00:04 +0000120 self.assertEqual(str8("abc") == b"abc", True)
121 self.assertEqual(str8("ab") != b"abc", True)
122 self.assertEqual(str8("ab") <= b"abc", True)
123 self.assertEqual(str8("ab") < b"abc", True)
124 self.assertEqual(str8("abc") >= b"ab", True)
125 self.assertEqual(str8("abc") > b"ab", True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000126
Guido van Rossum4355a472007-05-04 05:00:04 +0000127 self.assertEqual(str8("abc") != b"abc", False)
128 self.assertEqual(str8("ab") == b"abc", False)
129 self.assertEqual(str8("ab") > b"abc", False)
130 self.assertEqual(str8("ab") >= b"abc", False)
131 self.assertEqual(str8("abc") < b"ab", False)
132 self.assertEqual(str8("abc") <= b"ab", False)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000133
Guido van Rossum4355a472007-05-04 05:00:04 +0000134 # Bytes should never compare equal to Unicode!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000135 # Test this for all expected byte orders and Unicode character sizes
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000136 self.assertEqual(b"\0a\0b\0c" == "abc", False)
137 self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == "abc", False)
138 self.assertEqual(b"a\0b\0c\0" == "abc", False)
139 self.assertEqual(b"a\0\0\0b\0\0\0c\0\0\0" == "abc", False)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000140
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000141 def test_nohash(self):
142 self.assertRaises(TypeError, hash, bytes())
143
144 def test_doc(self):
145 self.failUnless(bytes.__doc__ != None)
146 self.failUnless(bytes.__doc__.startswith("bytes("))
147
Guido van Rossumd624f182006-04-24 13:47:05 +0000148 def test_buffer_api(self):
149 short_sample = "Hello world\n"
150 sample = short_sample + "x"*(20 - len(short_sample))
151 tfn = tempfile.mktemp()
152 try:
153 # Prepare
154 with open(tfn, "wb") as f:
155 f.write(short_sample)
156 # Test readinto
157 with open(tfn, "rb") as f:
158 b = bytes([ord('x')]*20)
159 n = f.readinto(b)
160 self.assertEqual(n, len(short_sample))
161 self.assertEqual(list(b), map(ord, sample))
162 # Test writing in binary mode
163 with open(tfn, "wb") as f:
164 f.write(b)
165 with open(tfn, "rb") as f:
166 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000167 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000168 finally:
169 try:
170 os.remove(tfn)
171 except os.error:
172 pass
173
174 def test_reversed(self):
175 input = map(ord, "Hello")
176 b = bytes(input)
177 output = list(reversed(b))
178 input.reverse()
179 self.assertEqual(output, input)
180
Neal Norwitz6968b052007-02-27 19:02:19 +0000181 def test_reverse(self):
182 b = b'hello'
183 self.assertEqual(b.reverse(), None)
184 self.assertEqual(b, b'olleh')
185 b = b'hello1' # test even number of items
186 b.reverse()
187 self.assertEqual(b, b'1olleh')
188 b = bytes()
189 b.reverse()
190 self.assertFalse(b)
191
Guido van Rossumd624f182006-04-24 13:47:05 +0000192 def test_getslice(self):
193 def by(s):
194 return bytes(map(ord, s))
195 b = by("Hello, world")
196
197 self.assertEqual(b[:5], by("Hello"))
198 self.assertEqual(b[1:5], by("ello"))
199 self.assertEqual(b[5:7], by(", "))
200 self.assertEqual(b[7:], by("world"))
201 self.assertEqual(b[7:12], by("world"))
202 self.assertEqual(b[7:100], by("world"))
203
204 self.assertEqual(b[:-7], by("Hello"))
205 self.assertEqual(b[-11:-7], by("ello"))
206 self.assertEqual(b[-7:-5], by(", "))
207 self.assertEqual(b[-5:], by("world"))
208 self.assertEqual(b[-5:12], by("world"))
209 self.assertEqual(b[-5:100], by("world"))
210 self.assertEqual(b[-100:5], by("Hello"))
211
Thomas Wouters376446d2006-12-19 08:30:14 +0000212 def test_extended_getslice(self):
213 # Test extended slicing by comparing with list slicing.
214 L = list(range(255))
215 b = bytes(L)
216 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
217 for start in indices:
218 for stop in indices:
219 # Skip step 0 (invalid)
220 for step in indices[1:]:
221 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000222
Guido van Rossumd624f182006-04-24 13:47:05 +0000223 def test_regexps(self):
224 def by(s):
225 return bytes(map(ord, s))
226 b = by("Hello, world")
227 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
228
229 def test_setitem(self):
230 b = bytes([1, 2, 3])
231 b[1] = 100
232 self.assertEqual(b, bytes([1, 100, 3]))
233 b[-1] = 200
234 self.assertEqual(b, bytes([1, 100, 200]))
235 class C:
236 def __init__(self, i=0):
237 self.i = i
238 def __index__(self):
239 return self.i
240 b[0] = C(10)
241 self.assertEqual(b, bytes([10, 100, 200]))
242 try:
243 b[3] = 0
244 self.fail("Didn't raise IndexError")
245 except IndexError:
246 pass
247 try:
248 b[-10] = 0
249 self.fail("Didn't raise IndexError")
250 except IndexError:
251 pass
252 try:
253 b[0] = 256
254 self.fail("Didn't raise ValueError")
255 except ValueError:
256 pass
257 try:
258 b[0] = C(-1)
259 self.fail("Didn't raise ValueError")
260 except ValueError:
261 pass
262 try:
263 b[0] = None
264 self.fail("Didn't raise TypeError")
265 except TypeError:
266 pass
267
268 def test_delitem(self):
269 b = bytes(range(10))
270 del b[0]
271 self.assertEqual(b, bytes(range(1, 10)))
272 del b[-1]
273 self.assertEqual(b, bytes(range(1, 9)))
274 del b[4]
275 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
276
277 def test_setslice(self):
278 b = bytes(range(10))
279 self.assertEqual(list(b), list(range(10)))
280
281 b[0:5] = bytes([1, 1, 1, 1, 1])
282 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
283
284 del b[0:-5]
285 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
286
287 b[0:0] = bytes([0, 1, 2, 3, 4])
288 self.assertEqual(b, bytes(range(10)))
289
290 b[-7:-3] = bytes([100, 101])
291 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
292
293 b[3:5] = [3, 4, 5, 6]
294 self.assertEqual(b, bytes(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000295
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000296 b[3:0] = [42, 42, 42]
297 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 +0000298
Thomas Wouters376446d2006-12-19 08:30:14 +0000299 def test_extended_set_del_slice(self):
300 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
301 for start in indices:
302 for stop in indices:
303 # Skip invalid step 0
304 for step in indices[1:]:
305 L = list(range(255))
306 b = bytes(L)
307 # Make sure we have a slice of exactly the right length,
308 # but with different data.
309 data = L[start:stop:step]
310 data.reverse()
311 L[start:stop:step] = data
312 b[start:stop:step] = data
313 self.assertEquals(b, bytes(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000314
Thomas Wouters376446d2006-12-19 08:30:14 +0000315 del L[start:stop:step]
316 del b[start:stop:step]
317 self.assertEquals(b, bytes(L))
318
Guido van Rossumd624f182006-04-24 13:47:05 +0000319 def test_setslice_trap(self):
320 # This test verifies that we correctly handle assigning self
321 # to a slice of self (the old Lambert Meertens trap).
322 b = bytes(range(256))
323 b[8:] = b
324 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
325
326 def test_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000327 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000328 for enc in ("utf8", "utf16"):
329 b = bytes(sample, enc)
Guido van Rossum4355a472007-05-04 05:00:04 +0000330 self.assertEqual(b, bytes(sample.encode(enc)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000331 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
332 b = bytes(sample, "latin1", "ignore")
333 self.assertEqual(b, bytes(sample[:-4]))
334
335 def test_decode(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000336 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000337 for enc in ("utf8", "utf16"):
338 b = bytes(sample, enc)
339 self.assertEqual(b.decode(enc), sample)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000340 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossumd624f182006-04-24 13:47:05 +0000341 b = bytes(sample, "latin1")
342 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
343 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
344
345 def test_from_buffer(self):
Guido van Rossum4355a472007-05-04 05:00:04 +0000346 sample = str8("Hello world\n\x80\x81\xfe\xff")
Guido van Rossumd624f182006-04-24 13:47:05 +0000347 buf = buffer(sample)
348 b = bytes(buf)
349 self.assertEqual(b, bytes(map(ord, sample)))
350
351 def test_to_str(self):
352 sample = "Hello world\n\x80\x81\xfe\xff"
353 b = bytes(sample)
354 self.assertEqual(str(b), sample)
355
356 def test_from_int(self):
357 b = bytes(0)
358 self.assertEqual(b, bytes())
359 b = bytes(10)
360 self.assertEqual(b, bytes([0]*10))
361 b = bytes(10000)
362 self.assertEqual(b, bytes([0]*10000))
363
364 def test_concat(self):
365 b1 = bytes("abc")
366 b2 = bytes("def")
367 self.assertEqual(b1 + b2, bytes("abcdef"))
Guido van Rossum4355a472007-05-04 05:00:04 +0000368 self.assertEqual(b1 + str8("def"), bytes("abcdef"))
369 self.assertEqual(str8("def") + b1, bytes("defabc"))
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000370 self.assertRaises(TypeError, lambda: b1 + "def")
371 self.assertRaises(TypeError, lambda: "abc" + b2)
Guido van Rossumd624f182006-04-24 13:47:05 +0000372
373 def test_repeat(self):
374 b = bytes("abc")
375 self.assertEqual(b * 3, bytes("abcabcabc"))
376 self.assertEqual(b * 0, bytes())
377 self.assertEqual(b * -1, bytes())
378 self.assertRaises(TypeError, lambda: b * 3.14)
379 self.assertRaises(TypeError, lambda: 3.14 * b)
380 self.assertRaises(MemoryError, lambda: b * sys.maxint)
Guido van Rossum13e57212006-04-27 22:54:26 +0000381
382 def test_repeat_1char(self):
Guido van Rossumd624f182006-04-24 13:47:05 +0000383 self.assertEqual(bytes('x')*100, bytes('x'*100))
384
Guido van Rossum13e57212006-04-27 22:54:26 +0000385 def test_iconcat(self):
386 b = bytes("abc")
387 b1 = b
388 b += bytes("def")
389 self.assertEqual(b, bytes("abcdef"))
390 self.assertEqual(b, b1)
391 self.failUnless(b is b1)
Guido van Rossum4355a472007-05-04 05:00:04 +0000392 b += str8("xyz")
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000393 self.assertEqual(b, b"abcdefxyz")
394 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000395 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000396 except TypeError:
397 pass
398 else:
399 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000400
401 def test_irepeat(self):
402 b = bytes("abc")
403 b1 = b
404 b *= 3
405 self.assertEqual(b, bytes("abcabcabc"))
406 self.assertEqual(b, b1)
407 self.failUnless(b is b1)
408
409 def test_irepeat_1char(self):
410 b = bytes("x")
411 b1 = b
412 b *= 100
413 self.assertEqual(b, bytes("x"*100))
414 self.assertEqual(b, b1)
415 self.failUnless(b is b1)
416
417 def test_contains(self):
418 b = bytes("abc")
419 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000420 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000421 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000422 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000423 self.assertRaises(ValueError, lambda: 300 in b)
424 self.assertRaises(ValueError, lambda: -1 in b)
425 self.assertRaises(TypeError, lambda: None in b)
426 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
427 self.assertRaises(TypeError, lambda: "a" in b)
428 self.failUnless(bytes("") in b)
429 self.failUnless(bytes("a") in b)
430 self.failUnless(bytes("b") in b)
431 self.failUnless(bytes("c") in b)
432 self.failUnless(bytes("ab") in b)
433 self.failUnless(bytes("bc") in b)
434 self.failUnless(bytes("abc") in b)
435 self.failIf(bytes("ac") in b)
436 self.failIf(bytes("d") in b)
437 self.failIf(bytes("dab") in b)
438 self.failIf(bytes("abd") in b)
439
Guido van Rossum20188312006-05-05 15:15:40 +0000440 def test_alloc(self):
441 b = bytes()
442 alloc = b.__alloc__()
443 self.assert_(alloc >= 0)
444 seq = [alloc]
445 for i in range(100):
446 b += bytes("x")
447 alloc = b.__alloc__()
448 self.assert_(alloc >= len(b))
449 if alloc not in seq:
450 seq.append(alloc)
Guido van Rossum08e8b7a2006-05-26 19:16:09 +0000451 #print seq
Guido van Rossum20188312006-05-05 15:15:40 +0000452
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000453 def test_fromhex(self):
454 self.assertRaises(TypeError, bytes.fromhex)
455 self.assertRaises(TypeError, bytes.fromhex, 1)
456 self.assertEquals(bytes.fromhex(''), bytes())
457 b = bytes([0x1a, 0x2b, 0x30])
458 self.assertEquals(bytes.fromhex('1a2B30'), b)
459 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
Guido van Rossum4355a472007-05-04 05:00:04 +0000460 self.assertEquals(bytes.fromhex(buffer(b'')), bytes())
461 self.assertEquals(bytes.fromhex(buffer(b'0000')), bytes([0, 0]))
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000462 self.assertRaises(ValueError, bytes.fromhex, 'a')
463 self.assertRaises(ValueError, bytes.fromhex, 'rt')
464 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
465 self.assertRaises(ValueError, bytes.fromhex, '\x00')
466 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
467
Guido van Rossum20188312006-05-05 15:15:40 +0000468 def test_join(self):
469 self.assertEqual(bytes.join([]), bytes())
470 self.assertEqual(bytes.join([bytes()]), bytes())
471 for part in [("abc",), ("a", "bc"), ("ab", "c"), ("a", "b", "c")]:
472 lst = map(bytes, part)
473 self.assertEqual(bytes.join(lst), bytes("abc"))
474 self.assertEqual(bytes.join(tuple(lst)), bytes("abc"))
475 self.assertEqual(bytes.join(iter(lst)), bytes("abc"))
476 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000477
478 def test_literal(self):
479 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000480 (b"Wonderful spam", "Wonderful spam"),
481 (br"Wonderful spam too", "Wonderful spam too"),
482 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
483 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000484 ]
485 for b, s in tests:
486 self.assertEqual(b, bytes(s, 'latin-1'))
487 for c in range(128, 256):
488 self.assertRaises(SyntaxError, eval,
489 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000490
Neal Norwitz6968b052007-02-27 19:02:19 +0000491 def test_extend(self):
492 orig = b'hello'
493 a = bytes(orig)
494 a.extend(a)
495 self.assertEqual(a, orig + orig)
496 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000497
Neal Norwitz6968b052007-02-27 19:02:19 +0000498 def test_remove(self):
499 b = b'hello'
500 b.remove(ord('l'))
501 self.assertEqual(b, b'helo')
502 b.remove(ord('l'))
503 self.assertEqual(b, b'heo')
504 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
505 self.assertRaises(ValueError, lambda: b.remove(400))
506 self.assertRaises(ValueError, lambda: b.remove('e'))
507 # remove first and last
508 b.remove(ord('o'))
509 b.remove(ord('h'))
510 self.assertEqual(b, b'e')
511
512 def test_pop(self):
513 b = b'world'
514 self.assertEqual(b.pop(), ord('d'))
515 self.assertEqual(b.pop(0), ord('w'))
516 self.assertEqual(b.pop(-2), ord('r'))
517 self.assertRaises(IndexError, lambda: b.pop(10))
518 self.assertRaises(OverflowError, lambda: bytes().pop())
519
520 def test_nosort(self):
521 self.assertRaises(AttributeError, lambda: bytes().sort())
522
523 def test_index(self):
524 b = b'parrot'
525 self.assertEqual(b.index('p'), 0)
526 self.assertEqual(b.index('rr'), 2)
527 self.assertEqual(b.index('t'), 5)
528 self.assertRaises(ValueError, lambda: b.index('w'))
529
530 def test_count(self):
531 b = b'mississippi'
532 self.assertEqual(b.count('i'), 4)
533 self.assertEqual(b.count('ss'), 2)
534 self.assertEqual(b.count('w'), 0)
535
536 def test_append(self):
537 b = b'hell'
538 b.append(ord('o'))
539 self.assertEqual(b, b'hello')
540 self.assertEqual(b.append(100), None)
541 b = bytes()
542 b.append(ord('A'))
543 self.assertEqual(len(b), 1)
544
545 def test_insert(self):
546 b = b'msssspp'
547 b.insert(1, ord('i'))
548 b.insert(4, ord('i'))
549 b.insert(-2, ord('i'))
550 b.insert(1000, ord('i'))
551 self.assertEqual(b, b'mississippi')
552
553 def test_startswith(self):
554 b = b'hello'
555 self.assertFalse(bytes().startswith("anything"))
556 self.assertTrue(b.startswith("hello"))
557 self.assertTrue(b.startswith("hel"))
558 self.assertTrue(b.startswith("h"))
559 self.assertFalse(b.startswith("hellow"))
560 self.assertFalse(b.startswith("ha"))
561
562 def test_endswith(self):
563 b = b'hello'
564 self.assertFalse(bytes().endswith("anything"))
565 self.assertTrue(b.endswith("hello"))
566 self.assertTrue(b.endswith("llo"))
567 self.assertTrue(b.endswith("o"))
568 self.assertFalse(b.endswith("whello"))
569 self.assertFalse(b.endswith("no"))
570
571 def test_find(self):
572 b = b'mississippi'
573 self.assertEqual(b.find('ss'), 2)
574 self.assertEqual(b.find('ss', 3), 5)
575 self.assertEqual(b.find('ss', 1, 7), 2)
576 self.assertEqual(b.find('ss', 1, 3), -1)
577 self.assertEqual(b.find('w'), -1)
578 self.assertEqual(b.find('mississippian'), -1)
579
580 def test_rfind(self):
581 b = b'mississippi'
582 self.assertEqual(b.rfind('ss'), 5)
583 self.assertEqual(b.rfind('ss', 3), 5)
584 self.assertEqual(b.rfind('ss', 0, 6), 2)
585 self.assertEqual(b.rfind('w'), -1)
586 self.assertEqual(b.rfind('mississippian'), -1)
587
588 def test_index(self):
589 b = b'world'
590 self.assertEqual(b.index('w'), 0)
591 self.assertEqual(b.index('orl'), 1)
592 self.assertRaises(ValueError, lambda: b.index('worm'))
593 self.assertRaises(ValueError, lambda: b.index('ldo'))
594
595 def test_rindex(self):
596 # XXX could be more rigorous
597 b = b'world'
598 self.assertEqual(b.rindex('w'), 0)
599 self.assertEqual(b.rindex('orl'), 1)
600 self.assertRaises(ValueError, lambda: b.rindex('worm'))
601 self.assertRaises(ValueError, lambda: b.rindex('ldo'))
602
603 def test_replace(self):
604 b = b'mississippi'
605 self.assertEqual(b.replace('i', 'a'), b'massassappa')
606 self.assertEqual(b.replace('ss', 'x'), b'mixixippi')
607
608 def test_translate(self):
609 b = b'hello'
610 rosetta = bytes(range(0, 256))
611 rosetta[ord('o')] = ord('e')
612 c = b.translate(rosetta, b'l')
613 self.assertEqual(b, b'hello')
614 self.assertEqual(c, b'hee')
615
616 def test_split(self):
617 b = b'mississippi'
618 self.assertEqual(b.split('i'), [b'm', b'ss', b'ss', b'pp', b''])
619 self.assertEqual(b.split('ss'), [b'mi', b'i', b'ippi'])
620 self.assertEqual(b.split('w'), [b])
621 # require an arg (no magic whitespace split)
622 self.assertRaises(TypeError, lambda: b.split())
623
624 def test_rsplit(self):
625 b = b'mississippi'
626 self.assertEqual(b.rsplit('i'), [b'm', b'ss', b'ss', b'pp', b''])
627 self.assertEqual(b.rsplit('ss'), [b'mi', b'i', b'ippi'])
628 self.assertEqual(b.rsplit('w'), [b])
629 # require an arg (no magic whitespace split)
630 self.assertRaises(TypeError, lambda: b.rsplit())
631
632 def test_partition(self):
633 b = b'mississippi'
634 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
635 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
636
637 def test_rpartition(self):
638 b = b'mississippi'
639 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
640 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
641
Guido van Rossum0ad08122007-04-11 04:37:43 +0000642 def test_pickling(self):
643 for pm in pickle, cPickle:
644 for proto in range(pm.HIGHEST_PROTOCOL):
645 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
646 ps = pm.dumps(b, proto)
647 q = pm.loads(ps)
648 self.assertEqual(b, q)
649
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000650 def test_strip(self):
651 b = b'mississippi'
652 self.assertEqual(b.strip(b'i'), b'mississipp')
653 self.assertEqual(b.strip(b'm'), b'ississippi')
654 self.assertEqual(b.strip(b'pi'), b'mississ')
655 self.assertEqual(b.strip(b'im'), b'ssissipp')
656 self.assertEqual(b.strip(b'pim'), b'ssiss')
657
658 def test_lstrip(self):
659 b = b'mississippi'
660 self.assertEqual(b.lstrip(b'i'), b'mississippi')
661 self.assertEqual(b.lstrip(b'm'), b'ississippi')
662 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
663 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
664 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
665
666 def test_rstrip(self):
667 b = b'mississippi'
668 self.assertEqual(b.rstrip(b'i'), b'mississipp')
669 self.assertEqual(b.rstrip(b'm'), b'mississippi')
670 self.assertEqual(b.rstrip(b'pi'), b'mississ')
671 self.assertEqual(b.rstrip(b'im'), b'mississipp')
672 self.assertEqual(b.rstrip(b'pim'), b'mississ')
673
Guido van Rossumd624f182006-04-24 13:47:05 +0000674 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000675 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000676 # __reversed__? (optimization)
677
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000678 # XXX More string methods? (Those that don't use character properties)
679
Neal Norwitz6968b052007-02-27 19:02:19 +0000680 # There are tests in string_tests.py that are more
681 # comprehensive for things like split, partition, etc.
682 # Unfortunately they are all bundled with tests that
683 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000684
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000685
Georg Brandlc7885542007-03-06 19:16:20 +0000686class BytesAsStringTest(test.string_tests.BaseTest):
687 type2test = bytes
688
689 def checkequal(self, result, object, methodname, *args):
690 object = bytes(object)
691 realresult = getattr(bytes, methodname)(object, *args)
692 self.assertEqual(
693 self.fixtype(result),
694 realresult
695 )
696
697 def checkraises(self, exc, object, methodname, *args):
698 object = bytes(object)
699 self.assertRaises(
700 exc,
701 getattr(bytes, methodname),
702 object,
703 *args
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000704 )
Georg Brandlc7885542007-03-06 19:16:20 +0000705
706 # Currently the bytes containment testing uses a single integer
707 # value. This may not be the final design, but until then the
708 # bytes section with in a bytes containment not valid
709 def test_contains(self):
710 pass
711 def test_find(self):
712 pass
713
714
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000715def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000716 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000717 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000718
719
720if __name__ == "__main__":
Guido van Rossum4355a472007-05-04 05:00:04 +0000721 ##test_main()
722 unittest.main()