blob: 40082c34306fd99a0cd5c9b12df397660997b8c6 [file] [log] [blame]
Guido van Rossum254348e2007-11-21 19:29:53 +00001"""Unit tests for the bytes and bytearray types.
Guido van Rossum98297ee2007-11-06 21:34:58 +00002
3XXX This is a mess. Common tests should be moved to buffer_tests.py,
4which itself ought to be unified with string_tests.py (and the latter
5should be modernized).
6"""
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00007
Guido van Rossumd624f182006-04-24 13:47:05 +00008import os
9import re
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000010import sys
Guido van Rossuma6c04be2007-11-03 00:24:24 +000011import copy
Guido van Rossum0ad08122007-04-11 04:37:43 +000012import pickle
Guido van Rossumd624f182006-04-24 13:47:05 +000013import tempfile
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000014import unittest
Guido van Rossum98297ee2007-11-06 21:34:58 +000015import warnings
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000016import test.test_support
Georg Brandlc7885542007-03-06 19:16:20 +000017import test.string_tests
Gregory P. Smith60d241f2007-10-16 06:31:30 +000018import test.buffer_tests
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000019
20
21class BytesTest(unittest.TestCase):
22
Guido van Rossum98297ee2007-11-06 21:34:58 +000023 def setUp(self):
24 self.warning_filters = warnings.filters[:]
25
26 def tearDown(self):
27 warnings.filters = self.warning_filters
28
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000029 def test_basics(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000030 b = bytearray()
31 self.assertEqual(type(b), bytearray)
32 self.assertEqual(b.__class__, bytearray)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000033
34 def test_empty_sequence(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000035 b = bytearray()
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000036 self.assertEqual(len(b), 0)
37 self.assertRaises(IndexError, lambda: b[0])
38 self.assertRaises(IndexError, lambda: b[1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000039 self.assertRaises(IndexError, lambda: b[sys.maxsize])
40 self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000041 self.assertRaises(IndexError, lambda: b[10**100])
42 self.assertRaises(IndexError, lambda: b[-1])
43 self.assertRaises(IndexError, lambda: b[-2])
Christian Heimesa37d4c62007-12-04 23:02:19 +000044 self.assertRaises(IndexError, lambda: b[-sys.maxsize])
45 self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
46 self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000047 self.assertRaises(IndexError, lambda: b[-10**100])
48
49 def test_from_list(self):
50 ints = list(range(256))
Guido van Rossum254348e2007-11-21 19:29:53 +000051 b = bytearray(i for i in ints)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000052 self.assertEqual(len(b), 256)
53 self.assertEqual(list(b), ints)
54
55 def test_from_index(self):
56 class C:
57 def __init__(self, i=0):
58 self.i = i
59 def __index__(self):
60 return self.i
Guido van Rossum254348e2007-11-21 19:29:53 +000061 b = bytearray([C(), C(1), C(254), C(255)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000062 self.assertEqual(list(b), [0, 1, 254, 255])
Guido van Rossum254348e2007-11-21 19:29:53 +000063 self.assertRaises(ValueError, bytearray, [C(-1)])
64 self.assertRaises(ValueError, bytearray, [C(256)])
Guido van Rossum98297ee2007-11-06 21:34:58 +000065
66 def test_from_ssize(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000067 self.assertEqual(bytearray(0), b'')
68 self.assertEqual(bytearray(1), b'\x00')
69 self.assertEqual(bytearray(5), b'\x00\x00\x00\x00\x00')
70 self.assertRaises(ValueError, bytearray, -1)
Guido van Rossum98297ee2007-11-06 21:34:58 +000071
Guido van Rossum254348e2007-11-21 19:29:53 +000072 self.assertEqual(bytearray('0', 'ascii'), b'0')
73 self.assertEqual(bytearray(b'0'), b'0')
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000074
75 def test_constructor_type_errors(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000076 self.assertRaises(TypeError, bytearray, 0.0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000077 class C:
78 pass
Guido van Rossum254348e2007-11-21 19:29:53 +000079 self.assertRaises(TypeError, bytearray, ["0"])
80 self.assertRaises(TypeError, bytearray, [0.0])
81 self.assertRaises(TypeError, bytearray, [None])
82 self.assertRaises(TypeError, bytearray, [C()])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000083
84 def test_constructor_value_errors(self):
Guido van Rossum254348e2007-11-21 19:29:53 +000085 self.assertRaises(ValueError, bytearray, [-1])
Christian Heimesa37d4c62007-12-04 23:02:19 +000086 self.assertRaises(ValueError, bytearray, [-sys.maxsize])
87 self.assertRaises(ValueError, bytearray, [-sys.maxsize-1])
88 self.assertRaises(ValueError, bytearray, [-sys.maxsize-2])
Guido van Rossum254348e2007-11-21 19:29:53 +000089 self.assertRaises(ValueError, bytearray, [-10**100])
90 self.assertRaises(ValueError, bytearray, [256])
91 self.assertRaises(ValueError, bytearray, [257])
Christian Heimesa37d4c62007-12-04 23:02:19 +000092 self.assertRaises(ValueError, bytearray, [sys.maxsize])
93 self.assertRaises(ValueError, bytearray, [sys.maxsize+1])
Guido van Rossum254348e2007-11-21 19:29:53 +000094 self.assertRaises(ValueError, bytearray, [10**100])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000095
Guido van Rossum98297ee2007-11-06 21:34:58 +000096 def test_repr_str(self):
97 warnings.simplefilter('ignore', BytesWarning)
98 for f in str, repr:
Guido van Rossum254348e2007-11-21 19:29:53 +000099 self.assertEqual(f(bytearray()), "bytearray(b'')")
100 self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
101 self.assertEqual(f(bytearray([0, 1, 254, 255])),
102 "bytearray(b'\\x00\\x01\\xfe\\xff')")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000103 self.assertEqual(f(b"abc"), "b'abc'")
104 self.assertEqual(f(b"'"), '''b"'"''')
105 self.assertEqual(f(b"'\""), r"""b'\'"'""")
106
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000107
108 def test_compare(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000109 b1 = bytearray([1, 2, 3])
110 b2 = bytearray([1, 2, 3])
111 b3 = bytearray([1, 3])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000112
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000113 self.assertEqual(b1, b2)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000114 self.failUnless(b2 != b3)
115 self.failUnless(b1 <= b2)
116 self.failUnless(b1 <= b3)
117 self.failUnless(b1 < b3)
118 self.failUnless(b1 >= b2)
119 self.failUnless(b3 >= b2)
120 self.failUnless(b3 > b2)
121
122 self.failIf(b1 != b2)
123 self.failIf(b2 == b3)
124 self.failIf(b1 > b2)
125 self.failIf(b1 > b3)
126 self.failIf(b1 >= b3)
127 self.failIf(b1 < b2)
128 self.failIf(b3 < b2)
129 self.failIf(b3 <= b2)
130
Guido van Rossum254348e2007-11-21 19:29:53 +0000131 def test_compare_bytes_to_bytearray(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000132 self.assertEqual(b"abc" == bytes(b"abc"), True)
133 self.assertEqual(b"ab" != bytes(b"abc"), True)
134 self.assertEqual(b"ab" <= bytes(b"abc"), True)
135 self.assertEqual(b"ab" < bytes(b"abc"), True)
136 self.assertEqual(b"abc" >= bytes(b"ab"), True)
137 self.assertEqual(b"abc" > bytes(b"ab"), True)
138
139 self.assertEqual(b"abc" != bytes(b"abc"), False)
140 self.assertEqual(b"ab" == bytes(b"abc"), False)
141 self.assertEqual(b"ab" > bytes(b"abc"), False)
142 self.assertEqual(b"ab" >= bytes(b"abc"), False)
143 self.assertEqual(b"abc" < bytes(b"ab"), False)
144 self.assertEqual(b"abc" <= bytes(b"ab"), False)
145
146 self.assertEqual(bytes(b"abc") == b"abc", True)
147 self.assertEqual(bytes(b"ab") != b"abc", True)
148 self.assertEqual(bytes(b"ab") <= b"abc", True)
149 self.assertEqual(bytes(b"ab") < b"abc", True)
150 self.assertEqual(bytes(b"abc") >= b"ab", True)
151 self.assertEqual(bytes(b"abc") > b"ab", True)
152
153 self.assertEqual(bytes(b"abc") != b"abc", False)
154 self.assertEqual(bytes(b"ab") == b"abc", False)
155 self.assertEqual(bytes(b"ab") > b"abc", False)
156 self.assertEqual(bytes(b"ab") >= b"abc", False)
157 self.assertEqual(bytes(b"abc") < b"ab", False)
158 self.assertEqual(bytes(b"abc") <= b"ab", False)
159
Guido van Rossum343e97f2007-04-09 00:43:24 +0000160 def test_compare_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000161 warnings.simplefilter('ignore', BytesWarning)
Guido van Rossum1e35e762007-10-09 17:21:10 +0000162 # Byte comparisons with unicode should always fail!
Guido van Rossumebea9be2007-04-09 00:49:13 +0000163 # Test this for all expected byte orders and Unicode character sizes
Guido van Rossum1e35e762007-10-09 17:21:10 +0000164 self.assertEqual(b"\0a\0b\0c" == "abc", False)
165 self.assertEqual(b"\0\0\0a\0\0\0b\0\0\0c" == "abc", False)
166 self.assertEqual(b"a\0b\0c\0" == "abc", False)
167 self.assertEqual(b"a\0\0\0b\0\0\0c\0\0\0" == "abc", False)
Guido van Rossum254348e2007-11-21 19:29:53 +0000168 self.assertEqual(bytearray() == str(), False)
169 self.assertEqual(bytearray() != str(), True)
Guido van Rossumebea9be2007-04-09 00:49:13 +0000170
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000171 def test_nohash(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000172 self.assertRaises(TypeError, hash, bytearray())
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000173
174 def test_doc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000175 self.failUnless(bytearray.__doc__ != None)
176 self.failUnless(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000177 self.failUnless(bytes.__doc__ != None)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000178 self.failUnless(bytes.__doc__.startswith("bytes("), bytes.__doc__)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000179
Guido van Rossum254348e2007-11-21 19:29:53 +0000180 def test_bytearray_api(self):
Guido van Rossum75d6f1a2007-05-24 17:52:00 +0000181 short_sample = b"Hello world\n"
Guido van Rossum98297ee2007-11-06 21:34:58 +0000182 sample = short_sample + b"\0"*(20 - len(short_sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000183 tfn = tempfile.mktemp()
184 try:
185 # Prepare
186 with open(tfn, "wb") as f:
187 f.write(short_sample)
188 # Test readinto
189 with open(tfn, "rb") as f:
Guido van Rossum254348e2007-11-21 19:29:53 +0000190 b = bytearray(20)
Guido van Rossumd624f182006-04-24 13:47:05 +0000191 n = f.readinto(b)
192 self.assertEqual(n, len(short_sample))
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000193 self.assertEqual(list(b), list(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000194 # Test writing in binary mode
195 with open(tfn, "wb") as f:
196 f.write(b)
197 with open(tfn, "rb") as f:
198 self.assertEqual(f.read(), sample)
Guido van Rossum13633bb2007-04-13 18:42:35 +0000199 # Text mode is ambiguous; don't test
Guido van Rossumd624f182006-04-24 13:47:05 +0000200 finally:
201 try:
202 os.remove(tfn)
203 except os.error:
204 pass
205
206 def test_reversed(self):
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000207 input = list(map(ord, "Hello"))
Guido van Rossum254348e2007-11-21 19:29:53 +0000208 b = bytearray(input)
Guido van Rossumd624f182006-04-24 13:47:05 +0000209 output = list(reversed(b))
210 input.reverse()
211 self.assertEqual(output, input)
212
Neal Norwitz6968b052007-02-27 19:02:19 +0000213 def test_reverse(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000214 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000215 self.assertEqual(b.reverse(), None)
216 self.assertEqual(b, b'olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000217 b = bytearray(b'hello1') # test even number of items
Neal Norwitz6968b052007-02-27 19:02:19 +0000218 b.reverse()
219 self.assertEqual(b, b'1olleh')
Guido van Rossum254348e2007-11-21 19:29:53 +0000220 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000221 b.reverse()
222 self.assertFalse(b)
223
Guido van Rossumd624f182006-04-24 13:47:05 +0000224 def test_getslice(self):
225 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000226 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000227 b = by("Hello, world")
228
229 self.assertEqual(b[:5], by("Hello"))
230 self.assertEqual(b[1:5], by("ello"))
231 self.assertEqual(b[5:7], by(", "))
232 self.assertEqual(b[7:], by("world"))
233 self.assertEqual(b[7:12], by("world"))
234 self.assertEqual(b[7:100], by("world"))
235
236 self.assertEqual(b[:-7], by("Hello"))
237 self.assertEqual(b[-11:-7], by("ello"))
238 self.assertEqual(b[-7:-5], by(", "))
239 self.assertEqual(b[-5:], by("world"))
240 self.assertEqual(b[-5:12], by("world"))
241 self.assertEqual(b[-5:100], by("world"))
242 self.assertEqual(b[-100:5], by("Hello"))
243
Thomas Wouters376446d2006-12-19 08:30:14 +0000244 def test_extended_getslice(self):
245 # Test extended slicing by comparing with list slicing.
246 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000247 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000248 indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
249 for start in indices:
250 for stop in indices:
251 # Skip step 0 (invalid)
252 for step in indices[1:]:
Guido van Rossum254348e2007-11-21 19:29:53 +0000253 self.assertEqual(b[start:stop:step], bytearray(L[start:stop:step]))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000254
Guido van Rossumd624f182006-04-24 13:47:05 +0000255 def test_regexps(self):
256 def by(s):
Guido van Rossum254348e2007-11-21 19:29:53 +0000257 return bytearray(map(ord, s))
Guido van Rossumd624f182006-04-24 13:47:05 +0000258 b = by("Hello, world")
259 self.assertEqual(re.findall(r"\w+", b), [by("Hello"), by("world")])
260
261 def test_setitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000262 b = bytearray([1, 2, 3])
Guido van Rossumd624f182006-04-24 13:47:05 +0000263 b[1] = 100
Guido van Rossum254348e2007-11-21 19:29:53 +0000264 self.assertEqual(b, bytearray([1, 100, 3]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000265 b[-1] = 200
Guido van Rossum254348e2007-11-21 19:29:53 +0000266 self.assertEqual(b, bytearray([1, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000267 class C:
268 def __init__(self, i=0):
269 self.i = i
270 def __index__(self):
271 return self.i
272 b[0] = C(10)
Guido van Rossum254348e2007-11-21 19:29:53 +0000273 self.assertEqual(b, bytearray([10, 100, 200]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000274 try:
275 b[3] = 0
276 self.fail("Didn't raise IndexError")
277 except IndexError:
278 pass
279 try:
280 b[-10] = 0
281 self.fail("Didn't raise IndexError")
282 except IndexError:
283 pass
284 try:
285 b[0] = 256
286 self.fail("Didn't raise ValueError")
287 except ValueError:
288 pass
289 try:
290 b[0] = C(-1)
291 self.fail("Didn't raise ValueError")
292 except ValueError:
293 pass
294 try:
295 b[0] = None
296 self.fail("Didn't raise TypeError")
297 except TypeError:
298 pass
299
300 def test_delitem(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000301 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000302 del b[0]
Guido van Rossum254348e2007-11-21 19:29:53 +0000303 self.assertEqual(b, bytearray(range(1, 10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000304 del b[-1]
Guido van Rossum254348e2007-11-21 19:29:53 +0000305 self.assertEqual(b, bytearray(range(1, 9)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000306 del b[4]
Guido van Rossum254348e2007-11-21 19:29:53 +0000307 self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000308
309 def test_setslice(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000310 b = bytearray(range(10))
Guido van Rossumd624f182006-04-24 13:47:05 +0000311 self.assertEqual(list(b), list(range(10)))
312
Guido van Rossum254348e2007-11-21 19:29:53 +0000313 b[0:5] = bytearray([1, 1, 1, 1, 1])
314 self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000315
316 del b[0:-5]
Guido van Rossum254348e2007-11-21 19:29:53 +0000317 self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000318
Guido van Rossum254348e2007-11-21 19:29:53 +0000319 b[0:0] = bytearray([0, 1, 2, 3, 4])
320 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumd624f182006-04-24 13:47:05 +0000321
Guido van Rossum254348e2007-11-21 19:29:53 +0000322 b[-7:-3] = bytearray([100, 101])
323 self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000324
325 b[3:5] = [3, 4, 5, 6]
Guido van Rossum254348e2007-11-21 19:29:53 +0000326 self.assertEqual(b, bytearray(range(10)))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000327
Thomas Wouters9a6e62b2006-08-23 23:20:29 +0000328 b[3:0] = [42, 42, 42]
Guido van Rossum254348e2007-11-21 19:29:53 +0000329 self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
Guido van Rossumd624f182006-04-24 13:47:05 +0000330
Thomas Wouters376446d2006-12-19 08:30:14 +0000331 def test_extended_set_del_slice(self):
332 indices = (0, None, 1, 3, 19, 300, -1, -2, -31, -300)
333 for start in indices:
334 for stop in indices:
335 # Skip invalid step 0
336 for step in indices[1:]:
337 L = list(range(255))
Guido van Rossum254348e2007-11-21 19:29:53 +0000338 b = bytearray(L)
Thomas Wouters376446d2006-12-19 08:30:14 +0000339 # Make sure we have a slice of exactly the right length,
340 # but with different data.
341 data = L[start:stop:step]
342 data.reverse()
343 L[start:stop:step] = data
344 b[start:stop:step] = data
Guido van Rossum254348e2007-11-21 19:29:53 +0000345 self.assertEquals(b, bytearray(L))
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000346
Thomas Wouters376446d2006-12-19 08:30:14 +0000347 del L[start:stop:step]
348 del b[start:stop:step]
Guido van Rossum254348e2007-11-21 19:29:53 +0000349 self.assertEquals(b, bytearray(L))
Thomas Wouters376446d2006-12-19 08:30:14 +0000350
Guido van Rossumd624f182006-04-24 13:47:05 +0000351 def test_setslice_trap(self):
352 # This test verifies that we correctly handle assigning self
353 # to a slice of self (the old Lambert Meertens trap).
Guido van Rossum254348e2007-11-21 19:29:53 +0000354 b = bytearray(range(256))
Guido van Rossumd624f182006-04-24 13:47:05 +0000355 b[8:] = b
Guido van Rossum254348e2007-11-21 19:29:53 +0000356 self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
Guido van Rossumd624f182006-04-24 13:47:05 +0000357
358 def test_encoding(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000359 sample = "Hello world\n\u1234\u5678\u9abc\udef0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000360 for enc in ("utf8", "utf16"):
Guido van Rossum254348e2007-11-21 19:29:53 +0000361 b = bytearray(sample, enc)
362 self.assertEqual(b, bytearray(sample.encode(enc)))
363 self.assertRaises(UnicodeEncodeError, bytearray, sample, "latin1")
364 b = bytearray(sample, "latin1", "ignore")
365 self.assertEqual(b, bytearray(sample[:-4], "utf-8"))
Guido van Rossumd624f182006-04-24 13:47:05 +0000366
367 def test_decode(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000368 sample = "Hello world\n\u1234\u5678\u9abc\def0\def0"
Guido van Rossumd624f182006-04-24 13:47:05 +0000369 for enc in ("utf8", "utf16"):
Guido van Rossum254348e2007-11-21 19:29:53 +0000370 b = bytearray(sample, enc)
Guido van Rossumd624f182006-04-24 13:47:05 +0000371 self.assertEqual(b.decode(enc), sample)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000372 sample = "Hello world\n\x80\x81\xfe\xff"
Guido van Rossum254348e2007-11-21 19:29:53 +0000373 b = bytearray(sample, "latin1")
Guido van Rossumd624f182006-04-24 13:47:05 +0000374 self.assertRaises(UnicodeDecodeError, b.decode, "utf8")
375 self.assertEqual(b.decode("utf8", "ignore"), "Hello world\n")
376
Guido van Rossum254348e2007-11-21 19:29:53 +0000377 def test_from_bytearray(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000378 sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
Guido van Rossumbae07c92007-10-08 02:46:15 +0000379 buf = memoryview(sample)
Guido van Rossum254348e2007-11-21 19:29:53 +0000380 b = bytearray(buf)
381 self.assertEqual(b, bytearray(sample))
Guido van Rossumd624f182006-04-24 13:47:05 +0000382
383 def test_to_str(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000384 warnings.simplefilter('ignore', BytesWarning)
385 self.assertEqual(str(b''), "b''")
386 self.assertEqual(str(b'x'), "b'x'")
387 self.assertEqual(str(b'\x80'), "b'\\x80'")
Guido van Rossumd624f182006-04-24 13:47:05 +0000388
389 def test_from_int(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000390 b = bytearray(0)
391 self.assertEqual(b, bytearray())
392 b = bytearray(10)
393 self.assertEqual(b, bytearray([0]*10))
394 b = bytearray(10000)
395 self.assertEqual(b, bytearray([0]*10000))
Guido van Rossumd624f182006-04-24 13:47:05 +0000396
397 def test_concat(self):
Guido van Rossum9c627722007-08-27 18:31:48 +0000398 b1 = b"abc"
399 b2 = b"def"
400 self.assertEqual(b1 + b2, b"abcdef")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000401 self.assertEqual(b1 + bytes(b"def"), b"abcdef")
402 self.assertEqual(bytes(b"def") + b1, b"defabc")
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000403 self.assertRaises(TypeError, lambda: b1 + "def")
404 self.assertRaises(TypeError, lambda: "abc" + b2)
Guido van Rossumd624f182006-04-24 13:47:05 +0000405
406 def test_repeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000407 for b in b"abc", bytearray(b"abc"):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000408 self.assertEqual(b * 3, b"abcabcabc")
409 self.assertEqual(b * 0, b"")
410 self.assertEqual(b * -1, b"")
411 self.assertRaises(TypeError, lambda: b * 3.14)
412 self.assertRaises(TypeError, lambda: 3.14 * b)
Guido van Rossum254348e2007-11-21 19:29:53 +0000413 # XXX Shouldn't bytes and bytearray agree on what to raise?
Guido van Rossum98297ee2007-11-06 21:34:58 +0000414 self.assertRaises((OverflowError, MemoryError),
Christian Heimesa37d4c62007-12-04 23:02:19 +0000415 lambda: b * sys.maxsize)
Guido van Rossum13e57212006-04-27 22:54:26 +0000416
417 def test_repeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000418 self.assertEqual(b'x'*100, bytearray([ord('x')]*100))
Guido van Rossumd624f182006-04-24 13:47:05 +0000419
Guido van Rossum13e57212006-04-27 22:54:26 +0000420 def test_iconcat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000421 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000422 b1 = b
Guido van Rossum9c627722007-08-27 18:31:48 +0000423 b += b"def"
424 self.assertEqual(b, b"abcdef")
Guido van Rossum13e57212006-04-27 22:54:26 +0000425 self.assertEqual(b, b1)
426 self.failUnless(b is b1)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000427 b += b"xyz"
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000428 self.assertEqual(b, b"abcdefxyz")
429 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000430 b += ""
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000431 except TypeError:
432 pass
433 else:
434 self.fail("bytes += unicode didn't raise TypeError")
Guido van Rossum13e57212006-04-27 22:54:26 +0000435
436 def test_irepeat(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000437 b = bytearray(b"abc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000438 b1 = b
439 b *= 3
Guido van Rossum9c627722007-08-27 18:31:48 +0000440 self.assertEqual(b, b"abcabcabc")
Guido van Rossum13e57212006-04-27 22:54:26 +0000441 self.assertEqual(b, b1)
442 self.failUnless(b is b1)
443
444 def test_irepeat_1char(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000445 b = bytearray(b"x")
Guido van Rossum13e57212006-04-27 22:54:26 +0000446 b1 = b
447 b *= 100
Guido van Rossum98297ee2007-11-06 21:34:58 +0000448 self.assertEqual(b, b"x"*100)
Guido van Rossum13e57212006-04-27 22:54:26 +0000449 self.assertEqual(b, b1)
450 self.failUnless(b is b1)
451
452 def test_contains(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000453 for b in b"abc", bytearray(b"abc"):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000454 self.failUnless(ord('a') in b)
455 self.failUnless(int(ord('a')) in b)
456 self.failIf(200 in b)
457 self.failIf(200 in b)
458 self.assertRaises(ValueError, lambda: 300 in b)
459 self.assertRaises(ValueError, lambda: -1 in b)
460 self.assertRaises(TypeError, lambda: None in b)
461 self.assertRaises(TypeError, lambda: float(ord('a')) in b)
462 self.assertRaises(TypeError, lambda: "a" in b)
Guido van Rossum254348e2007-11-21 19:29:53 +0000463 for f in bytes, bytearray:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000464 self.failUnless(f(b"") in b)
465 self.failUnless(f(b"a") in b)
466 self.failUnless(f(b"b") in b)
467 self.failUnless(f(b"c") in b)
468 self.failUnless(f(b"ab") in b)
469 self.failUnless(f(b"bc") in b)
470 self.failUnless(f(b"abc") in b)
471 self.failIf(f(b"ac") in b)
472 self.failIf(f(b"d") in b)
473 self.failIf(f(b"dab") in b)
474 self.failIf(f(b"abd") in b)
Guido van Rossum13e57212006-04-27 22:54:26 +0000475
Guido van Rossum20188312006-05-05 15:15:40 +0000476 def test_alloc(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000477 b = bytearray()
Guido van Rossum20188312006-05-05 15:15:40 +0000478 alloc = b.__alloc__()
479 self.assert_(alloc >= 0)
480 seq = [alloc]
481 for i in range(100):
Guido van Rossum9c627722007-08-27 18:31:48 +0000482 b += b"x"
Guido van Rossum20188312006-05-05 15:15:40 +0000483 alloc = b.__alloc__()
484 self.assert_(alloc >= len(b))
485 if alloc not in seq:
486 seq.append(alloc)
Guido van Rossum20188312006-05-05 15:15:40 +0000487
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000488 def test_fromhex(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000489 self.assertRaises(TypeError, bytearray.fromhex)
490 self.assertRaises(TypeError, bytearray.fromhex, 1)
491 self.assertEquals(bytearray.fromhex(''), bytearray())
492 b = bytearray([0x1a, 0x2b, 0x30])
493 self.assertEquals(bytearray.fromhex('1a2B30'), b)
494 self.assertEquals(bytearray.fromhex(' 1A 2B 30 '), b)
495 self.assertEquals(bytearray.fromhex('0000'), b'\0\0')
496 self.assertRaises(TypeError, bytearray.fromhex, b'1B')
497 self.assertRaises(ValueError, bytearray.fromhex, 'a')
498 self.assertRaises(ValueError, bytearray.fromhex, 'rt')
499 self.assertRaises(ValueError, bytearray.fromhex, '1a b cd')
500 self.assertRaises(ValueError, bytearray.fromhex, '\x00')
501 self.assertRaises(ValueError, bytearray.fromhex, '12 \x00 34')
Georg Brandl0b9b9e02007-02-27 08:40:54 +0000502
Guido van Rossum20188312006-05-05 15:15:40 +0000503 def test_join(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +0000504 self.assertEqual(b"".join([]), b"")
505 self.assertEqual(b"".join([b""]), b"")
Guido van Rossum9c627722007-08-27 18:31:48 +0000506 for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
507 self.assertEqual(b"".join(lst), b"abc")
508 self.assertEqual(b"".join(tuple(lst)), b"abc")
509 self.assertEqual(b"".join(iter(lst)), b"abc")
Guido van Rossumcd6ae682007-05-09 19:52:16 +0000510 self.assertEqual(b".".join([b"ab", b"cd"]), b"ab.cd")
Guido van Rossum20188312006-05-05 15:15:40 +0000511 # XXX more...
Thomas Wouters00e41de2007-02-23 19:56:57 +0000512
513 def test_literal(self):
514 tests = [
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000515 (b"Wonderful spam", "Wonderful spam"),
516 (br"Wonderful spam too", "Wonderful spam too"),
517 (b"\xaa\x00\000\200", "\xaa\x00\000\200"),
518 (br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
Thomas Wouters00e41de2007-02-23 19:56:57 +0000519 ]
520 for b, s in tests:
Guido van Rossum254348e2007-11-21 19:29:53 +0000521 self.assertEqual(b, bytearray(s, 'latin-1'))
Thomas Wouters00e41de2007-02-23 19:56:57 +0000522 for c in range(128, 256):
523 self.assertRaises(SyntaxError, eval,
524 'b"%s"' % chr(c))
Guido van Rossum20188312006-05-05 15:15:40 +0000525
Neal Norwitz6968b052007-02-27 19:02:19 +0000526 def test_extend(self):
527 orig = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000528 a = bytearray(orig)
Neal Norwitz6968b052007-02-27 19:02:19 +0000529 a.extend(a)
530 self.assertEqual(a, orig + orig)
531 self.assertEqual(a[5:], orig)
Alexandre Vassalotti09121e82007-12-04 05:51:13 +0000532 a = bytearray(b'')
533 # Test iterators that don't have a __length_hint__
534 a.extend(map(int, orig * 25))
535 a.extend(int(x) for x in orig * 25)
536 self.assertEqual(a, orig * 50)
537 self.assertEqual(a[-5:], orig)
538 a = bytearray(b'')
539 a.extend(iter(map(int, orig * 50)))
540 self.assertEqual(a, orig * 50)
541 self.assertEqual(a[-5:], orig)
542 a = bytearray(b'')
543 a.extend(list(map(int, orig * 50)))
544 self.assertEqual(a, orig * 50)
545 self.assertEqual(a[-5:], orig)
546 a = bytearray(b'')
547 self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
548 self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
549 self.assertEqual(len(a), 0)
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000550
Neal Norwitz6968b052007-02-27 19:02:19 +0000551 def test_remove(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000552 b = bytearray(b'hello')
Neal Norwitz6968b052007-02-27 19:02:19 +0000553 b.remove(ord('l'))
554 self.assertEqual(b, b'helo')
555 b.remove(ord('l'))
556 self.assertEqual(b, b'heo')
557 self.assertRaises(ValueError, lambda: b.remove(ord('l')))
558 self.assertRaises(ValueError, lambda: b.remove(400))
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000559 self.assertRaises(TypeError, lambda: b.remove('e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000560 # remove first and last
561 b.remove(ord('o'))
562 b.remove(ord('h'))
563 self.assertEqual(b, b'e')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000564 self.assertRaises(TypeError, lambda: b.remove(b'e'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000565
566 def test_pop(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000567 b = bytearray(b'world')
Neal Norwitz6968b052007-02-27 19:02:19 +0000568 self.assertEqual(b.pop(), ord('d'))
569 self.assertEqual(b.pop(0), ord('w'))
570 self.assertEqual(b.pop(-2), ord('r'))
571 self.assertRaises(IndexError, lambda: b.pop(10))
Guido van Rossum254348e2007-11-21 19:29:53 +0000572 self.assertRaises(OverflowError, lambda: bytearray().pop())
Neal Norwitz6968b052007-02-27 19:02:19 +0000573
574 def test_nosort(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000575 self.assertRaises(AttributeError, lambda: bytearray().sort())
Neal Norwitz6968b052007-02-27 19:02:19 +0000576
577 def test_index(self):
578 b = b'parrot'
579 self.assertEqual(b.index('p'), 0)
580 self.assertEqual(b.index('rr'), 2)
581 self.assertEqual(b.index('t'), 5)
582 self.assertRaises(ValueError, lambda: b.index('w'))
583
584 def test_count(self):
585 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000586 self.assertEqual(b.count(b'i'), 4)
587 self.assertEqual(b.count(b'ss'), 2)
588 self.assertEqual(b.count(b'w'), 0)
Neal Norwitz6968b052007-02-27 19:02:19 +0000589
590 def test_append(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000591 b = bytearray(b'hell')
Neal Norwitz6968b052007-02-27 19:02:19 +0000592 b.append(ord('o'))
593 self.assertEqual(b, b'hello')
594 self.assertEqual(b.append(100), None)
Guido van Rossum254348e2007-11-21 19:29:53 +0000595 b = bytearray()
Neal Norwitz6968b052007-02-27 19:02:19 +0000596 b.append(ord('A'))
597 self.assertEqual(len(b), 1)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000598 self.assertRaises(TypeError, lambda: b.append(b'o'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000599
600 def test_insert(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000601 b = bytearray(b'msssspp')
Neal Norwitz6968b052007-02-27 19:02:19 +0000602 b.insert(1, ord('i'))
603 b.insert(4, ord('i'))
604 b.insert(-2, ord('i'))
605 b.insert(1000, ord('i'))
606 self.assertEqual(b, b'mississippi')
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000607 self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
Neal Norwitz6968b052007-02-27 19:02:19 +0000608
609 def test_startswith(self):
610 b = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000611 self.assertFalse(bytearray().startswith(b"anything"))
Guido van Rossum09549f42007-08-27 20:40:10 +0000612 self.assertTrue(b.startswith(b"hello"))
613 self.assertTrue(b.startswith(b"hel"))
614 self.assertTrue(b.startswith(b"h"))
615 self.assertFalse(b.startswith(b"hellow"))
616 self.assertFalse(b.startswith(b"ha"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000617
618 def test_endswith(self):
619 b = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000620 self.assertFalse(bytearray().endswith(b"anything"))
Guido van Rossum09549f42007-08-27 20:40:10 +0000621 self.assertTrue(b.endswith(b"hello"))
622 self.assertTrue(b.endswith(b"llo"))
623 self.assertTrue(b.endswith(b"o"))
624 self.assertFalse(b.endswith(b"whello"))
625 self.assertFalse(b.endswith(b"no"))
Neal Norwitz6968b052007-02-27 19:02:19 +0000626
627 def test_find(self):
628 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000629 self.assertEqual(b.find(b'ss'), 2)
630 self.assertEqual(b.find(b'ss', 3), 5)
631 self.assertEqual(b.find(b'ss', 1, 7), 2)
632 self.assertEqual(b.find(b'ss', 1, 3), -1)
633 self.assertEqual(b.find(b'w'), -1)
634 self.assertEqual(b.find(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000635
636 def test_rfind(self):
637 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000638 self.assertEqual(b.rfind(b'ss'), 5)
639 self.assertEqual(b.rfind(b'ss', 3), 5)
640 self.assertEqual(b.rfind(b'ss', 0, 6), 2)
641 self.assertEqual(b.rfind(b'w'), -1)
642 self.assertEqual(b.rfind(b'mississippian'), -1)
Neal Norwitz6968b052007-02-27 19:02:19 +0000643
644 def test_index(self):
645 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000646 self.assertEqual(b.index(b'w'), 0)
647 self.assertEqual(b.index(b'orl'), 1)
648 self.assertRaises(ValueError, b.index, b'worm')
649 self.assertRaises(ValueError, b.index, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000650
651 def test_rindex(self):
652 # XXX could be more rigorous
653 b = b'world'
Guido van Rossum09549f42007-08-27 20:40:10 +0000654 self.assertEqual(b.rindex(b'w'), 0)
655 self.assertEqual(b.rindex(b'orl'), 1)
656 self.assertRaises(ValueError, b.rindex, b'worm')
657 self.assertRaises(ValueError, b.rindex, b'ldo')
Neal Norwitz6968b052007-02-27 19:02:19 +0000658
659 def test_replace(self):
660 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000661 self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
662 self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
Neal Norwitz6968b052007-02-27 19:02:19 +0000663
664 def test_translate(self):
665 b = b'hello'
Guido van Rossum254348e2007-11-21 19:29:53 +0000666 rosetta = bytearray(range(0, 256))
Neal Norwitz6968b052007-02-27 19:02:19 +0000667 rosetta[ord('o')] = ord('e')
668 c = b.translate(rosetta, b'l')
669 self.assertEqual(b, b'hello')
670 self.assertEqual(c, b'hee')
671
672 def test_split(self):
673 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000674 self.assertEqual(b.split(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
675 self.assertEqual(b.split(b'ss'), [b'mi', b'i', b'ippi'])
676 self.assertEqual(b.split(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000677
678 def test_split_whitespace(self):
679 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
680 b'arf\fbarf', b'arf\vbarf'):
681 self.assertEqual(b.split(), [b'arf', b'barf'])
682 self.assertEqual(b.split(None), [b'arf', b'barf'])
683 self.assertEqual(b.split(None, 2), [b'arf', b'barf'])
684 self.assertEqual(b' a bb c '.split(None, 0), [b'a bb c '])
685 self.assertEqual(b' a bb c '.split(None, 1), [b'a', b'bb c '])
686 self.assertEqual(b' a bb c '.split(None, 2), [b'a', b'bb', b'c '])
687 self.assertEqual(b' a bb c '.split(None, 3), [b'a', b'bb', b'c'])
688
Guido van Rossum254348e2007-11-21 19:29:53 +0000689 def test_split_bytearray(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000690 self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000691
692 def test_split_string_error(self):
693 self.assertRaises(TypeError, b'a b'.split, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000694
695 def test_rsplit(self):
696 b = b'mississippi'
Guido van Rossum09549f42007-08-27 20:40:10 +0000697 self.assertEqual(b.rsplit(b'i'), [b'm', b'ss', b'ss', b'pp', b''])
698 self.assertEqual(b.rsplit(b'ss'), [b'mi', b'i', b'ippi'])
699 self.assertEqual(b.rsplit(b'w'), [b])
Guido van Rossum8f950672007-09-10 16:53:45 +0000700
701 def test_rsplit_whitespace(self):
702 for b in (b' arf barf ', b'arf\tbarf', b'arf\nbarf', b'arf\rbarf',
703 b'arf\fbarf', b'arf\vbarf'):
704 self.assertEqual(b.rsplit(), [b'arf', b'barf'])
705 self.assertEqual(b.rsplit(None), [b'arf', b'barf'])
706 self.assertEqual(b.rsplit(None, 2), [b'arf', b'barf'])
707 self.assertEqual(b' a bb c '.rsplit(None, 0), [b' a bb c'])
708 self.assertEqual(b' a bb c '.rsplit(None, 1), [b' a bb', b'c'])
Christian Heimes7b876152008-01-30 09:51:48 +0000709 self.assertEqual(b' a bb c '.rsplit(None, 2), [b' a', b'bb', b'c'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000710 self.assertEqual(b' a bb c '.rsplit(None, 3), [b'a', b'bb', b'c'])
711
Guido van Rossum254348e2007-11-21 19:29:53 +0000712 def test_rsplit_bytearray(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000713 self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
Guido van Rossum8f950672007-09-10 16:53:45 +0000714
Guido van Rossum98297ee2007-11-06 21:34:58 +0000715 def test_rsplit_string_error(self):
Guido van Rossum8f950672007-09-10 16:53:45 +0000716 self.assertRaises(TypeError, b'a b'.rsplit, ' ')
Neal Norwitz6968b052007-02-27 19:02:19 +0000717
Christian Heimes7b876152008-01-30 09:51:48 +0000718 def test_rsplit_unicodewhitespace(self):
719 b = b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F"
720 self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
721 self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
722 ba = bytearray(b)
723 self.assertEqual(ba.split(), [bytearray(b'\x1c\x1d\x1e\x1f')])
724 self.assertEqual(ba.rsplit(), [bytearray(b'\x1c\x1d\x1e\x1f')])
725
726
Neal Norwitz6968b052007-02-27 19:02:19 +0000727 def test_partition(self):
728 b = b'mississippi'
729 self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
730 self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
731
732 def test_rpartition(self):
733 b = b'mississippi'
734 self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
735 self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
736
Guido van Rossum0ad08122007-04-11 04:37:43 +0000737 def test_pickling(self):
Guido van Rossum99603b02007-07-20 00:22:32 +0000738 for proto in range(pickle.HIGHEST_PROTOCOL):
739 for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
740 ps = pickle.dumps(b, proto)
741 q = pickle.loads(ps)
742 self.assertEqual(b, q)
Guido van Rossum0ad08122007-04-11 04:37:43 +0000743
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000744 def test_strip(self):
745 b = b'mississippi'
746 self.assertEqual(b.strip(b'i'), b'mississipp')
747 self.assertEqual(b.strip(b'm'), b'ississippi')
748 self.assertEqual(b.strip(b'pi'), b'mississ')
749 self.assertEqual(b.strip(b'im'), b'ssissipp')
750 self.assertEqual(b.strip(b'pim'), b'ssiss')
Guido van Rossumeb29e9a2007-08-08 21:55:33 +0000751 self.assertEqual(b.strip(b), b'')
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000752
753 def test_lstrip(self):
754 b = b'mississippi'
755 self.assertEqual(b.lstrip(b'i'), b'mississippi')
756 self.assertEqual(b.lstrip(b'm'), b'ississippi')
757 self.assertEqual(b.lstrip(b'pi'), b'mississippi')
758 self.assertEqual(b.lstrip(b'im'), b'ssissippi')
759 self.assertEqual(b.lstrip(b'pim'), b'ssissippi')
760
761 def test_rstrip(self):
762 b = b'mississippi'
763 self.assertEqual(b.rstrip(b'i'), b'mississipp')
764 self.assertEqual(b.rstrip(b'm'), b'mississippi')
765 self.assertEqual(b.rstrip(b'pi'), b'mississ')
766 self.assertEqual(b.rstrip(b'im'), b'mississipp')
767 self.assertEqual(b.rstrip(b'pim'), b'mississ')
768
Guido van Rossum8f950672007-09-10 16:53:45 +0000769 def test_strip_whitespace(self):
770 b = b' \t\n\r\f\vabc \t\n\r\f\v'
771 self.assertEqual(b.strip(), b'abc')
772 self.assertEqual(b.lstrip(), b'abc \t\n\r\f\v')
773 self.assertEqual(b.rstrip(), b' \t\n\r\f\vabc')
774
Guido van Rossum254348e2007-11-21 19:29:53 +0000775 def test_strip_bytearray(self):
Guido van Rossumbae07c92007-10-08 02:46:15 +0000776 self.assertEqual(b'abc'.strip(memoryview(b'ac')), b'b')
777 self.assertEqual(b'abc'.lstrip(memoryview(b'ac')), b'bc')
778 self.assertEqual(b'abc'.rstrip(memoryview(b'ac')), b'ab')
Guido van Rossum8f950672007-09-10 16:53:45 +0000779
780 def test_strip_string_error(self):
781 self.assertRaises(TypeError, b'abc'.strip, 'b')
782 self.assertRaises(TypeError, b'abc'.lstrip, 'b')
783 self.assertRaises(TypeError, b'abc'.rstrip, 'b')
784
Guido van Rossumf9e91c92007-05-08 21:05:48 +0000785 def test_ord(self):
786 b = b'\0A\x7f\x80\xff'
787 self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
788 [0, 65, 127, 128, 255])
789
Guido van Rossum254348e2007-11-21 19:29:53 +0000790 def test_partition_bytearray_doesnt_share_nullstring(self):
791 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000792 self.assertEqual(b, b"")
793 self.assertEqual(c, b"")
794 self.assert_(b is not c)
795 b += b"!"
796 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000797 a, b, c = bytearray(b"x").partition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000798 self.assertEqual(b, b"")
799 self.assertEqual(c, b"")
800 # Same for rpartition
Guido van Rossum254348e2007-11-21 19:29:53 +0000801 b, c, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000802 self.assertEqual(b, b"")
803 self.assertEqual(c, b"")
804 self.assert_(b is not c)
805 b += b"!"
806 self.assertEqual(c, b"")
Guido van Rossum254348e2007-11-21 19:29:53 +0000807 c, b, a = bytearray(b"x").rpartition(b"y")
Guido van Rossum98297ee2007-11-06 21:34:58 +0000808 self.assertEqual(b, b"")
809 self.assertEqual(c, b"")
810
811
Guido van Rossumd624f182006-04-24 13:47:05 +0000812 # Optimizations:
Guido van Rossume06b6b82006-04-23 07:43:54 +0000813 # __iter__? (optimization)
Guido van Rossumd624f182006-04-24 13:47:05 +0000814 # __reversed__? (optimization)
815
Guido van Rossumad7d8d12007-04-13 01:39:34 +0000816 # XXX More string methods? (Those that don't use character properties)
817
Neal Norwitz6968b052007-02-27 19:02:19 +0000818 # There are tests in string_tests.py that are more
819 # comprehensive for things like split, partition, etc.
820 # Unfortunately they are all bundled with tests that
821 # are not appropriate for bytes
Guido van Rossume06b6b82006-04-23 07:43:54 +0000822
Guido van Rossum254348e2007-11-21 19:29:53 +0000823 # I've started porting some of those into bytearray_tests.py, we should port
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000824 # the rest that make sense (the code can be cleaned up to use modern
825 # unittest methods at the same time).
826
Guido van Rossum254348e2007-11-21 19:29:53 +0000827class BytearrayPEP3137Test(unittest.TestCase,
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000828 test.buffer_tests.MixinBytesBufferCommonTests):
829 def marshal(self, x):
Guido van Rossum254348e2007-11-21 19:29:53 +0000830 return bytearray(x)
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000831
832 def test_returns_new_copy(self):
833 val = self.marshal(b'1234')
834 # On immutable types these MAY return a reference to themselves
Guido van Rossum254348e2007-11-21 19:29:53 +0000835 # but on mutable types like bytearray they MUST return a new copy.
Gregory P. Smith60d241f2007-10-16 06:31:30 +0000836 for methname in ('zfill', 'rjust', 'ljust', 'center'):
837 method = getattr(val, methname)
838 newval = method(3)
839 self.assertEqual(val, newval)
840 self.assertTrue(val is not newval,
841 methname+' returned self on a mutable object')
842
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000843
Georg Brandlc7885542007-03-06 19:16:20 +0000844class BytesAsStringTest(test.string_tests.BaseTest):
Guido van Rossum254348e2007-11-21 19:29:53 +0000845 type2test = bytearray
Georg Brandlc7885542007-03-06 19:16:20 +0000846
Guido van Rossum9c627722007-08-27 18:31:48 +0000847 def fixtype(self, obj):
848 if isinstance(obj, str):
849 return obj.encode("utf-8")
850 return super().fixtype(obj)
851
Georg Brandlc7885542007-03-06 19:16:20 +0000852 # Currently the bytes containment testing uses a single integer
853 # value. This may not be the final design, but until then the
854 # bytes section with in a bytes containment not valid
855 def test_contains(self):
856 pass
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000857 def test_expandtabs(self):
858 pass
859 def test_upper(self):
860 pass
861 def test_lower(self):
862 pass
Georg Brandlc7885542007-03-06 19:16:20 +0000863
864
Guido van Rossum254348e2007-11-21 19:29:53 +0000865class ByteArraySubclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000866 pass
867
Guido van Rossum254348e2007-11-21 19:29:53 +0000868class ByteArraySubclassTest(unittest.TestCase):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000869
870 def test_basic(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000871 self.assert_(issubclass(ByteArraySubclass, bytearray))
872 self.assert_(isinstance(ByteArraySubclass(), bytearray))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000873
874 a, b = b"abcd", b"efgh"
Guido van Rossum254348e2007-11-21 19:29:53 +0000875 _a, _b = ByteArraySubclass(a), ByteArraySubclass(b)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000876
877 # test comparison operators with subclass instances
878 self.assert_(_a == _a)
879 self.assert_(_a != _b)
880 self.assert_(_a < _b)
881 self.assert_(_a <= _b)
882 self.assert_(_b >= _a)
883 self.assert_(_b > _a)
884 self.assert_(_a is not a)
885
886 # test concat of subclass instances
887 self.assertEqual(a + b, _a + _b)
888 self.assertEqual(a + b, a + _b)
889 self.assertEqual(a + b, _a + b)
890
891 # test repeat
892 self.assert_(a*5 == _a*5)
893
894 def test_join(self):
895 # Make sure join returns a NEW object for single item sequences
896 # involving a subclass.
897 # Make sure that it is of the appropriate type.
Guido van Rossum254348e2007-11-21 19:29:53 +0000898 s1 = ByteArraySubclass(b"abcd")
899 s2 = bytearray().join([s1])
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000900 self.assert_(s1 is not s2)
Guido van Rossum254348e2007-11-21 19:29:53 +0000901 self.assert_(type(s2) is bytearray, type(s2))
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000902
903 # Test reverse, calling join on subclass
904 s3 = s1.join([b"abcd"])
Guido van Rossum254348e2007-11-21 19:29:53 +0000905 self.assert_(type(s3) is bytearray)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000906
907 def test_pickle(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000908 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000909 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000910 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000911 for proto in range(pickle.HIGHEST_PROTOCOL):
912 b = pickle.loads(pickle.dumps(a, proto))
913 self.assertNotEqual(id(a), id(b))
914 self.assertEqual(a, b)
915 self.assertEqual(a.x, b.x)
916 self.assertEqual(a.y, b.y)
917 self.assertEqual(type(a), type(b))
918 self.assertEqual(type(a.y), type(b.y))
919
920 def test_copy(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000921 a = ByteArraySubclass(b"abcd")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000922 a.x = 10
Guido van Rossum254348e2007-11-21 19:29:53 +0000923 a.y = ByteArraySubclass(b"efgh")
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000924 for copy_method in (copy.copy, copy.deepcopy):
925 b = copy_method(a)
926 self.assertNotEqual(id(a), id(b))
927 self.assertEqual(a, b)
928 self.assertEqual(a.x, b.x)
929 self.assertEqual(a.y, b.y)
930 self.assertEqual(type(a), type(b))
931 self.assertEqual(type(a.y), type(b.y))
932
933 def test_init_override(self):
Guido van Rossum254348e2007-11-21 19:29:53 +0000934 class subclass(bytearray):
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000935 def __init__(self, newarg=1, *args, **kwargs):
Guido van Rossum254348e2007-11-21 19:29:53 +0000936 bytearray.__init__(self, *args, **kwargs)
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000937 x = subclass(4, source=b"abcd")
938 self.assertEqual(x, b"abcd")
939 x = subclass(newarg=4, source=b"abcd")
940 self.assertEqual(x, b"abcd")
941
942
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000943def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000944 test.test_support.run_unittest(BytesTest)
Georg Brandlc7885542007-03-06 19:16:20 +0000945 test.test_support.run_unittest(BytesAsStringTest)
Guido van Rossum254348e2007-11-21 19:29:53 +0000946 test.test_support.run_unittest(ByteArraySubclassTest)
947 test.test_support.run_unittest(BytearrayPEP3137Test)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000948
949if __name__ == "__main__":
Guido van Rossuma6c04be2007-11-03 00:24:24 +0000950 test_main()