gh-94808: Add coverage for bytesarray_setitem (#95802)

This commit is contained in:
Michael Droettboom 2022-10-10 11:28:41 -04:00 committed by GitHub
parent 187e853690
commit dfcdee4a18
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 85 additions and 41 deletions

View file

@ -1225,6 +1225,8 @@ class BytesTest(BaseBytesTest, unittest.TestCase):
class ByteArrayTest(BaseBytesTest, unittest.TestCase):
type2test = bytearray
_testcapi = import_helper.import_module('_testcapi')
def test_getitem_error(self):
b = bytearray(b'python')
msg = "bytearray indices must be integers or slices"
@ -1317,47 +1319,73 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase):
self.assertEqual(re.findall(br"\w+", b), [by("Hello"), by("world")])
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]))
b[0] = Indexable(10)
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:
b[0] = Indexable(-1)
self.fail("Didn't raise ValueError")
except ValueError:
pass
try:
b[0] = None
self.fail("Didn't raise TypeError")
except TypeError:
pass
def setitem_as_mapping(b, i, val):
b[i] = val
def setitem_as_sequence(b, i, val):
self._testcapi.sequence_setitem(b, i, val)
def do_tests(setitem):
b = bytearray([1, 2, 3])
setitem(b, 1, 100)
self.assertEqual(b, bytearray([1, 100, 3]))
setitem(b, -1, 200)
self.assertEqual(b, bytearray([1, 100, 200]))
setitem(b, 0, Indexable(10))
self.assertEqual(b, bytearray([10, 100, 200]))
try:
setitem(b, 3, 0)
self.fail("Didn't raise IndexError")
except IndexError:
pass
try:
setitem(b, -10, 0)
self.fail("Didn't raise IndexError")
except IndexError:
pass
try:
setitem(b, 0, 256)
self.fail("Didn't raise ValueError")
except ValueError:
pass
try:
setitem(b, 0, Indexable(-1))
self.fail("Didn't raise ValueError")
except ValueError:
pass
try:
setitem(b, 0, None)
self.fail("Didn't raise TypeError")
except TypeError:
pass
with self.subTest("tp_as_mapping"):
do_tests(setitem_as_mapping)
with self.subTest("tp_as_sequence"):
do_tests(setitem_as_sequence)
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 del_as_mapping(b, i):
del b[i]
def del_as_sequence(b, i):
self._testcapi.sequence_delitem(b, i)
def do_tests(delete):
b = bytearray(range(10))
delete(b, 0)
self.assertEqual(b, bytearray(range(1, 10)))
delete(b, -1)
self.assertEqual(b, bytearray(range(1, 9)))
delete(b, 4)
self.assertEqual(b, bytearray([1, 2, 3, 4, 6, 7, 8]))
with self.subTest("tp_as_mapping"):
do_tests(del_as_mapping)
with self.subTest("tp_as_sequence"):
do_tests(del_as_sequence)
def test_setslice(self):
b = bytearray(range(10))
@ -1729,6 +1757,8 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase):
self.assertEqual(b3, b'xcxcxc')
def test_mutating_index(self):
# See gh-91153
class Boom:
def __index__(self):
b.clear()
@ -1740,10 +1770,9 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase):
b[0] = Boom()
with self.subTest("tp_as_sequence"):
_testcapi = import_helper.import_module('_testcapi')
b = bytearray(b'Now you see me...')
with self.assertRaises(IndexError):
_testcapi.sequence_setitem(b, 0, Boom())
self._testcapi.sequence_setitem(b, 0, Boom())
class AssortedBytesTest(unittest.TestCase):