mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 10:44:36 +08:00
Update test_collections from v3.14.3 (#7189)
This commit is contained in:
1 parent
8dd70fe471
commit
550cc44fbd
1 file changed
+128
-13
Vendored
+128
-13
@@ -2,7 +2,9 @@ import builtins
|
||||
import contextlib
|
||||
import copy
|
||||
import gc
|
||||
import operator
|
||||
import pickle
|
||||
import re
|
||||
from random import randrange, shuffle
|
||||
import struct
|
||||
import sys
|
||||
@@ -145,7 +147,7 @@ class OrderedDictTests:
|
||||
def test_abc(self):
|
||||
OrderedDict = self.OrderedDict
|
||||
self.assertIsInstance(OrderedDict(), MutableMapping)
|
||||
self.assertTrue(issubclass(OrderedDict, MutableMapping))
|
||||
self.assertIsSubclass(OrderedDict, MutableMapping)
|
||||
|
||||
def test_clear(self):
|
||||
OrderedDict = self.OrderedDict
|
||||
@@ -312,14 +314,14 @@ class OrderedDictTests:
|
||||
check(dup)
|
||||
self.assertIs(dup.x, od.x)
|
||||
self.assertIs(dup.z, od.z)
|
||||
self.assertFalse(hasattr(dup, 'y'))
|
||||
self.assertNotHasAttr(dup, 'y')
|
||||
dup = copy.deepcopy(od)
|
||||
check(dup)
|
||||
self.assertEqual(dup.x, od.x)
|
||||
self.assertIsNot(dup.x, od.x)
|
||||
self.assertEqual(dup.z, od.z)
|
||||
self.assertIsNot(dup.z, od.z)
|
||||
self.assertFalse(hasattr(dup, 'y'))
|
||||
self.assertNotHasAttr(dup, 'y')
|
||||
# pickle directly pulls the module, so we have to fake it
|
||||
with replaced_module('collections', self.module):
|
||||
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||
@@ -328,7 +330,7 @@ class OrderedDictTests:
|
||||
check(dup)
|
||||
self.assertEqual(dup.x, od.x)
|
||||
self.assertEqual(dup.z, od.z)
|
||||
self.assertFalse(hasattr(dup, 'y'))
|
||||
self.assertNotHasAttr(dup, 'y')
|
||||
check(eval(repr(od)))
|
||||
update_test = OrderedDict()
|
||||
update_test.update(od)
|
||||
@@ -667,8 +669,7 @@ class OrderedDictTests:
|
||||
dict.update(od, [('spam', 1)])
|
||||
self.assertNotIn('NULL', repr(od))
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: <class 'test.test_ordered_dict.OrderedDictTests.test_reference_loop.<locals>.A'> is not None
|
||||
def test_reference_loop(self):
|
||||
# Issue 25935
|
||||
OrderedDict = self.OrderedDict
|
||||
@@ -680,8 +681,7 @@ class OrderedDictTests:
|
||||
gc.collect()
|
||||
self.assertIsNone(r())
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: False is not true
|
||||
def test_free_after_iterating(self):
|
||||
support.check_free_after_iterating(self, iter, self.OrderedDict)
|
||||
support.check_free_after_iterating(self, lambda d: iter(d.keys()), self.OrderedDict)
|
||||
@@ -743,11 +743,44 @@ class OrderedDictTests:
|
||||
# when it's mutated and returned from __next__:
|
||||
self.assertTrue(gc.is_tracked(next(it)))
|
||||
|
||||
|
||||
class _TriggerSideEffectOnEqual:
|
||||
count = 0 # number of calls to __eq__
|
||||
trigger = 1 # count value when to trigger side effect
|
||||
|
||||
def __eq__(self, other):
|
||||
if self.__class__.count == self.__class__.trigger:
|
||||
self.side_effect()
|
||||
self.__class__.count += 1
|
||||
return True
|
||||
|
||||
def __hash__(self):
|
||||
# all instances represent the same key
|
||||
return -1
|
||||
|
||||
def side_effect(self):
|
||||
raise NotImplementedError
|
||||
|
||||
class PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase):
|
||||
|
||||
module = py_coll
|
||||
OrderedDict = py_coll.OrderedDict
|
||||
|
||||
def test_issue119004_attribute_error(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
def side_effect(self):
|
||||
del dict1[TODEL]
|
||||
|
||||
TODEL = Key()
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
# This causes an AttributeError due to the linked list being changed
|
||||
msg = re.escape("'NoneType' object has no attribute 'key'")
|
||||
self.assertRaisesRegex(AttributeError, msg, operator.eq, dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, dict.fromkeys((0, 4.2)))
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
|
||||
class CPythonBuiltinDictTests(unittest.TestCase):
|
||||
"""Builtin dict preserves insertion order.
|
||||
@@ -768,8 +801,90 @@ for method in (
|
||||
del method
|
||||
|
||||
|
||||
class CPythonOrderedDictSideEffects:
|
||||
|
||||
def check_runtime_error_issue119004(self, dict1, dict2):
|
||||
msg = re.escape("OrderedDict mutated during iteration")
|
||||
self.assertRaisesRegex(RuntimeError, msg, operator.eq, dict1, dict2)
|
||||
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: RuntimeError not raised by eq
|
||||
def test_issue119004_change_size_by_clear(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
def side_effect(self):
|
||||
dict1.clear()
|
||||
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
self.check_runtime_error_issue119004(dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, {})
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AttributeError: 'NoneType' object has no attribute 'key'
|
||||
def test_issue119004_change_size_by_delete_key(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
def side_effect(self):
|
||||
del dict1[TODEL]
|
||||
|
||||
TODEL = Key()
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
self.check_runtime_error_issue119004(dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, dict.fromkeys((0, 4.2)))
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: RuntimeError not raised by eq
|
||||
def test_issue119004_change_linked_list_by_clear(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
def side_effect(self):
|
||||
dict1.clear()
|
||||
dict1['a'] = dict1['b'] = 'c'
|
||||
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
self.check_runtime_error_issue119004(dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, dict.fromkeys(('a', 'b'), 'c'))
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AttributeError: 'NoneType' object has no attribute 'key'
|
||||
def test_issue119004_change_linked_list_by_delete_key(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
def side_effect(self):
|
||||
del dict1[TODEL]
|
||||
dict1['a'] = 'c'
|
||||
|
||||
TODEL = Key()
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
self.check_runtime_error_issue119004(dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, {0: None, 'a': 'c', 4.2: None})
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: 1 != 2
|
||||
def test_issue119004_change_size_by_delete_key_in_dict_eq(self):
|
||||
class Key(_TriggerSideEffectOnEqual):
|
||||
trigger = 0
|
||||
def side_effect(self):
|
||||
del dict1[TODEL]
|
||||
|
||||
TODEL = Key()
|
||||
dict1 = self.OrderedDict(dict.fromkeys((0, TODEL, 4.2)))
|
||||
dict2 = self.OrderedDict(dict.fromkeys((0, Key(), 4.2)))
|
||||
self.assertEqual(Key.count, 0)
|
||||
# the side effect is in dict.__eq__ and modifies the length
|
||||
self.assertNotEqual(dict1, dict2)
|
||||
self.assertEqual(Key.count, 2)
|
||||
self.assertDictEqual(dict1, dict.fromkeys((0, 4.2)))
|
||||
self.assertDictEqual(dict2, dict.fromkeys((0, Key(), 4.2)))
|
||||
|
||||
|
||||
@unittest.skipUnless(c_coll, 'requires the C version of the collections module')
|
||||
class CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase):
|
||||
class CPythonOrderedDictTests(OrderedDictTests,
|
||||
CPythonOrderedDictSideEffects,
|
||||
unittest.TestCase):
|
||||
|
||||
module = c_coll
|
||||
OrderedDict = c_coll.OrderedDict
|
||||
@@ -808,8 +923,7 @@ class CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase):
|
||||
check(iter(od.items()), itersize)
|
||||
check(iter(od.values()), itersize)
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON; AssertionError: RuntimeError not raised
|
||||
def test_key_change_during_iteration(self):
|
||||
OrderedDict = self.OrderedDict
|
||||
|
||||
@@ -827,8 +941,7 @@ class CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase):
|
||||
del od['c']
|
||||
self.assertEqual(list(od), list('bdeaf'))
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.expectedFailure # TODO: RUSTPYTHON
|
||||
def test_iterators_pickling(self):
|
||||
OrderedDict = self.OrderedDict
|
||||
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
|
||||
@@ -880,6 +993,7 @@ class CPythonOrderedDictSubclassTests(CPythonOrderedDictTests):
|
||||
class OrderedDict(c_coll.OrderedDict):
|
||||
pass
|
||||
|
||||
|
||||
class PurePythonOrderedDictWithSlotsCopyingTests(unittest.TestCase):
|
||||
|
||||
module = py_coll
|
||||
@@ -887,6 +1001,7 @@ class PurePythonOrderedDictWithSlotsCopyingTests(unittest.TestCase):
|
||||
__slots__ = ('x', 'y')
|
||||
test_copying = OrderedDictTests.test_copying
|
||||
|
||||
|
||||
@unittest.skipUnless(c_coll, 'requires the C version of the collections module')
|
||||
class CPythonOrderedDictWithSlotsCopyingTests(unittest.TestCase):
|
||||
|
||||
|
||||
Reference in new issue
Block a user