blob: 112cb3251a19088684686f27b0c528dc81dca0e6 [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
Guido van Rossumd624f182006-04-24 13:47:05 +00007import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00008import unittest
9import test.test_support
Georg Brandlc7885542007-03-06 19:16:20 +000010import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000011import test.buffer_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'")
Guido van Rossum9c627722007-08-27 18:31:48 +000079 self.assertEqual(repr(b"abc"), "b'abc'")
80 self.assertEqual(repr(b"'"), "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
Guido van Rossume61fd5b2007-07-11 12:20:59 +000087 self.assertEqual(b1, b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000088 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):
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000106 self.assertEqual(b"abc" == str8(b"abc"), True)
107 self.assertEqual(b"ab" != str8(b"abc"), True)
108 self.assertEqual(b"ab" <= str8(b"abc"), True)
109 self.assertEqual(b"ab" < str8(b"abc"), True)
110 self.assertEqual(b"abc" >= str8(b"ab"), True)
111 self.assertEqual(b"abc" > str8(b"ab"), True)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000112
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000113 self.assertEqual(b"abc" != str8(b"abc"), False)
114 self.assertEqual(b"ab" == str8(b"abc"), False)
115 self.assertEqual(b"ab" > str8(b"abc"), False)
116 self.assertEqual(b"ab" >= str8(b"abc"), False)
117 self.assertEqual(b"abc" < str8(b"ab"), False)
118 self.assertEqual(b"abc" <= str8(b"ab"), False)
Guido van Rossum343e97f2007-04-09 00:43:24 +0000119
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000120 self.assertEqual(str8(b"abc") == b"abc", True)
121 self.assertEqual(str8(b"ab") != b"abc", True)
122 self.assertEqual(str8(b"ab") <= b"abc", True)
123 self.assertEqual(str8(b"ab") < b"abc", True)
124 self.assertEqual(str8(b"abc") >= b"ab", True)
125 self.assertEqual(str8(b"abc") > b"ab", True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000126
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000127 self.assertEqual(str8(b"abc") != b"abc", False)
128 self.assertEqual(str8(b"ab") == b"abc", False)
129 self.assertEqual(str8(b"ab") > b"abc", False)
130 self.assertEqual(str8(b"ab") >= b"abc", False)
131 self.assertEqual(str8(b"abc") < b"ab", False)
132 self.assertEqual(str8(b"abc") <= b"ab", False)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000133
Guido van Rossum1e35e762007-10-09 17:21:10 +0000134 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000135 # Test this for all expected byte orders and Unicode character sizes
Guido van Rossum1e35e762007-10-09 17:21:10 +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)
140 self.assertEqual(bytes() == str(), False)
141 self.assertEqual(bytes() != str(), True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000142
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000143 def test_nohash(self):
144 self.assertRaises(TypeError, hash, bytes())
145
146 def test_doc(self):
147 self.failUnless(bytes.__doc__ != None)
148 self.failUnless(bytes.__doc__.startswith("bytes("))
149
Guido van Rossumd624f182006-04-24 13:47:05 +0000150 def test_buffer_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000151 short_sample = b"Hello world\n"
152 sample = short_sample + b"x"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000153 tfn = tempfile.mktemp()
154 try:
155 # Prepare
156 with open(tfn, "wb") as f:
157 f.write(short_sample)
158 # Test readinto
159 with open(tfn, "rb") as f:
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000160 b = b"x"*20
Guido van Rossumd624f182006-04-24 13:47:05 +0000161 n = f.readinto(b)
162 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000163 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000164 # Test writing in binary mode
165 with open(tfn, "wb") as f:
166 f.write(b)
167 with open(tfn, "rb") as f:
168 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000169 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000170 finally:
171 try:
172 os.remove(tfn)
173 except os.error:
174 pass
175
176 def test_reversed(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000177 input = list(map(ord, "Hello"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000178 b = bytes(input)
179 output = list(reversed(b))
180 input.reverse()
181 self.assertEqual(output, input)
182
Neal Norwitz6968b052007-02-27 19:02:19 +0000183 def test_reverse(self):
184 b = b'hello'
185 self.assertEqual(b.reverse(), None)
186 self.assertEqual(b, b'olleh')
187 b = b'hello1' # test even number of items
188 b.reverse()
189 self.assertEqual(b, b'1olleh')
190 b = bytes()
191 b.reverse()
192 self.assertFalse(b)
193
Guido van Rossumd624f182006-04-24 13:47:05 +0000194 def test_getslice(self):
195 def by(s):
196 return bytes(map(ord, s))
197 b = by("Hello, world")
198
199 self.assertEqual(b[:5], by("Hello"))
200 self.assertEqual(b[1:5], by("ello"))
201 self.assertEqual(b[5:7], by(", "))
202 self.assertEqual(b[7:], by("world"))
203 self.assertEqual(b[7:12], by("world"))
204 self.assertEqual(b[7:100], by("world"))
205
206 self.assertEqual(b[:-7], by("Hello"))
207 self.assertEqual(b[-11:-7], by("ello"))
208 self.assertEqual(b[-7:-5], by(", "))
209 self.assertEqual(b[-5:], by("world"))
210 self.assertEqual(b[-5:12], by("world"))
211 self.assertEqual(b[-5:100], by("world"))
212 self.assertEqual(b[-100:5], by("Hello"))
213
Thomas Wouters376446d2006-12-19 08:30:14 +0000214 def test_extended_getslice(self):
215 # Test extended slicing by comparing with list slicing.
216 L = list(range(255))
217 b = bytes(L)
218 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
219 for start in indices:
220 for stop in indices:
221 # Skip step 0 (invalid)
222 for step in indices[1:]:
223 self.assertEqual(b[start:stop:step], bytes(L[start:stop:step]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000224
Guido van Rossumd624f182006-04-24 13:47:05 +0000225 def test_regexps(self):
226 def by(s):
227 return bytes(map(ord, s))
228 b = by("Hello, world")
229 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
230
231 def test_setitem(self):
232 b = bytes([1, 2, 3])
233 b[1] = 100
234 self.assertEqual(b, bytes([1, 100, 3]))
235 b[-1] = 200
236 self.assertEqual(b, bytes([1, 100, 200]))
237 class C:
238 def __init__(self, i=0):
239 self.i = i
240 def __index__(self):
241 return self.i
242 b[0] = C(10)
243 self.assertEqual(b, bytes([10, 100, 200]))
244 try:
245 b[3] = 0
246 self.fail("Didn't raise IndexError")
247 except IndexError:
248 pass
249 try:
250 b[-10] = 0
251 self.fail("Didn't raise IndexError")
252 except IndexError:
253 pass
254 try:
255 b[0] = 256
256 self.fail("Didn't raise ValueError")
257 except ValueError:
258 pass
259 try:
260 b[0] = C(-1)
261 self.fail("Didn't raise ValueError")
262 except ValueError:
263 pass
264 try:
265 b[0] = None
266 self.fail("Didn't raise TypeError")
267 except TypeError:
268 pass
269
270 def test_delitem(self):
271 b = bytes(range(10))
272 del b[0]
273 self.assertEqual(b, bytes(range(1, 10)))
274 del b[-1]
275 self.assertEqual(b, bytes(range(1, 9)))
276 del b[4]
277 self.assertEqual(b, bytes([1, 2, 3, 4, 6, 7, 8]))
278
279 def test_setslice(self):
280 b = bytes(range(10))
281 self.assertEqual(list(b), list(range(10)))
282
283 b[0:5] = bytes([1, 1, 1, 1, 1])
284 self.assertEqual(b, bytes([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
285
286 del b[0:-5]
287 self.assertEqual(b, bytes([5, 6, 7, 8, 9]))
288
289 b[0:0] = bytes([0, 1, 2, 3, 4])
290 self.assertEqual(b, bytes(range(10)))
291
292 b[-7:-3] = bytes([100, 101])
293 self.assertEqual(b, bytes([0, 1, 2, 100, 101, 7, 8, 9]))
294
295 b[3:5] = [3, 4, 5, 6]
296 self.assertEqual(b, bytes(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000297
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000298 b[3:0] = [42, 42, 42]
299 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 +0000300
Thomas Wouters376446d2006-12-19 08:30:14 +0000301 def test_extended_set_del_slice(self):
302 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
303 for start in indices:
304 for stop in indices:
305 # Skip invalid step 0
306 for step in indices[1:]:
307 L = list(range(255))
308 b = bytes(L)
309 # Make sure we have a slice of exactly the right length,
310 # but with different data.
311 data = L[start:stop:step]
312 data.reverse()
313 L[start:stop:step] = data
314 b[start:stop:step] = data
315 self.assertEquals(b, bytes(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000316
Thomas Wouters376446d2006-12-19 08:30:14 +0000317 del L[start:stop:step]
318 del b[start:stop:step]
319 self.assertEquals(b, bytes(L))
320
Guido van Rossumd624f182006-04-24 13:47:05 +0000321 def test_setslice_trap(self):
322 # This test verifies that we correctly handle assigning self
323 # to a slice of self (the old Lambert Meertens trap).
324 b = bytes(range(256))
325 b[8:] = b
326 self.assertEqual(b, bytes(list(range(8)) + list(range(256))))
327
328 def test_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000329 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000330 for enc in ("utf8", "utf16"):
331 b = bytes(sample, enc)
Guido van Rossum4355a472007-05-04 05:00:04 +0000332 self.assertEqual(b, bytes(sample.encode(enc)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000333 self.assertRaises(UnicodeEncodeError, bytes, sample, "latin1")
334 b = bytes(sample, "latin1", "ignore")
Guido van Rossum9c627722007-08-27 18:31:48 +0000335 self.assertEqual(b, bytes(sample[:-4], "utf-8"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000336
337 def test_decode(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000338 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000339 for enc in ("utf8", "utf16"):
340 b = bytes(sample, enc)
341 self.assertEqual(b.decode(enc), sample)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000342 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossumd624f182006-04-24 13:47:05 +0000343 b = bytes(sample, "latin1")
344 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
345 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
346
347 def test_from_buffer(self):
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000348 sample = str8(b"Hello world\n\x80\x81\xfe\xff")
Guido van Rossumbae07c92007-10-08 02:46:15 +0000349 buf = memoryview(sample)
Guido van Rossumd624f182006-04-24 13:47:05 +0000350 b = bytes(buf)
Guido van Rossum75a902d2007-10-19 22:06:24 +0000351 self.assertEqual(b, bytes(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000352
353 def test_to_str(self):
354 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossum9c627722007-08-27 18:31:48 +0000355 b = bytes(sample, "utf-8")
Guido van Rossumd624f182006-04-24 13:47:05 +0000356 self.assertEqual(str(b), sample)
357
358 def test_from_int(self):
359 b = bytes(0)
360 self.assertEqual(b, bytes())
361 b = bytes(10)
362 self.assertEqual(b, bytes([0]*10))
363 b = bytes(10000)
364 self.assertEqual(b, bytes([0]*10000))
365
366 def test_concat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000367 b1 = b"abc"
368 b2 = b"def"
369 self.assertEqual(b1 + b2, b"abcdef")
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000370 self.assertEqual(b1 + str8(b"def"), b"abcdef")
371 self.assertEqual(str8(b"def") + b1, b"defabc")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000372 self.assertRaises(TypeError, lambda: b1 + "def")
373 self.assertRaises(TypeError, lambda: "abc" + b2)
Guido van Rossumd624f182006-04-24 13:47:05 +0000374
375 def test_repeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000376 b = b"abc"
377 self.assertEqual(b * 3, b"abcabcabc")
Guido van Rossumd624f182006-04-24 13:47:05 +0000378 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 Rossum9c627722007-08-27 18:31:48 +0000385 self.assertEqual(b'x'*100, bytes([ord('x')]*100))
Guido van Rossumd624f182006-04-24 13:47:05 +0000386
Guido van Rossum13e57212006-04-27 22:54:26 +0000387 def test_iconcat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000388 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000389 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000390 b += b"def"
391 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000392 self.assertEqual(b, b1)
393 self.failUnless(b is b1)
Georg Brandlbd1c68c2007-10-24 18:55:37 +0000394 b += str8(b"xyz")
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000395 self.assertEqual(b, b"abcdefxyz")
396 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000397 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000398 except TypeError:
399 pass
400 else:
401 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000402
403 def test_irepeat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000404 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000405 b1 = b
406 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000407 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000408 self.assertEqual(b, b1)
409 self.failUnless(b is b1)
410
411 def test_irepeat_1char(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000412 b = b"x"
Guido van Rossum13e57212006-04-27 22:54:26 +0000413 b1 = b
414 b *= 100
Guido van Rossum9c627722007-08-27 18:31:48 +0000415 self.assertEqual(b, bytes([ord("x")]*100))
Guido van Rossum13e57212006-04-27 22:54:26 +0000416 self.assertEqual(b, b1)
417 self.failUnless(b is b1)
418
419 def test_contains(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000420 b = b"abc"
Guido van Rossum13e57212006-04-27 22:54:26 +0000421 self.failUnless(ord('a') in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000422 self.failUnless(int(ord('a')) in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000423 self.failIf(200 in b)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 self.failIf(200 in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000425 self.assertRaises(ValueError, lambda: 300 in b)
426 self.assertRaises(ValueError, lambda: -1 in b)
427 self.assertRaises(TypeError, lambda: None in b)
428 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
429 self.assertRaises(TypeError, lambda: "a" in b)
Guido van Rossum9c627722007-08-27 18:31:48 +0000430 self.failUnless(b"" in b)
431 self.failUnless(b"a" in b)
432 self.failUnless(b"b" in b)
433 self.failUnless(b"c" in b)
434 self.failUnless(b"ab" in b)
435 self.failUnless(b"bc" in b)
436 self.failUnless(b"abc" in b)
437 self.failIf(b"ac" in b)
438 self.failIf(b"d" in b)
439 self.failIf(b"dab" in b)
440 self.failIf(b"abd" in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000441
Guido van Rossum20188312006-05-05 15:15:40 +0000442 def test_alloc(self):
443 b = bytes()
444 alloc = b.__alloc__()
445 self.assert_(alloc >= 0)
446 seq = [alloc]
447 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000448 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000449 alloc = b.__alloc__()
450 self.assert_(alloc >= len(b))
451 if alloc not in seq:
452 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000453
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000454 def test_fromhex(self):
455 self.assertRaises(TypeError, bytes.fromhex)
456 self.assertRaises(TypeError, bytes.fromhex, 1)
Guido van Rossumae404e22007-10-26 21:46:44 +0000457 self.assertEquals(bytes.fromhex(''), bytes())
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000458 b = bytes([0x1a, 0x2b, 0x30])
Guido van Rossumae404e22007-10-26 21:46:44 +0000459 self.assertEquals(bytes.fromhex('1a2B30'), b)
460 self.assertEquals(bytes.fromhex(' 1A 2B 30 '), b)
461 self.assertEquals(bytes.fromhex('0000'), b'\0\0')
462 self.assertRaises(TypeError, bytes.fromhex, b'1B')
463 self.assertRaises(ValueError, bytes.fromhex, 'a')
464 self.assertRaises(ValueError, bytes.fromhex, 'rt')
465 self.assertRaises(ValueError, bytes.fromhex, '1a b cd')
466 self.assertRaises(ValueError, bytes.fromhex, '\x00')
467 self.assertRaises(ValueError, bytes.fromhex, '12 \x00 34')
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000468
Guido van Rossum20188312006-05-05 15:15:40 +0000469 def test_join(self):
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000470 self.assertEqual(b"".join([]), bytes())
471 self.assertEqual(b"".join([bytes()]), bytes())
Guido van Rossum9c627722007-08-27 18:31:48 +0000472 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
473 self.assertEqual(b"".join(lst), b"abc")
474 self.assertEqual(b"".join(tuple(lst)), b"abc")
475 self.assertEqual(b"".join(iter(lst)), b"abc")
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000476 self.assertEqual(b".".join([b"ab", b"cd"]), b"ab.cd")
Guido van Rossum20188312006-05-05 15:15:40 +0000477 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000478
479 def test_literal(self):
480 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000481 (b"Wonderful spam", "Wonderful spam"),
482 (br"Wonderful spam too", "Wonderful spam too"),
483 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
484 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000485 ]
486 for b, s in tests:
487 self.assertEqual(b, bytes(s, 'latin-1'))
488 for c in range(128, 256):
489 self.assertRaises(SyntaxError, eval,
490 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000491
Neal Norwitz6968b052007-02-27 19:02:19 +0000492 def test_extend(self):
493 orig = b'hello'
494 a = bytes(orig)
495 a.extend(a)
496 self.assertEqual(a, orig + orig)
497 self.assertEqual(a[5:], orig)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000498
Neal Norwitz6968b052007-02-27 19:02:19 +0000499 def test_remove(self):
500 b = b'hello'
501 b.remove(ord('l'))
502 self.assertEqual(b, b'helo')
503 b.remove(ord('l'))
504 self.assertEqual(b, b'heo')
505 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
506 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000507 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000508 # remove first and last
509 b.remove(ord('o'))
510 b.remove(ord('h'))
511 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000512 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000513
514 def test_pop(self):
515 b = b'world'
516 self.assertEqual(b.pop(), ord('d'))
517 self.assertEqual(b.pop(0), ord('w'))
518 self.assertEqual(b.pop(-2), ord('r'))
519 self.assertRaises(IndexError, lambda: b.pop(10))
520 self.assertRaises(OverflowError, lambda: bytes().pop())
521
522 def test_nosort(self):
523 self.assertRaises(AttributeError, lambda: bytes().sort())
524
525 def test_index(self):
526 b = b'parrot'
527 self.assertEqual(b.index('p'), 0)
528 self.assertEqual(b.index('rr'), 2)
529 self.assertEqual(b.index('t'), 5)
530 self.assertRaises(ValueError, lambda: b.index('w'))
531
532 def test_count(self):
533 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000534 self.assertEqual(b.count(b'i'), 4)
535 self.assertEqual(b.count(b'ss'), 2)
536 self.assertEqual(b.count(b'w'), 0)
Neal Norwitz6968b052007-02-27 19:02:19 +0000537
538 def test_append(self):
539 b = b'hell'
540 b.append(ord('o'))
541 self.assertEqual(b, b'hello')
542 self.assertEqual(b.append(100), None)
543 b = bytes()
544 b.append(ord('A'))
545 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000546 self.assertRaises(TypeError, lambda: b.append(b'o'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000547
548 def test_insert(self):
549 b = b'msssspp'
550 b.insert(1, ord('i'))
551 b.insert(4, ord('i'))
552 b.insert(-2, ord('i'))
553 b.insert(1000, ord('i'))
554 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000555 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000556
557 def test_startswith(self):
558 b = b'hello'
Guido van Rossum09549f42007-08-27 20:40:10 +0000559 self.assertFalse(bytes().startswith(b"anything"))
560 self.assertTrue(b.startswith(b"hello"))
561 self.assertTrue(b.startswith(b"hel"))
562 self.assertTrue(b.startswith(b"h"))
563 self.assertFalse(b.startswith(b"hellow"))
564 self.assertFalse(b.startswith(b"ha"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000565
566 def test_endswith(self):
567 b = b'hello'
Guido van Rossum09549f42007-08-27 20:40:10 +0000568 self.assertFalse(bytes().endswith(b"anything"))
569 self.assertTrue(b.endswith(b"hello"))
570 self.assertTrue(b.endswith(b"llo"))
571 self.assertTrue(b.endswith(b"o"))
572 self.assertFalse(b.endswith(b"whello"))
573 self.assertFalse(b.endswith(b"no"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000574
575 def test_find(self):
576 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000577 self.assertEqual(b.find(b'ss'), 2)
578 self.assertEqual(b.find(b'ss', 3), 5)
579 self.assertEqual(b.find(b'ss', 1, 7), 2)
580 self.assertEqual(b.find(b'ss', 1, 3), -1)
581 self.assertEqual(b.find(b'w'), -1)
582 self.assertEqual(b.find(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000583
584 def test_rfind(self):
585 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000586 self.assertEqual(b.rfind(b'ss'), 5)
587 self.assertEqual(b.rfind(b'ss', 3), 5)
588 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
589 self.assertEqual(b.rfind(b'w'), -1)
590 self.assertEqual(b.rfind(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000591
592 def test_index(self):
593 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000594 self.assertEqual(b.index(b'w'), 0)
595 self.assertEqual(b.index(b'orl'), 1)
596 self.assertRaises(ValueError, b.index, b'worm')
597 self.assertRaises(ValueError, b.index, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000598
599 def test_rindex(self):
600 # XXX could be more rigorous
601 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000602 self.assertEqual(b.rindex(b'w'), 0)
603 self.assertEqual(b.rindex(b'orl'), 1)
604 self.assertRaises(ValueError, b.rindex, b'worm')
605 self.assertRaises(ValueError, b.rindex, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000606
607 def test_replace(self):
608 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000609 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
610 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
Neal Norwitz6968b052007-02-27 19:02:19 +0000611
612 def test_translate(self):
613 b = b'hello'
614 rosetta = bytes(range(0, 256))
615 rosetta[ord('o')] = ord('e')
616 c = b.translate(rosetta, b'l')
617 self.assertEqual(b, b'hello')
618 self.assertEqual(c, b'hee')
619
620 def test_split(self):
621 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000622 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
623 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
624 self.assertEqual(b.split(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000625
626 def test_split_whitespace(self):
627 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
628 b'arf\fbarf', b'arf\vbarf'):
629 self.assertEqual(b.split(), [b'arf', b'barf'])
630 self.assertEqual(b.split(None), [b'arf', b'barf'])
631 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
632 self.assertEqual(b' a bb c '.split(None, 0), [b'a bb c '])
633 self.assertEqual(b' a bb c '.split(None, 1), [b'a', b'bb c '])
634 self.assertEqual(b' a bb c '.split(None, 2), [b'a', b'bb', b'c '])
635 self.assertEqual(b' a bb c '.split(None, 3), [b'a', b'bb', b'c'])
636
637 def test_split_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000638 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000639
640 def test_split_string_error(self):
641 self.assertRaises(TypeError, b'a b'.split, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000642
643 def test_rsplit(self):
644 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000645 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
646 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
647 self.assertEqual(b.rsplit(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000648
649 def test_rsplit_whitespace(self):
650 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
651 b'arf\fbarf', b'arf\vbarf'):
652 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
653 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
654 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
655 self.assertEqual(b' a bb c '.rsplit(None, 0), [b' a bb c'])
656 self.assertEqual(b' a bb c '.rsplit(None, 1), [b' a bb', b'c'])
657 self.assertEqual(b' a bb c '.rsplit(None,2), [b' a', b'bb', b'c'])
658 self.assertEqual(b' a bb c '.rsplit(None, 3), [b'a', b'bb', b'c'])
659
660 def test_rplit_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000661 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000662
663 def test_rplit_string_error(self):
664 self.assertRaises(TypeError, b'a b'.rsplit, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000665
666 def test_partition(self):
667 b = b'mississippi'
668 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
669 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
670
671 def test_rpartition(self):
672 b = b'mississippi'
673 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
674 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
675
Guido van Rossum0ad08122007-04-11 04:37:43 +0000676 def test_pickling(self):
Guido van Rossum99603b02007-07-20 00:22:32 +0000677 for proto in range(pickle.HIGHEST_PROTOCOL):
678 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
679 ps = pickle.dumps(b, proto)
680 q = pickle.loads(ps)
681 self.assertEqual(b, q)
Guido van Rossum0ad08122007-04-11 04:37:43 +0000682
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000683 def test_strip(self):
684 b = b'mississippi'
685 self.assertEqual(b.strip(b'i'), b'mississipp')
686 self.assertEqual(b.strip(b'm'), b'ississippi')
687 self.assertEqual(b.strip(b'pi'), b'mississ')
688 self.assertEqual(b.strip(b'im'), b'ssissipp')
689 self.assertEqual(b.strip(b'pim'), b'ssiss')
Guido van Rossumeb29e9a2007-08-08 21:55:33 +0000690 self.assertEqual(b.strip(b), b'')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000691
692 def test_lstrip(self):
693 b = b'mississippi'
694 self.assertEqual(b.lstrip(b'i'), b'mississippi')
695 self.assertEqual(b.lstrip(b'm'), b'ississippi')
696 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
697 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
698 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
699
700 def test_rstrip(self):
701 b = b'mississippi'
702 self.assertEqual(b.rstrip(b'i'), b'mississipp')
703 self.assertEqual(b.rstrip(b'm'), b'mississippi')
704 self.assertEqual(b.rstrip(b'pi'), b'mississ')
705 self.assertEqual(b.rstrip(b'im'), b'mississipp')
706 self.assertEqual(b.rstrip(b'pim'), b'mississ')
707
Guido van Rossum8f950672007-09-10 16:53:45 +0000708 def test_strip_whitespace(self):
709 b = b' \t\n\r\f\vabc \t\n\r\f\v'
710 self.assertEqual(b.strip(), b'abc')
711 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
712 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
713
714 def test_strip_buffer(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000715 self.assertEqual(b'abc'.strip(memoryview(b'ac')), b'b')
716 self.assertEqual(b'abc'.lstrip(memoryview(b'ac')), b'bc')
717 self.assertEqual(b'abc'.rstrip(memoryview(b'ac')), b'ab')
Guido van Rossum8f950672007-09-10 16:53:45 +0000718
719 def test_strip_string_error(self):
720 self.assertRaises(TypeError, b'abc'.strip, 'b')
721 self.assertRaises(TypeError, b'abc'.lstrip, 'b')
722 self.assertRaises(TypeError, b'abc'.rstrip, 'b')
723
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000724 def test_ord(self):
725 b = b'\0A\x7f\x80\xff'
726 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
727 [0, 65, 127, 128, 255])
728
Guido van Rossumd624f182006-04-24 13:47:05 +0000729 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000730 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000731 # __reversed__? (optimization)
732
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000733 # XXX More string methods? (Those that don't use character properties)
734
Neal Norwitz6968b052007-02-27 19:02:19 +0000735 # There are tests in string_tests.py that are more
736 # comprehensive for things like split, partition, etc.
737 # Unfortunately they are all bundled with tests that
738 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000739
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000740 # I've started porting some of those into buffer_tests.py, we should port
741 # the rest that make sense (the code can be cleaned up to use modern
742 # unittest methods at the same time).
743
744class BufferPEP3137Test(unittest.TestCase,
745 test.buffer_tests.MixinBytesBufferCommonTests):
746 def marshal(self, x):
747 return bytes(x)
748 # TODO this should become:
749 #return buffer(x)
750 # once the bytes -> buffer and str8 -> bytes rename happens
751
752 def test_returns_new_copy(self):
753 val = self.marshal(b'1234')
754 # On immutable types these MAY return a reference to themselves
755 # but on mutable types like buffer they MUST return a new copy.
756 for methname in ('zfill', 'rjust', 'ljust', 'center'):
757 method = getattr(val, methname)
758 newval = method(3)
759 self.assertEqual(val, newval)
760 self.assertTrue(val is not newval,
761 methname+' returned self on a mutable object')
762
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000763
Georg Brandlc7885542007-03-06 19:16:20 +0000764class BytesAsStringTest(test.string_tests.BaseTest):
765 type2test = bytes
766
Guido van Rossum9c627722007-08-27 18:31:48 +0000767 def fixtype(self, obj):
768 if isinstance(obj, str):
769 return obj.encode("utf-8")
770 return super().fixtype(obj)
771
Georg Brandlc7885542007-03-06 19:16:20 +0000772 # Currently the bytes containment testing uses a single integer
773 # value. This may not be the final design, but until then the
774 # bytes section with in a bytes containment not valid
775 def test_contains(self):
776 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000777 def test_expandtabs(self):
778 pass
779 def test_upper(self):
780 pass
781 def test_lower(self):
782 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000783
784
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000785def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000786 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000787 test.test_support.run_unittest(BytesAsStringTest)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000788 test.test_support.run_unittest(BufferPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000789
790if __name__ == "__main__":
Guido van Rossum4355a472007-05-04 05:00:04 +0000791 ##test_main()
792 unittest.main()