2007-11-21 15:29:53 -04:00
|
|
|
"""Unit tests for the bytes and bytearray types.
|
2007-11-06 17:34:58 -04:00
|
|
|
|
2016-04-06 03:37:17 -03:00
|
|
|
XXX This is a mess. Common tests should be unified with string_tests.py (and
|
|
|
|
the latter should be modernized).
|
2007-11-06 17:34:58 -04:00
|
|
|
"""
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2006-04-24 10:47:05 -03:00
|
|
|
import os
|
|
|
|
import re
|
2006-04-22 20:28:04 -03:00
|
|
|
import sys
|
2007-11-02 21:24:24 -03:00
|
|
|
import copy
|
2010-09-03 17:00:37 -03:00
|
|
|
import functools
|
2007-04-11 01:37:43 -03:00
|
|
|
import pickle
|
2006-04-24 10:47:05 -03:00
|
|
|
import tempfile
|
2006-04-22 20:28:04 -03:00
|
|
|
import unittest
|
2014-11-02 13:40:09 -04:00
|
|
|
|
2008-05-20 18:35:26 -03:00
|
|
|
import test.support
|
2007-03-06 15:16:20 -04:00
|
|
|
import test.string_tests
|
2016-03-30 15:01:26 -03:00
|
|
|
import test.list_tests
|
2014-11-02 13:40:09 -04:00
|
|
|
from test.support import bigaddrspacetest, MAX_Py_ssize_t
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2010-09-03 17:00:37 -03:00
|
|
|
|
|
|
|
if sys.flags.bytes_warning:
|
|
|
|
def check_bytes_warnings(func):
|
|
|
|
@functools.wraps(func)
|
|
|
|
def wrapper(*args, **kw):
|
|
|
|
with test.support.check_warnings(('', BytesWarning)):
|
|
|
|
return func(*args, **kw)
|
|
|
|
return wrapper
|
|
|
|
else:
|
|
|
|
# no-op
|
|
|
|
def check_bytes_warnings(func):
|
|
|
|
return func
|
|
|
|
|
|
|
|
|
2008-07-16 20:15:30 -03:00
|
|
|
class Indexable:
|
|
|
|
def __init__(self, value=0):
|
|
|
|
self.value = value
|
|
|
|
def __index__(self):
|
|
|
|
return self.value
|
|
|
|
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class BaseBytesTest:
|
2006-04-22 20:28:04 -03:00
|
|
|
|
|
|
|
def test_basics(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test()
|
|
|
|
self.assertEqual(type(b), self.type2test)
|
|
|
|
self.assertEqual(b.__class__, self.type2test)
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2010-01-11 21:23:09 -04:00
|
|
|
def test_copy(self):
|
|
|
|
a = self.type2test(b"abcd")
|
|
|
|
for copy_method in (copy.copy, copy.deepcopy):
|
|
|
|
b = copy_method(a)
|
|
|
|
self.assertEqual(a, b)
|
|
|
|
self.assertEqual(type(a), type(b))
|
|
|
|
|
2006-04-22 20:28:04 -03:00
|
|
|
def test_empty_sequence(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test()
|
2006-04-22 20:28:04 -03:00
|
|
|
self.assertEqual(len(b), 0)
|
|
|
|
self.assertRaises(IndexError, lambda: b[0])
|
|
|
|
self.assertRaises(IndexError, lambda: b[1])
|
2007-12-04 19:02:19 -04:00
|
|
|
self.assertRaises(IndexError, lambda: b[sys.maxsize])
|
|
|
|
self.assertRaises(IndexError, lambda: b[sys.maxsize+1])
|
2006-04-22 20:28:04 -03:00
|
|
|
self.assertRaises(IndexError, lambda: b[10**100])
|
|
|
|
self.assertRaises(IndexError, lambda: b[-1])
|
|
|
|
self.assertRaises(IndexError, lambda: b[-2])
|
2007-12-04 19:02:19 -04:00
|
|
|
self.assertRaises(IndexError, lambda: b[-sys.maxsize])
|
|
|
|
self.assertRaises(IndexError, lambda: b[-sys.maxsize-1])
|
|
|
|
self.assertRaises(IndexError, lambda: b[-sys.maxsize-2])
|
2006-04-22 20:28:04 -03:00
|
|
|
self.assertRaises(IndexError, lambda: b[-10**100])
|
|
|
|
|
|
|
|
def test_from_list(self):
|
|
|
|
ints = list(range(256))
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(i for i in ints)
|
2006-04-22 20:28:04 -03:00
|
|
|
self.assertEqual(len(b), 256)
|
|
|
|
self.assertEqual(list(b), ints)
|
|
|
|
|
|
|
|
def test_from_index(self):
|
2008-07-16 20:15:30 -03:00
|
|
|
b = self.type2test([Indexable(), Indexable(1), Indexable(254),
|
|
|
|
Indexable(255)])
|
2006-04-22 20:28:04 -03:00
|
|
|
self.assertEqual(list(b), [0, 1, 254, 255])
|
2010-04-16 19:35:32 -03:00
|
|
|
self.assertRaises(ValueError, self.type2test, [Indexable(-1)])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [Indexable(256)])
|
2007-11-06 17:34:58 -04:00
|
|
|
|
|
|
|
def test_from_ssize(self):
|
2010-04-16 19:35:32 -03:00
|
|
|
self.assertEqual(self.type2test(0), b'')
|
|
|
|
self.assertEqual(self.type2test(1), b'\x00')
|
|
|
|
self.assertEqual(self.type2test(5), b'\x00\x00\x00\x00\x00')
|
|
|
|
self.assertRaises(ValueError, self.type2test, -1)
|
2007-11-06 17:34:58 -04:00
|
|
|
|
2010-04-16 19:35:32 -03:00
|
|
|
self.assertEqual(self.type2test('0', 'ascii'), b'0')
|
|
|
|
self.assertEqual(self.type2test(b'0'), b'0')
|
2010-04-16 19:51:37 -03:00
|
|
|
self.assertRaises(OverflowError, self.type2test, sys.maxsize + 1)
|
2006-04-22 20:28:04 -03:00
|
|
|
|
|
|
|
def test_constructor_type_errors(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test, 0.0)
|
2006-04-22 20:28:04 -03:00
|
|
|
class C:
|
|
|
|
pass
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test, ["0"])
|
|
|
|
self.assertRaises(TypeError, self.type2test, [0.0])
|
|
|
|
self.assertRaises(TypeError, self.type2test, [None])
|
|
|
|
self.assertRaises(TypeError, self.type2test, [C()])
|
2014-12-02 03:24:06 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test, 0, 'ascii')
|
|
|
|
self.assertRaises(TypeError, self.type2test, b'', 'ascii')
|
|
|
|
self.assertRaises(TypeError, self.type2test, 0, errors='ignore')
|
|
|
|
self.assertRaises(TypeError, self.type2test, b'', errors='ignore')
|
|
|
|
self.assertRaises(TypeError, self.type2test, '')
|
|
|
|
self.assertRaises(TypeError, self.type2test, '', errors='ignore')
|
|
|
|
self.assertRaises(TypeError, self.type2test, '', b'ascii')
|
|
|
|
self.assertRaises(TypeError, self.type2test, '', 'ascii', b'ignore')
|
2006-04-22 20:28:04 -03:00
|
|
|
|
|
|
|
def test_constructor_value_errors(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(ValueError, self.type2test, [-1])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [-sys.maxsize])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [-sys.maxsize-1])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [-sys.maxsize-2])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [-10**100])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [256])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [257])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [sys.maxsize])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [sys.maxsize+1])
|
|
|
|
self.assertRaises(ValueError, self.type2test, [10**100])
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2014-11-02 13:40:09 -04:00
|
|
|
@bigaddrspacetest
|
|
|
|
def test_constructor_overflow(self):
|
|
|
|
size = MAX_Py_ssize_t
|
|
|
|
self.assertRaises((OverflowError, MemoryError), self.type2test, size)
|
|
|
|
try:
|
|
|
|
# Should either pass or raise an error (e.g. on debug builds with
|
|
|
|
# additional malloc() overhead), but shouldn't crash.
|
|
|
|
bytearray(size - 4)
|
|
|
|
except (OverflowError, MemoryError):
|
|
|
|
pass
|
|
|
|
|
2006-04-22 20:28:04 -03:00
|
|
|
def test_compare(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b1 = self.type2test([1, 2, 3])
|
|
|
|
b2 = self.type2test([1, 2, 3])
|
|
|
|
b3 = self.type2test([1, 3])
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(b1, b2)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b2 != b3)
|
|
|
|
self.assertTrue(b1 <= b2)
|
|
|
|
self.assertTrue(b1 <= b3)
|
|
|
|
self.assertTrue(b1 < b3)
|
|
|
|
self.assertTrue(b1 >= b2)
|
|
|
|
self.assertTrue(b3 >= b2)
|
|
|
|
self.assertTrue(b3 > b2)
|
|
|
|
|
|
|
|
self.assertFalse(b1 != b2)
|
|
|
|
self.assertFalse(b2 == b3)
|
|
|
|
self.assertFalse(b1 > b2)
|
|
|
|
self.assertFalse(b1 > b3)
|
|
|
|
self.assertFalse(b1 >= b3)
|
|
|
|
self.assertFalse(b1 < b2)
|
|
|
|
self.assertFalse(b3 < b2)
|
|
|
|
self.assertFalse(b3 <= b2)
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2010-09-03 17:00:37 -03:00
|
|
|
@check_bytes_warnings
|
2007-11-06 17:34:58 -04:00
|
|
|
def test_compare_to_str(self):
|
2010-09-03 17:00:37 -03:00
|
|
|
# Byte comparisons with unicode should always fail!
|
|
|
|
# Test this for all expected byte orders and Unicode character
|
|
|
|
# sizes.
|
|
|
|
self.assertEqual(self.type2test(b"\0a\0b\0c") == "abc", False)
|
|
|
|
self.assertEqual(self.type2test(b"\0\0\0a\0\0\0b\0\0\0c") == "abc",
|
|
|
|
False)
|
|
|
|
self.assertEqual(self.type2test(b"a\0b\0c\0") == "abc", False)
|
|
|
|
self.assertEqual(self.type2test(b"a\0\0\0b\0\0\0c\0\0\0") == "abc",
|
|
|
|
False)
|
|
|
|
self.assertEqual(self.type2test() == str(), False)
|
|
|
|
self.assertEqual(self.type2test() != str(), True)
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_reversed(self):
|
Merged revisions 56125-56153 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r56127 | georg.brandl | 2007-06-30 09:32:49 +0200 (Sat, 30 Jun 2007) | 2 lines
Fix a place where floor division would be in order.
........
r56135 | guido.van.rossum | 2007-07-01 06:13:54 +0200 (Sun, 01 Jul 2007) | 28 lines
Make map() and filter() identical to itertools.imap() and .ifilter(),
respectively.
I fixed two bootstrap issues, due to the dynamic import of itertools:
1. Starting python requires that map() and filter() are not used until
site.py has added build/lib.<arch> to sys.path.
2. Building python requires that setup.py and distutils and everything
they use is free of map() and filter() calls.
Beyond this, I only fixed the tests in test_builtin.py.
Others, please help fixing the remaining tests that are now broken!
The fixes are usually simple:
a. map(None, X) -> list(X)
b. map(F, X) -> list(map(F, X))
c. map(lambda x: F(x), X) -> [F(x) for x in X]
d. filter(F, X) -> list(filter(F, X))
e. filter(lambda x: P(x), X) -> [x for x in X if P(x)]
Someone, please also contribute a fixer for 2to3 to do this.
It can leave map()/filter() calls alone that are already
inside a list() or sorted() call or for-loop.
Only in rare cases have I seen code that depends on map() of lists
of different lengths going to the end of the longest, or on filter()
of a string or tuple returning an object of the same type; these
will need more thought to fix.
........
r56136 | guido.van.rossum | 2007-07-01 06:22:01 +0200 (Sun, 01 Jul 2007) | 3 lines
Make it so that test_decimal fails instead of hangs, to help automated
test runners.
........
r56139 | georg.brandl | 2007-07-01 18:20:58 +0200 (Sun, 01 Jul 2007) | 2 lines
Fix a few test cases after the map->imap change.
........
r56142 | neal.norwitz | 2007-07-02 06:38:12 +0200 (Mon, 02 Jul 2007) | 1 line
Get a bunch more tests passing after converting map/filter to return iterators.
........
r56147 | guido.van.rossum | 2007-07-02 15:32:02 +0200 (Mon, 02 Jul 2007) | 4 lines
Fix the remaining failing unit tests (at least on OSX).
Also tweaked urllib2 so it doesn't raise socket.gaierror when
all network interfaces are turned off.
........
2007-07-03 05:25:58 -03:00
|
|
|
input = list(map(ord, "Hello"))
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(input)
|
2006-04-24 10:47:05 -03:00
|
|
|
output = list(reversed(b))
|
|
|
|
input.reverse()
|
|
|
|
self.assertEqual(output, input)
|
|
|
|
|
|
|
|
def test_getslice(self):
|
|
|
|
def by(s):
|
2008-01-30 07:57:58 -04:00
|
|
|
return self.type2test(map(ord, s))
|
2006-04-24 10:47:05 -03:00
|
|
|
b = by("Hello, world")
|
|
|
|
|
|
|
|
self.assertEqual(b[:5], by("Hello"))
|
|
|
|
self.assertEqual(b[1:5], by("ello"))
|
|
|
|
self.assertEqual(b[5:7], by(", "))
|
|
|
|
self.assertEqual(b[7:], by("world"))
|
|
|
|
self.assertEqual(b[7:12], by("world"))
|
|
|
|
self.assertEqual(b[7:100], by("world"))
|
|
|
|
|
|
|
|
self.assertEqual(b[:-7], by("Hello"))
|
|
|
|
self.assertEqual(b[-11:-7], by("ello"))
|
|
|
|
self.assertEqual(b[-7:-5], by(", "))
|
|
|
|
self.assertEqual(b[-5:], by("world"))
|
|
|
|
self.assertEqual(b[-5:12], by("world"))
|
|
|
|
self.assertEqual(b[-5:100], by("world"))
|
|
|
|
self.assertEqual(b[-100:5], by("Hello"))
|
|
|
|
|
2006-12-19 04:30:14 -04:00
|
|
|
def test_extended_getslice(self):
|
|
|
|
# Test extended slicing by comparing with list slicing.
|
|
|
|
L = list(range(255))
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(L)
|
2006-12-19 04:30:14 -04:00
|
|
|
indices = (0, None, 1, 3, 19, 100, -1, -2, -31, -100)
|
|
|
|
for start in indices:
|
|
|
|
for stop in indices:
|
|
|
|
# Skip step 0 (invalid)
|
|
|
|
for step in indices[1:]:
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertEqual(b[start:stop:step], self.type2test(L[start:stop:step]))
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_encoding(self):
|
2009-05-02 15:52:14 -03:00
|
|
|
sample = "Hello world\n\u1234\u5678\u9abc"
|
2011-02-25 11:42:01 -04:00
|
|
|
for enc in ("utf-8", "utf-16"):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(sample, enc)
|
|
|
|
self.assertEqual(b, self.type2test(sample.encode(enc)))
|
2011-02-25 11:42:01 -04:00
|
|
|
self.assertRaises(UnicodeEncodeError, self.type2test, sample, "latin-1")
|
|
|
|
b = self.type2test(sample, "latin-1", "ignore")
|
2009-05-02 15:52:14 -03:00
|
|
|
self.assertEqual(b, self.type2test(sample[:-3], "utf-8"))
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_decode(self):
|
2016-09-08 09:47:27 -03:00
|
|
|
sample = "Hello world\n\u1234\u5678\u9abc"
|
2011-02-25 11:42:01 -04:00
|
|
|
for enc in ("utf-8", "utf-16"):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(sample, enc)
|
2006-04-24 10:47:05 -03:00
|
|
|
self.assertEqual(b.decode(enc), sample)
|
2007-05-02 16:09:54 -03:00
|
|
|
sample = "Hello world\n\x80\x81\xfe\xff"
|
2011-02-25 11:42:01 -04:00
|
|
|
b = self.type2test(sample, "latin-1")
|
|
|
|
self.assertRaises(UnicodeDecodeError, b.decode, "utf-8")
|
|
|
|
self.assertEqual(b.decode("utf-8", "ignore"), "Hello world\n")
|
|
|
|
self.assertEqual(b.decode(errors="ignore", encoding="utf-8"),
|
2009-09-18 18:42:35 -03:00
|
|
|
"Hello world\n")
|
2011-02-25 11:42:01 -04:00
|
|
|
# Default encoding is utf-8
|
|
|
|
self.assertEqual(self.type2test(b'\xe2\x98\x83').decode(), '\u2603')
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_from_int(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(0)
|
|
|
|
self.assertEqual(b, self.type2test())
|
|
|
|
b = self.type2test(10)
|
|
|
|
self.assertEqual(b, self.type2test([0]*10))
|
|
|
|
b = self.type2test(10000)
|
|
|
|
self.assertEqual(b, self.type2test([0]*10000))
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_concat(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b1 = self.type2test(b"abc")
|
|
|
|
b2 = self.type2test(b"def")
|
2007-08-27 15:31:48 -03:00
|
|
|
self.assertEqual(b1 + b2, b"abcdef")
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b1 + bytes(b"def"), b"abcdef")
|
|
|
|
self.assertEqual(bytes(b"def") + b1, b"defabc")
|
2007-05-02 16:09:54 -03:00
|
|
|
self.assertRaises(TypeError, lambda: b1 + "def")
|
|
|
|
self.assertRaises(TypeError, lambda: "abc" + b2)
|
2006-04-24 10:47:05 -03:00
|
|
|
|
|
|
|
def test_repeat(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
for b in b"abc", self.type2test(b"abc"):
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b * 3, b"abcabcabc")
|
|
|
|
self.assertEqual(b * 0, b"")
|
|
|
|
self.assertEqual(b * -1, b"")
|
|
|
|
self.assertRaises(TypeError, lambda: b * 3.14)
|
|
|
|
self.assertRaises(TypeError, lambda: 3.14 * b)
|
2007-11-21 15:29:53 -04:00
|
|
|
# XXX Shouldn't bytes and bytearray agree on what to raise?
|
2010-08-10 15:35:01 -03:00
|
|
|
with self.assertRaises((OverflowError, MemoryError)):
|
|
|
|
c = b * sys.maxsize
|
|
|
|
with self.assertRaises((OverflowError, MemoryError)):
|
|
|
|
b *= sys.maxsize
|
2006-04-27 19:54:26 -03:00
|
|
|
|
|
|
|
def test_repeat_1char(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertEqual(self.type2test(b'x')*100, self.type2test([ord('x')]*100))
|
2006-04-27 19:54:26 -03:00
|
|
|
|
|
|
|
def test_contains(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b"abc")
|
2010-01-18 20:09:57 -04:00
|
|
|
self.assertIn(ord('a'), b)
|
|
|
|
self.assertIn(int(ord('a')), b)
|
2010-01-23 11:40:09 -04:00
|
|
|
self.assertNotIn(200, b)
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(ValueError, lambda: 300 in b)
|
|
|
|
self.assertRaises(ValueError, lambda: -1 in b)
|
2016-07-10 06:37:30 -03:00
|
|
|
self.assertRaises(ValueError, lambda: sys.maxsize+1 in b)
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, lambda: None in b)
|
|
|
|
self.assertRaises(TypeError, lambda: float(ord('a')) in b)
|
|
|
|
self.assertRaises(TypeError, lambda: "a" in b)
|
|
|
|
for f in bytes, bytearray:
|
2010-01-18 20:09:57 -04:00
|
|
|
self.assertIn(f(b""), b)
|
|
|
|
self.assertIn(f(b"a"), b)
|
|
|
|
self.assertIn(f(b"b"), b)
|
|
|
|
self.assertIn(f(b"c"), b)
|
|
|
|
self.assertIn(f(b"ab"), b)
|
|
|
|
self.assertIn(f(b"bc"), b)
|
|
|
|
self.assertIn(f(b"abc"), b)
|
2010-01-23 11:40:09 -04:00
|
|
|
self.assertNotIn(f(b"ac"), b)
|
|
|
|
self.assertNotIn(f(b"d"), b)
|
|
|
|
self.assertNotIn(f(b"dab"), b)
|
|
|
|
self.assertNotIn(f(b"abd"), b)
|
2006-05-05 12:15:40 -03:00
|
|
|
|
2007-02-27 04:40:54 -04:00
|
|
|
def test_fromhex(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test.fromhex)
|
|
|
|
self.assertRaises(TypeError, self.type2test.fromhex, 1)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(self.type2test.fromhex(''), self.type2test())
|
2007-11-21 15:29:53 -04:00
|
|
|
b = bytearray([0x1a, 0x2b, 0x30])
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(self.type2test.fromhex('1a2B30'), b)
|
|
|
|
self.assertEqual(self.type2test.fromhex(' 1A 2B 30 '), b)
|
2016-12-19 12:51:37 -04:00
|
|
|
|
|
|
|
# check that ASCII whitespace is ignored
|
|
|
|
self.assertEqual(self.type2test.fromhex(' 1A\n2B\t30\v'), b)
|
|
|
|
for c in "\x09\x0A\x0B\x0C\x0D\x20":
|
|
|
|
self.assertEqual(self.type2test.fromhex(c), self.type2test())
|
|
|
|
for c in "\x1C\x1D\x1E\x1F\x85\xa0\u2000\u2002\u2028":
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, c)
|
|
|
|
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(self.type2test.fromhex('0000'), b'\0\0')
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test.fromhex, b'1B')
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, 'a')
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, 'rt')
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, '1a b cd')
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, '\x00')
|
|
|
|
self.assertRaises(ValueError, self.type2test.fromhex, '12 \x00 34')
|
2007-02-27 04:40:54 -04:00
|
|
|
|
2015-10-14 06:25:33 -03:00
|
|
|
for data, pos in (
|
|
|
|
# invalid first hexadecimal character
|
|
|
|
('12 x4 56', 3),
|
|
|
|
# invalid second hexadecimal character
|
|
|
|
('12 3x 56', 4),
|
|
|
|
# two invalid hexadecimal characters
|
|
|
|
('12 xy 56', 3),
|
|
|
|
# test non-ASCII string
|
|
|
|
('12 3\xff 56', 4),
|
|
|
|
):
|
|
|
|
with self.assertRaises(ValueError) as cm:
|
|
|
|
self.type2test.fromhex(data)
|
|
|
|
self.assertIn('at position %s' % pos, str(cm.exception))
|
|
|
|
|
2015-04-25 20:22:26 -03:00
|
|
|
def test_hex(self):
|
|
|
|
self.assertRaises(TypeError, self.type2test.hex)
|
|
|
|
self.assertRaises(TypeError, self.type2test.hex, 1)
|
2015-04-26 02:05:53 -03:00
|
|
|
self.assertEqual(self.type2test(b"").hex(), "")
|
|
|
|
self.assertEqual(bytearray([0x1a, 0x2b, 0x30]).hex(), '1a2b30')
|
|
|
|
self.assertEqual(self.type2test(b"\x1a\x2b\x30").hex(), '1a2b30')
|
|
|
|
self.assertEqual(memoryview(b"\x1a\x2b\x30").hex(), '1a2b30')
|
2015-04-25 20:22:26 -03:00
|
|
|
|
2006-05-05 12:15:40 -03:00
|
|
|
def test_join(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertEqual(self.type2test(b"").join([]), b"")
|
|
|
|
self.assertEqual(self.type2test(b"").join([b""]), b"")
|
2007-08-27 15:31:48 -03:00
|
|
|
for lst in [[b"abc"], [b"a", b"bc"], [b"ab", b"c"], [b"a", b"b", b"c"]]:
|
2008-01-30 07:57:58 -04:00
|
|
|
lst = list(map(self.type2test, lst))
|
|
|
|
self.assertEqual(self.type2test(b"").join(lst), b"abc")
|
|
|
|
self.assertEqual(self.type2test(b"").join(tuple(lst)), b"abc")
|
|
|
|
self.assertEqual(self.type2test(b"").join(iter(lst)), b"abc")
|
2012-10-16 16:07:23 -03:00
|
|
|
dot_join = self.type2test(b".:").join
|
|
|
|
self.assertEqual(dot_join([b"ab", b"cd"]), b"ab.:cd")
|
|
|
|
self.assertEqual(dot_join([memoryview(b"ab"), b"cd"]), b"ab.:cd")
|
|
|
|
self.assertEqual(dot_join([b"ab", memoryview(b"cd")]), b"ab.:cd")
|
|
|
|
self.assertEqual(dot_join([bytearray(b"ab"), b"cd"]), b"ab.:cd")
|
|
|
|
self.assertEqual(dot_join([b"ab", bytearray(b"cd")]), b"ab.:cd")
|
|
|
|
# Stress it with many items
|
|
|
|
seq = [b"abc"] * 1000
|
|
|
|
expected = b"abc" + b".:abc" * 999
|
|
|
|
self.assertEqual(dot_join(seq), expected)
|
2014-09-28 13:56:42 -03:00
|
|
|
self.assertRaises(TypeError, self.type2test(b" ").join, None)
|
2012-10-16 16:07:23 -03:00
|
|
|
# Error handling and cleanup when some item in the middle of the
|
|
|
|
# sequence has the wrong type.
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
dot_join([bytearray(b"ab"), "cd", b"ef"])
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
dot_join([memoryview(b"ab"), "cd", b"ef"])
|
2007-02-23 15:56:57 -04:00
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_count(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2011-10-20 18:54:17 -03:00
|
|
|
i = 105
|
|
|
|
p = 112
|
|
|
|
w = 119
|
|
|
|
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertEqual(b.count(b'i'), 4)
|
|
|
|
self.assertEqual(b.count(b'ss'), 2)
|
|
|
|
self.assertEqual(b.count(b'w'), 0)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2011-10-20 18:54:17 -03:00
|
|
|
self.assertEqual(b.count(i), 4)
|
|
|
|
self.assertEqual(b.count(w), 0)
|
|
|
|
|
|
|
|
self.assertEqual(b.count(b'i', 6), 2)
|
|
|
|
self.assertEqual(b.count(b'p', 6), 2)
|
|
|
|
self.assertEqual(b.count(b'i', 1, 3), 1)
|
|
|
|
self.assertEqual(b.count(b'p', 7, 9), 1)
|
|
|
|
|
|
|
|
self.assertEqual(b.count(i, 6), 2)
|
|
|
|
self.assertEqual(b.count(p, 6), 2)
|
|
|
|
self.assertEqual(b.count(i, 1, 3), 1)
|
|
|
|
self.assertEqual(b.count(p, 7, 9), 1)
|
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_startswith(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'hello')
|
|
|
|
self.assertFalse(self.type2test().startswith(b"anything"))
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertTrue(b.startswith(b"hello"))
|
|
|
|
self.assertTrue(b.startswith(b"hel"))
|
|
|
|
self.assertTrue(b.startswith(b"h"))
|
|
|
|
self.assertFalse(b.startswith(b"hellow"))
|
|
|
|
self.assertFalse(b.startswith(b"ha"))
|
2011-04-26 00:40:59 -03:00
|
|
|
with self.assertRaises(TypeError) as cm:
|
2011-04-26 00:09:45 -03:00
|
|
|
b.startswith([b'h'])
|
2011-04-26 00:40:59 -03:00
|
|
|
exc = str(cm.exception)
|
2011-04-26 00:09:45 -03:00
|
|
|
self.assertIn('bytes', exc)
|
|
|
|
self.assertIn('tuple', exc)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
|
|
|
def test_endswith(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'hello')
|
2007-11-21 15:29:53 -04:00
|
|
|
self.assertFalse(bytearray().endswith(b"anything"))
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertTrue(b.endswith(b"hello"))
|
|
|
|
self.assertTrue(b.endswith(b"llo"))
|
|
|
|
self.assertTrue(b.endswith(b"o"))
|
|
|
|
self.assertFalse(b.endswith(b"whello"))
|
|
|
|
self.assertFalse(b.endswith(b"no"))
|
2011-04-26 00:40:59 -03:00
|
|
|
with self.assertRaises(TypeError) as cm:
|
2011-04-26 00:09:45 -03:00
|
|
|
b.endswith([b'o'])
|
2011-04-26 00:40:59 -03:00
|
|
|
exc = str(cm.exception)
|
2011-04-26 00:09:45 -03:00
|
|
|
self.assertIn('bytes', exc)
|
|
|
|
self.assertIn('tuple', exc)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
|
|
|
def test_find(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2011-10-20 18:54:17 -03:00
|
|
|
i = 105
|
|
|
|
w = 119
|
|
|
|
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertEqual(b.find(b'ss'), 2)
|
2011-10-20 18:54:17 -03:00
|
|
|
self.assertEqual(b.find(b'w'), -1)
|
|
|
|
self.assertEqual(b.find(b'mississippian'), -1)
|
|
|
|
|
|
|
|
self.assertEqual(b.find(i), 1)
|
|
|
|
self.assertEqual(b.find(w), -1)
|
|
|
|
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertEqual(b.find(b'ss', 3), 5)
|
|
|
|
self.assertEqual(b.find(b'ss', 1, 7), 2)
|
|
|
|
self.assertEqual(b.find(b'ss', 1, 3), -1)
|
2011-10-20 18:54:17 -03:00
|
|
|
|
|
|
|
self.assertEqual(b.find(i, 6), 7)
|
|
|
|
self.assertEqual(b.find(i, 1, 3), 1)
|
|
|
|
self.assertEqual(b.find(w, 1, 3), -1)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2011-12-17 20:17:41 -04:00
|
|
|
for index in (-1, 256, sys.maxsize + 1):
|
|
|
|
self.assertRaisesRegex(
|
|
|
|
ValueError, r'byte must be in range\(0, 256\)',
|
|
|
|
b.find, index)
|
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_rfind(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2011-10-20 18:54:17 -03:00
|
|
|
i = 105
|
|
|
|
w = 119
|
|
|
|
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertEqual(b.rfind(b'ss'), 5)
|
|
|
|
self.assertEqual(b.rfind(b'w'), -1)
|
|
|
|
self.assertEqual(b.rfind(b'mississippian'), -1)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2011-10-20 18:54:17 -03:00
|
|
|
self.assertEqual(b.rfind(i), 10)
|
|
|
|
self.assertEqual(b.rfind(w), -1)
|
|
|
|
|
|
|
|
self.assertEqual(b.rfind(b'ss', 3), 5)
|
|
|
|
self.assertEqual(b.rfind(b'ss', 0, 6), 2)
|
|
|
|
|
|
|
|
self.assertEqual(b.rfind(i, 1, 3), 1)
|
|
|
|
self.assertEqual(b.rfind(i, 3, 9), 7)
|
|
|
|
self.assertEqual(b.rfind(w, 1, 3), -1)
|
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_index(self):
|
2011-10-20 18:54:17 -03:00
|
|
|
b = self.type2test(b'mississippi')
|
|
|
|
i = 105
|
|
|
|
w = 119
|
|
|
|
|
|
|
|
self.assertEqual(b.index(b'ss'), 2)
|
|
|
|
self.assertRaises(ValueError, b.index, b'w')
|
|
|
|
self.assertRaises(ValueError, b.index, b'mississippian')
|
|
|
|
|
|
|
|
self.assertEqual(b.index(i), 1)
|
|
|
|
self.assertRaises(ValueError, b.index, w)
|
|
|
|
|
|
|
|
self.assertEqual(b.index(b'ss', 3), 5)
|
|
|
|
self.assertEqual(b.index(b'ss', 1, 7), 2)
|
|
|
|
self.assertRaises(ValueError, b.index, b'ss', 1, 3)
|
|
|
|
|
|
|
|
self.assertEqual(b.index(i, 6), 7)
|
|
|
|
self.assertEqual(b.index(i, 1, 3), 1)
|
|
|
|
self.assertRaises(ValueError, b.index, w, 1, 3)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
|
|
|
def test_rindex(self):
|
2011-10-20 18:54:17 -03:00
|
|
|
b = self.type2test(b'mississippi')
|
|
|
|
i = 105
|
|
|
|
w = 119
|
|
|
|
|
|
|
|
self.assertEqual(b.rindex(b'ss'), 5)
|
|
|
|
self.assertRaises(ValueError, b.rindex, b'w')
|
|
|
|
self.assertRaises(ValueError, b.rindex, b'mississippian')
|
|
|
|
|
|
|
|
self.assertEqual(b.rindex(i), 10)
|
|
|
|
self.assertRaises(ValueError, b.rindex, w)
|
|
|
|
|
|
|
|
self.assertEqual(b.rindex(b'ss', 3), 5)
|
|
|
|
self.assertEqual(b.rindex(b'ss', 0, 6), 2)
|
|
|
|
|
|
|
|
self.assertEqual(b.rindex(i, 1, 3), 1)
|
|
|
|
self.assertEqual(b.rindex(i, 3, 9), 7)
|
|
|
|
self.assertRaises(ValueError, b.rindex, w, 1, 3)
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2015-01-24 00:05:18 -04:00
|
|
|
def test_mod(self):
|
2016-04-15 08:11:10 -03:00
|
|
|
b = self.type2test(b'hello, %b!')
|
2015-01-24 00:05:18 -04:00
|
|
|
orig = b
|
|
|
|
b = b % b'world'
|
|
|
|
self.assertEqual(b, b'hello, world!')
|
|
|
|
self.assertEqual(orig, b'hello, %b!')
|
|
|
|
self.assertFalse(b is orig)
|
2016-04-15 08:11:10 -03:00
|
|
|
b = self.type2test(b'%s / 100 = %d%%')
|
2015-01-24 00:05:18 -04:00
|
|
|
a = b % (b'seventy-nine', 79)
|
2015-01-26 03:28:11 -04:00
|
|
|
self.assertEqual(a, b'seventy-nine / 100 = 79%')
|
2016-04-15 12:52:27 -03:00
|
|
|
self.assertIs(type(a), self.type2test)
|
2015-01-24 00:05:18 -04:00
|
|
|
|
|
|
|
def test_imod(self):
|
2016-04-15 08:11:10 -03:00
|
|
|
b = self.type2test(b'hello, %b!')
|
2015-01-24 00:05:18 -04:00
|
|
|
orig = b
|
|
|
|
b %= b'world'
|
|
|
|
self.assertEqual(b, b'hello, world!')
|
|
|
|
self.assertEqual(orig, b'hello, %b!')
|
|
|
|
self.assertFalse(b is orig)
|
2016-04-15 08:11:10 -03:00
|
|
|
b = self.type2test(b'%s / 100 = %d%%')
|
2015-01-24 00:05:18 -04:00
|
|
|
b %= (b'seventy-nine', 79)
|
2015-01-26 03:28:11 -04:00
|
|
|
self.assertEqual(b, b'seventy-nine / 100 = 79%')
|
2016-04-15 12:52:27 -03:00
|
|
|
self.assertIs(type(b), self.type2test)
|
2016-04-15 08:11:10 -03:00
|
|
|
|
|
|
|
def test_rmod(self):
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
object() % self.type2test(b'abc')
|
|
|
|
self.assertIs(self.type2test(b'abc').__rmod__('%r'), NotImplemented)
|
2015-01-24 00:05:18 -04:00
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_replace(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2007-08-27 17:40:10 -03:00
|
|
|
self.assertEqual(b.replace(b'i', b'a'), b'massassappa')
|
|
|
|
self.assertEqual(b.replace(b'ss', b'x'), b'mixixippi')
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2007-09-10 13:53:45 -03:00
|
|
|
def test_split_string_error(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test(b'a b').split, ' ')
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2010-01-12 18:05:42 -04:00
|
|
|
def test_split_unicodewhitespace(self):
|
2016-04-10 05:45:26 -03:00
|
|
|
for b in (b'a\x1Cb', b'a\x1Db', b'a\x1Eb', b'a\x1Fb'):
|
|
|
|
b = self.type2test(b)
|
|
|
|
self.assertEqual(b.split(), [b])
|
2010-01-12 18:05:42 -04:00
|
|
|
b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
|
|
|
|
self.assertEqual(b.split(), [b'\x1c\x1d\x1e\x1f'])
|
|
|
|
|
2007-11-06 17:34:58 -04:00
|
|
|
def test_rsplit_string_error(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test(b'a b').rsplit, ' ')
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2008-01-30 05:51:48 -04:00
|
|
|
def test_rsplit_unicodewhitespace(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b"\x09\x0A\x0B\x0C\x0D\x1C\x1D\x1E\x1F")
|
2008-01-30 05:51:48 -04:00
|
|
|
self.assertEqual(b.rsplit(), [b'\x1c\x1d\x1e\x1f'])
|
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
def test_partition(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2007-02-27 15:02:19 -04:00
|
|
|
self.assertEqual(b.partition(b'ss'), (b'mi', b'ss', b'issippi'))
|
2010-01-12 18:05:42 -04:00
|
|
|
self.assertEqual(b.partition(b'w'), (b'mississippi', b'', b''))
|
2007-02-27 15:02:19 -04:00
|
|
|
|
|
|
|
def test_rpartition(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'mississippi')
|
2007-02-27 15:02:19 -04:00
|
|
|
self.assertEqual(b.rpartition(b'ss'), (b'missi', b'ss', b'ippi'))
|
|
|
|
self.assertEqual(b.rpartition(b'i'), (b'mississipp', b'i', b''))
|
2010-01-12 18:05:42 -04:00
|
|
|
self.assertEqual(b.rpartition(b'w'), (b'', b'', b'mississippi'))
|
2007-02-27 15:02:19 -04:00
|
|
|
|
2007-04-11 01:37:43 -03:00
|
|
|
def test_pickling(self):
|
2008-10-22 21:38:15 -03:00
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
2007-07-19 21:22:32 -03:00
|
|
|
for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b)
|
2007-07-19 21:22:32 -03:00
|
|
|
ps = pickle.dumps(b, proto)
|
|
|
|
q = pickle.loads(ps)
|
|
|
|
self.assertEqual(b, q)
|
2007-04-11 01:37:43 -03:00
|
|
|
|
2012-04-03 07:49:41 -03:00
|
|
|
def test_iterator_pickling(self):
|
2014-12-15 08:03:42 -04:00
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
|
|
|
for b in b"", b"a", b"abc", b"\xffab\x80", b"\0\0\377\0\0":
|
|
|
|
it = itorg = iter(self.type2test(b))
|
|
|
|
data = list(self.type2test(b))
|
|
|
|
d = pickle.dumps(it, proto)
|
|
|
|
it = pickle.loads(d)
|
|
|
|
self.assertEqual(type(itorg), type(it))
|
|
|
|
self.assertEqual(list(it), data)
|
|
|
|
|
|
|
|
it = pickle.loads(d)
|
2016-03-06 08:10:24 -04:00
|
|
|
if not b:
|
2014-12-15 08:03:42 -04:00
|
|
|
continue
|
2016-03-06 08:10:24 -04:00
|
|
|
next(it)
|
2014-12-15 08:03:42 -04:00
|
|
|
d = pickle.dumps(it, proto)
|
|
|
|
it = pickle.loads(d)
|
|
|
|
self.assertEqual(list(it), data[1:])
|
2012-04-03 07:49:41 -03:00
|
|
|
|
2007-11-21 15:29:53 -04:00
|
|
|
def test_strip_bytearray(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertEqual(self.type2test(b'abc').strip(memoryview(b'ac')), b'b')
|
|
|
|
self.assertEqual(self.type2test(b'abc').lstrip(memoryview(b'ac')), b'bc')
|
|
|
|
self.assertEqual(self.type2test(b'abc').rstrip(memoryview(b'ac')), b'ab')
|
2007-09-10 13:53:45 -03:00
|
|
|
|
|
|
|
def test_strip_string_error(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertRaises(TypeError, self.type2test(b'abc').strip, 'b')
|
|
|
|
self.assertRaises(TypeError, self.type2test(b'abc').lstrip, 'b')
|
|
|
|
self.assertRaises(TypeError, self.type2test(b'abc').rstrip, 'b')
|
2007-09-10 13:53:45 -03:00
|
|
|
|
2011-07-29 01:05:08 -03:00
|
|
|
def test_center(self):
|
|
|
|
# Fill character can be either bytes or bytearray (issue 12380)
|
|
|
|
b = self.type2test(b'abc')
|
|
|
|
for fill_type in (bytes, bytearray):
|
|
|
|
self.assertEqual(b.center(7, fill_type(b'-')),
|
|
|
|
self.type2test(b'--abc--'))
|
|
|
|
|
|
|
|
def test_ljust(self):
|
|
|
|
# Fill character can be either bytes or bytearray (issue 12380)
|
|
|
|
b = self.type2test(b'abc')
|
|
|
|
for fill_type in (bytes, bytearray):
|
|
|
|
self.assertEqual(b.ljust(7, fill_type(b'-')),
|
|
|
|
self.type2test(b'abc----'))
|
|
|
|
|
|
|
|
def test_rjust(self):
|
|
|
|
# Fill character can be either bytes or bytearray (issue 12380)
|
|
|
|
b = self.type2test(b'abc')
|
|
|
|
for fill_type in (bytes, bytearray):
|
|
|
|
self.assertEqual(b.rjust(7, fill_type(b'-')),
|
|
|
|
self.type2test(b'----abc'))
|
|
|
|
|
2007-05-08 18:05:48 -03:00
|
|
|
def test_ord(self):
|
2008-01-30 07:57:58 -04:00
|
|
|
b = self.type2test(b'\0A\x7f\x80\xff')
|
2007-05-08 18:05:48 -03:00
|
|
|
self.assertEqual([ord(b[i:i+1]) for i in range(len(b))],
|
|
|
|
[0, 65, 127, 128, 255])
|
|
|
|
|
2009-04-12 12:51:51 -03:00
|
|
|
def test_maketrans(self):
|
|
|
|
transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
|
|
|
|
self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
|
2009-10-14 14:14:16 -03:00
|
|
|
transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
|
|
|
|
self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
|
2009-04-12 12:51:51 -03:00
|
|
|
self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
|
|
|
|
self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
|
|
|
|
|
2011-04-20 12:09:23 -03:00
|
|
|
def test_none_arguments(self):
|
|
|
|
# issue 11828
|
|
|
|
b = self.type2test(b'hello')
|
|
|
|
l = self.type2test(b'l')
|
|
|
|
h = self.type2test(b'h')
|
|
|
|
x = self.type2test(b'x')
|
|
|
|
o = self.type2test(b'o')
|
|
|
|
|
|
|
|
self.assertEqual(2, b.find(l, None))
|
|
|
|
self.assertEqual(3, b.find(l, -2, None))
|
|
|
|
self.assertEqual(2, b.find(l, None, -2))
|
|
|
|
self.assertEqual(0, b.find(h, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(3, b.rfind(l, None))
|
|
|
|
self.assertEqual(3, b.rfind(l, -2, None))
|
|
|
|
self.assertEqual(2, b.rfind(l, None, -2))
|
|
|
|
self.assertEqual(0, b.rfind(h, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(2, b.index(l, None))
|
|
|
|
self.assertEqual(3, b.index(l, -2, None))
|
|
|
|
self.assertEqual(2, b.index(l, None, -2))
|
|
|
|
self.assertEqual(0, b.index(h, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(3, b.rindex(l, None))
|
|
|
|
self.assertEqual(3, b.rindex(l, -2, None))
|
|
|
|
self.assertEqual(2, b.rindex(l, None, -2))
|
|
|
|
self.assertEqual(0, b.rindex(h, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(2, b.count(l, None))
|
|
|
|
self.assertEqual(1, b.count(l, -2, None))
|
|
|
|
self.assertEqual(1, b.count(l, None, -2))
|
|
|
|
self.assertEqual(0, b.count(x, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(True, b.endswith(o, None))
|
|
|
|
self.assertEqual(True, b.endswith(o, -2, None))
|
|
|
|
self.assertEqual(True, b.endswith(l, None, -2))
|
|
|
|
self.assertEqual(False, b.endswith(x, None, None))
|
|
|
|
|
|
|
|
self.assertEqual(True, b.startswith(h, None))
|
|
|
|
self.assertEqual(True, b.startswith(l, -2, None))
|
|
|
|
self.assertEqual(True, b.startswith(h, None, -2))
|
|
|
|
self.assertEqual(False, b.startswith(x, None, None))
|
|
|
|
|
2011-10-20 18:54:17 -03:00
|
|
|
def test_integer_arguments_out_of_byte_range(self):
|
|
|
|
b = self.type2test(b'hello')
|
|
|
|
|
|
|
|
for method in (b.count, b.find, b.index, b.rfind, b.rindex):
|
|
|
|
self.assertRaises(ValueError, method, -1)
|
|
|
|
self.assertRaises(ValueError, method, 256)
|
|
|
|
self.assertRaises(ValueError, method, 9999)
|
|
|
|
|
2011-04-20 12:09:23 -03:00
|
|
|
def test_find_etc_raise_correct_error_messages(self):
|
|
|
|
# issue 11828
|
|
|
|
b = self.type2test(b'hello')
|
|
|
|
x = self.type2test(b'x')
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\bfind\b', b.find,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\brfind\b', b.rfind,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\bindex\b', b.index,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\brindex\b', b.rindex,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\bcount\b', b.count,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\bstartswith\b', b.startswith,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
2011-04-20 15:56:21 -03:00
|
|
|
self.assertRaisesRegex(TypeError, r'\bendswith\b', b.endswith,
|
2011-04-20 12:09:23 -03:00
|
|
|
x, None, None, None)
|
|
|
|
|
Issue #26494: Fixed crash on iterating exhausting iterators.
Affected classes are generic sequence iterators, iterators of str, bytes,
bytearray, list, tuple, set, frozenset, dict, OrderedDict, corresponding
views and os.scandir() iterator.
2016-03-30 14:40:02 -03:00
|
|
|
def test_free_after_iterating(self):
|
|
|
|
test.support.check_free_after_iterating(self, iter, self.type2test)
|
|
|
|
test.support.check_free_after_iterating(self, reversed, self.type2test)
|
|
|
|
|
2016-08-27 05:35:02 -03:00
|
|
|
def test_translate(self):
|
|
|
|
b = self.type2test(b'hello')
|
|
|
|
rosetta = bytearray(range(256))
|
|
|
|
rosetta[ord('o')] = ord('e')
|
|
|
|
|
|
|
|
self.assertRaises(TypeError, b.translate)
|
|
|
|
self.assertRaises(TypeError, b.translate, None, None)
|
|
|
|
self.assertRaises(ValueError, b.translate, bytes(range(255)))
|
|
|
|
|
|
|
|
c = b.translate(rosetta, b'hello')
|
|
|
|
self.assertEqual(b, b'hello')
|
|
|
|
self.assertIsInstance(c, self.type2test)
|
|
|
|
|
|
|
|
c = b.translate(rosetta)
|
|
|
|
d = b.translate(rosetta, b'')
|
|
|
|
self.assertEqual(c, d)
|
|
|
|
self.assertEqual(c, b'helle')
|
|
|
|
|
|
|
|
c = b.translate(rosetta, b'l')
|
|
|
|
self.assertEqual(c, b'hee')
|
|
|
|
c = b.translate(None, b'e')
|
|
|
|
self.assertEqual(c, b'hllo')
|
|
|
|
|
|
|
|
# test delete as a keyword argument
|
|
|
|
c = b.translate(rosetta, delete=b'')
|
|
|
|
self.assertEqual(c, b'helle')
|
|
|
|
c = b.translate(rosetta, delete=b'l')
|
|
|
|
self.assertEqual(c, b'hee')
|
|
|
|
c = b.translate(None, delete=b'e')
|
|
|
|
self.assertEqual(c, b'hllo')
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class BytesTest(BaseBytesTest, unittest.TestCase):
|
2008-01-30 07:57:58 -04:00
|
|
|
type2test = bytes
|
|
|
|
|
2014-08-02 02:30:37 -03:00
|
|
|
def test_getitem_error(self):
|
|
|
|
msg = "byte indices must be integers or slices"
|
|
|
|
with self.assertRaisesRegex(TypeError, msg):
|
|
|
|
b'python'['a']
|
|
|
|
|
2008-08-02 18:02:48 -03:00
|
|
|
def test_buffer_is_readonly(self):
|
2014-07-28 17:07:07 -03:00
|
|
|
fd = os.open(__file__, os.O_RDONLY)
|
2008-08-16 20:28:44 -03:00
|
|
|
with open(fd, "rb", buffering=0) as f:
|
2008-08-02 18:02:48 -03:00
|
|
|
self.assertRaises(TypeError, f.readinto, b"")
|
|
|
|
|
2008-08-26 13:46:47 -03:00
|
|
|
def test_custom(self):
|
|
|
|
class A:
|
|
|
|
def __bytes__(self):
|
|
|
|
return b'abc'
|
|
|
|
self.assertEqual(bytes(A()), b'abc')
|
|
|
|
class A: pass
|
|
|
|
self.assertRaises(TypeError, bytes, A())
|
|
|
|
class A:
|
|
|
|
def __bytes__(self):
|
|
|
|
return None
|
|
|
|
self.assertRaises(TypeError, bytes, A())
|
2012-12-19 17:27:41 -04:00
|
|
|
class A:
|
|
|
|
def __bytes__(self):
|
|
|
|
return b'a'
|
|
|
|
def __index__(self):
|
|
|
|
return 42
|
|
|
|
self.assertEqual(bytes(A()), b'a')
|
2015-12-20 10:36:34 -04:00
|
|
|
# Issue #25766
|
|
|
|
class A(str):
|
|
|
|
def __bytes__(self):
|
|
|
|
return b'abc'
|
|
|
|
self.assertEqual(bytes(A('\u20ac')), b'abc')
|
|
|
|
self.assertEqual(bytes(A('\u20ac'), 'iso8859-15'), b'\xa4')
|
2015-11-25 09:47:01 -04:00
|
|
|
# Issue #24731
|
|
|
|
class A:
|
|
|
|
def __bytes__(self):
|
|
|
|
return OtherBytesSubclass(b'abc')
|
|
|
|
self.assertEqual(bytes(A()), b'abc')
|
|
|
|
self.assertIs(type(bytes(A())), OtherBytesSubclass)
|
|
|
|
self.assertEqual(BytesSubclass(A()), b'abc')
|
|
|
|
self.assertIs(type(BytesSubclass(A())), BytesSubclass)
|
2008-08-26 13:46:47 -03:00
|
|
|
|
2011-01-04 23:33:28 -04:00
|
|
|
# Test PyBytes_FromFormat()
|
|
|
|
def test_from_format(self):
|
2015-10-13 21:55:12 -03:00
|
|
|
ctypes = test.support.import_module('ctypes')
|
2015-10-13 19:21:35 -03:00
|
|
|
_testcapi = test.support.import_module('_testcapi')
|
|
|
|
from ctypes import pythonapi, py_object
|
|
|
|
from ctypes import (
|
|
|
|
c_int, c_uint,
|
|
|
|
c_long, c_ulong,
|
|
|
|
c_size_t, c_ssize_t,
|
|
|
|
c_char_p)
|
|
|
|
|
2011-01-04 23:33:28 -04:00
|
|
|
PyBytes_FromFormat = pythonapi.PyBytes_FromFormat
|
|
|
|
PyBytes_FromFormat.restype = py_object
|
|
|
|
|
2015-10-13 19:21:35 -03:00
|
|
|
# basic tests
|
2011-01-04 23:33:28 -04:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b'format'),
|
|
|
|
b'format')
|
2015-10-13 19:21:35 -03:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b'Hello %s !', b'world'),
|
|
|
|
b'Hello world !')
|
|
|
|
|
|
|
|
# test formatters
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(0)),
|
|
|
|
b'c=\0')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(ord('@'))),
|
|
|
|
b'c=@')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'c=%c', c_int(255)),
|
|
|
|
b'c=\xff')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
|
|
|
|
c_int(1), c_long(2),
|
|
|
|
c_size_t(3)),
|
|
|
|
b'd=1 ld=2 zd=3')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'd=%d ld=%ld zd=%zd',
|
|
|
|
c_int(-1), c_long(-2),
|
|
|
|
c_size_t(-3)),
|
|
|
|
b'd=-1 ld=-2 zd=-3')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'u=%u lu=%lu zu=%zu',
|
|
|
|
c_uint(123), c_ulong(456),
|
|
|
|
c_size_t(789)),
|
|
|
|
b'u=123 lu=456 zu=789')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(123)),
|
|
|
|
b'i=123')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'i=%i', c_int(-123)),
|
|
|
|
b'i=-123')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'x=%x', c_int(0xabc)),
|
|
|
|
b'x=abc')
|
2015-10-14 10:28:59 -03:00
|
|
|
|
|
|
|
sizeof_ptr = ctypes.sizeof(c_char_p)
|
|
|
|
|
|
|
|
if os.name == 'nt':
|
|
|
|
# Windows (MSCRT)
|
|
|
|
ptr_format = '0x%0{}X'.format(2 * sizeof_ptr)
|
|
|
|
def ptr_formatter(ptr):
|
|
|
|
return (ptr_format % ptr)
|
|
|
|
else:
|
|
|
|
# UNIX (glibc)
|
|
|
|
def ptr_formatter(ptr):
|
|
|
|
return '%#x' % ptr
|
|
|
|
|
2015-10-13 21:55:12 -03:00
|
|
|
ptr = 0xabcdef
|
2015-10-14 10:28:59 -03:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b'ptr=%p', c_char_p(ptr)),
|
|
|
|
('ptr=' + ptr_formatter(ptr)).encode('ascii'))
|
2015-10-13 19:21:35 -03:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b's=%s', c_char_p(b'cstr')),
|
|
|
|
b's=cstr')
|
|
|
|
|
|
|
|
# test minimum and maximum integer values
|
|
|
|
size_max = c_size_t(-1).value
|
|
|
|
for formatstr, ctypes_type, value, py_formatter in (
|
|
|
|
(b'%d', c_int, _testcapi.INT_MIN, str),
|
|
|
|
(b'%d', c_int, _testcapi.INT_MAX, str),
|
|
|
|
(b'%ld', c_long, _testcapi.LONG_MIN, str),
|
|
|
|
(b'%ld', c_long, _testcapi.LONG_MAX, str),
|
|
|
|
(b'%lu', c_ulong, _testcapi.ULONG_MAX, str),
|
|
|
|
(b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MIN, str),
|
|
|
|
(b'%zd', c_ssize_t, _testcapi.PY_SSIZE_T_MAX, str),
|
|
|
|
(b'%zu', c_size_t, size_max, str),
|
2015-10-14 10:28:59 -03:00
|
|
|
(b'%p', c_char_p, size_max, ptr_formatter),
|
2015-10-13 19:21:35 -03:00
|
|
|
):
|
|
|
|
self.assertEqual(PyBytes_FromFormat(formatstr, ctypes_type(value)),
|
|
|
|
py_formatter(value).encode('ascii')),
|
|
|
|
|
|
|
|
# width and precision (width is currently ignored)
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%5s', b'a'),
|
|
|
|
b'a')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%.3s', b'abcdef'),
|
|
|
|
b'abc')
|
|
|
|
|
|
|
|
# '%%' formatter
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%%'),
|
|
|
|
b'%')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'[%%]'),
|
|
|
|
b'[%]')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%%%c', c_int(ord('_'))),
|
|
|
|
b'%_')
|
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%%s'),
|
|
|
|
b'%s')
|
|
|
|
|
|
|
|
# Invalid formats and partial formatting
|
2011-01-04 23:33:28 -04:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b'%'), b'%')
|
2015-10-13 19:21:35 -03:00
|
|
|
self.assertEqual(PyBytes_FromFormat(b'x=%i y=%', c_int(2), c_int(3)),
|
|
|
|
b'x=2 y=%')
|
2011-01-04 23:33:28 -04:00
|
|
|
|
2015-10-13 19:21:35 -03:00
|
|
|
# Issue #19969: %c must raise OverflowError for values
|
|
|
|
# not in the range [0; 255]
|
2013-12-13 07:14:44 -04:00
|
|
|
self.assertRaises(OverflowError,
|
|
|
|
PyBytes_FromFormat, b'%c', c_int(-1))
|
|
|
|
self.assertRaises(OverflowError,
|
|
|
|
PyBytes_FromFormat, b'%c', c_int(256))
|
|
|
|
|
2016-08-18 13:22:23 -03:00
|
|
|
def test_bytes_blocking(self):
|
|
|
|
class IterationBlocked(list):
|
|
|
|
__bytes__ = None
|
|
|
|
i = [0, 1, 2, 3]
|
|
|
|
self.assertEqual(bytes(i), b'\x00\x01\x02\x03')
|
|
|
|
self.assertRaises(TypeError, bytes, IterationBlocked(i))
|
|
|
|
|
|
|
|
# At least in CPython, because bytes.__new__ and the C API
|
|
|
|
# PyBytes_FromObject have different fallback rules, integer
|
|
|
|
# fallback is handled specially, so test separately.
|
|
|
|
class IntBlocked(int):
|
|
|
|
__bytes__ = None
|
|
|
|
self.assertEqual(bytes(3), b'\0\0\0')
|
|
|
|
self.assertRaises(TypeError, bytes, IntBlocked(3))
|
|
|
|
|
|
|
|
# While there is no separately-defined rule for handling bytes
|
|
|
|
# subclasses differently from other buffer-interface classes,
|
|
|
|
# an implementation may well special-case them (as CPython 2.x
|
|
|
|
# str did), so test them separately.
|
|
|
|
class BytesSubclassBlocked(bytes):
|
|
|
|
__bytes__ = None
|
|
|
|
self.assertEqual(bytes(b'ab'), b'ab')
|
|
|
|
self.assertRaises(TypeError, bytes, BytesSubclassBlocked(b'ab'))
|
|
|
|
|
|
|
|
class BufferBlocked(bytearray):
|
|
|
|
__bytes__ = None
|
|
|
|
ba, bb = bytearray(b'ab'), BufferBlocked(b'ab')
|
|
|
|
self.assertEqual(bytes(ba), b'ab')
|
|
|
|
self.assertRaises(TypeError, bytes, bb)
|
|
|
|
|
2008-08-02 18:02:48 -03:00
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class ByteArrayTest(BaseBytesTest, unittest.TestCase):
|
2008-01-30 07:57:58 -04:00
|
|
|
type2test = bytearray
|
|
|
|
|
2014-08-02 02:30:37 -03:00
|
|
|
def test_getitem_error(self):
|
|
|
|
msg = "bytearray indices must be integers or slices"
|
|
|
|
with self.assertRaisesRegex(TypeError, msg):
|
|
|
|
bytearray(b'python')['a']
|
|
|
|
|
|
|
|
def test_setitem_error(self):
|
|
|
|
msg = "bytearray indices must be integers or slices"
|
|
|
|
with self.assertRaisesRegex(TypeError, msg):
|
|
|
|
b = bytearray(b'python')
|
|
|
|
b['a'] = "python"
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_nohash(self):
|
|
|
|
self.assertRaises(TypeError, hash, bytearray())
|
|
|
|
|
|
|
|
def test_bytearray_api(self):
|
|
|
|
short_sample = b"Hello world\n"
|
|
|
|
sample = short_sample + b"\0"*(20 - len(short_sample))
|
|
|
|
tfn = tempfile.mktemp()
|
|
|
|
try:
|
|
|
|
# Prepare
|
|
|
|
with open(tfn, "wb") as f:
|
|
|
|
f.write(short_sample)
|
|
|
|
# Test readinto
|
|
|
|
with open(tfn, "rb") as f:
|
|
|
|
b = bytearray(20)
|
|
|
|
n = f.readinto(b)
|
|
|
|
self.assertEqual(n, len(short_sample))
|
|
|
|
self.assertEqual(list(b), list(sample))
|
|
|
|
# Test writing in binary mode
|
|
|
|
with open(tfn, "wb") as f:
|
|
|
|
f.write(b)
|
|
|
|
with open(tfn, "rb") as f:
|
|
|
|
self.assertEqual(f.read(), sample)
|
|
|
|
# Text mode is ambiguous; don't test
|
|
|
|
finally:
|
|
|
|
try:
|
|
|
|
os.remove(tfn)
|
2012-12-24 13:58:48 -04:00
|
|
|
except OSError:
|
2008-01-30 07:57:58 -04:00
|
|
|
pass
|
|
|
|
|
|
|
|
def test_reverse(self):
|
|
|
|
b = bytearray(b'hello')
|
|
|
|
self.assertEqual(b.reverse(), None)
|
|
|
|
self.assertEqual(b, b'olleh')
|
|
|
|
b = bytearray(b'hello1') # test even number of items
|
|
|
|
b.reverse()
|
|
|
|
self.assertEqual(b, b'1olleh')
|
|
|
|
b = bytearray()
|
|
|
|
b.reverse()
|
|
|
|
self.assertFalse(b)
|
|
|
|
|
2011-03-03 14:21:02 -04:00
|
|
|
def test_clear(self):
|
|
|
|
b = bytearray(b'python')
|
|
|
|
b.clear()
|
|
|
|
self.assertEqual(b, b'')
|
|
|
|
|
|
|
|
b = bytearray(b'')
|
|
|
|
b.clear()
|
|
|
|
self.assertEqual(b, b'')
|
|
|
|
|
|
|
|
b = bytearray(b'')
|
|
|
|
b.append(ord('r'))
|
|
|
|
b.clear()
|
|
|
|
b.append(ord('p'))
|
|
|
|
self.assertEqual(b, b'p')
|
|
|
|
|
|
|
|
def test_copy(self):
|
|
|
|
b = bytearray(b'abc')
|
|
|
|
bb = b.copy()
|
|
|
|
self.assertEqual(bb, b'abc')
|
|
|
|
|
|
|
|
b = bytearray(b'')
|
|
|
|
bb = b.copy()
|
|
|
|
self.assertEqual(bb, b'')
|
|
|
|
|
|
|
|
# test that it's indeed a copy and not a reference
|
|
|
|
b = bytearray(b'abc')
|
|
|
|
bb = b.copy()
|
|
|
|
self.assertEqual(b, bb)
|
|
|
|
self.assertIsNot(b, bb)
|
|
|
|
bb.append(ord('d'))
|
|
|
|
self.assertEqual(bb, b'abcd')
|
|
|
|
self.assertEqual(b, b'abc')
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_regexps(self):
|
|
|
|
def by(s):
|
|
|
|
return bytearray(map(ord, s))
|
|
|
|
b = by("Hello, world")
|
2008-08-19 14:56:33 -03:00
|
|
|
self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_setitem(self):
|
|
|
|
b = bytearray([1, 2, 3])
|
|
|
|
b[1] = 100
|
|
|
|
self.assertEqual(b, bytearray([1, 100, 3]))
|
|
|
|
b[-1] = 200
|
|
|
|
self.assertEqual(b, bytearray([1, 100, 200]))
|
2008-07-16 20:15:30 -03:00
|
|
|
b[0] = Indexable(10)
|
2008-01-30 07:57:58 -04:00
|
|
|
self.assertEqual(b, bytearray([10, 100, 200]))
|
|
|
|
try:
|
|
|
|
b[3] = 0
|
|
|
|
self.fail("Didn't raise IndexError")
|
|
|
|
except IndexError:
|
|
|
|
pass
|
|
|
|
try:
|
|
|
|
b[-10] = 0
|
|
|
|
self.fail("Didn't raise IndexError")
|
|
|
|
except IndexError:
|
|
|
|
pass
|
|
|
|
try:
|
|
|
|
b[0] = 256
|
|
|
|
self.fail("Didn't raise ValueError")
|
|
|
|
except ValueError:
|
|
|
|
pass
|
|
|
|
try:
|
2008-07-16 20:15:30 -03:00
|
|
|
b[0] = Indexable(-1)
|
2008-01-30 07:57:58 -04:00
|
|
|
self.fail("Didn't raise ValueError")
|
|
|
|
except ValueError:
|
|
|
|
pass
|
|
|
|
try:
|
|
|
|
b[0] = None
|
|
|
|
self.fail("Didn't raise TypeError")
|
|
|
|
except TypeError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
def test_delitem(self):
|
|
|
|
b = bytearray(range(10))
|
|
|
|
del b[0]
|
|
|
|
self.assertEqual(b, bytearray(range(1, 10)))
|
|
|
|
del b[-1]
|
|
|
|
self.assertEqual(b, bytearray(range(1, 9)))
|
|
|
|
del b[4]
|
|
|
|
self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
|
|
|
|
|
|
|
|
def test_setslice(self):
|
|
|
|
b = bytearray(range(10))
|
|
|
|
self.assertEqual(list(b), list(range(10)))
|
|
|
|
|
|
|
|
b[0:5] = bytearray([1, 1, 1, 1, 1])
|
|
|
|
self.assertEqual(b, bytearray([1, 1, 1, 1, 1, 5, 6, 7, 8, 9]))
|
|
|
|
|
|
|
|
del b[0:-5]
|
|
|
|
self.assertEqual(b, bytearray([5, 6, 7, 8, 9]))
|
|
|
|
|
|
|
|
b[0:0] = bytearray([0, 1, 2, 3, 4])
|
|
|
|
self.assertEqual(b, bytearray(range(10)))
|
|
|
|
|
|
|
|
b[-7:-3] = bytearray([100, 101])
|
|
|
|
self.assertEqual(b, bytearray([0, 1, 2, 100, 101, 7, 8, 9]))
|
|
|
|
|
|
|
|
b[3:5] = [3, 4, 5, 6]
|
|
|
|
self.assertEqual(b, bytearray(range(10)))
|
|
|
|
|
|
|
|
b[3:0] = [42, 42, 42]
|
|
|
|
self.assertEqual(b, bytearray([0, 1, 2, 42, 42, 42, 3, 4, 5, 6, 7, 8, 9]))
|
|
|
|
|
2012-11-03 16:19:06 -03:00
|
|
|
b[3:] = b'foo'
|
|
|
|
self.assertEqual(b, bytearray([0, 1, 2, 102, 111, 111]))
|
|
|
|
|
|
|
|
b[:3] = memoryview(b'foo')
|
|
|
|
self.assertEqual(b, bytearray([102, 111, 111, 102, 111, 111]))
|
|
|
|
|
|
|
|
b[3:4] = []
|
|
|
|
self.assertEqual(b, bytearray([102, 111, 111, 111, 111]))
|
|
|
|
|
|
|
|
for elem in [5, -5, 0, int(10e20), 'str', 2.3,
|
|
|
|
['a', 'b'], [b'a', b'b'], [[]]]:
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
b[3:4] = elem
|
|
|
|
|
|
|
|
for elem in [[254, 255, 256], [-256, 9000]]:
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
b[3:4] = elem
|
|
|
|
|
2013-10-05 16:12:18 -03:00
|
|
|
def test_setslice_extend(self):
|
|
|
|
# Exercise the resizing logic (see issue #19087)
|
|
|
|
b = bytearray(range(100))
|
|
|
|
self.assertEqual(list(b), list(range(100)))
|
|
|
|
del b[:10]
|
|
|
|
self.assertEqual(list(b), list(range(10, 100)))
|
|
|
|
b.extend(range(100, 110))
|
|
|
|
self.assertEqual(list(b), list(range(10, 110)))
|
|
|
|
|
2015-05-19 15:52:27 -03:00
|
|
|
def test_fifo_overrun(self):
|
|
|
|
# Test for issue #23985, a buffer overrun when implementing a FIFO
|
|
|
|
# Build Python in pydebug mode for best results.
|
|
|
|
b = bytearray(10)
|
|
|
|
b.pop() # Defeat expanding buffer off-by-one quirk
|
|
|
|
del b[:1] # Advance start pointer without reallocating
|
|
|
|
b += bytes(2) # Append exactly the number of deleted bytes
|
|
|
|
del b # Free memory buffer, allowing pydebug verification
|
|
|
|
|
|
|
|
def test_del_expand(self):
|
|
|
|
# Reducing the size should not expand the buffer (issue #23985)
|
|
|
|
b = bytearray(10)
|
|
|
|
size = sys.getsizeof(b)
|
|
|
|
del b[:1]
|
|
|
|
self.assertLessEqual(sys.getsizeof(b), size)
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_extended_set_del_slice(self):
|
2010-01-29 13:27:24 -04:00
|
|
|
indices = (0, None, 1, 3, 19, 300, 1<<333, -1, -2, -31, -300)
|
2008-01-30 07:57:58 -04:00
|
|
|
for start in indices:
|
|
|
|
for stop in indices:
|
|
|
|
# Skip invalid step 0
|
|
|
|
for step in indices[1:]:
|
|
|
|
L = list(range(255))
|
|
|
|
b = bytearray(L)
|
|
|
|
# Make sure we have a slice of exactly the right length,
|
|
|
|
# but with different data.
|
|
|
|
data = L[start:stop:step]
|
|
|
|
data.reverse()
|
|
|
|
L[start:stop:step] = data
|
|
|
|
b[start:stop:step] = data
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, bytearray(L))
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
del L[start:stop:step]
|
|
|
|
del b[start:stop:step]
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, bytearray(L))
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_setslice_trap(self):
|
|
|
|
# This test verifies that we correctly handle assigning self
|
|
|
|
# to a slice of self (the old Lambert Meertens trap).
|
|
|
|
b = bytearray(range(256))
|
|
|
|
b[8:] = b
|
|
|
|
self.assertEqual(b, bytearray(list(range(8)) + list(range(256))))
|
|
|
|
|
|
|
|
def test_iconcat(self):
|
|
|
|
b = bytearray(b"abc")
|
|
|
|
b1 = b
|
|
|
|
b += b"def"
|
|
|
|
self.assertEqual(b, b"abcdef")
|
|
|
|
self.assertEqual(b, b1)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b is b1)
|
2008-01-30 07:57:58 -04:00
|
|
|
b += b"xyz"
|
|
|
|
self.assertEqual(b, b"abcdefxyz")
|
|
|
|
try:
|
|
|
|
b += ""
|
|
|
|
except TypeError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
self.fail("bytes += unicode didn't raise TypeError")
|
|
|
|
|
|
|
|
def test_irepeat(self):
|
|
|
|
b = bytearray(b"abc")
|
|
|
|
b1 = b
|
|
|
|
b *= 3
|
|
|
|
self.assertEqual(b, b"abcabcabc")
|
|
|
|
self.assertEqual(b, b1)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b is b1)
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_irepeat_1char(self):
|
|
|
|
b = bytearray(b"x")
|
|
|
|
b1 = b
|
|
|
|
b *= 100
|
|
|
|
self.assertEqual(b, b"x"*100)
|
|
|
|
self.assertEqual(b, b1)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b is b1)
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_alloc(self):
|
|
|
|
b = bytearray()
|
|
|
|
alloc = b.__alloc__()
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(alloc >= 0)
|
2008-01-30 07:57:58 -04:00
|
|
|
seq = [alloc]
|
|
|
|
for i in range(100):
|
|
|
|
b += b"x"
|
|
|
|
alloc = b.__alloc__()
|
2015-06-29 15:14:06 -03:00
|
|
|
self.assertGreater(alloc, len(b)) # including trailing null byte
|
2008-01-30 07:57:58 -04:00
|
|
|
if alloc not in seq:
|
|
|
|
seq.append(alloc)
|
|
|
|
|
2015-06-29 15:14:06 -03:00
|
|
|
def test_init_alloc(self):
|
|
|
|
b = bytearray()
|
|
|
|
def g():
|
|
|
|
for i in range(1, 100):
|
|
|
|
yield i
|
|
|
|
a = list(b)
|
|
|
|
self.assertEqual(a, list(range(1, len(a)+1)))
|
|
|
|
self.assertEqual(len(b), len(a))
|
|
|
|
self.assertLessEqual(len(b), i)
|
|
|
|
alloc = b.__alloc__()
|
|
|
|
self.assertGreater(alloc, len(b)) # including trailing null byte
|
|
|
|
b.__init__(g())
|
|
|
|
self.assertEqual(list(b), list(range(1, 100)))
|
|
|
|
self.assertEqual(len(b), 99)
|
|
|
|
alloc = b.__alloc__()
|
|
|
|
self.assertGreater(alloc, len(b))
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_extend(self):
|
|
|
|
orig = b'hello'
|
|
|
|
a = bytearray(orig)
|
|
|
|
a.extend(a)
|
|
|
|
self.assertEqual(a, orig + orig)
|
|
|
|
self.assertEqual(a[5:], orig)
|
|
|
|
a = bytearray(b'')
|
|
|
|
# Test iterators that don't have a __length_hint__
|
|
|
|
a.extend(map(int, orig * 25))
|
|
|
|
a.extend(int(x) for x in orig * 25)
|
|
|
|
self.assertEqual(a, orig * 50)
|
|
|
|
self.assertEqual(a[-5:], orig)
|
|
|
|
a = bytearray(b'')
|
|
|
|
a.extend(iter(map(int, orig * 50)))
|
|
|
|
self.assertEqual(a, orig * 50)
|
|
|
|
self.assertEqual(a[-5:], orig)
|
|
|
|
a = bytearray(b'')
|
|
|
|
a.extend(list(map(int, orig * 50)))
|
|
|
|
self.assertEqual(a, orig * 50)
|
|
|
|
self.assertEqual(a[-5:], orig)
|
|
|
|
a = bytearray(b'')
|
|
|
|
self.assertRaises(ValueError, a.extend, [0, 1, 2, 256])
|
|
|
|
self.assertRaises(ValueError, a.extend, [0, 1, 2, -1])
|
|
|
|
self.assertEqual(len(a), 0)
|
2008-07-16 20:15:30 -03:00
|
|
|
a = bytearray(b'')
|
|
|
|
a.extend([Indexable(ord('a'))])
|
|
|
|
self.assertEqual(a, b'a')
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_remove(self):
|
|
|
|
b = bytearray(b'hello')
|
|
|
|
b.remove(ord('l'))
|
|
|
|
self.assertEqual(b, b'helo')
|
|
|
|
b.remove(ord('l'))
|
|
|
|
self.assertEqual(b, b'heo')
|
|
|
|
self.assertRaises(ValueError, lambda: b.remove(ord('l')))
|
|
|
|
self.assertRaises(ValueError, lambda: b.remove(400))
|
|
|
|
self.assertRaises(TypeError, lambda: b.remove('e'))
|
|
|
|
# remove first and last
|
|
|
|
b.remove(ord('o'))
|
|
|
|
b.remove(ord('h'))
|
|
|
|
self.assertEqual(b, b'e')
|
|
|
|
self.assertRaises(TypeError, lambda: b.remove(b'e'))
|
2008-07-16 20:15:30 -03:00
|
|
|
b.remove(Indexable(ord('e')))
|
|
|
|
self.assertEqual(b, b'')
|
2008-01-30 07:57:58 -04:00
|
|
|
|
2016-05-16 16:15:38 -03:00
|
|
|
# test values outside of the ascii range: (0, 127)
|
|
|
|
c = bytearray([126, 127, 128, 129])
|
|
|
|
c.remove(127)
|
|
|
|
self.assertEqual(c, bytes([126, 128, 129]))
|
|
|
|
c.remove(129)
|
|
|
|
self.assertEqual(c, bytes([126, 128]))
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_pop(self):
|
|
|
|
b = bytearray(b'world')
|
|
|
|
self.assertEqual(b.pop(), ord('d'))
|
|
|
|
self.assertEqual(b.pop(0), ord('w'))
|
|
|
|
self.assertEqual(b.pop(-2), ord('r'))
|
|
|
|
self.assertRaises(IndexError, lambda: b.pop(10))
|
2011-03-04 00:55:25 -04:00
|
|
|
self.assertRaises(IndexError, lambda: bytearray().pop())
|
2009-09-06 07:19:23 -03:00
|
|
|
# test for issue #6846
|
|
|
|
self.assertEqual(bytearray(b'\xff').pop(), 0xff)
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_nosort(self):
|
|
|
|
self.assertRaises(AttributeError, lambda: bytearray().sort())
|
|
|
|
|
|
|
|
def test_append(self):
|
|
|
|
b = bytearray(b'hell')
|
|
|
|
b.append(ord('o'))
|
|
|
|
self.assertEqual(b, b'hello')
|
|
|
|
self.assertEqual(b.append(100), None)
|
|
|
|
b = bytearray()
|
|
|
|
b.append(ord('A'))
|
|
|
|
self.assertEqual(len(b), 1)
|
|
|
|
self.assertRaises(TypeError, lambda: b.append(b'o'))
|
2008-07-16 20:15:30 -03:00
|
|
|
b = bytearray()
|
|
|
|
b.append(Indexable(ord('A')))
|
|
|
|
self.assertEqual(b, b'A')
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_insert(self):
|
|
|
|
b = bytearray(b'msssspp')
|
|
|
|
b.insert(1, ord('i'))
|
|
|
|
b.insert(4, ord('i'))
|
|
|
|
b.insert(-2, ord('i'))
|
|
|
|
b.insert(1000, ord('i'))
|
|
|
|
self.assertEqual(b, b'mississippi')
|
|
|
|
self.assertRaises(TypeError, lambda: b.insert(0, b'1'))
|
2008-07-16 20:15:30 -03:00
|
|
|
b = bytearray()
|
|
|
|
b.insert(0, Indexable(ord('A')))
|
|
|
|
self.assertEqual(b, b'A')
|
2008-01-30 07:57:58 -04:00
|
|
|
|
2008-11-19 18:05:52 -04:00
|
|
|
def test_copied(self):
|
|
|
|
# Issue 4348. Make sure that operations that don't mutate the array
|
|
|
|
# copy the bytes.
|
|
|
|
b = bytearray(b'abc')
|
Merged revisions 67295,67301-67302,67318,67330,67342-67343 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67295 | benjamin.peterson | 2008-11-20 05:05:12 +0100 (jeu., 20 nov. 2008) | 1 line
move useful sys.settrace information to the function's documentation from the debugger
........
r67301 | benjamin.peterson | 2008-11-20 22:25:31 +0100 (jeu., 20 nov. 2008) | 1 line
fix indentation and a sphinx warning
........
r67302 | benjamin.peterson | 2008-11-20 22:44:23 +0100 (jeu., 20 nov. 2008) | 1 line
oops! didn't mean to disable that test
........
r67318 | amaury.forgeotdarc | 2008-11-21 23:05:48 +0100 (ven., 21 nov. 2008) | 4 lines
#4363: Let uuid.uuid1() and uuid.uuid4() run even if the ctypes module is not present.
Will backport to 2.6
........
r67330 | georg.brandl | 2008-11-22 09:34:14 +0100 (sam., 22 nov. 2008) | 2 lines
#4364: fix attribute name on ctypes object.
........
r67342 | amaury.forgeotdarc | 2008-11-22 20:39:38 +0100 (sam., 22 nov. 2008) | 3 lines
yuvconvert.c is a part of the "sv" module, an old IRIX thing
and certainly not useful for any Windows build.
........
r67343 | amaury.forgeotdarc | 2008-11-22 21:01:18 +0100 (sam., 22 nov. 2008) | 5 lines
#3996: On Windows, PyOS_CheckStack is supposed to protect the interpreter from
stack overflow. But doing this, it always crashes when the stack is nearly full.
Reviewed by Martin von Loewis. Will backport to 2.6.
........
2008-11-22 18:18:04 -04:00
|
|
|
self.assertFalse(b is b.replace(b'abc', b'cde', 0))
|
2008-11-19 18:05:52 -04:00
|
|
|
|
|
|
|
t = bytearray([i for i in range(256)])
|
|
|
|
x = bytearray(b'')
|
|
|
|
self.assertFalse(x is x.translate(t))
|
|
|
|
|
2007-11-21 15:29:53 -04:00
|
|
|
def test_partition_bytearray_doesnt_share_nullstring(self):
|
|
|
|
a, b, c = bytearray(b"x").partition(b"y")
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b, b"")
|
|
|
|
self.assertEqual(c, b"")
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b is not c)
|
2007-11-06 17:34:58 -04:00
|
|
|
b += b"!"
|
|
|
|
self.assertEqual(c, b"")
|
2007-11-21 15:29:53 -04:00
|
|
|
a, b, c = bytearray(b"x").partition(b"y")
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b, b"")
|
|
|
|
self.assertEqual(c, b"")
|
|
|
|
# Same for rpartition
|
2007-11-21 15:29:53 -04:00
|
|
|
b, c, a = bytearray(b"x").rpartition(b"y")
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b, b"")
|
|
|
|
self.assertEqual(c, b"")
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(b is not c)
|
2007-11-06 17:34:58 -04:00
|
|
|
b += b"!"
|
|
|
|
self.assertEqual(c, b"")
|
2007-11-21 15:29:53 -04:00
|
|
|
c, b, a = bytearray(b"x").rpartition(b"y")
|
2007-11-06 17:34:58 -04:00
|
|
|
self.assertEqual(b, b"")
|
|
|
|
self.assertEqual(c, b"")
|
|
|
|
|
2008-12-06 17:27:53 -04:00
|
|
|
def test_resize_forbidden(self):
|
|
|
|
# #4509: can't resize a bytearray when there are buffer exports, even
|
|
|
|
# if it wouldn't reallocate the underlying buffer.
|
|
|
|
# Furthermore, no destructive changes to the buffer may be applied
|
|
|
|
# before raising the error.
|
|
|
|
b = bytearray(range(10))
|
|
|
|
v = memoryview(b)
|
|
|
|
def resize(n):
|
|
|
|
b[1:-1] = range(n + 1, 2*n - 1)
|
|
|
|
resize(10)
|
|
|
|
orig = b[:]
|
|
|
|
self.assertRaises(BufferError, resize, 11)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
self.assertRaises(BufferError, resize, 9)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
self.assertRaises(BufferError, resize, 0)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
# Other operations implying resize
|
|
|
|
self.assertRaises(BufferError, b.pop, 0)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
self.assertRaises(BufferError, b.remove, b[1])
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
def delitem():
|
|
|
|
del b[1]
|
|
|
|
self.assertRaises(BufferError, delitem)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2008-12-06 17:27:53 -04:00
|
|
|
# deleting a non-contiguous slice
|
|
|
|
def delslice():
|
|
|
|
b[1:-1:2] = b""
|
|
|
|
self.assertRaises(BufferError, delslice)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(b, orig)
|
2007-11-06 17:34:58 -04:00
|
|
|
|
2015-02-03 16:43:23 -04:00
|
|
|
@test.support.cpython_only
|
|
|
|
def test_obsolete_write_lock(self):
|
|
|
|
from _testcapi import getbuffer_with_null_view
|
|
|
|
self.assertRaises(BufferError, getbuffer_with_null_view, bytearray())
|
2010-01-17 08:38:54 -04:00
|
|
|
|
2016-03-06 08:10:24 -04:00
|
|
|
def test_iterator_pickling2(self):
|
|
|
|
orig = bytearray(b'abc')
|
|
|
|
data = list(b'qwerty')
|
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
|
|
|
# initial iterator
|
|
|
|
itorig = iter(orig)
|
|
|
|
d = pickle.dumps((itorig, orig), proto)
|
|
|
|
it, b = pickle.loads(d)
|
|
|
|
b[:] = data
|
|
|
|
self.assertEqual(type(it), type(itorig))
|
|
|
|
self.assertEqual(list(it), data)
|
|
|
|
|
|
|
|
# running iterator
|
|
|
|
next(itorig)
|
|
|
|
d = pickle.dumps((itorig, orig), proto)
|
|
|
|
it, b = pickle.loads(d)
|
|
|
|
b[:] = data
|
|
|
|
self.assertEqual(type(it), type(itorig))
|
|
|
|
self.assertEqual(list(it), data[1:])
|
|
|
|
|
|
|
|
# empty iterator
|
|
|
|
for i in range(1, len(orig)):
|
|
|
|
next(itorig)
|
|
|
|
d = pickle.dumps((itorig, orig), proto)
|
|
|
|
it, b = pickle.loads(d)
|
|
|
|
b[:] = data
|
|
|
|
self.assertEqual(type(it), type(itorig))
|
|
|
|
self.assertEqual(list(it), data[len(orig):])
|
|
|
|
|
|
|
|
# exhausted iterator
|
|
|
|
self.assertRaises(StopIteration, next, itorig)
|
|
|
|
d = pickle.dumps((itorig, orig), proto)
|
|
|
|
it, b = pickle.loads(d)
|
|
|
|
b[:] = data
|
|
|
|
self.assertEqual(list(it), [])
|
|
|
|
|
2016-03-30 15:01:26 -03:00
|
|
|
test_exhausted_iterator = test.list_tests.CommonTest.test_exhausted_iterator
|
2016-03-06 08:10:24 -04:00
|
|
|
|
2016-07-03 08:41:36 -03:00
|
|
|
def test_iterator_length_hint(self):
|
|
|
|
# Issue 27443: __length_hint__ can return negative integer
|
|
|
|
ba = bytearray(b'ab')
|
|
|
|
it = iter(ba)
|
|
|
|
next(it)
|
|
|
|
ba.clear()
|
|
|
|
# Shouldn't raise an error
|
|
|
|
self.assertEqual(list(it), [])
|
|
|
|
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
class AssortedBytesTest(unittest.TestCase):
|
|
|
|
#
|
|
|
|
# Test various combinations of bytes and bytearray
|
|
|
|
#
|
|
|
|
|
2010-09-03 17:00:37 -03:00
|
|
|
@check_bytes_warnings
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_repr_str(self):
|
2010-09-03 17:00:37 -03:00
|
|
|
for f in str, repr:
|
|
|
|
self.assertEqual(f(bytearray()), "bytearray(b'')")
|
|
|
|
self.assertEqual(f(bytearray([0])), "bytearray(b'\\x00')")
|
|
|
|
self.assertEqual(f(bytearray([0, 1, 254, 255])),
|
|
|
|
"bytearray(b'\\x00\\x01\\xfe\\xff')")
|
|
|
|
self.assertEqual(f(b"abc"), "b'abc'")
|
|
|
|
self.assertEqual(f(b"'"), '''b"'"''') # '''
|
|
|
|
self.assertEqual(f(b"'\""), r"""b'\'"'""") # '
|
2008-01-30 07:57:58 -04:00
|
|
|
|
2016-10-30 14:33:54 -03:00
|
|
|
@check_bytes_warnings
|
|
|
|
def test_format(self):
|
|
|
|
for b in b'abc', bytearray(b'abc'):
|
|
|
|
self.assertEqual(format(b), str(b))
|
|
|
|
self.assertEqual(format(b, ''), str(b))
|
|
|
|
with self.assertRaisesRegex(TypeError,
|
|
|
|
r'\b%s\b' % re.escape(type(b).__name__)):
|
|
|
|
format(b, 's')
|
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_compare_bytes_to_bytearray(self):
|
|
|
|
self.assertEqual(b"abc" == bytes(b"abc"), True)
|
|
|
|
self.assertEqual(b"ab" != bytes(b"abc"), True)
|
|
|
|
self.assertEqual(b"ab" <= bytes(b"abc"), True)
|
|
|
|
self.assertEqual(b"ab" < bytes(b"abc"), True)
|
|
|
|
self.assertEqual(b"abc" >= bytes(b"ab"), True)
|
|
|
|
self.assertEqual(b"abc" > bytes(b"ab"), True)
|
|
|
|
|
|
|
|
self.assertEqual(b"abc" != bytes(b"abc"), False)
|
|
|
|
self.assertEqual(b"ab" == bytes(b"abc"), False)
|
|
|
|
self.assertEqual(b"ab" > bytes(b"abc"), False)
|
|
|
|
self.assertEqual(b"ab" >= bytes(b"abc"), False)
|
|
|
|
self.assertEqual(b"abc" < bytes(b"ab"), False)
|
|
|
|
self.assertEqual(b"abc" <= bytes(b"ab"), False)
|
|
|
|
|
|
|
|
self.assertEqual(bytes(b"abc") == b"abc", True)
|
|
|
|
self.assertEqual(bytes(b"ab") != b"abc", True)
|
|
|
|
self.assertEqual(bytes(b"ab") <= b"abc", True)
|
|
|
|
self.assertEqual(bytes(b"ab") < b"abc", True)
|
|
|
|
self.assertEqual(bytes(b"abc") >= b"ab", True)
|
|
|
|
self.assertEqual(bytes(b"abc") > b"ab", True)
|
|
|
|
|
|
|
|
self.assertEqual(bytes(b"abc") != b"abc", False)
|
|
|
|
self.assertEqual(bytes(b"ab") == b"abc", False)
|
|
|
|
self.assertEqual(bytes(b"ab") > b"abc", False)
|
|
|
|
self.assertEqual(bytes(b"ab") >= b"abc", False)
|
|
|
|
self.assertEqual(bytes(b"abc") < b"ab", False)
|
|
|
|
self.assertEqual(bytes(b"abc") <= b"ab", False)
|
|
|
|
|
2013-01-26 08:06:36 -04:00
|
|
|
@test.support.requires_docstrings
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_doc(self):
|
2010-03-19 16:00:44 -03:00
|
|
|
self.assertIsNotNone(bytearray.__doc__)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(bytearray.__doc__.startswith("bytearray("), bytearray.__doc__)
|
2010-03-19 16:00:44 -03:00
|
|
|
self.assertIsNotNone(bytes.__doc__)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(bytes.__doc__.startswith("bytes("), bytes.__doc__)
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_from_bytearray(self):
|
|
|
|
sample = bytes(b"Hello world\n\x80\x81\xfe\xff")
|
|
|
|
buf = memoryview(sample)
|
|
|
|
b = bytearray(buf)
|
|
|
|
self.assertEqual(b, bytearray(sample))
|
|
|
|
|
2010-09-03 17:00:37 -03:00
|
|
|
@check_bytes_warnings
|
2008-01-30 07:57:58 -04:00
|
|
|
def test_to_str(self):
|
2010-09-03 17:00:37 -03:00
|
|
|
self.assertEqual(str(b''), "b''")
|
|
|
|
self.assertEqual(str(b'x'), "b'x'")
|
|
|
|
self.assertEqual(str(b'\x80'), "b'\\x80'")
|
|
|
|
self.assertEqual(str(bytearray(b'')), "bytearray(b'')")
|
|
|
|
self.assertEqual(str(bytearray(b'x')), "bytearray(b'x')")
|
|
|
|
self.assertEqual(str(bytearray(b'\x80')), "bytearray(b'\\x80')")
|
2008-01-30 07:57:58 -04:00
|
|
|
|
|
|
|
def test_literal(self):
|
|
|
|
tests = [
|
|
|
|
(b"Wonderful spam", "Wonderful spam"),
|
|
|
|
(br"Wonderful spam too", "Wonderful spam too"),
|
|
|
|
(b"\xaa\x00\000\200", "\xaa\x00\000\200"),
|
|
|
|
(br"\xaa\x00\000\200", r"\xaa\x00\000\200"),
|
|
|
|
]
|
|
|
|
for b, s in tests:
|
|
|
|
self.assertEqual(b, bytearray(s, 'latin-1'))
|
|
|
|
for c in range(128, 256):
|
|
|
|
self.assertRaises(SyntaxError, eval,
|
|
|
|
'b"%s"' % chr(c))
|
|
|
|
|
|
|
|
def test_split_bytearray(self):
|
|
|
|
self.assertEqual(b'a b'.split(memoryview(b' ')), [b'a', b'b'])
|
|
|
|
|
|
|
|
def test_rsplit_bytearray(self):
|
|
|
|
self.assertEqual(b'a b'.rsplit(memoryview(b' ')), [b'a', b'b'])
|
|
|
|
|
2008-05-30 09:05:02 -03:00
|
|
|
def test_return_self(self):
|
|
|
|
# bytearray.replace must always return a new bytearray
|
|
|
|
b = bytearray()
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertFalse(b.replace(b'', b'') is b)
|
2008-05-30 09:05:02 -03:00
|
|
|
|
2015-03-20 11:54:57 -03:00
|
|
|
@unittest.skipUnless(sys.flags.bytes_warning,
|
|
|
|
"BytesWarning is needed for this test: use -bb option")
|
2008-10-16 22:50:37 -03:00
|
|
|
def test_compare(self):
|
2015-03-20 11:54:57 -03:00
|
|
|
def bytes_warning():
|
|
|
|
return test.support.check_warnings(('', BytesWarning))
|
|
|
|
with bytes_warning():
|
|
|
|
b'' == ''
|
|
|
|
with bytes_warning():
|
|
|
|
'' == b''
|
|
|
|
with bytes_warning():
|
|
|
|
b'' != ''
|
|
|
|
with bytes_warning():
|
|
|
|
'' != b''
|
|
|
|
with bytes_warning():
|
|
|
|
bytearray(b'') == ''
|
|
|
|
with bytes_warning():
|
|
|
|
'' == bytearray(b'')
|
|
|
|
with bytes_warning():
|
|
|
|
bytearray(b'') != ''
|
|
|
|
with bytes_warning():
|
|
|
|
'' != bytearray(b'')
|
|
|
|
with bytes_warning():
|
|
|
|
b'\0' == 0
|
|
|
|
with bytes_warning():
|
|
|
|
0 == b'\0'
|
|
|
|
with bytes_warning():
|
|
|
|
b'\0' != 0
|
|
|
|
with bytes_warning():
|
|
|
|
0 != b'\0'
|
2008-10-16 22:50:37 -03:00
|
|
|
|
2006-04-24 10:47:05 -03:00
|
|
|
# Optimizations:
|
2006-04-23 04:43:54 -03:00
|
|
|
# __iter__? (optimization)
|
2006-04-24 10:47:05 -03:00
|
|
|
# __reversed__? (optimization)
|
|
|
|
|
2007-04-12 22:39:34 -03:00
|
|
|
# XXX More string methods? (Those that don't use character properties)
|
|
|
|
|
2007-02-27 15:02:19 -04:00
|
|
|
# There are tests in string_tests.py that are more
|
2016-04-10 05:45:26 -03:00
|
|
|
# comprehensive for things like partition, etc.
|
2007-02-27 15:02:19 -04:00
|
|
|
# Unfortunately they are all bundled with tests that
|
|
|
|
# are not appropriate for bytes
|
2006-04-23 04:43:54 -03:00
|
|
|
|
2007-11-21 15:29:53 -04:00
|
|
|
# I've started porting some of those into bytearray_tests.py, we should port
|
2007-10-16 03:31:30 -03:00
|
|
|
# the rest that make sense (the code can be cleaned up to use modern
|
|
|
|
# unittest methods at the same time).
|
|
|
|
|
2016-04-06 03:37:17 -03:00
|
|
|
class BytearrayPEP3137Test(unittest.TestCase):
|
2007-10-16 03:31:30 -03:00
|
|
|
def marshal(self, x):
|
2007-11-21 15:29:53 -04:00
|
|
|
return bytearray(x)
|
2007-10-16 03:31:30 -03:00
|
|
|
|
|
|
|
def test_returns_new_copy(self):
|
|
|
|
val = self.marshal(b'1234')
|
|
|
|
# On immutable types these MAY return a reference to themselves
|
2007-11-21 15:29:53 -04:00
|
|
|
# but on mutable types like bytearray they MUST return a new copy.
|
2007-10-16 03:31:30 -03:00
|
|
|
for methname in ('zfill', 'rjust', 'ljust', 'center'):
|
|
|
|
method = getattr(val, methname)
|
|
|
|
newval = method(3)
|
|
|
|
self.assertEqual(val, newval)
|
|
|
|
self.assertTrue(val is not newval,
|
|
|
|
methname+' returned self on a mutable object')
|
2010-01-13 11:03:39 -04:00
|
|
|
for expr in ('val.split()[0]', 'val.rsplit()[0]',
|
|
|
|
'val.partition(b".")[0]', 'val.rpartition(b".")[2]',
|
|
|
|
'val.splitlines()[0]', 'val.replace(b"", b"")'):
|
|
|
|
newval = eval(expr)
|
|
|
|
self.assertEqual(val, newval)
|
|
|
|
self.assertTrue(val is not newval,
|
|
|
|
expr+' returned val on a mutable object')
|
2012-10-16 16:07:23 -03:00
|
|
|
sep = self.marshal(b'')
|
|
|
|
newval = sep.join([val])
|
|
|
|
self.assertEqual(val, newval)
|
|
|
|
self.assertIsNot(val, newval)
|
|
|
|
|
2006-04-22 20:28:04 -03:00
|
|
|
|
2008-01-30 07:57:58 -04:00
|
|
|
class FixedStringTest(test.string_tests.BaseTest):
|
2007-08-27 15:31:48 -03:00
|
|
|
def fixtype(self, obj):
|
|
|
|
if isinstance(obj, str):
|
2016-04-06 03:37:17 -03:00
|
|
|
return self.type2test(obj.encode("utf-8"))
|
2007-08-27 15:31:48 -03:00
|
|
|
return super().fixtype(obj)
|
|
|
|
|
2016-04-06 03:37:17 -03:00
|
|
|
contains_bytes = True
|
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class ByteArrayAsStringTest(FixedStringTest, unittest.TestCase):
|
2008-01-30 07:57:58 -04:00
|
|
|
type2test = bytearray
|
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class BytesAsStringTest(FixedStringTest, unittest.TestCase):
|
2008-01-30 07:57:58 -04:00
|
|
|
type2test = bytes
|
|
|
|
|
2007-03-06 15:16:20 -04:00
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class SubclassTest:
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
def test_basic(self):
|
2016-05-12 06:33:21 -03:00
|
|
|
self.assertTrue(issubclass(self.type2test, self.basetype))
|
|
|
|
self.assertIsInstance(self.type2test(), self.basetype)
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
a, b = b"abcd", b"efgh"
|
2016-05-12 06:33:21 -03:00
|
|
|
_a, _b = self.type2test(a), self.type2test(b)
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
# test comparison operators with subclass instances
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(_a == _a)
|
|
|
|
self.assertTrue(_a != _b)
|
|
|
|
self.assertTrue(_a < _b)
|
|
|
|
self.assertTrue(_a <= _b)
|
|
|
|
self.assertTrue(_b >= _a)
|
|
|
|
self.assertTrue(_b > _a)
|
|
|
|
self.assertTrue(_a is not a)
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
# test concat of subclass instances
|
|
|
|
self.assertEqual(a + b, _a + _b)
|
|
|
|
self.assertEqual(a + b, a + _b)
|
|
|
|
self.assertEqual(a + b, _a + b)
|
|
|
|
|
|
|
|
# test repeat
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(a*5 == _a*5)
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
def test_join(self):
|
|
|
|
# Make sure join returns a NEW object for single item sequences
|
|
|
|
# involving a subclass.
|
|
|
|
# Make sure that it is of the appropriate type.
|
2016-05-12 06:33:21 -03:00
|
|
|
s1 = self.type2test(b"abcd")
|
|
|
|
s2 = self.basetype().join([s1])
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(s1 is not s2)
|
2016-05-12 06:33:21 -03:00
|
|
|
self.assertTrue(type(s2) is self.basetype, type(s2))
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
# Test reverse, calling join on subclass
|
|
|
|
s3 = s1.join([b"abcd"])
|
2016-05-12 06:33:21 -03:00
|
|
|
self.assertTrue(type(s3) is self.basetype)
|
2007-11-02 21:24:24 -03:00
|
|
|
|
|
|
|
def test_pickle(self):
|
2016-05-12 06:33:21 -03:00
|
|
|
a = self.type2test(b"abcd")
|
2007-11-02 21:24:24 -03:00
|
|
|
a.x = 10
|
2016-05-12 06:33:21 -03:00
|
|
|
a.y = self.type2test(b"efgh")
|
2008-10-22 21:38:15 -03:00
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
2007-11-02 21:24:24 -03:00
|
|
|
b = pickle.loads(pickle.dumps(a, proto))
|
|
|
|
self.assertNotEqual(id(a), id(b))
|
|
|
|
self.assertEqual(a, b)
|
|
|
|
self.assertEqual(a.x, b.x)
|
|
|
|
self.assertEqual(a.y, b.y)
|
|
|
|
self.assertEqual(type(a), type(b))
|
|
|
|
self.assertEqual(type(a.y), type(b.y))
|
|
|
|
|
|
|
|
def test_copy(self):
|
2016-05-12 06:33:21 -03:00
|
|
|
a = self.type2test(b"abcd")
|
2007-11-02 21:24:24 -03:00
|
|
|
a.x = 10
|
2016-05-12 06:33:21 -03:00
|
|
|
a.y = self.type2test(b"efgh")
|
2007-11-02 21:24:24 -03:00
|
|
|
for copy_method in (copy.copy, copy.deepcopy):
|
|
|
|
b = copy_method(a)
|
|
|
|
self.assertNotEqual(id(a), id(b))
|
|
|
|
self.assertEqual(a, b)
|
|
|
|
self.assertEqual(a.x, b.x)
|
|
|
|
self.assertEqual(a.y, b.y)
|
|
|
|
self.assertEqual(type(a), type(b))
|
|
|
|
self.assertEqual(type(a.y), type(b.y))
|
|
|
|
|
2016-07-01 11:22:31 -03:00
|
|
|
def test_fromhex(self):
|
|
|
|
b = self.type2test.fromhex('1a2B30')
|
|
|
|
self.assertEqual(b, b'\x1a\x2b\x30')
|
|
|
|
self.assertIs(type(b), self.type2test)
|
|
|
|
|
|
|
|
class B1(self.basetype):
|
|
|
|
def __new__(cls, value):
|
|
|
|
me = self.basetype.__new__(cls, value)
|
|
|
|
me.foo = 'bar'
|
|
|
|
return me
|
|
|
|
|
|
|
|
b = B1.fromhex('1a2B30')
|
|
|
|
self.assertEqual(b, b'\x1a\x2b\x30')
|
|
|
|
self.assertIs(type(b), B1)
|
|
|
|
self.assertEqual(b.foo, 'bar')
|
|
|
|
|
|
|
|
class B2(self.basetype):
|
|
|
|
def __init__(me, *args, **kwargs):
|
|
|
|
if self.basetype is not bytes:
|
|
|
|
self.basetype.__init__(me, *args, **kwargs)
|
|
|
|
me.foo = 'bar'
|
|
|
|
|
|
|
|
b = B2.fromhex('1a2B30')
|
|
|
|
self.assertEqual(b, b'\x1a\x2b\x30')
|
|
|
|
self.assertIs(type(b), B2)
|
|
|
|
self.assertEqual(b.foo, 'bar')
|
2016-05-12 06:33:21 -03:00
|
|
|
|
2010-01-11 21:23:09 -04:00
|
|
|
|
|
|
|
class ByteArraySubclass(bytearray):
|
|
|
|
pass
|
|
|
|
|
|
|
|
class BytesSubclass(bytes):
|
|
|
|
pass
|
|
|
|
|
2015-11-25 09:47:01 -04:00
|
|
|
class OtherBytesSubclass(bytes):
|
|
|
|
pass
|
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class ByteArraySubclassTest(SubclassTest, unittest.TestCase):
|
2016-05-12 06:33:21 -03:00
|
|
|
basetype = bytearray
|
|
|
|
type2test = ByteArraySubclass
|
2010-01-11 21:23:09 -04:00
|
|
|
|
2007-11-02 21:24:24 -03:00
|
|
|
def test_init_override(self):
|
2007-11-21 15:29:53 -04:00
|
|
|
class subclass(bytearray):
|
2010-01-11 21:23:09 -04:00
|
|
|
def __init__(me, newarg=1, *args, **kwargs):
|
|
|
|
bytearray.__init__(me, *args, **kwargs)
|
|
|
|
x = subclass(4, b"abcd")
|
2007-11-02 21:24:24 -03:00
|
|
|
x = subclass(4, source=b"abcd")
|
|
|
|
self.assertEqual(x, b"abcd")
|
|
|
|
x = subclass(newarg=4, source=b"abcd")
|
|
|
|
self.assertEqual(x, b"abcd")
|
|
|
|
|
|
|
|
|
2013-01-10 01:43:26 -04:00
|
|
|
class BytesSubclassTest(SubclassTest, unittest.TestCase):
|
2016-05-12 06:33:21 -03:00
|
|
|
basetype = bytes
|
|
|
|
type2test = BytesSubclass
|
2010-01-11 21:23:09 -04:00
|
|
|
|
|
|
|
|
2006-04-22 20:28:04 -03:00
|
|
|
if __name__ == "__main__":
|
2013-01-10 01:43:26 -04:00
|
|
|
unittest.main()
|