10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom weakref import proxy, ref, WeakSet
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport operator
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport copy
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport string
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport os
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom random import randrange, shuffle
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport warnings
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport collections
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport gc
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport contextlib
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass Foo:
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    pass
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass SomeClass(object):
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, value):
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.value = value
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __eq__(self, other):
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if type(other) != type(self):
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return False
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return other.value == self.value
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __ne__(self, other):
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return not self.__eq__(other)
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __hash__(self):
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return hash((SomeClass, self.value))
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass RefCycle(object):
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self):
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.cycle = self
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass TestWeakSet(unittest.TestCase):
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # need to keep references to them
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.items = [SomeClass(c) for c in ('a', 'b', 'c')]
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.items2 = [SomeClass(c) for c in ('x', 'y', 'z')]
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.letters = [SomeClass(c) for c in string.ascii_letters]
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.ab_items = [SomeClass(c) for c in 'ab']
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.abcde_items = [SomeClass(c) for c in 'abcde']
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.def_items = [SomeClass(c) for c in 'def']
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.ab_weakset = WeakSet(self.ab_items)
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.abcde_weakset = WeakSet(self.abcde_items)
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.def_weakset = WeakSet(self.def_items)
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s = WeakSet(self.items)
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.d = dict.fromkeys(self.items)
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.obj = SomeClass('F')
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.fs = WeakSet([self.obj])
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_methods(self):
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        weaksetmethods = dir(WeakSet)
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for method in dir(set):
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if method == 'test_c_api' or method.startswith('_'):
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                continue
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(method, weaksetmethods,
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         "WeakSet missing method " + method)
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_new_or_init(self):
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, WeakSet, [], 2)
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_len(self):
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(self.s), len(self.d))
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(self.fs), 1)
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del self.obj
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(self.fs), 0)
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_contains(self):
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in self.letters:
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c in self.s, c in self.d)
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # 1 is not weakref'able, but that TypeError is caught by __contains__
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(1, self.s)
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(self.obj, self.fs)
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del self.obj
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(SomeClass('F'), self.fs)
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_union(self):
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        u = self.s.union(self.items2)
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in self.letters:
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c in u, c in self.d or c in self.items2)
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, WeakSet(self.items))
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(u), WeakSet)
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.union, [[]])
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for C in set, frozenset, dict.fromkeys, list, tuple:
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = WeakSet(self.items + self.items2)
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c = C(self.items2)
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(self.s.union(c), x)
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del c
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(u), len(self.items) + len(self.items2))
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.items2.pop()
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(u), len(self.items) + len(self.items2))
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_or(self):
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.union(self.items2)
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s | set(self.items2), i)
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s | frozenset(self.items2), i)
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_intersection(self):
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(self.letters)
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = s.intersection(self.items2)
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in self.letters:
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c in i, c in self.items2 and c in self.letters)
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, WeakSet(self.letters))
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(i), WeakSet)
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for C in set, frozenset, dict.fromkeys, list, tuple:
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = WeakSet([])
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(i.intersection(C(self.items)), x)
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(i), len(self.items2))
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.items2.pop()
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(i), len(self.items2))
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_isdisjoint(self):
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.s.isdisjoint(WeakSet(self.items2)))
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not self.s.isdisjoint(WeakSet(self.letters)))
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_and(self):
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.intersection(self.items2)
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s & set(self.items2), i)
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s & frozenset(self.items2), i)
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_difference(self):
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.difference(self.items2)
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in self.letters:
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c in i, c in self.d and c not in self.items2)
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, WeakSet(self.items))
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(i), WeakSet)
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.difference, [[]])
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_sub(self):
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.difference(self.items2)
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s - set(self.items2), i)
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s - frozenset(self.items2), i)
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_symmetric_difference(self):
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.symmetric_difference(self.items2)
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in self.letters:
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c in i, (c in self.d) ^ (c in self.items2))
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, WeakSet(self.items))
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(i), WeakSet)
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(i), len(self.items) + len(self.items2))
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.items2.pop()
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(i), len(self.items) + len(self.items2))
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_xor(self):
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        i = self.s.symmetric_difference(self.items2)
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s ^ set(self.items2), i)
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s ^ frozenset(self.items2), i)
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_sub_and_super(self):
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.ab_weakset <= self.abcde_weakset)
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.abcde_weakset <= self.abcde_weakset)
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.abcde_weakset >= self.ab_weakset)
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.abcde_weakset <= self.def_weakset)
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.abcde_weakset >= self.def_weakset)
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(set('a').issubset('abc'))
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(set('abc').issuperset('a'))
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(set('a').issubset('cbs'))
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(set('cbs').issuperset('a'))
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_lt(self):
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.ab_weakset < self.abcde_weakset)
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.abcde_weakset < self.def_weakset)
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.ab_weakset < self.ab_weakset)
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(WeakSet() < WeakSet())
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_gt(self):
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.abcde_weakset > self.ab_weakset)
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.abcde_weakset > self.def_weakset)
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.ab_weakset > self.ab_weakset)
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(WeakSet() > WeakSet())
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_gc(self):
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Create a nest of cycles to exercise overall ref count check
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(Foo() for i in range(1000))
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for elem in s:
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            elem.cycle = s
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            elem.sub = elem
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            elem.set = WeakSet([elem])
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subclass_with_custom_hash(self):
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Bug #1257731
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class H(WeakSet):
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __hash__(self):
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return int(id(self) & 0x7fffffff)
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s=H()
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f=set()
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.add(s)
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(s, f)
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.remove(s)
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.add(s)
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.discard(s)
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_init(self):
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet()
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s.__init__(self.items)
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, self.s)
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s.__init__(self.items2)
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, WeakSet(self.items2))
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, s.__init__, s, 2);
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, s.__init__, 1);
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_constructor_identity(self):
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(self.items)
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = WeakSet(s)
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(id(s), id(t))
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_hash(self):
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, hash, self.s)
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_clear(self):
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.clear()
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, WeakSet([]))
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(self.s), 0)
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_copy(self):
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dup = self.s.copy()
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, dup)
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(id(self.s), id(dup))
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_add(self):
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = SomeClass('Q')
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.add(x)
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(x, self.s)
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dup = self.s.copy()
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.add(x)
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(self.s, dup)
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.add, [])
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.fs.add(Foo())
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(len(self.fs) == 1)
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.fs.add(self.obj)
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(len(self.fs) == 1)
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_remove(self):
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = SomeClass('a')
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.remove(x)
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(x, self.s)
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(KeyError, self.s.remove, x)
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.remove, [])
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_discard(self):
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a, q = SomeClass('a'), SomeClass('Q')
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.discard(a)
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(a, self.s)
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.discard(q)
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.discard, [])
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_pop(self):
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(len(self.s)):
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            elem = self.s.pop()
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertNotIn(elem, self.s)
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(KeyError, self.s.pop)
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_update(self):
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        retval = self.s.update(self.items2)
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(retval, None)
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(c, self.s)
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.update, [[]])
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_update_set(self):
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s.update(set(self.items2))
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(c, self.s)
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ior(self):
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s |= set(self.items2)
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(c, self.s)
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_intersection_update(self):
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        retval = self.s.intersection_update(self.items2)
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(retval, None)
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if c in self.items2 and c in self.items:
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.intersection_update, [[]])
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_iand(self):
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s &= set(self.items2)
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if c in self.items2 and c in self.items:
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_difference_update(self):
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        retval = self.s.difference_update(self.items2)
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(retval, None)
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if c in self.items and c not in self.items2:
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.difference_update, [[]])
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_isub(self):
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s -= set(self.items2)
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if c in self.items and c not in self.items2:
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_symmetric_difference_update(self):
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        retval = self.s.symmetric_difference_update(self.items2)
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(retval, None)
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if (c in self.items) ^ (c in self.items2):
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ixor(self):
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.s ^= set(self.items2)
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for c in (self.items + self.items2):
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if (c in self.items) ^ (c in self.items2):
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIn(c, self.s)
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertNotIn(c, self.s)
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_inplace_on_self(self):
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = self.s.copy()
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t |= t
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(t, self.s)
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t &= t
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(t, self.s)
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t -= t
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(t, WeakSet())
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = self.s.copy()
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t ^= t
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(t, WeakSet())
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_eq(self):
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # issue 5964
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.s == self.s)
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(self.s == WeakSet(self.items))
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.s == set(self.items))
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.s == list(self.items))
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.s == tuple(self.items))
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(self.s == 1)
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_weak_destroy_while_iterating(self):
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue #7105: iterators shouldn't crash when a key is implicitly removed
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Create new items to be sure no-one else holds a reference
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        items = [SomeClass(c) for c in ('a', 'b', 'c')]
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(items)
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        it = iter(s)
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        next(it)             # Trigger internal iteration
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Destroy an item
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del items[-1]
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()    # just in case
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # We have removed either the first consumed items, or another one
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(len(list(it)), [len(items), len(items) - 1])
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del it
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The removal has been committed
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(s), len(items))
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_weak_destroy_and_mutate_while_iterating(self):
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue #7105: iterators shouldn't crash when a key is implicitly removed
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        items = [SomeClass(c) for c in string.ascii_letters]
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(items)
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        @contextlib.contextmanager
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def testcontext():
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                it = iter(s)
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                next(it)
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Schedule an item for removal and recreate it
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                u = SomeClass(str(items.pop()))
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                gc.collect()      # just in case
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                yield u
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            finally:
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                it = None           # should commit all removals
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with testcontext() as u:
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertNotIn(u, s)
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with testcontext() as u:
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertRaises(KeyError, s.remove, u)
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(u, s)
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with testcontext() as u:
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s.add(u)
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(u, s)
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = s.copy()
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with testcontext() as u:
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s.update(t)
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(s), len(t))
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with testcontext() as u:
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s.clear()
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(s), 0)
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_len_cycles(self):
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        N = 20
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        items = [RefCycle() for i in range(N)]
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = WeakSet(items)
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del items
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        it = iter(s)
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            next(it)
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except StopIteration:
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        n1 = len(s)
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del it
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        gc.collect()
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        n2 = len(s)
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # one item may be kept alive inside the iterator
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(n1, (0, 1))
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(n2, 0)
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_len_race(self):
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Extended sanity checks for len() in the face of cyclic collection
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.addCleanup(gc.set_threshold, *gc.get_threshold())
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for th in range(1, 100):
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            N = 20
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            gc.collect(0)
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            gc.set_threshold(th, th, th)
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            items = [RefCycle() for i in range(N)]
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s = WeakSet(items)
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del items
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # All items will be collected at next garbage collection pass
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            it = iter(s)
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                next(it)
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except StopIteration:
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            n1 = len(s)
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del it
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            n2 = len(s)
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertGreaterEqual(n1, 0)
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertLessEqual(n1, N)
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertGreaterEqual(n2, 0)
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertLessEqual(n2, n1)
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main(verbose=None):
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_support.run_unittest(TestWeakSet)
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main(verbose=True)
451