mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Update list/tuple tests from CPython 3.10.5
This commit is contained in:
1 parent
c737713c9e
commit
5b18683240
4 files changed
+100
-26
No files matched your search
Vendored
+15
-16
@@ -4,11 +4,10 @@ Tests common to list and UserList.UserList
|
||||
|
||||
import sys
|
||||
import os
|
||||
import unittest
|
||||
from functools import cmp_to_key
|
||||
|
||||
from test import support, seq_tests
|
||||
from test.support import os_helper
|
||||
from test.support import ALWAYS_EQ, NEVER_EQ
|
||||
|
||||
|
||||
class CommonTest(seq_tests.CommonTest):
|
||||
@@ -67,20 +66,6 @@ class CommonTest(seq_tests.CommonTest):
|
||||
a = self.type2test([a])
|
||||
self.assertRaises(RecursionError, repr, a)
|
||||
|
||||
def test_print(self):
|
||||
d = self.type2test(range(200))
|
||||
d.append(d)
|
||||
d.extend(range(200,400))
|
||||
d.append(d)
|
||||
d.append(400)
|
||||
try:
|
||||
with open(os_helper.TESTFN, "w") as fo:
|
||||
fo.write(str(d))
|
||||
with open(os_helper.TESTFN, "r") as fo:
|
||||
self.assertEqual(fo.read(), repr(d))
|
||||
finally:
|
||||
os.remove(os_helper.TESTFN)
|
||||
|
||||
def test_set_subscript(self):
|
||||
a = self.type2test(range(20))
|
||||
self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 0), [1,2,3])
|
||||
@@ -331,6 +316,20 @@ class CommonTest(seq_tests.CommonTest):
|
||||
|
||||
self.assertRaises(TypeError, a.remove)
|
||||
|
||||
a = self.type2test([1, 2])
|
||||
self.assertRaises(ValueError, a.remove, NEVER_EQ)
|
||||
self.assertEqual(a, [1, 2])
|
||||
a.remove(ALWAYS_EQ)
|
||||
self.assertEqual(a, [2])
|
||||
a = self.type2test([ALWAYS_EQ])
|
||||
a.remove(1)
|
||||
self.assertEqual(a, [])
|
||||
a = self.type2test([ALWAYS_EQ])
|
||||
a.remove(NEVER_EQ)
|
||||
self.assertEqual(a, [])
|
||||
a = self.type2test([NEVER_EQ])
|
||||
self.assertRaises(ValueError, a.remove, ALWAYS_EQ)
|
||||
|
||||
class BadExc(Exception):
|
||||
pass
|
||||
|
||||
|
||||
Vendored
+21
-9
@@ -6,6 +6,7 @@ import unittest
|
||||
import sys
|
||||
import pickle
|
||||
from test import support
|
||||
from test.support import ALWAYS_EQ, NEVER_EQ
|
||||
|
||||
# Various iterables
|
||||
# This is used for checking the constructor (here and in test_deque.py)
|
||||
@@ -209,6 +210,7 @@ class CommonTest(unittest.TestCase):
|
||||
a = self.type2test([0,1,2,3,4])
|
||||
self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2]))
|
||||
self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4]))
|
||||
self.assertEqual(a[3::sys.maxsize], self.type2test([3]))
|
||||
|
||||
def test_contains(self):
|
||||
u = self.type2test([0, 1, 2])
|
||||
@@ -220,15 +222,15 @@ class CommonTest(unittest.TestCase):
|
||||
self.assertRaises(TypeError, u.__contains__)
|
||||
|
||||
def test_contains_fake(self):
|
||||
class AllEq:
|
||||
# Sequences must use rich comparison against each item
|
||||
# (unless "is" is true, or an earlier item answered)
|
||||
# So instances of AllEq must be found in all non-empty sequences.
|
||||
def __eq__(self, other):
|
||||
return True
|
||||
__hash__ = None # Can't meet hash invariant requirements
|
||||
self.assertNotIn(AllEq(), self.type2test([]))
|
||||
self.assertIn(AllEq(), self.type2test([1]))
|
||||
# Sequences must use rich comparison against each item
|
||||
# (unless "is" is true, or an earlier item answered)
|
||||
# So ALWAYS_EQ must be found in all non-empty sequences.
|
||||
self.assertNotIn(ALWAYS_EQ, self.type2test([]))
|
||||
self.assertIn(ALWAYS_EQ, self.type2test([1]))
|
||||
self.assertIn(1, self.type2test([ALWAYS_EQ]))
|
||||
self.assertNotIn(NEVER_EQ, self.type2test([]))
|
||||
self.assertNotIn(ALWAYS_EQ, self.type2test([NEVER_EQ]))
|
||||
self.assertIn(NEVER_EQ, self.type2test([ALWAYS_EQ]))
|
||||
|
||||
def test_contains_order(self):
|
||||
# Sequences must test in-order. If a rich comparison has side
|
||||
@@ -349,6 +351,11 @@ class CommonTest(unittest.TestCase):
|
||||
self.assertEqual(a.count(1), 3)
|
||||
self.assertEqual(a.count(3), 0)
|
||||
|
||||
self.assertEqual(a.count(ALWAYS_EQ), 9)
|
||||
self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(1), 2)
|
||||
self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(NEVER_EQ), 2)
|
||||
self.assertEqual(self.type2test([NEVER_EQ, NEVER_EQ]).count(ALWAYS_EQ), 0)
|
||||
|
||||
self.assertRaises(TypeError, a.count)
|
||||
|
||||
class BadExc(Exception):
|
||||
@@ -377,6 +384,11 @@ class CommonTest(unittest.TestCase):
|
||||
self.assertEqual(u.index(0, 3, 4), 3)
|
||||
self.assertRaises(ValueError, u.index, 2, 0, -10)
|
||||
|
||||
self.assertEqual(u.index(ALWAYS_EQ), 0)
|
||||
self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(1), 0)
|
||||
self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(NEVER_EQ), 0)
|
||||
self.assertRaises(ValueError, self.type2test([NEVER_EQ, NEVER_EQ]).index, ALWAYS_EQ)
|
||||
|
||||
self.assertRaises(TypeError, u.index)
|
||||
|
||||
class BadExc(Exception):
|
||||
|
||||
Vendored
+63
@@ -151,6 +151,11 @@ class ListTest(list_tests.CommonTest):
|
||||
a[:] = data
|
||||
self.assertEqual(list(it), [])
|
||||
|
||||
def test_step_overflow(self):
|
||||
a = [0, 1, 2, 3, 4]
|
||||
a[1::sys.maxsize] = [0]
|
||||
self.assertEqual(a[3::sys.maxsize], [3])
|
||||
|
||||
def test_no_comdat_folding(self):
|
||||
# Issue 8847: In the PGO build, the MSVC linker's COMDAT folding
|
||||
# optimization causes failures in code that relies on distinct
|
||||
@@ -159,6 +164,31 @@ class ListTest(list_tests.CommonTest):
|
||||
with self.assertRaises(TypeError):
|
||||
(3,) + L([1,2])
|
||||
|
||||
def test_equal_operator_modifying_operand(self):
|
||||
# test fix for seg fault reported in bpo-38588 part 2.
|
||||
class X:
|
||||
def __eq__(self,other) :
|
||||
list2.clear()
|
||||
return NotImplemented
|
||||
|
||||
class Y:
|
||||
def __eq__(self, other):
|
||||
list1.clear()
|
||||
return NotImplemented
|
||||
|
||||
class Z:
|
||||
def __eq__(self, other):
|
||||
list3.clear()
|
||||
return NotImplemented
|
||||
|
||||
list1 = [X()]
|
||||
list2 = [Y()]
|
||||
self.assertTrue(list1 == list2)
|
||||
|
||||
list3 = [Z()]
|
||||
list4 = [1]
|
||||
self.assertFalse(list3 == list4)
|
||||
|
||||
@cpython_only
|
||||
def test_preallocation(self):
|
||||
iterable = [0] * 10
|
||||
@@ -167,5 +197,38 @@ class ListTest(list_tests.CommonTest):
|
||||
self.assertEqual(iter_size, sys.getsizeof(list([0] * 10)))
|
||||
self.assertEqual(iter_size, sys.getsizeof(list(range(10))))
|
||||
|
||||
def test_count_index_remove_crashes(self):
|
||||
# bpo-38610: The count(), index(), and remove() methods were not
|
||||
# holding strong references to list elements while calling
|
||||
# PyObject_RichCompareBool().
|
||||
class X:
|
||||
def __eq__(self, other):
|
||||
lst.clear()
|
||||
return NotImplemented
|
||||
|
||||
lst = [X()]
|
||||
with self.assertRaises(ValueError):
|
||||
lst.index(lst)
|
||||
|
||||
class L(list):
|
||||
def __eq__(self, other):
|
||||
str(other)
|
||||
return NotImplemented
|
||||
|
||||
lst = L([X()])
|
||||
lst.count(lst)
|
||||
|
||||
lst = L([X()])
|
||||
with self.assertRaises(ValueError):
|
||||
lst.remove(lst)
|
||||
|
||||
# bpo-39453: list.__contains__ was not holding strong references
|
||||
# to list elements while calling PyObject_RichCompareBool().
|
||||
lst = [X(), X()]
|
||||
3 in lst
|
||||
lst = [X(), X()]
|
||||
X() in lst
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Vendored
+1
-1
@@ -1,7 +1,7 @@
|
||||
from test import support, seq_tests
|
||||
import unittest
|
||||
|
||||
# import gc
|
||||
import gc
|
||||
import pickle
|
||||
|
||||
# For tuple hashes, we normally only run a test to ensure that we get
|
||||
|
||||
Reference in new issue
Block a user