blob: a13f886aa32b26d5fbb7da73373e1b48250e7371 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Antoine Pitrou7ddda782009-01-01 15:35:33 +00003import gc
4import weakref
Raymond Hettingera690a992003-11-16 16:17:49 +00005import operator
6import copy
7import pickle
Raymond Hettingereae05de2004-07-09 04:51:24 +00008import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00009from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +000010import sys
Christian Heimes0ded5b52007-12-10 15:50:56 +000011import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000012import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000013
14class PassThru(Exception):
15 pass
16
17def check_pass_thru():
18 raise PassThru
19 yield 1
20
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000021class BadCmp:
22 def __hash__(self):
23 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000024 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000025 raise RuntimeError
26
Thomas Wouters902d6eb2007-01-09 23:18:33 +000027class ReprWrapper:
28 'Used to test self-referential repr() calls'
29 def __repr__(self):
30 return repr(self.value)
31
Thomas Wouterscf297e42007-02-23 15:07:44 +000032class HashCountingInt(int):
33 'int-like object that counts the number of times __hash__ is called'
34 def __init__(self, *args):
35 self.hash_count = 0
36 def __hash__(self):
37 self.hash_count += 1
38 return int.__hash__(self)
39
Raymond Hettingera690a992003-11-16 16:17:49 +000040class TestJointOps(unittest.TestCase):
41 # Tests common to both set and frozenset
42
43 def setUp(self):
44 self.word = word = 'simsalabim'
45 self.otherword = 'madagascar'
46 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
47 self.s = self.thetype(word)
48 self.d = dict.fromkeys(word)
49
Raymond Hettinger6429a472004-09-28 01:51:35 +000050 def test_new_or_init(self):
51 self.assertRaises(TypeError, self.thetype, [], 2)
52
Raymond Hettingera690a992003-11-16 16:17:49 +000053 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000054 actual = sorted(self.s)
55 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000056 self.assertEqual(actual, expected)
57 self.assertRaises(PassThru, self.thetype, check_pass_thru())
58 self.assertRaises(TypeError, self.thetype, [[]])
59
60 def test_len(self):
61 self.assertEqual(len(self.s), len(self.d))
62
63 def test_contains(self):
64 for c in self.letters:
65 self.assertEqual(c in self.s, c in self.d)
66 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000067 s = self.thetype([frozenset(self.letters)])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000068 self.assertTrue(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000069
Raymond Hettingera690a992003-11-16 16:17:49 +000070 def test_union(self):
71 u = self.s.union(self.otherword)
72 for c in self.letters:
73 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000074 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000075 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000076 self.assertRaises(PassThru, self.s.union, check_pass_thru())
77 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000078 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000079 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
80 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
81 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
82 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000083 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000084
85 def test_or(self):
86 i = self.s.union(self.otherword)
87 self.assertEqual(self.s | set(self.otherword), i)
88 self.assertEqual(self.s | frozenset(self.otherword), i)
89 try:
90 self.s | self.otherword
91 except TypeError:
92 pass
93 else:
94 self.fail("s|t did not screen-out general iterables")
95
96 def test_intersection(self):
97 i = self.s.intersection(self.otherword)
98 for c in self.letters:
99 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000100 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000101 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000102 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000103 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000104 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
105 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
106 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
107 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000108 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000109 s = self.thetype('abcba')
110 z = s.intersection()
111 if self.thetype == frozenset():
112 self.assertEqual(id(s), id(z))
113 else:
114 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000115
Guido van Rossum58da9312007-11-10 23:39:45 +0000116 def test_isdisjoint(self):
117 def f(s1, s2):
118 'Pure python equivalent of isdisjoint()'
119 return not set(s1).intersection(s2)
120 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
121 s1 = self.thetype(larg)
122 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
123 for C in set, frozenset, dict.fromkeys, str, list, tuple:
124 s2 = C(rarg)
125 actual = s1.isdisjoint(s2)
126 expected = f(s1, s2)
127 self.assertEqual(actual, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000128 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000129
Raymond Hettingera690a992003-11-16 16:17:49 +0000130 def test_and(self):
131 i = self.s.intersection(self.otherword)
132 self.assertEqual(self.s & set(self.otherword), i)
133 self.assertEqual(self.s & frozenset(self.otherword), i)
134 try:
135 self.s & self.otherword
136 except TypeError:
137 pass
138 else:
139 self.fail("s&t did not screen-out general iterables")
140
141 def test_difference(self):
142 i = self.s.difference(self.otherword)
143 for c in self.letters:
144 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000145 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000146 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000147 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
148 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000149 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000150 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
151 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
152 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
153 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000154 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
155 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000156
157 def test_sub(self):
158 i = self.s.difference(self.otherword)
159 self.assertEqual(self.s - set(self.otherword), i)
160 self.assertEqual(self.s - frozenset(self.otherword), i)
161 try:
162 self.s - self.otherword
163 except TypeError:
164 pass
165 else:
166 self.fail("s-t did not screen-out general iterables")
167
168 def test_symmetric_difference(self):
169 i = self.s.symmetric_difference(self.otherword)
170 for c in self.letters:
171 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000172 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000173 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000174 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
175 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000176 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000177 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
178 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
179 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
180 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000181
182 def test_xor(self):
183 i = self.s.symmetric_difference(self.otherword)
184 self.assertEqual(self.s ^ set(self.otherword), i)
185 self.assertEqual(self.s ^ frozenset(self.otherword), i)
186 try:
187 self.s ^ self.otherword
188 except TypeError:
189 pass
190 else:
191 self.fail("s^t did not screen-out general iterables")
192
193 def test_equality(self):
194 self.assertEqual(self.s, set(self.word))
195 self.assertEqual(self.s, frozenset(self.word))
196 self.assertEqual(self.s == self.word, False)
197 self.assertNotEqual(self.s, set(self.otherword))
198 self.assertNotEqual(self.s, frozenset(self.otherword))
199 self.assertEqual(self.s != self.word, True)
200
201 def test_setOfFrozensets(self):
202 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
203 s = self.thetype(t)
204 self.assertEqual(len(s), 3)
205
Raymond Hettingera690a992003-11-16 16:17:49 +0000206 def test_sub_and_super(self):
207 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000208 self.assertTrue(p < q)
209 self.assertTrue(p <= q)
210 self.assertTrue(q <= q)
211 self.assertTrue(q > p)
212 self.assertTrue(q >= p)
213 self.assertFalse(q < r)
214 self.assertFalse(q <= r)
215 self.assertFalse(q > r)
216 self.assertFalse(q >= r)
217 self.assertTrue(set('a').issubset('abc'))
218 self.assertTrue(set('abc').issuperset('a'))
219 self.assertFalse(set('a').issubset('cbs'))
220 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000221
222 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000223 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000224 p = pickle.dumps(self.s, i)
225 dup = pickle.loads(p)
226 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
227 if type(self.s) not in (set, frozenset):
228 self.s.x = 10
229 p = pickle.dumps(self.s)
230 dup = pickle.loads(p)
231 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000232
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000233 def test_deepcopy(self):
234 class Tracer:
235 def __init__(self, value):
236 self.value = value
237 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000238 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000239 def __deepcopy__(self, memo=None):
240 return Tracer(self.value + 1)
241 t = Tracer(10)
242 s = self.thetype([t])
243 dup = copy.deepcopy(s)
244 self.assertNotEqual(id(s), id(dup))
245 for elem in dup:
246 newt = elem
247 self.assertNotEqual(id(t), id(newt))
248 self.assertEqual(t.value + 1, newt.value)
249
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000250 def test_gc(self):
251 # Create a nest of cycles to exercise overall ref count check
252 class A:
253 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000254 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000255 for elem in s:
256 elem.cycle = s
257 elem.sub = elem
258 elem.set = set([elem])
259
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000260 def test_subclass_with_custom_hash(self):
261 # Bug #1257731
262 class H(self.thetype):
263 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000264 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000265 s=H()
266 f=set()
267 f.add(s)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(s in f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000269 f.remove(s)
270 f.add(s)
271 f.discard(s)
272
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000273 def test_badcmp(self):
274 s = self.thetype([BadCmp()])
275 # Detect comparison errors during insertion and lookup
276 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
277 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
278 # Detect errors during mutating operations
279 if hasattr(s, 'add'):
280 self.assertRaises(RuntimeError, s.add, BadCmp())
281 self.assertRaises(RuntimeError, s.discard, BadCmp())
282 self.assertRaises(RuntimeError, s.remove, BadCmp())
283
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000284 def test_cyclical_repr(self):
285 w = ReprWrapper()
286 s = self.thetype([w])
287 w.value = s
288 if self.thetype == set:
289 self.assertEqual(repr(s), '{set(...)}')
290 else:
291 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000292 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000293
294 def test_cyclical_print(self):
295 w = ReprWrapper()
296 s = self.thetype([w])
297 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000298 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000299 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000300 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000301 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000302 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000303 self.assertEqual(fo.read(), repr(s))
304 finally:
305 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000306 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000307
Thomas Wouterscf297e42007-02-23 15:07:44 +0000308 def test_do_not_rehash_dict_keys(self):
309 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000310 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000311 self.assertEqual(sum(elem.hash_count for elem in d), n)
312 s = self.thetype(d)
313 self.assertEqual(sum(elem.hash_count for elem in d), n)
314 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000315 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000316 if hasattr(s, 'symmetric_difference_update'):
317 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000318 self.assertEqual(sum(elem.hash_count for elem in d), n)
319 d2 = dict.fromkeys(set(d))
320 self.assertEqual(sum(elem.hash_count for elem in d), n)
321 d3 = dict.fromkeys(frozenset(d))
322 self.assertEqual(sum(elem.hash_count for elem in d), n)
323 d3 = dict.fromkeys(frozenset(d), 123)
324 self.assertEqual(sum(elem.hash_count for elem in d), n)
325 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000326
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000327 def test_container_iterator(self):
328 # Bug #3680: tp_traverse was not implemented for set iterator object
329 class C(object):
330 pass
331 obj = C()
332 ref = weakref.ref(obj)
333 container = set([obj, 1])
334 obj.x = iter(container)
335 del obj, container
336 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000337 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000338
Raymond Hettingera690a992003-11-16 16:17:49 +0000339class TestSet(TestJointOps):
340 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000341 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000342
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000343 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000344 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000345 s.__init__(self.word)
346 self.assertEqual(s, set(self.word))
347 s.__init__(self.otherword)
348 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000349 self.assertRaises(TypeError, s.__init__, s, 2);
350 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000351
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000352 def test_constructor_identity(self):
353 s = self.thetype(range(3))
354 t = self.thetype(s)
355 self.assertNotEqual(id(s), id(t))
356
Guido van Rossum86e58e22006-08-28 15:27:34 +0000357 def test_set_literal(self):
358 s = set([1,2,3])
359 t = {1,2,3}
360 self.assertEqual(s, t)
361
Raymond Hettingera690a992003-11-16 16:17:49 +0000362 def test_hash(self):
363 self.assertRaises(TypeError, hash, self.s)
364
365 def test_clear(self):
366 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000367 self.assertEqual(self.s, set())
368 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000369
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000370 def test_copy(self):
371 dup = self.s.copy()
372 self.assertEqual(self.s, dup)
373 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000374 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000375
Raymond Hettingera690a992003-11-16 16:17:49 +0000376 def test_add(self):
377 self.s.add('Q')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000378 self.assertTrue('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000379 dup = self.s.copy()
380 self.s.add('Q')
381 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000382 self.assertRaises(TypeError, self.s.add, [])
383
384 def test_remove(self):
385 self.s.remove('a')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000386 self.assertTrue('a' not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000387 self.assertRaises(KeyError, self.s.remove, 'Q')
388 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000389 s = self.thetype([frozenset(self.word)])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000390 self.assertTrue(self.thetype(self.word) in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000391 s.remove(self.thetype(self.word))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000392 self.assertTrue(self.thetype(self.word) not in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000393 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000394
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 def test_remove_keyerror_unpacking(self):
396 # bug: www.python.org/sf/1576657
397 for v1 in ['Q', (1,)]:
398 try:
399 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000400 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 v2 = e.args[0]
402 self.assertEqual(v1, v2)
403 else:
404 self.fail()
405
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000406 def test_remove_keyerror_set(self):
407 key = self.thetype([3, 4])
408 try:
409 self.s.remove(key)
410 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000411 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000412 "KeyError should be {0}, not {1}".format(key,
413 e.args[0]))
414 else:
415 self.fail()
416
Raymond Hettingera690a992003-11-16 16:17:49 +0000417 def test_discard(self):
418 self.s.discard('a')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000419 self.assertTrue('a' not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000420 self.s.discard('Q')
421 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000422 s = self.thetype([frozenset(self.word)])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000423 self.assertTrue(self.thetype(self.word) in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000424 s.discard(self.thetype(self.word))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000425 self.assertTrue(self.thetype(self.word) not in s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000426 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000427
428 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000429 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000430 elem = self.s.pop()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000431 self.assertTrue(elem not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000432 self.assertRaises(KeyError, self.s.pop)
433
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000434 def test_update(self):
435 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000436 self.assertEqual(retval, None)
437 for c in (self.word + self.otherword):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000438 self.assertTrue(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000439 self.assertRaises(PassThru, self.s.update, check_pass_thru())
440 self.assertRaises(TypeError, self.s.update, [[]])
441 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000442 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000443 s = self.thetype('abcba')
444 self.assertEqual(s.update(C(p)), None)
445 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000446 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
447 q = 'ahi'
448 for C in set, frozenset, dict.fromkeys, str, list, tuple:
449 s = self.thetype('abcba')
450 self.assertEqual(s.update(C(p), C(q)), None)
451 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000452
453 def test_ior(self):
454 self.s |= set(self.otherword)
455 for c in (self.word + self.otherword):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000456 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000457
458 def test_intersection_update(self):
459 retval = self.s.intersection_update(self.otherword)
460 self.assertEqual(retval, None)
461 for c in (self.word + self.otherword):
462 if c in self.otherword and c in self.word:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000463 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000464 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000465 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000466 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
467 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000468 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000469 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000470 s = self.thetype('abcba')
471 self.assertEqual(s.intersection_update(C(p)), None)
472 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000473 ss = 'abcba'
474 s = self.thetype(ss)
475 t = 'cbc'
476 self.assertEqual(s.intersection_update(C(p), C(t)), None)
477 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000478
479 def test_iand(self):
480 self.s &= set(self.otherword)
481 for c in (self.word + self.otherword):
482 if c in self.otherword and c in self.word:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000483 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000484 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000485 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000486
487 def test_difference_update(self):
488 retval = self.s.difference_update(self.otherword)
489 self.assertEqual(retval, None)
490 for c in (self.word + self.otherword):
491 if c in self.word and c not in self.otherword:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000492 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000493 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000494 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000495 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
496 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000497 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
498 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000499 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000500 s = self.thetype('abcba')
501 self.assertEqual(s.difference_update(C(p)), None)
502 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000503
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000504 s = self.thetype('abcdefghih')
505 s.difference_update()
506 self.assertEqual(s, self.thetype('abcdefghih'))
507
508 s = self.thetype('abcdefghih')
509 s.difference_update(C('aba'))
510 self.assertEqual(s, self.thetype('cdefghih'))
511
512 s = self.thetype('abcdefghih')
513 s.difference_update(C('cdc'), C('aba'))
514 self.assertEqual(s, self.thetype('efghih'))
515
Raymond Hettingera690a992003-11-16 16:17:49 +0000516 def test_isub(self):
517 self.s -= set(self.otherword)
518 for c in (self.word + self.otherword):
519 if c in self.word and c not in self.otherword:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000520 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000521 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000522 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000523
524 def test_symmetric_difference_update(self):
525 retval = self.s.symmetric_difference_update(self.otherword)
526 self.assertEqual(retval, None)
527 for c in (self.word + self.otherword):
528 if (c in self.word) ^ (c in self.otherword):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000529 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000530 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000531 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000532 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
533 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000534 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000535 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000536 s = self.thetype('abcba')
537 self.assertEqual(s.symmetric_difference_update(C(p)), None)
538 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000539
540 def test_ixor(self):
541 self.s ^= set(self.otherword)
542 for c in (self.word + self.otherword):
543 if (c in self.word) ^ (c in self.otherword):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000544 self.assertTrue(c in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000545 else:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000546 self.assertTrue(c not in self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000547
Raymond Hettingerc991db22005-08-11 07:58:45 +0000548 def test_inplace_on_self(self):
549 t = self.s.copy()
550 t |= t
551 self.assertEqual(t, self.s)
552 t &= t
553 self.assertEqual(t, self.s)
554 t -= t
555 self.assertEqual(t, self.thetype())
556 t = self.s.copy()
557 t ^= t
558 self.assertEqual(t, self.thetype())
559
Raymond Hettinger691d8052004-05-30 07:26:47 +0000560 def test_weakref(self):
561 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000562 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000563 self.assertEqual(str(p), str(s))
564 s = None
565 self.assertRaises(ReferenceError, str, p)
566
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000567 def test_rich_compare(self):
568 class TestRichSetCompare:
569 def __gt__(self, some_set):
570 self.gt_called = True
571 return False
572 def __lt__(self, some_set):
573 self.lt_called = True
574 return False
575 def __ge__(self, some_set):
576 self.ge_called = True
577 return False
578 def __le__(self, some_set):
579 self.le_called = True
580 return False
581
582 # This first tries the bulitin rich set comparison, which doesn't know
583 # how to handle the custom object. Upon returning NotImplemented, the
584 # corresponding comparison on the right object is invoked.
585 myset = {1, 2, 3}
586
587 myobj = TestRichSetCompare()
588 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000589 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000590
591 myobj = TestRichSetCompare()
592 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000593 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000594
595 myobj = TestRichSetCompare()
596 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000597 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000598
599 myobj = TestRichSetCompare()
600 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000602
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000603 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000604 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000605 def test_c_api(self):
606 self.assertEqual(set('abc').test_c_api(), True)
607
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000608class SetSubclass(set):
609 pass
610
611class TestSetSubclass(TestSet):
612 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000613 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000614
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000615class SetSubclassWithKeywordArgs(set):
616 def __init__(self, iterable=[], newarg=None):
617 set.__init__(self, iterable)
618
619class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000620
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000621 def test_keywords_in_subclass(self):
622 'SF bug #1486663 -- this used to erroneously raise a TypeError'
623 SetSubclassWithKeywordArgs(newarg=1)
624
Raymond Hettingera690a992003-11-16 16:17:49 +0000625class TestFrozenSet(TestJointOps):
626 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000627 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000628
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000629 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000630 s = self.thetype(self.word)
631 s.__init__(self.otherword)
632 self.assertEqual(s, set(self.word))
633
Raymond Hettingerd7946662005-08-01 21:39:29 +0000634 def test_singleton_empty_frozenset(self):
635 f = frozenset()
636 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
637 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000638 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000639 frozenset(f), f]
640 # All of the empty frozensets should have just one id()
641 self.assertEqual(len(set(map(id, efs))), 1)
642
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000643 def test_constructor_identity(self):
644 s = self.thetype(range(3))
645 t = self.thetype(s)
646 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000647
Raymond Hettingera690a992003-11-16 16:17:49 +0000648 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000649 self.assertEqual(hash(self.thetype('abcdeb')),
650 hash(self.thetype('ebecda')))
651
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000652 # make sure that all permutations give the same hash value
653 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000654 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000655 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000656 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000657 shuffle(seq)
658 results.add(hash(self.thetype(seq)))
659 self.assertEqual(len(results), 1)
660
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000661 def test_copy(self):
662 dup = self.s.copy()
663 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000664
665 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000666 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000667 key1 = self.thetype(seq)
668 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000669 self.assertEqual(key1, key2)
670 self.assertNotEqual(id(key1), id(key2))
671 d = {}
672 d[key1] = 42
673 self.assertEqual(d[key2], 42)
674
675 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000676 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000677 self.assertEqual(hash(f), hash(f))
678
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000679 def test_hash_effectiveness(self):
680 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000681 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000682 addhashvalue = hashvalues.add
683 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000684 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000685 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
686 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000687
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000688class FrozenSetSubclass(frozenset):
689 pass
690
691class TestFrozenSetSubclass(TestFrozenSet):
692 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000693 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000694
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000695 def test_constructor_identity(self):
696 s = self.thetype(range(3))
697 t = self.thetype(s)
698 self.assertNotEqual(id(s), id(t))
699
700 def test_copy(self):
701 dup = self.s.copy()
702 self.assertNotEqual(id(self.s), id(dup))
703
704 def test_nested_empty_constructor(self):
705 s = self.thetype()
706 t = self.thetype(s)
707 self.assertEqual(s, t)
708
Raymond Hettingerd7946662005-08-01 21:39:29 +0000709 def test_singleton_empty_frozenset(self):
710 Frozenset = self.thetype
711 f = frozenset()
712 F = Frozenset()
713 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
714 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000715 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000716 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
717 # All empty frozenset subclass instances should have different ids
718 self.assertEqual(len(set(map(id, efs))), len(efs))
719
Raymond Hettingera690a992003-11-16 16:17:49 +0000720# Tests taken from test_sets.py =============================================
721
722empty_set = set()
723
724#==============================================================================
725
726class TestBasicOps(unittest.TestCase):
727
728 def test_repr(self):
729 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000730 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000731
Raymond Hettingereae05de2004-07-09 04:51:24 +0000732 def test_print(self):
733 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000734 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000735 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000736 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000737 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000738 self.assertEqual(fo.read(), repr(self.set))
739 finally:
740 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000741 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000742
Raymond Hettingera690a992003-11-16 16:17:49 +0000743 def test_length(self):
744 self.assertEqual(len(self.set), self.length)
745
746 def test_self_equality(self):
747 self.assertEqual(self.set, self.set)
748
749 def test_equivalent_equality(self):
750 self.assertEqual(self.set, self.dup)
751
752 def test_copy(self):
753 self.assertEqual(self.set.copy(), self.dup)
754
755 def test_self_union(self):
756 result = self.set | self.set
757 self.assertEqual(result, self.dup)
758
759 def test_empty_union(self):
760 result = self.set | empty_set
761 self.assertEqual(result, self.dup)
762
763 def test_union_empty(self):
764 result = empty_set | self.set
765 self.assertEqual(result, self.dup)
766
767 def test_self_intersection(self):
768 result = self.set & self.set
769 self.assertEqual(result, self.dup)
770
771 def test_empty_intersection(self):
772 result = self.set & empty_set
773 self.assertEqual(result, empty_set)
774
775 def test_intersection_empty(self):
776 result = empty_set & self.set
777 self.assertEqual(result, empty_set)
778
Guido van Rossum58da9312007-11-10 23:39:45 +0000779 def test_self_isdisjoint(self):
780 result = self.set.isdisjoint(self.set)
781 self.assertEqual(result, not self.set)
782
783 def test_empty_isdisjoint(self):
784 result = self.set.isdisjoint(empty_set)
785 self.assertEqual(result, True)
786
787 def test_isdisjoint_empty(self):
788 result = empty_set.isdisjoint(self.set)
789 self.assertEqual(result, True)
790
Raymond Hettingera690a992003-11-16 16:17:49 +0000791 def test_self_symmetric_difference(self):
792 result = self.set ^ self.set
793 self.assertEqual(result, empty_set)
794
795 def checkempty_symmetric_difference(self):
796 result = self.set ^ empty_set
797 self.assertEqual(result, self.set)
798
799 def test_self_difference(self):
800 result = self.set - self.set
801 self.assertEqual(result, empty_set)
802
803 def test_empty_difference(self):
804 result = self.set - empty_set
805 self.assertEqual(result, self.dup)
806
807 def test_empty_difference_rev(self):
808 result = empty_set - self.set
809 self.assertEqual(result, empty_set)
810
811 def test_iteration(self):
812 for v in self.set:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000813 self.assertTrue(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000814 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000815 # note: __length_hint__ is an internal undocumented API,
816 # don't rely on it in your own programs
817 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000818
819 def test_pickling(self):
820 p = pickle.dumps(self.set)
821 copy = pickle.loads(p)
822 self.assertEqual(self.set, copy,
823 "%s != %s" % (self.set, copy))
824
825#------------------------------------------------------------------------------
826
827class TestBasicOpsEmpty(TestBasicOps):
828 def setUp(self):
829 self.case = "empty set"
830 self.values = []
831 self.set = set(self.values)
832 self.dup = set(self.values)
833 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000834 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000835
836#------------------------------------------------------------------------------
837
838class TestBasicOpsSingleton(TestBasicOps):
839 def setUp(self):
840 self.case = "unit set (number)"
841 self.values = [3]
842 self.set = set(self.values)
843 self.dup = set(self.values)
844 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000845 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000846
847 def test_in(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000848 self.assertTrue(3 in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000849
850 def test_not_in(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000851 self.assertTrue(2 not in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000852
853#------------------------------------------------------------------------------
854
855class TestBasicOpsTuple(TestBasicOps):
856 def setUp(self):
857 self.case = "unit set (tuple)"
858 self.values = [(0, "zero")]
859 self.set = set(self.values)
860 self.dup = set(self.values)
861 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000862 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000863
864 def test_in(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000865 self.assertTrue((0, "zero") in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000866
867 def test_not_in(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000868 self.assertTrue(9 not in self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000869
870#------------------------------------------------------------------------------
871
872class TestBasicOpsTriple(TestBasicOps):
873 def setUp(self):
874 self.case = "triple set"
875 self.values = [0, "zero", operator.add]
876 self.set = set(self.values)
877 self.dup = set(self.values)
878 self.length = 3
879 self.repr = None
880
Christian Heimes0ded5b52007-12-10 15:50:56 +0000881#------------------------------------------------------------------------------
882
883class TestBasicOpsString(TestBasicOps):
884 def setUp(self):
885 self.case = "string set"
886 self.values = ["a", "b", "c"]
887 self.set = set(self.values)
888 self.dup = set(self.values)
889 self.length = 3
890 self.repr = "{'a', 'c', 'b'}"
891
892#------------------------------------------------------------------------------
893
894class TestBasicOpsBytes(TestBasicOps):
895 def setUp(self):
896 self.case = "string set"
897 self.values = [b"a", b"b", b"c"]
898 self.set = set(self.values)
899 self.dup = set(self.values)
900 self.length = 3
901 self.repr = "{b'a', b'c', b'b'}"
902
903#------------------------------------------------------------------------------
904
905class TestBasicOpsMixedStringBytes(TestBasicOps):
906 def setUp(self):
907 self.warning_filters = warnings.filters[:]
908 warnings.simplefilter('ignore', BytesWarning)
909 self.case = "string and bytes set"
910 self.values = ["a", "b", b"a", b"b"]
911 self.set = set(self.values)
912 self.dup = set(self.values)
913 self.length = 4
914 self.repr = "{'a', b'a', 'b', b'b'}"
915
916 def tearDown(self):
917 warnings.filters = self.warning_filters
918
Raymond Hettingera690a992003-11-16 16:17:49 +0000919#==============================================================================
920
921def baditer():
922 raise TypeError
923 yield True
924
925def gooditer():
926 yield True
927
928class TestExceptionPropagation(unittest.TestCase):
929 """SF 628246: Set constructor should not trap iterator TypeErrors"""
930
931 def test_instanceWithException(self):
932 self.assertRaises(TypeError, set, baditer())
933
934 def test_instancesWithoutException(self):
935 # All of these iterables should load without exception.
936 set([1,2,3])
937 set((1,2,3))
938 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000939 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000940 set('abc')
941 set(gooditer())
942
Neal Norwitzfcf44352005-11-27 20:37:43 +0000943 def test_changingSizeWhileIterating(self):
944 s = set([1,2,3])
945 try:
946 for i in s:
947 s.update([4])
948 except RuntimeError:
949 pass
950 else:
951 self.fail("no exception when changing size during iteration")
952
Raymond Hettingera690a992003-11-16 16:17:49 +0000953#==============================================================================
954
955class TestSetOfSets(unittest.TestCase):
956 def test_constructor(self):
957 inner = frozenset([1])
958 outer = set([inner])
959 element = outer.pop()
960 self.assertEqual(type(element), frozenset)
961 outer.add(inner) # Rebuild set of sets with .add method
962 outer.remove(inner)
963 self.assertEqual(outer, set()) # Verify that remove worked
964 outer.discard(inner) # Absence of KeyError indicates working fine
965
966#==============================================================================
967
968class TestBinaryOps(unittest.TestCase):
969 def setUp(self):
970 self.set = set((2, 4, 6))
971
972 def test_eq(self): # SF bug 643115
973 self.assertEqual(self.set, set({2:1,4:3,6:5}))
974
975 def test_union_subset(self):
976 result = self.set | set([2])
977 self.assertEqual(result, set((2, 4, 6)))
978
979 def test_union_superset(self):
980 result = self.set | set([2, 4, 6, 8])
981 self.assertEqual(result, set([2, 4, 6, 8]))
982
983 def test_union_overlap(self):
984 result = self.set | set([3, 4, 5])
985 self.assertEqual(result, set([2, 3, 4, 5, 6]))
986
987 def test_union_non_overlap(self):
988 result = self.set | set([8])
989 self.assertEqual(result, set([2, 4, 6, 8]))
990
991 def test_intersection_subset(self):
992 result = self.set & set((2, 4))
993 self.assertEqual(result, set((2, 4)))
994
995 def test_intersection_superset(self):
996 result = self.set & set([2, 4, 6, 8])
997 self.assertEqual(result, set([2, 4, 6]))
998
999 def test_intersection_overlap(self):
1000 result = self.set & set([3, 4, 5])
1001 self.assertEqual(result, set([4]))
1002
1003 def test_intersection_non_overlap(self):
1004 result = self.set & set([8])
1005 self.assertEqual(result, empty_set)
1006
Guido van Rossum58da9312007-11-10 23:39:45 +00001007 def test_isdisjoint_subset(self):
1008 result = self.set.isdisjoint(set((2, 4)))
1009 self.assertEqual(result, False)
1010
1011 def test_isdisjoint_superset(self):
1012 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1013 self.assertEqual(result, False)
1014
1015 def test_isdisjoint_overlap(self):
1016 result = self.set.isdisjoint(set([3, 4, 5]))
1017 self.assertEqual(result, False)
1018
1019 def test_isdisjoint_non_overlap(self):
1020 result = self.set.isdisjoint(set([8]))
1021 self.assertEqual(result, True)
1022
Raymond Hettingera690a992003-11-16 16:17:49 +00001023 def test_sym_difference_subset(self):
1024 result = self.set ^ set((2, 4))
1025 self.assertEqual(result, set([6]))
1026
1027 def test_sym_difference_superset(self):
1028 result = self.set ^ set((2, 4, 6, 8))
1029 self.assertEqual(result, set([8]))
1030
1031 def test_sym_difference_overlap(self):
1032 result = self.set ^ set((3, 4, 5))
1033 self.assertEqual(result, set([2, 3, 5, 6]))
1034
1035 def test_sym_difference_non_overlap(self):
1036 result = self.set ^ set([8])
1037 self.assertEqual(result, set([2, 4, 6, 8]))
1038
Raymond Hettingera690a992003-11-16 16:17:49 +00001039#==============================================================================
1040
1041class TestUpdateOps(unittest.TestCase):
1042 def setUp(self):
1043 self.set = set((2, 4, 6))
1044
1045 def test_union_subset(self):
1046 self.set |= set([2])
1047 self.assertEqual(self.set, set((2, 4, 6)))
1048
1049 def test_union_superset(self):
1050 self.set |= set([2, 4, 6, 8])
1051 self.assertEqual(self.set, set([2, 4, 6, 8]))
1052
1053 def test_union_overlap(self):
1054 self.set |= set([3, 4, 5])
1055 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1056
1057 def test_union_non_overlap(self):
1058 self.set |= set([8])
1059 self.assertEqual(self.set, set([2, 4, 6, 8]))
1060
1061 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001062 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001063 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1064
1065 def test_intersection_subset(self):
1066 self.set &= set((2, 4))
1067 self.assertEqual(self.set, set((2, 4)))
1068
1069 def test_intersection_superset(self):
1070 self.set &= set([2, 4, 6, 8])
1071 self.assertEqual(self.set, set([2, 4, 6]))
1072
1073 def test_intersection_overlap(self):
1074 self.set &= set([3, 4, 5])
1075 self.assertEqual(self.set, set([4]))
1076
1077 def test_intersection_non_overlap(self):
1078 self.set &= set([8])
1079 self.assertEqual(self.set, empty_set)
1080
1081 def test_intersection_method_call(self):
1082 self.set.intersection_update(set([3, 4, 5]))
1083 self.assertEqual(self.set, set([4]))
1084
1085 def test_sym_difference_subset(self):
1086 self.set ^= set((2, 4))
1087 self.assertEqual(self.set, set([6]))
1088
1089 def test_sym_difference_superset(self):
1090 self.set ^= set((2, 4, 6, 8))
1091 self.assertEqual(self.set, set([8]))
1092
1093 def test_sym_difference_overlap(self):
1094 self.set ^= set((3, 4, 5))
1095 self.assertEqual(self.set, set([2, 3, 5, 6]))
1096
1097 def test_sym_difference_non_overlap(self):
1098 self.set ^= set([8])
1099 self.assertEqual(self.set, set([2, 4, 6, 8]))
1100
1101 def test_sym_difference_method_call(self):
1102 self.set.symmetric_difference_update(set([3, 4, 5]))
1103 self.assertEqual(self.set, set([2, 3, 5, 6]))
1104
1105 def test_difference_subset(self):
1106 self.set -= set((2, 4))
1107 self.assertEqual(self.set, set([6]))
1108
1109 def test_difference_superset(self):
1110 self.set -= set((2, 4, 6, 8))
1111 self.assertEqual(self.set, set([]))
1112
1113 def test_difference_overlap(self):
1114 self.set -= set((3, 4, 5))
1115 self.assertEqual(self.set, set([2, 6]))
1116
1117 def test_difference_non_overlap(self):
1118 self.set -= set([8])
1119 self.assertEqual(self.set, set([2, 4, 6]))
1120
1121 def test_difference_method_call(self):
1122 self.set.difference_update(set([3, 4, 5]))
1123 self.assertEqual(self.set, set([2, 6]))
1124
1125#==============================================================================
1126
1127class TestMutate(unittest.TestCase):
1128 def setUp(self):
1129 self.values = ["a", "b", "c"]
1130 self.set = set(self.values)
1131
1132 def test_add_present(self):
1133 self.set.add("c")
1134 self.assertEqual(self.set, set("abc"))
1135
1136 def test_add_absent(self):
1137 self.set.add("d")
1138 self.assertEqual(self.set, set("abcd"))
1139
1140 def test_add_until_full(self):
1141 tmp = set()
1142 expected_len = 0
1143 for v in self.values:
1144 tmp.add(v)
1145 expected_len += 1
1146 self.assertEqual(len(tmp), expected_len)
1147 self.assertEqual(tmp, self.set)
1148
1149 def test_remove_present(self):
1150 self.set.remove("b")
1151 self.assertEqual(self.set, set("ac"))
1152
1153 def test_remove_absent(self):
1154 try:
1155 self.set.remove("d")
1156 self.fail("Removing missing element should have raised LookupError")
1157 except LookupError:
1158 pass
1159
1160 def test_remove_until_empty(self):
1161 expected_len = len(self.set)
1162 for v in self.values:
1163 self.set.remove(v)
1164 expected_len -= 1
1165 self.assertEqual(len(self.set), expected_len)
1166
1167 def test_discard_present(self):
1168 self.set.discard("c")
1169 self.assertEqual(self.set, set("ab"))
1170
1171 def test_discard_absent(self):
1172 self.set.discard("d")
1173 self.assertEqual(self.set, set("abc"))
1174
1175 def test_clear(self):
1176 self.set.clear()
1177 self.assertEqual(len(self.set), 0)
1178
1179 def test_pop(self):
1180 popped = {}
1181 while self.set:
1182 popped[self.set.pop()] = None
1183 self.assertEqual(len(popped), len(self.values))
1184 for v in self.values:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001185 self.assertTrue(v in popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001186
1187 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001188 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001189 self.assertEqual(self.set, set(self.values))
1190
1191 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001192 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001193 self.assertEqual(self.set, set(self.values))
1194
1195 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001196 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001197 self.assertEqual(self.set, set(self.values + ["z"]))
1198
1199#==============================================================================
1200
1201class TestSubsets(unittest.TestCase):
1202
1203 case2method = {"<=": "issubset",
1204 ">=": "issuperset",
1205 }
1206
1207 reverse = {"==": "==",
1208 "!=": "!=",
1209 "<": ">",
1210 ">": "<",
1211 "<=": ">=",
1212 ">=": "<=",
1213 }
1214
1215 def test_issubset(self):
1216 x = self.left
1217 y = self.right
1218 for case in "!=", "==", "<", "<=", ">", ">=":
1219 expected = case in self.cases
1220 # Test the binary infix spelling.
1221 result = eval("x" + case + "y", locals())
1222 self.assertEqual(result, expected)
1223 # Test the "friendly" method-name spelling, if one exists.
1224 if case in TestSubsets.case2method:
1225 method = getattr(x, TestSubsets.case2method[case])
1226 result = method(y)
1227 self.assertEqual(result, expected)
1228
1229 # Now do the same for the operands reversed.
1230 rcase = TestSubsets.reverse[case]
1231 result = eval("y" + rcase + "x", locals())
1232 self.assertEqual(result, expected)
1233 if rcase in TestSubsets.case2method:
1234 method = getattr(y, TestSubsets.case2method[rcase])
1235 result = method(x)
1236 self.assertEqual(result, expected)
1237#------------------------------------------------------------------------------
1238
1239class TestSubsetEqualEmpty(TestSubsets):
1240 left = set()
1241 right = set()
1242 name = "both empty"
1243 cases = "==", "<=", ">="
1244
1245#------------------------------------------------------------------------------
1246
1247class TestSubsetEqualNonEmpty(TestSubsets):
1248 left = set([1, 2])
1249 right = set([1, 2])
1250 name = "equal pair"
1251 cases = "==", "<=", ">="
1252
1253#------------------------------------------------------------------------------
1254
1255class TestSubsetEmptyNonEmpty(TestSubsets):
1256 left = set()
1257 right = set([1, 2])
1258 name = "one empty, one non-empty"
1259 cases = "!=", "<", "<="
1260
1261#------------------------------------------------------------------------------
1262
1263class TestSubsetPartial(TestSubsets):
1264 left = set([1])
1265 right = set([1, 2])
1266 name = "one a non-empty proper subset of other"
1267 cases = "!=", "<", "<="
1268
1269#------------------------------------------------------------------------------
1270
1271class TestSubsetNonOverlap(TestSubsets):
1272 left = set([1])
1273 right = set([2])
1274 name = "neither empty, neither contains"
1275 cases = "!="
1276
1277#==============================================================================
1278
1279class TestOnlySetsInBinaryOps(unittest.TestCase):
1280
1281 def test_eq_ne(self):
1282 # Unlike the others, this is testing that == and != *are* allowed.
1283 self.assertEqual(self.other == self.set, False)
1284 self.assertEqual(self.set == self.other, False)
1285 self.assertEqual(self.other != self.set, True)
1286 self.assertEqual(self.set != self.other, True)
1287
1288 def test_ge_gt_le_lt(self):
1289 self.assertRaises(TypeError, lambda: self.set < self.other)
1290 self.assertRaises(TypeError, lambda: self.set <= self.other)
1291 self.assertRaises(TypeError, lambda: self.set > self.other)
1292 self.assertRaises(TypeError, lambda: self.set >= self.other)
1293
1294 self.assertRaises(TypeError, lambda: self.other < self.set)
1295 self.assertRaises(TypeError, lambda: self.other <= self.set)
1296 self.assertRaises(TypeError, lambda: self.other > self.set)
1297 self.assertRaises(TypeError, lambda: self.other >= self.set)
1298
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001299 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001300 try:
1301 self.set |= self.other
1302 except TypeError:
1303 pass
1304 else:
1305 self.fail("expected TypeError")
1306
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001307 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001308 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001309 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001310 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001311 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001312
1313 def test_union(self):
1314 self.assertRaises(TypeError, lambda: self.set | self.other)
1315 self.assertRaises(TypeError, lambda: self.other | self.set)
1316 if self.otherIsIterable:
1317 self.set.union(self.other)
1318 else:
1319 self.assertRaises(TypeError, self.set.union, self.other)
1320
1321 def test_intersection_update_operator(self):
1322 try:
1323 self.set &= self.other
1324 except TypeError:
1325 pass
1326 else:
1327 self.fail("expected TypeError")
1328
1329 def test_intersection_update(self):
1330 if self.otherIsIterable:
1331 self.set.intersection_update(self.other)
1332 else:
1333 self.assertRaises(TypeError,
1334 self.set.intersection_update,
1335 self.other)
1336
1337 def test_intersection(self):
1338 self.assertRaises(TypeError, lambda: self.set & self.other)
1339 self.assertRaises(TypeError, lambda: self.other & self.set)
1340 if self.otherIsIterable:
1341 self.set.intersection(self.other)
1342 else:
1343 self.assertRaises(TypeError, self.set.intersection, self.other)
1344
1345 def test_sym_difference_update_operator(self):
1346 try:
1347 self.set ^= self.other
1348 except TypeError:
1349 pass
1350 else:
1351 self.fail("expected TypeError")
1352
1353 def test_sym_difference_update(self):
1354 if self.otherIsIterable:
1355 self.set.symmetric_difference_update(self.other)
1356 else:
1357 self.assertRaises(TypeError,
1358 self.set.symmetric_difference_update,
1359 self.other)
1360
1361 def test_sym_difference(self):
1362 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1363 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1364 if self.otherIsIterable:
1365 self.set.symmetric_difference(self.other)
1366 else:
1367 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1368
1369 def test_difference_update_operator(self):
1370 try:
1371 self.set -= self.other
1372 except TypeError:
1373 pass
1374 else:
1375 self.fail("expected TypeError")
1376
1377 def test_difference_update(self):
1378 if self.otherIsIterable:
1379 self.set.difference_update(self.other)
1380 else:
1381 self.assertRaises(TypeError,
1382 self.set.difference_update,
1383 self.other)
1384
1385 def test_difference(self):
1386 self.assertRaises(TypeError, lambda: self.set - self.other)
1387 self.assertRaises(TypeError, lambda: self.other - self.set)
1388 if self.otherIsIterable:
1389 self.set.difference(self.other)
1390 else:
1391 self.assertRaises(TypeError, self.set.difference, self.other)
1392
1393#------------------------------------------------------------------------------
1394
1395class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1396 def setUp(self):
1397 self.set = set((1, 2, 3))
1398 self.other = 19
1399 self.otherIsIterable = False
1400
1401#------------------------------------------------------------------------------
1402
1403class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1404 def setUp(self):
1405 self.set = set((1, 2, 3))
1406 self.other = {1:2, 3:4}
1407 self.otherIsIterable = True
1408
1409#------------------------------------------------------------------------------
1410
1411class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1412 def setUp(self):
1413 self.set = set((1, 2, 3))
1414 self.other = operator.add
1415 self.otherIsIterable = False
1416
1417#------------------------------------------------------------------------------
1418
1419class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1420 def setUp(self):
1421 self.set = set((1, 2, 3))
1422 self.other = (2, 4, 6)
1423 self.otherIsIterable = True
1424
1425#------------------------------------------------------------------------------
1426
1427class TestOnlySetsString(TestOnlySetsInBinaryOps):
1428 def setUp(self):
1429 self.set = set((1, 2, 3))
1430 self.other = 'abc'
1431 self.otherIsIterable = True
1432
1433#------------------------------------------------------------------------------
1434
1435class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1436 def setUp(self):
1437 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001438 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001439 yield i
1440 self.set = set((1, 2, 3))
1441 self.other = gen()
1442 self.otherIsIterable = True
1443
1444#==============================================================================
1445
1446class TestCopying(unittest.TestCase):
1447
1448 def test_copy(self):
1449 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001450 dup_list = sorted(dup, key=repr)
1451 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001452 self.assertEqual(len(dup_list), len(set_list))
1453 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001454 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001455
1456 def test_deep_copy(self):
1457 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001458 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001459 dup_list = sorted(dup, key=repr)
1460 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 self.assertEqual(len(dup_list), len(set_list))
1462 for i in range(len(dup_list)):
1463 self.assertEqual(dup_list[i], set_list[i])
1464
1465#------------------------------------------------------------------------------
1466
1467class TestCopyingEmpty(TestCopying):
1468 def setUp(self):
1469 self.set = set()
1470
1471#------------------------------------------------------------------------------
1472
1473class TestCopyingSingleton(TestCopying):
1474 def setUp(self):
1475 self.set = set(["hello"])
1476
1477#------------------------------------------------------------------------------
1478
1479class TestCopyingTriple(TestCopying):
1480 def setUp(self):
1481 self.set = set(["zero", 0, None])
1482
1483#------------------------------------------------------------------------------
1484
1485class TestCopyingTuple(TestCopying):
1486 def setUp(self):
1487 self.set = set([(1, 2)])
1488
1489#------------------------------------------------------------------------------
1490
1491class TestCopyingNested(TestCopying):
1492 def setUp(self):
1493 self.set = set([((1, 2), (3, 4))])
1494
1495#==============================================================================
1496
1497class TestIdentities(unittest.TestCase):
1498 def setUp(self):
1499 self.a = set('abracadabra')
1500 self.b = set('alacazam')
1501
1502 def test_binopsVsSubsets(self):
1503 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001504 self.assertTrue(a - b < a)
1505 self.assertTrue(b - a < b)
1506 self.assertTrue(a & b < a)
1507 self.assertTrue(a & b < b)
1508 self.assertTrue(a | b > a)
1509 self.assertTrue(a | b > b)
1510 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001511
1512 def test_commutativity(self):
1513 a, b = self.a, self.b
1514 self.assertEqual(a&b, b&a)
1515 self.assertEqual(a|b, b|a)
1516 self.assertEqual(a^b, b^a)
1517 if a != b:
1518 self.assertNotEqual(a-b, b-a)
1519
1520 def test_summations(self):
1521 # check that sums of parts equal the whole
1522 a, b = self.a, self.b
1523 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1524 self.assertEqual((a&b)|(a^b), a|b)
1525 self.assertEqual(a|(b-a), a|b)
1526 self.assertEqual((a-b)|b, a|b)
1527 self.assertEqual((a-b)|(a&b), a)
1528 self.assertEqual((b-a)|(a&b), b)
1529 self.assertEqual((a-b)|(b-a), a^b)
1530
1531 def test_exclusion(self):
1532 # check that inverse operations show non-overlap
1533 a, b, zero = self.a, self.b, set()
1534 self.assertEqual((a-b)&b, zero)
1535 self.assertEqual((b-a)&a, zero)
1536 self.assertEqual((a&b)&(a^b), zero)
1537
1538# Tests derived from test_itertools.py =======================================
1539
1540def R(seqn):
1541 'Regular generator'
1542 for i in seqn:
1543 yield i
1544
1545class G:
1546 'Sequence using __getitem__'
1547 def __init__(self, seqn):
1548 self.seqn = seqn
1549 def __getitem__(self, i):
1550 return self.seqn[i]
1551
1552class I:
1553 'Sequence using iterator protocol'
1554 def __init__(self, seqn):
1555 self.seqn = seqn
1556 self.i = 0
1557 def __iter__(self):
1558 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001559 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001560 if self.i >= len(self.seqn): raise StopIteration
1561 v = self.seqn[self.i]
1562 self.i += 1
1563 return v
1564
1565class Ig:
1566 'Sequence using iterator protocol defined with a generator'
1567 def __init__(self, seqn):
1568 self.seqn = seqn
1569 self.i = 0
1570 def __iter__(self):
1571 for val in self.seqn:
1572 yield val
1573
1574class X:
1575 'Missing __getitem__ and __iter__'
1576 def __init__(self, seqn):
1577 self.seqn = seqn
1578 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001579 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001580 if self.i >= len(self.seqn): raise StopIteration
1581 v = self.seqn[self.i]
1582 self.i += 1
1583 return v
1584
1585class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001586 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001587 def __init__(self, seqn):
1588 self.seqn = seqn
1589 self.i = 0
1590 def __iter__(self):
1591 return self
1592
1593class E:
1594 'Test propagation of exceptions'
1595 def __init__(self, seqn):
1596 self.seqn = seqn
1597 self.i = 0
1598 def __iter__(self):
1599 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001600 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001601 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001602
1603class S:
1604 'Test immediate stop'
1605 def __init__(self, seqn):
1606 pass
1607 def __iter__(self):
1608 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001609 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001610 raise StopIteration
1611
Raymond Hettingera6c60372008-03-13 01:26:19 +00001612from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001613def L(seqn):
1614 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001615 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001616
1617class TestVariousIteratorArgs(unittest.TestCase):
1618
1619 def test_constructor(self):
1620 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001621 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001622 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001623 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001624 self.assertRaises(TypeError, cons , X(s))
1625 self.assertRaises(TypeError, cons , N(s))
1626 self.assertRaises(ZeroDivisionError, cons , E(s))
1627
1628 def test_inline_methods(self):
1629 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001630 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001631 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001632 for g in (G, I, Ig, L, R):
1633 expected = meth(data)
1634 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001635 if isinstance(expected, bool):
1636 self.assertEqual(actual, expected)
1637 else:
1638 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001639 self.assertRaises(TypeError, meth, X(s))
1640 self.assertRaises(TypeError, meth, N(s))
1641 self.assertRaises(ZeroDivisionError, meth, E(s))
1642
1643 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001644 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001645 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001646 'difference_update', 'symmetric_difference_update'):
1647 for g in (G, I, Ig, S, L, R):
1648 s = set('january')
1649 t = s.copy()
1650 getattr(s, methname)(list(g(data)))
1651 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001652 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001653
1654 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1655 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1656 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1657
Christian Heimes969fe572008-01-25 11:23:10 +00001658# Application tests (based on David Eppstein's graph recipes ====================================
1659
1660def powerset(U):
1661 """Generates all subsets of a set or sequence U."""
1662 U = iter(U)
1663 try:
1664 x = frozenset([next(U)])
1665 for S in powerset(U):
1666 yield S
1667 yield S | x
1668 except StopIteration:
1669 yield frozenset()
1670
1671def cube(n):
1672 """Graph of n-dimensional hypercube."""
1673 singletons = [frozenset([x]) for x in range(n)]
1674 return dict([(x, frozenset([x^s for s in singletons]))
1675 for x in powerset(range(n))])
1676
1677def linegraph(G):
1678 """Graph, the vertices of which are edges of G,
1679 with two vertices being adjacent iff the corresponding
1680 edges share a vertex."""
1681 L = {}
1682 for x in G:
1683 for y in G[x]:
1684 nx = [frozenset([x,z]) for z in G[x] if z != y]
1685 ny = [frozenset([y,z]) for z in G[y] if z != x]
1686 L[frozenset([x,y])] = frozenset(nx+ny)
1687 return L
1688
1689def faces(G):
1690 'Return a set of faces in G. Where a face is a set of vertices on that face'
1691 # currently limited to triangles,squares, and pentagons
1692 f = set()
1693 for v1, edges in G.items():
1694 for v2 in edges:
1695 for v3 in G[v2]:
1696 if v1 == v3:
1697 continue
1698 if v1 in G[v3]:
1699 f.add(frozenset([v1, v2, v3]))
1700 else:
1701 for v4 in G[v3]:
1702 if v4 == v2:
1703 continue
1704 if v1 in G[v4]:
1705 f.add(frozenset([v1, v2, v3, v4]))
1706 else:
1707 for v5 in G[v4]:
1708 if v5 == v3 or v5 == v2:
1709 continue
1710 if v1 in G[v5]:
1711 f.add(frozenset([v1, v2, v3, v4, v5]))
1712 return f
1713
1714
1715class TestGraphs(unittest.TestCase):
1716
1717 def test_cube(self):
1718
1719 g = cube(3) # vert --> {v1, v2, v3}
1720 vertices1 = set(g)
1721 self.assertEqual(len(vertices1), 8) # eight vertices
1722 for edge in g.values():
1723 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1724 vertices2 = set(v for edges in g.values() for v in edges)
1725 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1726
1727 cubefaces = faces(g)
1728 self.assertEqual(len(cubefaces), 6) # six faces
1729 for face in cubefaces:
1730 self.assertEqual(len(face), 4) # each face is a square
1731
1732 def test_cuboctahedron(self):
1733
1734 # http://en.wikipedia.org/wiki/Cuboctahedron
1735 # 8 triangular faces and 6 square faces
1736 # 12 indentical vertices each connecting a triangle and square
1737
1738 g = cube(3)
1739 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1740 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1741
1742 vertices = set(cuboctahedron)
1743 for edges in cuboctahedron.values():
1744 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1745 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1746 self.assertEqual(vertices, othervertices) # edge vertices in original set
1747
1748 cubofaces = faces(cuboctahedron)
1749 facesizes = collections.defaultdict(int)
1750 for face in cubofaces:
1751 facesizes[len(face)] += 1
1752 self.assertEqual(facesizes[3], 8) # eight triangular faces
1753 self.assertEqual(facesizes[4], 6) # six square faces
1754
1755 for vertex in cuboctahedron:
1756 edge = vertex # Cuboctahedron vertices are edges in Cube
1757 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1758 for cubevert in edge:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001759 self.assertTrue(cubevert in g)
Christian Heimes969fe572008-01-25 11:23:10 +00001760
1761
Raymond Hettingera690a992003-11-16 16:17:49 +00001762#==============================================================================
1763
1764def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001765 test_classes = (
1766 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001767 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001768 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001769 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001770 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001771 TestSetOfSets,
1772 TestExceptionPropagation,
1773 TestBasicOpsEmpty,
1774 TestBasicOpsSingleton,
1775 TestBasicOpsTuple,
1776 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001777 TestBasicOpsString,
1778 TestBasicOpsBytes,
1779 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001780 TestBinaryOps,
1781 TestUpdateOps,
1782 TestMutate,
1783 TestSubsetEqualEmpty,
1784 TestSubsetEqualNonEmpty,
1785 TestSubsetEmptyNonEmpty,
1786 TestSubsetPartial,
1787 TestSubsetNonOverlap,
1788 TestOnlySetsNumeric,
1789 TestOnlySetsDict,
1790 TestOnlySetsOperator,
1791 TestOnlySetsTuple,
1792 TestOnlySetsString,
1793 TestOnlySetsGenerator,
1794 TestCopyingEmpty,
1795 TestCopyingSingleton,
1796 TestCopyingTriple,
1797 TestCopyingTuple,
1798 TestCopyingNested,
1799 TestIdentities,
1800 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001801 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001802 )
1803
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001804 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001805
1806 # verify reference counting
1807 if verbose and hasattr(sys, "gettotalrefcount"):
1808 import gc
1809 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001810 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001811 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001812 gc.collect()
1813 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001814 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001815
1816if __name__ == "__main__":
1817 test_main(verbose=True)