diff options
author | Victor Stinner <vstinner@python.org> | 2023-11-13 16:14:56 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-13 16:14:56 (GMT) |
commit | babb787047e0f7807c8238d3b1a3128dac30bd5c (patch) | |
tree | 868cd78ee07ef9c20a5af32db79f979c543b8f0e /Lib | |
parent | 29af7369dbbbba8cefafb196e977bce8189a527d (diff) | |
download | cpython-babb787047e0f7807c8238d3b1a3128dac30bd5c.zip cpython-babb787047e0f7807c8238d3b1a3128dac30bd5c.tar.gz cpython-babb787047e0f7807c8238d3b1a3128dac30bd5c.tar.bz2 |
gh-111138: Add PyList_Extend() and PyList_Clear() functions (#111862)
* Split list_extend() into two sub-functions: list_extend_fast() and
list_extend_iter().
* list_inplace_concat() no longer has to call Py_DECREF() on the
list_extend() result, since list_extend() now returns an int.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_capi/test_list.py | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/Lib/test/test_capi/test_list.py b/Lib/test/test_capi/test_list.py index 197da03..eb03d51 100644 --- a/Lib/test/test_capi/test_list.py +++ b/Lib/test/test_capi/test_list.py @@ -1,5 +1,6 @@ +import gc +import weakref import unittest -import sys from test.support import import_helper from collections import UserList _testcapi = import_helper.import_module('_testcapi') @@ -12,6 +13,15 @@ class ListSubclass(list): pass +class DelAppend: + def __init__(self, lst, item): + self.lst = lst + self.item = item + + def __del__(self): + self.lst.append(self.item) + + class CAPITest(unittest.TestCase): def test_check(self): # Test PyList_Check() @@ -196,10 +206,10 @@ class CAPITest(unittest.TestCase): def test_list_setslice(self): # Test PyList_SetSlice() - setslice = _testcapi.list_setslice + list_setslice = _testcapi.list_setslice def set_slice(lst, low, high, value): lst = lst.copy() - self.assertEqual(setslice(lst, low, high, value), 0) + self.assertEqual(list_setslice(lst, low, high, value), 0) return lst # insert items @@ -231,8 +241,21 @@ class CAPITest(unittest.TestCase): self.assertEqual(set_slice(lst, 0, len(lst), NULL), []) self.assertEqual(set_slice(lst, 3, len(lst), NULL), list("abc")) - self.assertRaises(SystemError, setslice, (), 0, 0, []) - self.assertRaises(SystemError, setslice, 42, 0, 0, []) + self.assertRaises(SystemError, list_setslice, (), 0, 0, []) + self.assertRaises(SystemError, list_setslice, 42, 0, 0, []) + + # Item finalizer modify the list (clear the list) + lst = [] + lst.append(DelAppend(lst, 'zombie')) + self.assertEqual(list_setslice(lst, 0, len(lst), NULL), 0) + self.assertEqual(lst, ['zombie']) + + # Item finalizer modify the list (remove an list item) + lst = [] + lst.append(DelAppend(lst, 'zombie')) + lst.extend("abc") + self.assertEqual(list_setslice(lst, 0, 1, NULL), 0) + self.assertEqual(lst, ['a', 'b', 'c', 'zombie']) # CRASHES setslice(NULL, 0, 0, []) @@ -275,3 +298,47 @@ class CAPITest(unittest.TestCase): self.assertRaises(SystemError, astuple, ()) self.assertRaises(SystemError, astuple, object()) self.assertRaises(SystemError, astuple, NULL) + + def test_list_clear(self): + # Test PyList_Clear() + list_clear = _testcapi.list_clear + + lst = [1, 2, 3] + self.assertEqual(list_clear(lst), 0) + self.assertEqual(lst, []) + + lst = [] + self.assertEqual(list_clear(lst), 0) + self.assertEqual(lst, []) + + self.assertRaises(SystemError, list_clear, ()) + self.assertRaises(SystemError, list_clear, object()) + + # Item finalizer modify the list + lst = [] + lst.append(DelAppend(lst, 'zombie')) + list_clear(lst) + self.assertEqual(lst, ['zombie']) + + # CRASHES list_clear(NULL) + + def test_list_extend(self): + # Test PyList_Extend() + list_extend = _testcapi.list_extend + + for other_type in (list, tuple, str, iter): + lst = list("ab") + arg = other_type("def") + self.assertEqual(list_extend(lst, arg), 0) + self.assertEqual(lst, list("abdef")) + + # PyList_Extend(lst, lst) + lst = list("abc") + self.assertEqual(list_extend(lst, lst), 0) + self.assertEqual(lst, list("abcabc")) + + self.assertRaises(TypeError, list_extend, [], object()) + self.assertRaises(SystemError, list_extend, (), list("abc")) + + # CRASHES list_extend(NULL, []) + # CRASHES list_extend([], NULL) |