summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-11-13 16:14:56 (GMT)
committerGitHub <noreply@github.com>2023-11-13 16:14:56 (GMT)
commitbabb787047e0f7807c8238d3b1a3128dac30bd5c (patch)
tree868cd78ee07ef9c20a5af32db79f979c543b8f0e /Lib
parent29af7369dbbbba8cefafb196e977bce8189a527d (diff)
downloadcpython-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.py77
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)