blob: da627238ccc0f03fae73181fe2409e8dbfc4dc7d [file] [log] [blame]
Éric Araujo1138eba2010-09-05 18:59: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 Hettinger82cb9a22005-07-05 05:34:43 +00008from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00009import sys
Christian Heimes0ded5b52007-12-10 15:50:56 +000010import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000011import collections
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +000012import collections.abc
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)
Raymond Hettinger3fb156c2010-04-18 23:05:22 +000052 self.assertRaises(TypeError, set().__init__, a=1)
Raymond Hettinger6429a472004-09-28 01:51:35 +000053
Raymond Hettingera690a992003-11-16 16:17:49 +000054 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000055 actual = sorted(self.s)
56 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000057 self.assertEqual(actual, expected)
58 self.assertRaises(PassThru, self.thetype, check_pass_thru())
59 self.assertRaises(TypeError, self.thetype, [[]])
60
61 def test_len(self):
62 self.assertEqual(len(self.s), len(self.d))
63
64 def test_contains(self):
65 for c in self.letters:
66 self.assertEqual(c in self.s, c in self.d)
67 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000068 s = self.thetype([frozenset(self.letters)])
Benjamin Peterson577473f2010-01-19 00:09:57 +000069 self.assertIn(self.thetype(self.letters), s)
Raymond Hettingera690a992003-11-16 16:17:49 +000070
Raymond Hettingera690a992003-11-16 16:17:49 +000071 def test_union(self):
72 u = self.s.union(self.otherword)
73 for c in self.letters:
74 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000075 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000076 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000077 self.assertRaises(PassThru, self.s.union, check_pass_thru())
78 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000079 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000080 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
81 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
82 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
83 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000084 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000085
Raymond Hettingere805ecc2009-07-27 20:16:37 +000086 # Issue #6573
87 x = self.thetype()
88 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
89
Raymond Hettingera690a992003-11-16 16:17:49 +000090 def test_or(self):
91 i = self.s.union(self.otherword)
92 self.assertEqual(self.s | set(self.otherword), i)
93 self.assertEqual(self.s | frozenset(self.otherword), i)
94 try:
95 self.s | self.otherword
96 except TypeError:
97 pass
98 else:
99 self.fail("s|t did not screen-out general iterables")
100
101 def test_intersection(self):
102 i = self.s.intersection(self.otherword)
103 for c in self.letters:
104 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000105 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000106 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000107 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000108 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000109 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
110 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
111 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
112 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000113 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000114 s = self.thetype('abcba')
115 z = s.intersection()
116 if self.thetype == frozenset():
117 self.assertEqual(id(s), id(z))
118 else:
119 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000120
Guido van Rossum58da9312007-11-10 23:39:45 +0000121 def test_isdisjoint(self):
122 def f(s1, s2):
123 'Pure python equivalent of isdisjoint()'
124 return not set(s1).intersection(s2)
125 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
126 s1 = self.thetype(larg)
127 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
128 for C in set, frozenset, dict.fromkeys, str, list, tuple:
129 s2 = C(rarg)
130 actual = s1.isdisjoint(s2)
131 expected = f(s1, s2)
132 self.assertEqual(actual, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000133 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000134
Raymond Hettingera690a992003-11-16 16:17:49 +0000135 def test_and(self):
136 i = self.s.intersection(self.otherword)
137 self.assertEqual(self.s & set(self.otherword), i)
138 self.assertEqual(self.s & frozenset(self.otherword), i)
139 try:
140 self.s & self.otherword
141 except TypeError:
142 pass
143 else:
144 self.fail("s&t did not screen-out general iterables")
145
146 def test_difference(self):
147 i = self.s.difference(self.otherword)
148 for c in self.letters:
149 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000150 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000151 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000152 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
153 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000154 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000155 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
156 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
157 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
158 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000159 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
160 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000161
162 def test_sub(self):
163 i = self.s.difference(self.otherword)
164 self.assertEqual(self.s - set(self.otherword), i)
165 self.assertEqual(self.s - frozenset(self.otherword), i)
166 try:
167 self.s - self.otherword
168 except TypeError:
169 pass
170 else:
171 self.fail("s-t did not screen-out general iterables")
172
173 def test_symmetric_difference(self):
174 i = self.s.symmetric_difference(self.otherword)
175 for c in self.letters:
176 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000177 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000178 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000179 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
180 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000181 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000182 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
183 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
184 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
185 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000186
187 def test_xor(self):
188 i = self.s.symmetric_difference(self.otherword)
189 self.assertEqual(self.s ^ set(self.otherword), i)
190 self.assertEqual(self.s ^ frozenset(self.otherword), i)
191 try:
192 self.s ^ self.otherword
193 except TypeError:
194 pass
195 else:
196 self.fail("s^t did not screen-out general iterables")
197
198 def test_equality(self):
199 self.assertEqual(self.s, set(self.word))
200 self.assertEqual(self.s, frozenset(self.word))
201 self.assertEqual(self.s == self.word, False)
202 self.assertNotEqual(self.s, set(self.otherword))
203 self.assertNotEqual(self.s, frozenset(self.otherword))
204 self.assertEqual(self.s != self.word, True)
205
206 def test_setOfFrozensets(self):
207 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
208 s = self.thetype(t)
209 self.assertEqual(len(s), 3)
210
Raymond Hettingera690a992003-11-16 16:17:49 +0000211 def test_sub_and_super(self):
212 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000213 self.assertTrue(p < q)
214 self.assertTrue(p <= q)
215 self.assertTrue(q <= q)
216 self.assertTrue(q > p)
217 self.assertTrue(q >= p)
218 self.assertFalse(q < r)
219 self.assertFalse(q <= r)
220 self.assertFalse(q > r)
221 self.assertFalse(q >= r)
222 self.assertTrue(set('a').issubset('abc'))
223 self.assertTrue(set('abc').issuperset('a'))
224 self.assertFalse(set('a').issubset('cbs'))
225 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000226
227 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000228 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000229 p = pickle.dumps(self.s, i)
230 dup = pickle.loads(p)
231 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
232 if type(self.s) not in (set, frozenset):
233 self.s.x = 10
234 p = pickle.dumps(self.s)
235 dup = pickle.loads(p)
236 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000237
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000238 def test_iterator_pickling(self):
239 itorg = iter(self.s)
240 data = self.thetype(self.s)
241 d = pickle.dumps(itorg)
242 it = pickle.loads(d)
243 # Set iterators unpickle as list iterators due to the
244 # undefined order of set items.
245 # self.assertEqual(type(itorg), type(it))
246 self.assertTrue(isinstance(it, collections.abc.Iterator))
247 self.assertEqual(self.thetype(it), data)
248
249 it = pickle.loads(d)
250 try:
251 drop = next(it)
252 except StopIteration:
253 return
254 d = pickle.dumps(it)
255 it = pickle.loads(d)
256 self.assertEqual(self.thetype(it), data - self.thetype((drop,)))
257
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000258 def test_deepcopy(self):
259 class Tracer:
260 def __init__(self, value):
261 self.value = value
262 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000263 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000264 def __deepcopy__(self, memo=None):
265 return Tracer(self.value + 1)
266 t = Tracer(10)
267 s = self.thetype([t])
268 dup = copy.deepcopy(s)
269 self.assertNotEqual(id(s), id(dup))
270 for elem in dup:
271 newt = elem
272 self.assertNotEqual(id(t), id(newt))
273 self.assertEqual(t.value + 1, newt.value)
274
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000275 def test_gc(self):
276 # Create a nest of cycles to exercise overall ref count check
277 class A:
278 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000279 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000280 for elem in s:
281 elem.cycle = s
282 elem.sub = elem
283 elem.set = set([elem])
284
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000285 def test_subclass_with_custom_hash(self):
286 # Bug #1257731
287 class H(self.thetype):
288 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000290 s=H()
291 f=set()
292 f.add(s)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000293 self.assertIn(s, f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000294 f.remove(s)
295 f.add(s)
296 f.discard(s)
297
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000298 def test_badcmp(self):
299 s = self.thetype([BadCmp()])
300 # Detect comparison errors during insertion and lookup
301 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
302 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
303 # Detect errors during mutating operations
304 if hasattr(s, 'add'):
305 self.assertRaises(RuntimeError, s.add, BadCmp())
306 self.assertRaises(RuntimeError, s.discard, BadCmp())
307 self.assertRaises(RuntimeError, s.remove, BadCmp())
308
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000309 def test_cyclical_repr(self):
310 w = ReprWrapper()
311 s = self.thetype([w])
312 w.value = s
313 if self.thetype == set:
314 self.assertEqual(repr(s), '{set(...)}')
315 else:
316 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000317 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000318
319 def test_cyclical_print(self):
320 w = ReprWrapper()
321 s = self.thetype([w])
322 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000323 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000324 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000325 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000326 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000327 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000328 self.assertEqual(fo.read(), repr(s))
329 finally:
330 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000331 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000332
Thomas Wouterscf297e42007-02-23 15:07:44 +0000333 def test_do_not_rehash_dict_keys(self):
334 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000335 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000336 self.assertEqual(sum(elem.hash_count for elem in d), n)
337 s = self.thetype(d)
338 self.assertEqual(sum(elem.hash_count for elem in d), n)
339 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000340 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000341 if hasattr(s, 'symmetric_difference_update'):
342 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000343 self.assertEqual(sum(elem.hash_count for elem in d), n)
344 d2 = dict.fromkeys(set(d))
345 self.assertEqual(sum(elem.hash_count for elem in d), n)
346 d3 = dict.fromkeys(frozenset(d))
347 self.assertEqual(sum(elem.hash_count for elem in d), n)
348 d3 = dict.fromkeys(frozenset(d), 123)
349 self.assertEqual(sum(elem.hash_count for elem in d), n)
350 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000351
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000352 def test_container_iterator(self):
353 # Bug #3680: tp_traverse was not implemented for set iterator object
354 class C(object):
355 pass
356 obj = C()
357 ref = weakref.ref(obj)
358 container = set([obj, 1])
359 obj.x = iter(container)
360 del obj, container
361 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000362 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000363
Raymond Hettingera690a992003-11-16 16:17:49 +0000364class TestSet(TestJointOps):
365 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000366 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000367
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000368 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000369 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000370 s.__init__(self.word)
371 self.assertEqual(s, set(self.word))
372 s.__init__(self.otherword)
373 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000374 self.assertRaises(TypeError, s.__init__, s, 2);
375 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000376
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000377 def test_constructor_identity(self):
378 s = self.thetype(range(3))
379 t = self.thetype(s)
380 self.assertNotEqual(id(s), id(t))
381
Guido van Rossum86e58e22006-08-28 15:27:34 +0000382 def test_set_literal(self):
383 s = set([1,2,3])
384 t = {1,2,3}
385 self.assertEqual(s, t)
386
Raymond Hettingera690a992003-11-16 16:17:49 +0000387 def test_hash(self):
388 self.assertRaises(TypeError, hash, self.s)
389
390 def test_clear(self):
391 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000392 self.assertEqual(self.s, set())
393 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000394
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000395 def test_copy(self):
396 dup = self.s.copy()
397 self.assertEqual(self.s, dup)
398 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000399 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000400
Raymond Hettingera690a992003-11-16 16:17:49 +0000401 def test_add(self):
402 self.s.add('Q')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000403 self.assertIn('Q', self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000404 dup = self.s.copy()
405 self.s.add('Q')
406 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000407 self.assertRaises(TypeError, self.s.add, [])
408
409 def test_remove(self):
410 self.s.remove('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000411 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000412 self.assertRaises(KeyError, self.s.remove, 'Q')
413 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000414 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000415 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000416 s.remove(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000417 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000418 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000419
Thomas Wouters89f507f2006-12-13 04:49:30 +0000420 def test_remove_keyerror_unpacking(self):
421 # bug: www.python.org/sf/1576657
422 for v1 in ['Q', (1,)]:
423 try:
424 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000425 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 v2 = e.args[0]
427 self.assertEqual(v1, v2)
428 else:
429 self.fail()
430
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000431 def test_remove_keyerror_set(self):
432 key = self.thetype([3, 4])
433 try:
434 self.s.remove(key)
435 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000436 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000437 "KeyError should be {0}, not {1}".format(key,
438 e.args[0]))
439 else:
440 self.fail()
441
Raymond Hettingera690a992003-11-16 16:17:49 +0000442 def test_discard(self):
443 self.s.discard('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000444 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000445 self.s.discard('Q')
446 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000447 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000448 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000449 s.discard(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000450 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000451 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000452
453 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000454 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000455 elem = self.s.pop()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000456 self.assertNotIn(elem, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000457 self.assertRaises(KeyError, self.s.pop)
458
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000459 def test_update(self):
460 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000461 self.assertEqual(retval, None)
462 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000463 self.assertIn(c, self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000464 self.assertRaises(PassThru, self.s.update, check_pass_thru())
465 self.assertRaises(TypeError, self.s.update, [[]])
466 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000467 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000468 s = self.thetype('abcba')
469 self.assertEqual(s.update(C(p)), None)
470 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000471 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
472 q = 'ahi'
473 for C in set, frozenset, dict.fromkeys, str, list, tuple:
474 s = self.thetype('abcba')
475 self.assertEqual(s.update(C(p), C(q)), None)
476 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000477
478 def test_ior(self):
479 self.s |= set(self.otherword)
480 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000481 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000482
483 def test_intersection_update(self):
484 retval = self.s.intersection_update(self.otherword)
485 self.assertEqual(retval, None)
486 for c in (self.word + self.otherword):
487 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000488 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000489 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000490 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000491 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
492 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000493 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000494 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000495 s = self.thetype('abcba')
496 self.assertEqual(s.intersection_update(C(p)), None)
497 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000498 ss = 'abcba'
499 s = self.thetype(ss)
500 t = 'cbc'
501 self.assertEqual(s.intersection_update(C(p), C(t)), None)
502 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000503
504 def test_iand(self):
505 self.s &= set(self.otherword)
506 for c in (self.word + self.otherword):
507 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000508 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000509 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000510 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000511
512 def test_difference_update(self):
513 retval = self.s.difference_update(self.otherword)
514 self.assertEqual(retval, None)
515 for c in (self.word + self.otherword):
516 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000517 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000518 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000519 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000520 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
521 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000522 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
523 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000524 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000525 s = self.thetype('abcba')
526 self.assertEqual(s.difference_update(C(p)), None)
527 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000528
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000529 s = self.thetype('abcdefghih')
530 s.difference_update()
531 self.assertEqual(s, self.thetype('abcdefghih'))
532
533 s = self.thetype('abcdefghih')
534 s.difference_update(C('aba'))
535 self.assertEqual(s, self.thetype('cdefghih'))
536
537 s = self.thetype('abcdefghih')
538 s.difference_update(C('cdc'), C('aba'))
539 self.assertEqual(s, self.thetype('efghih'))
540
Raymond Hettingera690a992003-11-16 16:17:49 +0000541 def test_isub(self):
542 self.s -= set(self.otherword)
543 for c in (self.word + self.otherword):
544 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000545 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000546 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000547 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000548
549 def test_symmetric_difference_update(self):
550 retval = self.s.symmetric_difference_update(self.otherword)
551 self.assertEqual(retval, None)
552 for c in (self.word + self.otherword):
553 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000554 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000555 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000556 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000557 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
558 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000559 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000560 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000561 s = self.thetype('abcba')
562 self.assertEqual(s.symmetric_difference_update(C(p)), None)
563 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000564
565 def test_ixor(self):
566 self.s ^= set(self.otherword)
567 for c in (self.word + self.otherword):
568 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000569 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000570 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000571 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000572
Raymond Hettingerc991db22005-08-11 07:58:45 +0000573 def test_inplace_on_self(self):
574 t = self.s.copy()
575 t |= t
576 self.assertEqual(t, self.s)
577 t &= t
578 self.assertEqual(t, self.s)
579 t -= t
580 self.assertEqual(t, self.thetype())
581 t = self.s.copy()
582 t ^= t
583 self.assertEqual(t, self.thetype())
584
Raymond Hettinger691d8052004-05-30 07:26:47 +0000585 def test_weakref(self):
586 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000587 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000588 self.assertEqual(str(p), str(s))
589 s = None
590 self.assertRaises(ReferenceError, str, p)
591
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000592 def test_rich_compare(self):
593 class TestRichSetCompare:
594 def __gt__(self, some_set):
595 self.gt_called = True
596 return False
597 def __lt__(self, some_set):
598 self.lt_called = True
599 return False
600 def __ge__(self, some_set):
601 self.ge_called = True
602 return False
603 def __le__(self, some_set):
604 self.le_called = True
605 return False
606
Ezio Melotti42da6632011-03-15 05:18:48 +0200607 # This first tries the builtin rich set comparison, which doesn't know
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000608 # how to handle the custom object. Upon returning NotImplemented, the
609 # corresponding comparison on the right object is invoked.
610 myset = {1, 2, 3}
611
612 myobj = TestRichSetCompare()
613 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000614 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000615
616 myobj = TestRichSetCompare()
617 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000618 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000619
620 myobj = TestRichSetCompare()
621 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000622 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000623
624 myobj = TestRichSetCompare()
625 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000626 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000627
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000628 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000629 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000630 def test_c_api(self):
Victor Stinner08b36bd2010-03-13 00:19:17 +0000631 self.assertEqual(set().test_c_api(), True)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000632
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000633class SetSubclass(set):
634 pass
635
636class TestSetSubclass(TestSet):
637 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000638 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000639
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000640class SetSubclassWithKeywordArgs(set):
641 def __init__(self, iterable=[], newarg=None):
642 set.__init__(self, iterable)
643
644class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000645
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000646 def test_keywords_in_subclass(self):
647 'SF bug #1486663 -- this used to erroneously raise a TypeError'
648 SetSubclassWithKeywordArgs(newarg=1)
649
Raymond Hettingera690a992003-11-16 16:17:49 +0000650class TestFrozenSet(TestJointOps):
651 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000652 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000653
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000654 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000655 s = self.thetype(self.word)
656 s.__init__(self.otherword)
657 self.assertEqual(s, set(self.word))
658
Raymond Hettingerd7946662005-08-01 21:39:29 +0000659 def test_singleton_empty_frozenset(self):
660 f = frozenset()
661 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
662 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000663 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000664 frozenset(f), f]
665 # All of the empty frozensets should have just one id()
666 self.assertEqual(len(set(map(id, efs))), 1)
667
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000668 def test_constructor_identity(self):
669 s = self.thetype(range(3))
670 t = self.thetype(s)
671 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000672
Raymond Hettingera690a992003-11-16 16:17:49 +0000673 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000674 self.assertEqual(hash(self.thetype('abcdeb')),
675 hash(self.thetype('ebecda')))
676
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000677 # make sure that all permutations give the same hash value
678 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000679 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000680 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000681 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000682 shuffle(seq)
683 results.add(hash(self.thetype(seq)))
684 self.assertEqual(len(results), 1)
685
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000686 def test_copy(self):
687 dup = self.s.copy()
688 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000689
690 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000691 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000692 key1 = self.thetype(seq)
693 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000694 self.assertEqual(key1, key2)
695 self.assertNotEqual(id(key1), id(key2))
696 d = {}
697 d[key1] = 42
698 self.assertEqual(d[key2], 42)
699
700 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000701 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000702 self.assertEqual(hash(f), hash(f))
703
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000704 def test_hash_effectiveness(self):
705 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000706 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000707 addhashvalue = hashvalues.add
708 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000709 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000710 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
711 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000712
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000713class FrozenSetSubclass(frozenset):
714 pass
715
716class TestFrozenSetSubclass(TestFrozenSet):
717 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000718 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000719
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000720 def test_constructor_identity(self):
721 s = self.thetype(range(3))
722 t = self.thetype(s)
723 self.assertNotEqual(id(s), id(t))
724
725 def test_copy(self):
726 dup = self.s.copy()
727 self.assertNotEqual(id(self.s), id(dup))
728
729 def test_nested_empty_constructor(self):
730 s = self.thetype()
731 t = self.thetype(s)
732 self.assertEqual(s, t)
733
Raymond Hettingerd7946662005-08-01 21:39:29 +0000734 def test_singleton_empty_frozenset(self):
735 Frozenset = self.thetype
736 f = frozenset()
737 F = Frozenset()
738 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
739 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000740 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000741 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
742 # All empty frozenset subclass instances should have different ids
743 self.assertEqual(len(set(map(id, efs))), len(efs))
744
Raymond Hettingera690a992003-11-16 16:17:49 +0000745# Tests taken from test_sets.py =============================================
746
747empty_set = set()
748
749#==============================================================================
750
751class TestBasicOps(unittest.TestCase):
752
753 def test_repr(self):
754 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000755 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000756
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100757 def check_repr_against_values(self):
758 text = repr(self.set)
759 self.assertTrue(text.startswith('{'))
760 self.assertTrue(text.endswith('}'))
761
762 result = text[1:-1].split(', ')
763 result.sort()
764 sorted_repr_values = [repr(value) for value in self.values]
765 sorted_repr_values.sort()
766 self.assertEqual(result, sorted_repr_values)
767
Raymond Hettingereae05de2004-07-09 04:51:24 +0000768 def test_print(self):
769 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000770 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000771 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000772 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000773 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000774 self.assertEqual(fo.read(), repr(self.set))
775 finally:
776 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000777 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000778
Raymond Hettingera690a992003-11-16 16:17:49 +0000779 def test_length(self):
780 self.assertEqual(len(self.set), self.length)
781
782 def test_self_equality(self):
783 self.assertEqual(self.set, self.set)
784
785 def test_equivalent_equality(self):
786 self.assertEqual(self.set, self.dup)
787
788 def test_copy(self):
789 self.assertEqual(self.set.copy(), self.dup)
790
791 def test_self_union(self):
792 result = self.set | self.set
793 self.assertEqual(result, self.dup)
794
795 def test_empty_union(self):
796 result = self.set | empty_set
797 self.assertEqual(result, self.dup)
798
799 def test_union_empty(self):
800 result = empty_set | self.set
801 self.assertEqual(result, self.dup)
802
803 def test_self_intersection(self):
804 result = self.set & self.set
805 self.assertEqual(result, self.dup)
806
807 def test_empty_intersection(self):
808 result = self.set & empty_set
809 self.assertEqual(result, empty_set)
810
811 def test_intersection_empty(self):
812 result = empty_set & self.set
813 self.assertEqual(result, empty_set)
814
Guido van Rossum58da9312007-11-10 23:39:45 +0000815 def test_self_isdisjoint(self):
816 result = self.set.isdisjoint(self.set)
817 self.assertEqual(result, not self.set)
818
819 def test_empty_isdisjoint(self):
820 result = self.set.isdisjoint(empty_set)
821 self.assertEqual(result, True)
822
823 def test_isdisjoint_empty(self):
824 result = empty_set.isdisjoint(self.set)
825 self.assertEqual(result, True)
826
Raymond Hettingera690a992003-11-16 16:17:49 +0000827 def test_self_symmetric_difference(self):
828 result = self.set ^ self.set
829 self.assertEqual(result, empty_set)
830
Georg Brandl33b6a312010-08-01 06:44:46 +0000831 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000832 result = self.set ^ empty_set
833 self.assertEqual(result, self.set)
834
835 def test_self_difference(self):
836 result = self.set - self.set
837 self.assertEqual(result, empty_set)
838
839 def test_empty_difference(self):
840 result = self.set - empty_set
841 self.assertEqual(result, self.dup)
842
843 def test_empty_difference_rev(self):
844 result = empty_set - self.set
845 self.assertEqual(result, empty_set)
846
847 def test_iteration(self):
848 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000849 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000850 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000851 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000852
853 def test_pickling(self):
854 p = pickle.dumps(self.set)
855 copy = pickle.loads(p)
856 self.assertEqual(self.set, copy,
857 "%s != %s" % (self.set, copy))
858
859#------------------------------------------------------------------------------
860
861class TestBasicOpsEmpty(TestBasicOps):
862 def setUp(self):
863 self.case = "empty set"
864 self.values = []
865 self.set = set(self.values)
866 self.dup = set(self.values)
867 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000868 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000869
870#------------------------------------------------------------------------------
871
872class TestBasicOpsSingleton(TestBasicOps):
873 def setUp(self):
874 self.case = "unit set (number)"
875 self.values = [3]
876 self.set = set(self.values)
877 self.dup = set(self.values)
878 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000879 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000880
881 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000882 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000883
884 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000885 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000886
887#------------------------------------------------------------------------------
888
889class TestBasicOpsTuple(TestBasicOps):
890 def setUp(self):
891 self.case = "unit set (tuple)"
892 self.values = [(0, "zero")]
893 self.set = set(self.values)
894 self.dup = set(self.values)
895 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000896 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000897
898 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000899 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000900
901 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000902 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000903
904#------------------------------------------------------------------------------
905
906class TestBasicOpsTriple(TestBasicOps):
907 def setUp(self):
908 self.case = "triple set"
909 self.values = [0, "zero", operator.add]
910 self.set = set(self.values)
911 self.dup = set(self.values)
912 self.length = 3
913 self.repr = None
914
Christian Heimes0ded5b52007-12-10 15:50:56 +0000915#------------------------------------------------------------------------------
916
917class TestBasicOpsString(TestBasicOps):
918 def setUp(self):
919 self.case = "string set"
920 self.values = ["a", "b", "c"]
921 self.set = set(self.values)
922 self.dup = set(self.values)
923 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100924
925 def test_repr(self):
926 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000927
928#------------------------------------------------------------------------------
929
930class TestBasicOpsBytes(TestBasicOps):
931 def setUp(self):
932 self.case = "string set"
933 self.values = [b"a", b"b", b"c"]
934 self.set = set(self.values)
935 self.dup = set(self.values)
936 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100937
938 def test_repr(self):
939 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000940
941#------------------------------------------------------------------------------
942
943class TestBasicOpsMixedStringBytes(TestBasicOps):
944 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000945 self._warning_filters = support.check_warnings()
946 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000947 warnings.simplefilter('ignore', BytesWarning)
948 self.case = "string and bytes set"
949 self.values = ["a", "b", b"a", b"b"]
950 self.set = set(self.values)
951 self.dup = set(self.values)
952 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000953
954 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000955 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000956
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100957 def test_repr(self):
958 self.check_repr_against_values()
959
Raymond Hettingera690a992003-11-16 16:17:49 +0000960#==============================================================================
961
962def baditer():
963 raise TypeError
964 yield True
965
966def gooditer():
967 yield True
968
969class TestExceptionPropagation(unittest.TestCase):
970 """SF 628246: Set constructor should not trap iterator TypeErrors"""
971
972 def test_instanceWithException(self):
973 self.assertRaises(TypeError, set, baditer())
974
975 def test_instancesWithoutException(self):
976 # All of these iterables should load without exception.
977 set([1,2,3])
978 set((1,2,3))
979 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000980 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000981 set('abc')
982 set(gooditer())
983
Neal Norwitzfcf44352005-11-27 20:37:43 +0000984 def test_changingSizeWhileIterating(self):
985 s = set([1,2,3])
986 try:
987 for i in s:
988 s.update([4])
989 except RuntimeError:
990 pass
991 else:
992 self.fail("no exception when changing size during iteration")
993
Raymond Hettingera690a992003-11-16 16:17:49 +0000994#==============================================================================
995
996class TestSetOfSets(unittest.TestCase):
997 def test_constructor(self):
998 inner = frozenset([1])
999 outer = set([inner])
1000 element = outer.pop()
1001 self.assertEqual(type(element), frozenset)
1002 outer.add(inner) # Rebuild set of sets with .add method
1003 outer.remove(inner)
1004 self.assertEqual(outer, set()) # Verify that remove worked
1005 outer.discard(inner) # Absence of KeyError indicates working fine
1006
1007#==============================================================================
1008
1009class TestBinaryOps(unittest.TestCase):
1010 def setUp(self):
1011 self.set = set((2, 4, 6))
1012
1013 def test_eq(self): # SF bug 643115
1014 self.assertEqual(self.set, set({2:1,4:3,6:5}))
1015
1016 def test_union_subset(self):
1017 result = self.set | set([2])
1018 self.assertEqual(result, set((2, 4, 6)))
1019
1020 def test_union_superset(self):
1021 result = self.set | set([2, 4, 6, 8])
1022 self.assertEqual(result, set([2, 4, 6, 8]))
1023
1024 def test_union_overlap(self):
1025 result = self.set | set([3, 4, 5])
1026 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1027
1028 def test_union_non_overlap(self):
1029 result = self.set | set([8])
1030 self.assertEqual(result, set([2, 4, 6, 8]))
1031
1032 def test_intersection_subset(self):
1033 result = self.set & set((2, 4))
1034 self.assertEqual(result, set((2, 4)))
1035
1036 def test_intersection_superset(self):
1037 result = self.set & set([2, 4, 6, 8])
1038 self.assertEqual(result, set([2, 4, 6]))
1039
1040 def test_intersection_overlap(self):
1041 result = self.set & set([3, 4, 5])
1042 self.assertEqual(result, set([4]))
1043
1044 def test_intersection_non_overlap(self):
1045 result = self.set & set([8])
1046 self.assertEqual(result, empty_set)
1047
Guido van Rossum58da9312007-11-10 23:39:45 +00001048 def test_isdisjoint_subset(self):
1049 result = self.set.isdisjoint(set((2, 4)))
1050 self.assertEqual(result, False)
1051
1052 def test_isdisjoint_superset(self):
1053 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1054 self.assertEqual(result, False)
1055
1056 def test_isdisjoint_overlap(self):
1057 result = self.set.isdisjoint(set([3, 4, 5]))
1058 self.assertEqual(result, False)
1059
1060 def test_isdisjoint_non_overlap(self):
1061 result = self.set.isdisjoint(set([8]))
1062 self.assertEqual(result, True)
1063
Raymond Hettingera690a992003-11-16 16:17:49 +00001064 def test_sym_difference_subset(self):
1065 result = self.set ^ set((2, 4))
1066 self.assertEqual(result, set([6]))
1067
1068 def test_sym_difference_superset(self):
1069 result = self.set ^ set((2, 4, 6, 8))
1070 self.assertEqual(result, set([8]))
1071
1072 def test_sym_difference_overlap(self):
1073 result = self.set ^ set((3, 4, 5))
1074 self.assertEqual(result, set([2, 3, 5, 6]))
1075
1076 def test_sym_difference_non_overlap(self):
1077 result = self.set ^ set([8])
1078 self.assertEqual(result, set([2, 4, 6, 8]))
1079
Raymond Hettingera690a992003-11-16 16:17:49 +00001080#==============================================================================
1081
1082class TestUpdateOps(unittest.TestCase):
1083 def setUp(self):
1084 self.set = set((2, 4, 6))
1085
1086 def test_union_subset(self):
1087 self.set |= set([2])
1088 self.assertEqual(self.set, set((2, 4, 6)))
1089
1090 def test_union_superset(self):
1091 self.set |= set([2, 4, 6, 8])
1092 self.assertEqual(self.set, set([2, 4, 6, 8]))
1093
1094 def test_union_overlap(self):
1095 self.set |= set([3, 4, 5])
1096 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1097
1098 def test_union_non_overlap(self):
1099 self.set |= set([8])
1100 self.assertEqual(self.set, set([2, 4, 6, 8]))
1101
1102 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001103 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001104 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1105
1106 def test_intersection_subset(self):
1107 self.set &= set((2, 4))
1108 self.assertEqual(self.set, set((2, 4)))
1109
1110 def test_intersection_superset(self):
1111 self.set &= set([2, 4, 6, 8])
1112 self.assertEqual(self.set, set([2, 4, 6]))
1113
1114 def test_intersection_overlap(self):
1115 self.set &= set([3, 4, 5])
1116 self.assertEqual(self.set, set([4]))
1117
1118 def test_intersection_non_overlap(self):
1119 self.set &= set([8])
1120 self.assertEqual(self.set, empty_set)
1121
1122 def test_intersection_method_call(self):
1123 self.set.intersection_update(set([3, 4, 5]))
1124 self.assertEqual(self.set, set([4]))
1125
1126 def test_sym_difference_subset(self):
1127 self.set ^= set((2, 4))
1128 self.assertEqual(self.set, set([6]))
1129
1130 def test_sym_difference_superset(self):
1131 self.set ^= set((2, 4, 6, 8))
1132 self.assertEqual(self.set, set([8]))
1133
1134 def test_sym_difference_overlap(self):
1135 self.set ^= set((3, 4, 5))
1136 self.assertEqual(self.set, set([2, 3, 5, 6]))
1137
1138 def test_sym_difference_non_overlap(self):
1139 self.set ^= set([8])
1140 self.assertEqual(self.set, set([2, 4, 6, 8]))
1141
1142 def test_sym_difference_method_call(self):
1143 self.set.symmetric_difference_update(set([3, 4, 5]))
1144 self.assertEqual(self.set, set([2, 3, 5, 6]))
1145
1146 def test_difference_subset(self):
1147 self.set -= set((2, 4))
1148 self.assertEqual(self.set, set([6]))
1149
1150 def test_difference_superset(self):
1151 self.set -= set((2, 4, 6, 8))
1152 self.assertEqual(self.set, set([]))
1153
1154 def test_difference_overlap(self):
1155 self.set -= set((3, 4, 5))
1156 self.assertEqual(self.set, set([2, 6]))
1157
1158 def test_difference_non_overlap(self):
1159 self.set -= set([8])
1160 self.assertEqual(self.set, set([2, 4, 6]))
1161
1162 def test_difference_method_call(self):
1163 self.set.difference_update(set([3, 4, 5]))
1164 self.assertEqual(self.set, set([2, 6]))
1165
1166#==============================================================================
1167
1168class TestMutate(unittest.TestCase):
1169 def setUp(self):
1170 self.values = ["a", "b", "c"]
1171 self.set = set(self.values)
1172
1173 def test_add_present(self):
1174 self.set.add("c")
1175 self.assertEqual(self.set, set("abc"))
1176
1177 def test_add_absent(self):
1178 self.set.add("d")
1179 self.assertEqual(self.set, set("abcd"))
1180
1181 def test_add_until_full(self):
1182 tmp = set()
1183 expected_len = 0
1184 for v in self.values:
1185 tmp.add(v)
1186 expected_len += 1
1187 self.assertEqual(len(tmp), expected_len)
1188 self.assertEqual(tmp, self.set)
1189
1190 def test_remove_present(self):
1191 self.set.remove("b")
1192 self.assertEqual(self.set, set("ac"))
1193
1194 def test_remove_absent(self):
1195 try:
1196 self.set.remove("d")
1197 self.fail("Removing missing element should have raised LookupError")
1198 except LookupError:
1199 pass
1200
1201 def test_remove_until_empty(self):
1202 expected_len = len(self.set)
1203 for v in self.values:
1204 self.set.remove(v)
1205 expected_len -= 1
1206 self.assertEqual(len(self.set), expected_len)
1207
1208 def test_discard_present(self):
1209 self.set.discard("c")
1210 self.assertEqual(self.set, set("ab"))
1211
1212 def test_discard_absent(self):
1213 self.set.discard("d")
1214 self.assertEqual(self.set, set("abc"))
1215
1216 def test_clear(self):
1217 self.set.clear()
1218 self.assertEqual(len(self.set), 0)
1219
1220 def test_pop(self):
1221 popped = {}
1222 while self.set:
1223 popped[self.set.pop()] = None
1224 self.assertEqual(len(popped), len(self.values))
1225 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001226 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001227
1228 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001229 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001230 self.assertEqual(self.set, set(self.values))
1231
1232 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001233 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001234 self.assertEqual(self.set, set(self.values))
1235
1236 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001237 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001238 self.assertEqual(self.set, set(self.values + ["z"]))
1239
1240#==============================================================================
1241
1242class TestSubsets(unittest.TestCase):
1243
1244 case2method = {"<=": "issubset",
1245 ">=": "issuperset",
1246 }
1247
1248 reverse = {"==": "==",
1249 "!=": "!=",
1250 "<": ">",
1251 ">": "<",
1252 "<=": ">=",
1253 ">=": "<=",
1254 }
1255
1256 def test_issubset(self):
1257 x = self.left
1258 y = self.right
1259 for case in "!=", "==", "<", "<=", ">", ">=":
1260 expected = case in self.cases
1261 # Test the binary infix spelling.
1262 result = eval("x" + case + "y", locals())
1263 self.assertEqual(result, expected)
1264 # Test the "friendly" method-name spelling, if one exists.
1265 if case in TestSubsets.case2method:
1266 method = getattr(x, TestSubsets.case2method[case])
1267 result = method(y)
1268 self.assertEqual(result, expected)
1269
1270 # Now do the same for the operands reversed.
1271 rcase = TestSubsets.reverse[case]
1272 result = eval("y" + rcase + "x", locals())
1273 self.assertEqual(result, expected)
1274 if rcase in TestSubsets.case2method:
1275 method = getattr(y, TestSubsets.case2method[rcase])
1276 result = method(x)
1277 self.assertEqual(result, expected)
1278#------------------------------------------------------------------------------
1279
1280class TestSubsetEqualEmpty(TestSubsets):
1281 left = set()
1282 right = set()
1283 name = "both empty"
1284 cases = "==", "<=", ">="
1285
1286#------------------------------------------------------------------------------
1287
1288class TestSubsetEqualNonEmpty(TestSubsets):
1289 left = set([1, 2])
1290 right = set([1, 2])
1291 name = "equal pair"
1292 cases = "==", "<=", ">="
1293
1294#------------------------------------------------------------------------------
1295
1296class TestSubsetEmptyNonEmpty(TestSubsets):
1297 left = set()
1298 right = set([1, 2])
1299 name = "one empty, one non-empty"
1300 cases = "!=", "<", "<="
1301
1302#------------------------------------------------------------------------------
1303
1304class TestSubsetPartial(TestSubsets):
1305 left = set([1])
1306 right = set([1, 2])
1307 name = "one a non-empty proper subset of other"
1308 cases = "!=", "<", "<="
1309
1310#------------------------------------------------------------------------------
1311
1312class TestSubsetNonOverlap(TestSubsets):
1313 left = set([1])
1314 right = set([2])
1315 name = "neither empty, neither contains"
1316 cases = "!="
1317
1318#==============================================================================
1319
1320class TestOnlySetsInBinaryOps(unittest.TestCase):
1321
1322 def test_eq_ne(self):
1323 # Unlike the others, this is testing that == and != *are* allowed.
1324 self.assertEqual(self.other == self.set, False)
1325 self.assertEqual(self.set == self.other, False)
1326 self.assertEqual(self.other != self.set, True)
1327 self.assertEqual(self.set != self.other, True)
1328
1329 def test_ge_gt_le_lt(self):
1330 self.assertRaises(TypeError, lambda: self.set < self.other)
1331 self.assertRaises(TypeError, lambda: self.set <= self.other)
1332 self.assertRaises(TypeError, lambda: self.set > self.other)
1333 self.assertRaises(TypeError, lambda: self.set >= self.other)
1334
1335 self.assertRaises(TypeError, lambda: self.other < self.set)
1336 self.assertRaises(TypeError, lambda: self.other <= self.set)
1337 self.assertRaises(TypeError, lambda: self.other > self.set)
1338 self.assertRaises(TypeError, lambda: self.other >= self.set)
1339
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001340 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001341 try:
1342 self.set |= self.other
1343 except TypeError:
1344 pass
1345 else:
1346 self.fail("expected TypeError")
1347
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001348 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001349 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001350 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001351 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001352 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001353
1354 def test_union(self):
1355 self.assertRaises(TypeError, lambda: self.set | self.other)
1356 self.assertRaises(TypeError, lambda: self.other | self.set)
1357 if self.otherIsIterable:
1358 self.set.union(self.other)
1359 else:
1360 self.assertRaises(TypeError, self.set.union, self.other)
1361
1362 def test_intersection_update_operator(self):
1363 try:
1364 self.set &= self.other
1365 except TypeError:
1366 pass
1367 else:
1368 self.fail("expected TypeError")
1369
1370 def test_intersection_update(self):
1371 if self.otherIsIterable:
1372 self.set.intersection_update(self.other)
1373 else:
1374 self.assertRaises(TypeError,
1375 self.set.intersection_update,
1376 self.other)
1377
1378 def test_intersection(self):
1379 self.assertRaises(TypeError, lambda: self.set & self.other)
1380 self.assertRaises(TypeError, lambda: self.other & self.set)
1381 if self.otherIsIterable:
1382 self.set.intersection(self.other)
1383 else:
1384 self.assertRaises(TypeError, self.set.intersection, self.other)
1385
1386 def test_sym_difference_update_operator(self):
1387 try:
1388 self.set ^= self.other
1389 except TypeError:
1390 pass
1391 else:
1392 self.fail("expected TypeError")
1393
1394 def test_sym_difference_update(self):
1395 if self.otherIsIterable:
1396 self.set.symmetric_difference_update(self.other)
1397 else:
1398 self.assertRaises(TypeError,
1399 self.set.symmetric_difference_update,
1400 self.other)
1401
1402 def test_sym_difference(self):
1403 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1404 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1405 if self.otherIsIterable:
1406 self.set.symmetric_difference(self.other)
1407 else:
1408 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1409
1410 def test_difference_update_operator(self):
1411 try:
1412 self.set -= self.other
1413 except TypeError:
1414 pass
1415 else:
1416 self.fail("expected TypeError")
1417
1418 def test_difference_update(self):
1419 if self.otherIsIterable:
1420 self.set.difference_update(self.other)
1421 else:
1422 self.assertRaises(TypeError,
1423 self.set.difference_update,
1424 self.other)
1425
1426 def test_difference(self):
1427 self.assertRaises(TypeError, lambda: self.set - self.other)
1428 self.assertRaises(TypeError, lambda: self.other - self.set)
1429 if self.otherIsIterable:
1430 self.set.difference(self.other)
1431 else:
1432 self.assertRaises(TypeError, self.set.difference, self.other)
1433
1434#------------------------------------------------------------------------------
1435
1436class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1437 def setUp(self):
1438 self.set = set((1, 2, 3))
1439 self.other = 19
1440 self.otherIsIterable = False
1441
1442#------------------------------------------------------------------------------
1443
1444class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1445 def setUp(self):
1446 self.set = set((1, 2, 3))
1447 self.other = {1:2, 3:4}
1448 self.otherIsIterable = True
1449
1450#------------------------------------------------------------------------------
1451
1452class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1453 def setUp(self):
1454 self.set = set((1, 2, 3))
1455 self.other = operator.add
1456 self.otherIsIterable = False
1457
1458#------------------------------------------------------------------------------
1459
1460class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1461 def setUp(self):
1462 self.set = set((1, 2, 3))
1463 self.other = (2, 4, 6)
1464 self.otherIsIterable = True
1465
1466#------------------------------------------------------------------------------
1467
1468class TestOnlySetsString(TestOnlySetsInBinaryOps):
1469 def setUp(self):
1470 self.set = set((1, 2, 3))
1471 self.other = 'abc'
1472 self.otherIsIterable = True
1473
1474#------------------------------------------------------------------------------
1475
1476class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1477 def setUp(self):
1478 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001479 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001480 yield i
1481 self.set = set((1, 2, 3))
1482 self.other = gen()
1483 self.otherIsIterable = True
1484
1485#==============================================================================
1486
1487class TestCopying(unittest.TestCase):
1488
1489 def test_copy(self):
1490 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001491 dup_list = sorted(dup, key=repr)
1492 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001493 self.assertEqual(len(dup_list), len(set_list))
1494 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001495 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001496
1497 def test_deep_copy(self):
1498 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001499 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001500 dup_list = sorted(dup, key=repr)
1501 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001502 self.assertEqual(len(dup_list), len(set_list))
1503 for i in range(len(dup_list)):
1504 self.assertEqual(dup_list[i], set_list[i])
1505
1506#------------------------------------------------------------------------------
1507
1508class TestCopyingEmpty(TestCopying):
1509 def setUp(self):
1510 self.set = set()
1511
1512#------------------------------------------------------------------------------
1513
1514class TestCopyingSingleton(TestCopying):
1515 def setUp(self):
1516 self.set = set(["hello"])
1517
1518#------------------------------------------------------------------------------
1519
1520class TestCopyingTriple(TestCopying):
1521 def setUp(self):
1522 self.set = set(["zero", 0, None])
1523
1524#------------------------------------------------------------------------------
1525
1526class TestCopyingTuple(TestCopying):
1527 def setUp(self):
1528 self.set = set([(1, 2)])
1529
1530#------------------------------------------------------------------------------
1531
1532class TestCopyingNested(TestCopying):
1533 def setUp(self):
1534 self.set = set([((1, 2), (3, 4))])
1535
1536#==============================================================================
1537
1538class TestIdentities(unittest.TestCase):
1539 def setUp(self):
1540 self.a = set('abracadabra')
1541 self.b = set('alacazam')
1542
1543 def test_binopsVsSubsets(self):
1544 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001545 self.assertTrue(a - b < a)
1546 self.assertTrue(b - a < b)
1547 self.assertTrue(a & b < a)
1548 self.assertTrue(a & b < b)
1549 self.assertTrue(a | b > a)
1550 self.assertTrue(a | b > b)
1551 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001552
1553 def test_commutativity(self):
1554 a, b = self.a, self.b
1555 self.assertEqual(a&b, b&a)
1556 self.assertEqual(a|b, b|a)
1557 self.assertEqual(a^b, b^a)
1558 if a != b:
1559 self.assertNotEqual(a-b, b-a)
1560
1561 def test_summations(self):
1562 # check that sums of parts equal the whole
1563 a, b = self.a, self.b
1564 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1565 self.assertEqual((a&b)|(a^b), a|b)
1566 self.assertEqual(a|(b-a), a|b)
1567 self.assertEqual((a-b)|b, a|b)
1568 self.assertEqual((a-b)|(a&b), a)
1569 self.assertEqual((b-a)|(a&b), b)
1570 self.assertEqual((a-b)|(b-a), a^b)
1571
1572 def test_exclusion(self):
1573 # check that inverse operations show non-overlap
1574 a, b, zero = self.a, self.b, set()
1575 self.assertEqual((a-b)&b, zero)
1576 self.assertEqual((b-a)&a, zero)
1577 self.assertEqual((a&b)&(a^b), zero)
1578
1579# Tests derived from test_itertools.py =======================================
1580
1581def R(seqn):
1582 'Regular generator'
1583 for i in seqn:
1584 yield i
1585
1586class G:
1587 'Sequence using __getitem__'
1588 def __init__(self, seqn):
1589 self.seqn = seqn
1590 def __getitem__(self, i):
1591 return self.seqn[i]
1592
1593class I:
1594 'Sequence using iterator protocol'
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 Hettingera690a992003-11-16 16:17:49 +00001601 if self.i >= len(self.seqn): raise StopIteration
1602 v = self.seqn[self.i]
1603 self.i += 1
1604 return v
1605
1606class Ig:
1607 'Sequence using iterator protocol defined with a generator'
1608 def __init__(self, seqn):
1609 self.seqn = seqn
1610 self.i = 0
1611 def __iter__(self):
1612 for val in self.seqn:
1613 yield val
1614
1615class X:
1616 'Missing __getitem__ and __iter__'
1617 def __init__(self, seqn):
1618 self.seqn = seqn
1619 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001620 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001621 if self.i >= len(self.seqn): raise StopIteration
1622 v = self.seqn[self.i]
1623 self.i += 1
1624 return v
1625
1626class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001627 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001628 def __init__(self, seqn):
1629 self.seqn = seqn
1630 self.i = 0
1631 def __iter__(self):
1632 return self
1633
1634class E:
1635 'Test propagation of exceptions'
1636 def __init__(self, seqn):
1637 self.seqn = seqn
1638 self.i = 0
1639 def __iter__(self):
1640 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001641 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001642 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001643
1644class S:
1645 'Test immediate stop'
1646 def __init__(self, seqn):
1647 pass
1648 def __iter__(self):
1649 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001650 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001651 raise StopIteration
1652
Raymond Hettingera6c60372008-03-13 01:26:19 +00001653from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001654def L(seqn):
1655 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001656 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001657
1658class TestVariousIteratorArgs(unittest.TestCase):
1659
1660 def test_constructor(self):
1661 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001662 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001663 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001664 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001665 self.assertRaises(TypeError, cons , X(s))
1666 self.assertRaises(TypeError, cons , N(s))
1667 self.assertRaises(ZeroDivisionError, cons , E(s))
1668
1669 def test_inline_methods(self):
1670 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001671 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001672 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001673 for g in (G, I, Ig, L, R):
1674 expected = meth(data)
1675 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001676 if isinstance(expected, bool):
1677 self.assertEqual(actual, expected)
1678 else:
1679 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001680 self.assertRaises(TypeError, meth, X(s))
1681 self.assertRaises(TypeError, meth, N(s))
1682 self.assertRaises(ZeroDivisionError, meth, E(s))
1683
1684 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001685 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001686 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001687 'difference_update', 'symmetric_difference_update'):
1688 for g in (G, I, Ig, S, L, R):
1689 s = set('january')
1690 t = s.copy()
1691 getattr(s, methname)(list(g(data)))
1692 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001693 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001694
1695 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1696 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1697 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1698
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001699class bad_eq:
1700 def __eq__(self, other):
1701 if be_bad:
1702 set2.clear()
1703 raise ZeroDivisionError
1704 return self is other
1705 def __hash__(self):
1706 return 0
1707
1708class bad_dict_clear:
1709 def __eq__(self, other):
1710 if be_bad:
1711 dict2.clear()
1712 return self is other
1713 def __hash__(self):
1714 return 0
1715
Éric Araujo23eae862010-09-05 18:43:07 +00001716class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001717 def test_8420_set_merge(self):
1718 # This used to segfault
1719 global be_bad, set2, dict2
1720 be_bad = False
1721 set1 = {bad_eq()}
1722 set2 = {bad_eq() for i in range(75)}
1723 be_bad = True
1724 self.assertRaises(ZeroDivisionError, set1.update, set2)
1725
1726 be_bad = False
1727 set1 = {bad_dict_clear()}
1728 dict2 = {bad_dict_clear(): None}
1729 be_bad = True
1730 set1.symmetric_difference_update(dict2)
1731
Christian Heimes969fe572008-01-25 11:23:10 +00001732# Application tests (based on David Eppstein's graph recipes ====================================
1733
1734def powerset(U):
1735 """Generates all subsets of a set or sequence U."""
1736 U = iter(U)
1737 try:
1738 x = frozenset([next(U)])
1739 for S in powerset(U):
1740 yield S
1741 yield S | x
1742 except StopIteration:
1743 yield frozenset()
1744
1745def cube(n):
1746 """Graph of n-dimensional hypercube."""
1747 singletons = [frozenset([x]) for x in range(n)]
1748 return dict([(x, frozenset([x^s for s in singletons]))
1749 for x in powerset(range(n))])
1750
1751def linegraph(G):
1752 """Graph, the vertices of which are edges of G,
1753 with two vertices being adjacent iff the corresponding
1754 edges share a vertex."""
1755 L = {}
1756 for x in G:
1757 for y in G[x]:
1758 nx = [frozenset([x,z]) for z in G[x] if z != y]
1759 ny = [frozenset([y,z]) for z in G[y] if z != x]
1760 L[frozenset([x,y])] = frozenset(nx+ny)
1761 return L
1762
1763def faces(G):
1764 'Return a set of faces in G. Where a face is a set of vertices on that face'
1765 # currently limited to triangles,squares, and pentagons
1766 f = set()
1767 for v1, edges in G.items():
1768 for v2 in edges:
1769 for v3 in G[v2]:
1770 if v1 == v3:
1771 continue
1772 if v1 in G[v3]:
1773 f.add(frozenset([v1, v2, v3]))
1774 else:
1775 for v4 in G[v3]:
1776 if v4 == v2:
1777 continue
1778 if v1 in G[v4]:
1779 f.add(frozenset([v1, v2, v3, v4]))
1780 else:
1781 for v5 in G[v4]:
1782 if v5 == v3 or v5 == v2:
1783 continue
1784 if v1 in G[v5]:
1785 f.add(frozenset([v1, v2, v3, v4, v5]))
1786 return f
1787
1788
1789class TestGraphs(unittest.TestCase):
1790
1791 def test_cube(self):
1792
1793 g = cube(3) # vert --> {v1, v2, v3}
1794 vertices1 = set(g)
1795 self.assertEqual(len(vertices1), 8) # eight vertices
1796 for edge in g.values():
1797 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1798 vertices2 = set(v for edges in g.values() for v in edges)
1799 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1800
1801 cubefaces = faces(g)
1802 self.assertEqual(len(cubefaces), 6) # six faces
1803 for face in cubefaces:
1804 self.assertEqual(len(face), 4) # each face is a square
1805
1806 def test_cuboctahedron(self):
1807
1808 # http://en.wikipedia.org/wiki/Cuboctahedron
1809 # 8 triangular faces and 6 square faces
1810 # 12 indentical vertices each connecting a triangle and square
1811
1812 g = cube(3)
1813 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1814 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1815
1816 vertices = set(cuboctahedron)
1817 for edges in cuboctahedron.values():
1818 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1819 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1820 self.assertEqual(vertices, othervertices) # edge vertices in original set
1821
1822 cubofaces = faces(cuboctahedron)
1823 facesizes = collections.defaultdict(int)
1824 for face in cubofaces:
1825 facesizes[len(face)] += 1
1826 self.assertEqual(facesizes[3], 8) # eight triangular faces
1827 self.assertEqual(facesizes[4], 6) # six square faces
1828
1829 for vertex in cuboctahedron:
1830 edge = vertex # Cuboctahedron vertices are edges in Cube
1831 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1832 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001833 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001834
1835
Raymond Hettingera690a992003-11-16 16:17:49 +00001836#==============================================================================
1837
1838def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001839 test_classes = (
1840 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001841 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001842 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001843 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001844 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001845 TestSetOfSets,
1846 TestExceptionPropagation,
1847 TestBasicOpsEmpty,
1848 TestBasicOpsSingleton,
1849 TestBasicOpsTuple,
1850 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001851 TestBasicOpsString,
1852 TestBasicOpsBytes,
1853 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001854 TestBinaryOps,
1855 TestUpdateOps,
1856 TestMutate,
1857 TestSubsetEqualEmpty,
1858 TestSubsetEqualNonEmpty,
1859 TestSubsetEmptyNonEmpty,
1860 TestSubsetPartial,
1861 TestSubsetNonOverlap,
1862 TestOnlySetsNumeric,
1863 TestOnlySetsDict,
1864 TestOnlySetsOperator,
1865 TestOnlySetsTuple,
1866 TestOnlySetsString,
1867 TestOnlySetsGenerator,
1868 TestCopyingEmpty,
1869 TestCopyingSingleton,
1870 TestCopyingTriple,
1871 TestCopyingTuple,
1872 TestCopyingNested,
1873 TestIdentities,
1874 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001875 TestGraphs,
Éric Araujo23eae862010-09-05 18:43:07 +00001876 TestWeirdBugs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001877 )
1878
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001879 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001880
1881 # verify reference counting
1882 if verbose and hasattr(sys, "gettotalrefcount"):
1883 import gc
1884 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001885 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001886 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001887 gc.collect()
1888 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001889 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001890
1891if __name__ == "__main__":
1892 test_main(verbose=True)