annotate Lib/test/test_weakset.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents f911a89d2f1d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
1 import unittest
47201
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 47166
diff changeset
2 from test import support
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
3 from weakref import proxy, ref, WeakSet
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
4 import operator
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
5 import copy
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
6 import string
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
7 import os
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
8 from random import randrange, shuffle
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
9 import sys
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
10 import warnings
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
11 import collections
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
12 from collections import UserString as ustr
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
13 import gc
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
14 import contextlib
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
15
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
16
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
17 class Foo:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
18 pass
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
19
75356
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
20 class RefCycle:
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
21 def __init__(self):
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
22 self.cycle = self
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
23
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
24
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
25 class TestWeakSet(unittest.TestCase):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
26
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
27 def setUp(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
28 # need to keep references to them
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
29 self.items = [ustr(c) for c in ('a', 'b', 'c')]
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
30 self.items2 = [ustr(c) for c in ('x', 'y', 'z')]
75405
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
31 self.ab_items = [ustr(c) for c in 'ab']
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
32 self.abcde_items = [ustr(c) for c in 'abcde']
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
33 self.def_items = [ustr(c) for c in 'def']
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
34 self.ab_weakset = WeakSet(self.ab_items)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
35 self.abcde_weakset = WeakSet(self.abcde_items)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
36 self.def_weakset = WeakSet(self.def_items)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
37 self.letters = [ustr(c) for c in string.ascii_letters]
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
38 self.s = WeakSet(self.items)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
39 self.d = dict.fromkeys(self.items)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
40 self.obj = ustr('F')
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
41 self.fs = WeakSet([self.obj])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
42
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
43 def test_methods(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
44 weaksetmethods = dir(WeakSet)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
45 for method in dir(set):
47166
12ca1e820282 Ignore test_c_api when checking for set methods. Thanks Brett!
Georg Brandl <georg@python.org>
parents: 47161
diff changeset
46 if method == 'test_c_api' or method.startswith('_'):
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
47 continue
58456
f0f221e1a7c0 use assert[Not]In where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58415
diff changeset
48 self.assertIn(method, weaksetmethods,
47161
36c71d3a6ef8 Better diagnostic.
Georg Brandl <georg@python.org>
parents: 47159
diff changeset
49 "WeakSet missing method " + method)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
50
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
51 def test_new_or_init(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
52 self.assertRaises(TypeError, WeakSet, [], 2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
53
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
54 def test_len(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
55 self.assertEqual(len(self.s), len(self.d))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
56 self.assertEqual(len(self.fs), 1)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
57 del self.obj
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
58 self.assertEqual(len(self.fs), 0)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
59
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
60 def test_contains(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
61 for c in self.letters:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
62 self.assertEqual(c in self.s, c in self.d)
68007
b245d69b4f0a Merged revisions 86537,86867-86868,86881,86887,86913-86915,86931-86933,86960,86964,86974,86980,86996,87008,87050 via svnmerge from
Georg Brandl <georg@python.org>
parents: 58194
diff changeset
63 # 1 is not weakref'able, but that TypeError is caught by __contains__
b245d69b4f0a Merged revisions 86537,86867-86868,86881,86887,86913-86915,86931-86933,86960,86964,86974,86980,86996,87008,87050 via svnmerge from
Georg Brandl <georg@python.org>
parents: 58194
diff changeset
64 self.assertNotIn(1, self.s)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
65 self.assertIn(self.obj, self.fs)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
66 del self.obj
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
67 self.assertNotIn(ustr('F'), self.fs)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
68
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
69 def test_union(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
70 u = self.s.union(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
71 for c in self.letters:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
72 self.assertEqual(c in u, c in self.d or c in self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
73 self.assertEqual(self.s, WeakSet(self.items))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
74 self.assertEqual(type(u), WeakSet)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
75 self.assertRaises(TypeError, self.s.union, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
76 for C in set, frozenset, dict.fromkeys, list, tuple:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
77 x = WeakSet(self.items + self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
78 c = C(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
79 self.assertEqual(self.s.union(c), x)
75402
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
80 del c
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
81 self.assertEqual(len(u), len(self.items) + len(self.items2))
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
82 self.items2.pop()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
83 gc.collect()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
84 self.assertEqual(len(u), len(self.items) + len(self.items2))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
85
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
86 def test_or(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
87 i = self.s.union(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
88 self.assertEqual(self.s | set(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
89 self.assertEqual(self.s | frozenset(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
90
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
91 def test_intersection(self):
75402
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
92 s = WeakSet(self.letters)
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
93 i = s.intersection(self.items2)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
94 for c in self.letters:
75402
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
95 self.assertEqual(c in i, c in self.items2 and c in self.letters)
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
96 self.assertEqual(s, WeakSet(self.letters))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
97 self.assertEqual(type(i), WeakSet)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
98 for C in set, frozenset, dict.fromkeys, list, tuple:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
99 x = WeakSet([])
75402
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
100 self.assertEqual(i.intersection(C(self.items)), x)
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
101 self.assertEqual(len(i), len(self.items2))
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
102 self.items2.pop()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
103 gc.collect()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
104 self.assertEqual(len(i), len(self.items2))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
105
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
106 def test_isdisjoint(self):
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
107 self.assertTrue(self.s.isdisjoint(WeakSet(self.items2)))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
108 self.assertTrue(not self.s.isdisjoint(WeakSet(self.letters)))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
109
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
110 def test_and(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
111 i = self.s.intersection(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
112 self.assertEqual(self.s & set(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
113 self.assertEqual(self.s & frozenset(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
114
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
115 def test_difference(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
116 i = self.s.difference(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
117 for c in self.letters:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
118 self.assertEqual(c in i, c in self.d and c not in self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
119 self.assertEqual(self.s, WeakSet(self.items))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
120 self.assertEqual(type(i), WeakSet)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
121 self.assertRaises(TypeError, self.s.difference, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
122
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
123 def test_sub(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
124 i = self.s.difference(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
125 self.assertEqual(self.s - set(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
126 self.assertEqual(self.s - frozenset(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
127
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
128 def test_symmetric_difference(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
129 i = self.s.symmetric_difference(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
130 for c in self.letters:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
131 self.assertEqual(c in i, (c in self.d) ^ (c in self.items2))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
132 self.assertEqual(self.s, WeakSet(self.items))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
133 self.assertEqual(type(i), WeakSet)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
134 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
75402
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
135 self.assertEqual(len(i), len(self.items) + len(self.items2))
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
136 self.items2.pop()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
137 gc.collect()
d19d9ecbe42b Fix some set algebra methods of WeakSet objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75356
diff changeset
138 self.assertEqual(len(i), len(self.items) + len(self.items2))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
139
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
140 def test_xor(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
141 i = self.s.symmetric_difference(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
142 self.assertEqual(self.s ^ set(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
143 self.assertEqual(self.s ^ frozenset(self.items2), i)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
144
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
145 def test_sub_and_super(self):
75405
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
146 self.assertTrue(self.ab_weakset <= self.abcde_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
147 self.assertTrue(self.abcde_weakset <= self.abcde_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
148 self.assertTrue(self.abcde_weakset >= self.ab_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
149 self.assertFalse(self.abcde_weakset <= self.def_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
150 self.assertFalse(self.abcde_weakset >= self.def_weakset)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
151 self.assertTrue(set('a').issubset('abc'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
152 self.assertTrue(set('abc').issuperset('a'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
153 self.assertFalse(set('a').issubset('cbs'))
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
154 self.assertFalse(set('cbs').issuperset('a'))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
155
75405
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
156 def test_lt(self):
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
157 self.assertTrue(self.ab_weakset < self.abcde_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
158 self.assertFalse(self.abcde_weakset < self.def_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
159 self.assertFalse(self.ab_weakset < self.ab_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
160 self.assertFalse(WeakSet() < WeakSet())
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
161
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
162 def test_gt(self):
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
163 self.assertTrue(self.abcde_weakset > self.ab_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
164 self.assertFalse(self.abcde_weakset > self.def_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
165 self.assertFalse(self.ab_weakset > self.ab_weakset)
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
166 self.assertFalse(WeakSet() > WeakSet())
5b88475aae96 Issue #14195: Make WeakSet.__lt__ and WeakSet.__gt__ irreflexive.
Meador Inge <meadori@gmail.com>
parents: 75402
diff changeset
167
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
168 def test_gc(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
169 # Create a nest of cycles to exercise overall ref count check
54179
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
170 s = WeakSet(Foo() for i in range(1000))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
171 for elem in s:
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
172 elem.cycle = s
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
173 elem.sub = elem
54179
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
174 elem.set = WeakSet([elem])
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
175
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
176 def test_subclass_with_custom_hash(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
177 # Bug #1257731
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
178 class H(WeakSet):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
179 def __hash__(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
180 return int(id(self) & 0x7fffffff)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
181 s=H()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
182 f=set()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
183 f.add(s)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
184 self.assertIn(s, f)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
185 f.remove(s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
186 f.add(s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
187 f.discard(s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
188
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
189 def test_init(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
190 s = WeakSet()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
191 s.__init__(self.items)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
192 self.assertEqual(s, self.s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
193 s.__init__(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
194 self.assertEqual(s, WeakSet(self.items2))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
195 self.assertRaises(TypeError, s.__init__, s, 2);
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
196 self.assertRaises(TypeError, s.__init__, 1);
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
197
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
198 def test_constructor_identity(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
199 s = WeakSet(self.items)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
200 t = WeakSet(s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
201 self.assertNotEqual(id(s), id(t))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
202
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
203 def test_hash(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
204 self.assertRaises(TypeError, hash, self.s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
205
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
206 def test_clear(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
207 self.s.clear()
54179
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
208 self.assertEqual(self.s, WeakSet([]))
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
209 self.assertEqual(len(self.s), 0)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
210
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
211 def test_copy(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
212 dup = self.s.copy()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
213 self.assertEqual(self.s, dup)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
214 self.assertNotEqual(id(self.s), id(dup))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
215
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
216 def test_add(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
217 x = ustr('Q')
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
218 self.s.add(x)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
219 self.assertIn(x, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
220 dup = self.s.copy()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
221 self.s.add(x)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
222 self.assertEqual(self.s, dup)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
223 self.assertRaises(TypeError, self.s.add, [])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
224 self.fs.add(Foo())
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
225 self.assertTrue(len(self.fs) == 1)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
226 self.fs.add(self.obj)
55593
0bb232078b8c Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54179
diff changeset
227 self.assertTrue(len(self.fs) == 1)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
228
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
229 def test_remove(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
230 x = ustr('a')
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
231 self.s.remove(x)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
232 self.assertNotIn(x, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
233 self.assertRaises(KeyError, self.s.remove, x)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
234 self.assertRaises(TypeError, self.s.remove, [])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
235
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
236 def test_discard(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
237 a, q = ustr('a'), ustr('Q')
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
238 self.s.discard(a)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
239 self.assertNotIn(a, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
240 self.s.discard(q)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
241 self.assertRaises(TypeError, self.s.discard, [])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
242
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
243 def test_pop(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
244 for i in range(len(self.s)):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
245 elem = self.s.pop()
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
246 self.assertNotIn(elem, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
247 self.assertRaises(KeyError, self.s.pop)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
248
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
249 def test_update(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
250 retval = self.s.update(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
251 self.assertEqual(retval, None)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
252 for c in (self.items + self.items2):
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
253 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
254 self.assertRaises(TypeError, self.s.update, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
255
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
256 def test_update_set(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
257 self.s.update(set(self.items2))
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
258 for c in (self.items + self.items2):
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
259 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
260
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
261 def test_ior(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
262 self.s |= set(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
263 for c in (self.items + self.items2):
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
264 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
265
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
266 def test_intersection_update(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
267 retval = self.s.intersection_update(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
268 self.assertEqual(retval, None)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
269 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
270 if c in self.items2 and c in self.items:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
271 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
272 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
273 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
274 self.assertRaises(TypeError, self.s.intersection_update, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
275
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
276 def test_iand(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
277 self.s &= set(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
278 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
279 if c in self.items2 and c in self.items:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
280 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
281 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
282 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
283
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
284 def test_difference_update(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
285 retval = self.s.difference_update(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
286 self.assertEqual(retval, None)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
287 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
288 if c in self.items and c not in self.items2:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
289 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
290 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
291 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
292 self.assertRaises(TypeError, self.s.difference_update, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
293 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
294
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
295 def test_isub(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
296 self.s -= set(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
297 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
298 if c in self.items and c not in self.items2:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
299 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
300 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
301 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
302
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
303 def test_symmetric_difference_update(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
304 retval = self.s.symmetric_difference_update(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
305 self.assertEqual(retval, None)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
306 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
307 if (c in self.items) ^ (c in self.items2):
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
308 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
309 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
310 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
311 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
312
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
313 def test_ixor(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
314 self.s ^= set(self.items2)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
315 for c in (self.items + self.items2):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
316 if (c in self.items) ^ (c in self.items2):
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
317 self.assertIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
318 else:
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
319 self.assertNotIn(c, self.s)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
320
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
321 def test_inplace_on_self(self):
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
322 t = self.s.copy()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
323 t |= t
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
324 self.assertEqual(t, self.s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
325 t &= t
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
326 self.assertEqual(t, self.s)
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
327 t -= t
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
328 self.assertEqual(t, WeakSet())
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
329 t = self.s.copy()
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
330 t ^= t
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
331 self.assertEqual(t, WeakSet())
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
332
54179
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
333 def test_eq(self):
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
334 # issue 5964
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
335 self.assertTrue(self.s == self.s)
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
336 self.assertTrue(self.s == WeakSet(self.items))
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
337 self.assertFalse(self.s == set(self.items))
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
338 self.assertFalse(self.s == list(self.items))
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
339 self.assertFalse(self.s == tuple(self.items))
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
340 self.assertFalse(self.s == WeakSet([Foo]))
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
341 self.assertFalse(self.s == 1)
a7ad1696866b Merged revisions 72751 via svnmerge from
Robert Schuppenies <okkotonushi@googlemail.com>
parents: 47201
diff changeset
342
83894
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
343 def test_ne(self):
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
344 self.assertTrue(self.s != set(self.items))
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
345 s1 = WeakSet()
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
346 s2 = WeakSet()
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
347 self.assertFalse(s1 != s2)
f911a89d2f1d add test for inequality
Benjamin Peterson <benjamin@python.org>
parents: 75405
diff changeset
348
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
349 def test_weak_destroy_while_iterating(self):
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
350 # Issue #7105: iterators shouldn't crash when a key is implicitly removed
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
351 # Create new items to be sure no-one else holds a reference
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
352 items = [ustr(c) for c in ('a', 'b', 'c')]
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
353 s = WeakSet(items)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
354 it = iter(s)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
355 next(it) # Trigger internal iteration
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
356 # Destroy an item
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
357 del items[-1]
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
358 gc.collect() # just in case
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
359 # We have removed either the first consumed items, or another one
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
360 self.assertIn(len(list(it)), [len(items), len(items) - 1])
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
361 del it
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
362 # The removal has been committed
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
363 self.assertEqual(len(s), len(items))
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
364
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
365 def test_weak_destroy_and_mutate_while_iterating(self):
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
366 # Issue #7105: iterators shouldn't crash when a key is implicitly removed
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
367 items = [ustr(c) for c in string.ascii_letters]
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
368 s = WeakSet(items)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
369 @contextlib.contextmanager
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
370 def testcontext():
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
371 try:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
372 it = iter(s)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
373 next(it)
75095
f189da5bda26 Delete the iterator, which could accidentally keep a temporary reference to the yielded element.
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257
diff changeset
374 del it
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
375 # Schedule an item for removal and recreate it
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
376 u = ustr(str(items.pop()))
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
377 gc.collect() # just in case
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
378 yield u
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
379 finally:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
380 it = None # should commit all removals
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
381
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
382 with testcontext() as u:
58456
f0f221e1a7c0 use assert[Not]In where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58415
diff changeset
383 self.assertNotIn(u, s)
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
384 with testcontext() as u:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
385 self.assertRaises(KeyError, s.remove, u)
58456
f0f221e1a7c0 use assert[Not]In where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58415
diff changeset
386 self.assertNotIn(u, s)
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
387 with testcontext() as u:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
388 s.add(u)
58415
f6a626f34840 use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents: 58194
diff changeset
389 self.assertIn(u, s)
58194
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
390 t = s.copy()
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
391 with testcontext() as u:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
392 s.update(t)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
393 self.assertEqual(len(s), len(t))
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
394 with testcontext() as u:
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
395 s.clear()
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
396 self.assertEqual(len(s), 0)
84caac71d79b Issue #7105: Make WeakKeyDictionary and WeakValueDictionary robust against
Antoine Pitrou <solipsis@pitrou.net>
parents: 55593
diff changeset
397
75356
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
398 def test_len_cycles(self):
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
399 N = 20
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
400 items = [RefCycle() for i in range(N)]
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
401 s = WeakSet(items)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
402 del items
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
403 it = iter(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
404 try:
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
405 next(it)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
406 except StopIteration:
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
407 pass
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
408 gc.collect()
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
409 n1 = len(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
410 del it
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
411 gc.collect()
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
412 n2 = len(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
413 # one item may be kept alive inside the iterator
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
414 self.assertIn(n1, (0, 1))
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
415 self.assertEqual(n2, 0)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
416
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
417 def test_len_race(self):
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
418 # Extended sanity checks for len() in the face of cyclic collection
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
419 self.addCleanup(gc.set_threshold, *gc.get_threshold())
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
420 for th in range(1, 100):
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
421 N = 20
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
422 gc.collect(0)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
423 gc.set_threshold(th, th, th)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
424 items = [RefCycle() for i in range(N)]
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
425 s = WeakSet(items)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
426 del items
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
427 # All items will be collected at next garbage collection pass
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
428 it = iter(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
429 try:
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
430 next(it)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
431 except StopIteration:
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
432 pass
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
433 n1 = len(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
434 del it
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
435 n2 = len(s)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
436 self.assertGreaterEqual(n1, 0)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
437 self.assertLessEqual(n1, N)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
438 self.assertGreaterEqual(n2, 0)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
439 self.assertLessEqual(n2, n1)
1cd0688ff004 Issue #14159: Fix the len() of weak containers (WeakSet, WeakKeyDictionary, WeakValueDictionary) to return a better approximation when some objects are dead or dying.
Antoine Pitrou <solipsis@pitrou.net>
parents: 75095
diff changeset
440
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
441
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
442 def test_main(verbose=None):
47201
9c930a32cebb #2621 rename test.test_support to test.support
Benjamin Peterson <benjamin@python.org>
parents: 47166
diff changeset
443 support.run_unittest(TestWeakSet)
47159
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
444
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
445 if __name__ == "__main__":
37499287f758 Add a test suite for WeakSet mostly derived from test_set and fix some
Georg Brandl <georg@python.org>
parents:
diff changeset
446 test_main(verbose=True)