blob: 8e9e5878b2548b2390d694d712ab8367184b4b03 [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 # note: __length_hint__ is an internal undocumented API,
852 # don't rely on it in your own programs
853 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000854
855 def test_pickling(self):
856 p = pickle.dumps(self.set)
857 copy = pickle.loads(p)
858 self.assertEqual(self.set, copy,
859 "%s != %s" % (self.set, copy))
860
861#------------------------------------------------------------------------------
862
863class TestBasicOpsEmpty(TestBasicOps):
864 def setUp(self):
865 self.case = "empty set"
866 self.values = []
867 self.set = set(self.values)
868 self.dup = set(self.values)
869 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000870 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000871
872#------------------------------------------------------------------------------
873
874class TestBasicOpsSingleton(TestBasicOps):
875 def setUp(self):
876 self.case = "unit set (number)"
877 self.values = [3]
878 self.set = set(self.values)
879 self.dup = set(self.values)
880 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000881 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000882
883 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000884 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000885
886 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000887 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000888
889#------------------------------------------------------------------------------
890
891class TestBasicOpsTuple(TestBasicOps):
892 def setUp(self):
893 self.case = "unit set (tuple)"
894 self.values = [(0, "zero")]
895 self.set = set(self.values)
896 self.dup = set(self.values)
897 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000898 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000899
900 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000901 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000902
903 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000904 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000905
906#------------------------------------------------------------------------------
907
908class TestBasicOpsTriple(TestBasicOps):
909 def setUp(self):
910 self.case = "triple set"
911 self.values = [0, "zero", operator.add]
912 self.set = set(self.values)
913 self.dup = set(self.values)
914 self.length = 3
915 self.repr = None
916
Christian Heimes0ded5b52007-12-10 15:50:56 +0000917#------------------------------------------------------------------------------
918
919class TestBasicOpsString(TestBasicOps):
920 def setUp(self):
921 self.case = "string set"
922 self.values = ["a", "b", "c"]
923 self.set = set(self.values)
924 self.dup = set(self.values)
925 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100926
927 def test_repr(self):
928 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000929
930#------------------------------------------------------------------------------
931
932class TestBasicOpsBytes(TestBasicOps):
933 def setUp(self):
934 self.case = "string set"
935 self.values = [b"a", b"b", b"c"]
936 self.set = set(self.values)
937 self.dup = set(self.values)
938 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100939
940 def test_repr(self):
941 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000942
943#------------------------------------------------------------------------------
944
945class TestBasicOpsMixedStringBytes(TestBasicOps):
946 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000947 self._warning_filters = support.check_warnings()
948 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000949 warnings.simplefilter('ignore', BytesWarning)
950 self.case = "string and bytes set"
951 self.values = ["a", "b", b"a", b"b"]
952 self.set = set(self.values)
953 self.dup = set(self.values)
954 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000955
956 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000957 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000958
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100959 def test_repr(self):
960 self.check_repr_against_values()
961
Raymond Hettingera690a992003-11-16 16:17:49 +0000962#==============================================================================
963
964def baditer():
965 raise TypeError
966 yield True
967
968def gooditer():
969 yield True
970
971class TestExceptionPropagation(unittest.TestCase):
972 """SF 628246: Set constructor should not trap iterator TypeErrors"""
973
974 def test_instanceWithException(self):
975 self.assertRaises(TypeError, set, baditer())
976
977 def test_instancesWithoutException(self):
978 # All of these iterables should load without exception.
979 set([1,2,3])
980 set((1,2,3))
981 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000982 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000983 set('abc')
984 set(gooditer())
985
Neal Norwitzfcf44352005-11-27 20:37:43 +0000986 def test_changingSizeWhileIterating(self):
987 s = set([1,2,3])
988 try:
989 for i in s:
990 s.update([4])
991 except RuntimeError:
992 pass
993 else:
994 self.fail("no exception when changing size during iteration")
995
Raymond Hettingera690a992003-11-16 16:17:49 +0000996#==============================================================================
997
998class TestSetOfSets(unittest.TestCase):
999 def test_constructor(self):
1000 inner = frozenset([1])
1001 outer = set([inner])
1002 element = outer.pop()
1003 self.assertEqual(type(element), frozenset)
1004 outer.add(inner) # Rebuild set of sets with .add method
1005 outer.remove(inner)
1006 self.assertEqual(outer, set()) # Verify that remove worked
1007 outer.discard(inner) # Absence of KeyError indicates working fine
1008
1009#==============================================================================
1010
1011class TestBinaryOps(unittest.TestCase):
1012 def setUp(self):
1013 self.set = set((2, 4, 6))
1014
1015 def test_eq(self): # SF bug 643115
1016 self.assertEqual(self.set, set({2:1,4:3,6:5}))
1017
1018 def test_union_subset(self):
1019 result = self.set | set([2])
1020 self.assertEqual(result, set((2, 4, 6)))
1021
1022 def test_union_superset(self):
1023 result = self.set | set([2, 4, 6, 8])
1024 self.assertEqual(result, set([2, 4, 6, 8]))
1025
1026 def test_union_overlap(self):
1027 result = self.set | set([3, 4, 5])
1028 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1029
1030 def test_union_non_overlap(self):
1031 result = self.set | set([8])
1032 self.assertEqual(result, set([2, 4, 6, 8]))
1033
1034 def test_intersection_subset(self):
1035 result = self.set & set((2, 4))
1036 self.assertEqual(result, set((2, 4)))
1037
1038 def test_intersection_superset(self):
1039 result = self.set & set([2, 4, 6, 8])
1040 self.assertEqual(result, set([2, 4, 6]))
1041
1042 def test_intersection_overlap(self):
1043 result = self.set & set([3, 4, 5])
1044 self.assertEqual(result, set([4]))
1045
1046 def test_intersection_non_overlap(self):
1047 result = self.set & set([8])
1048 self.assertEqual(result, empty_set)
1049
Guido van Rossum58da9312007-11-10 23:39:45 +00001050 def test_isdisjoint_subset(self):
1051 result = self.set.isdisjoint(set((2, 4)))
1052 self.assertEqual(result, False)
1053
1054 def test_isdisjoint_superset(self):
1055 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1056 self.assertEqual(result, False)
1057
1058 def test_isdisjoint_overlap(self):
1059 result = self.set.isdisjoint(set([3, 4, 5]))
1060 self.assertEqual(result, False)
1061
1062 def test_isdisjoint_non_overlap(self):
1063 result = self.set.isdisjoint(set([8]))
1064 self.assertEqual(result, True)
1065
Raymond Hettingera690a992003-11-16 16:17:49 +00001066 def test_sym_difference_subset(self):
1067 result = self.set ^ set((2, 4))
1068 self.assertEqual(result, set([6]))
1069
1070 def test_sym_difference_superset(self):
1071 result = self.set ^ set((2, 4, 6, 8))
1072 self.assertEqual(result, set([8]))
1073
1074 def test_sym_difference_overlap(self):
1075 result = self.set ^ set((3, 4, 5))
1076 self.assertEqual(result, set([2, 3, 5, 6]))
1077
1078 def test_sym_difference_non_overlap(self):
1079 result = self.set ^ set([8])
1080 self.assertEqual(result, set([2, 4, 6, 8]))
1081
Raymond Hettingera690a992003-11-16 16:17:49 +00001082#==============================================================================
1083
1084class TestUpdateOps(unittest.TestCase):
1085 def setUp(self):
1086 self.set = set((2, 4, 6))
1087
1088 def test_union_subset(self):
1089 self.set |= set([2])
1090 self.assertEqual(self.set, set((2, 4, 6)))
1091
1092 def test_union_superset(self):
1093 self.set |= set([2, 4, 6, 8])
1094 self.assertEqual(self.set, set([2, 4, 6, 8]))
1095
1096 def test_union_overlap(self):
1097 self.set |= set([3, 4, 5])
1098 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1099
1100 def test_union_non_overlap(self):
1101 self.set |= set([8])
1102 self.assertEqual(self.set, set([2, 4, 6, 8]))
1103
1104 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001105 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001106 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1107
1108 def test_intersection_subset(self):
1109 self.set &= set((2, 4))
1110 self.assertEqual(self.set, set((2, 4)))
1111
1112 def test_intersection_superset(self):
1113 self.set &= set([2, 4, 6, 8])
1114 self.assertEqual(self.set, set([2, 4, 6]))
1115
1116 def test_intersection_overlap(self):
1117 self.set &= set([3, 4, 5])
1118 self.assertEqual(self.set, set([4]))
1119
1120 def test_intersection_non_overlap(self):
1121 self.set &= set([8])
1122 self.assertEqual(self.set, empty_set)
1123
1124 def test_intersection_method_call(self):
1125 self.set.intersection_update(set([3, 4, 5]))
1126 self.assertEqual(self.set, set([4]))
1127
1128 def test_sym_difference_subset(self):
1129 self.set ^= set((2, 4))
1130 self.assertEqual(self.set, set([6]))
1131
1132 def test_sym_difference_superset(self):
1133 self.set ^= set((2, 4, 6, 8))
1134 self.assertEqual(self.set, set([8]))
1135
1136 def test_sym_difference_overlap(self):
1137 self.set ^= set((3, 4, 5))
1138 self.assertEqual(self.set, set([2, 3, 5, 6]))
1139
1140 def test_sym_difference_non_overlap(self):
1141 self.set ^= set([8])
1142 self.assertEqual(self.set, set([2, 4, 6, 8]))
1143
1144 def test_sym_difference_method_call(self):
1145 self.set.symmetric_difference_update(set([3, 4, 5]))
1146 self.assertEqual(self.set, set([2, 3, 5, 6]))
1147
1148 def test_difference_subset(self):
1149 self.set -= set((2, 4))
1150 self.assertEqual(self.set, set([6]))
1151
1152 def test_difference_superset(self):
1153 self.set -= set((2, 4, 6, 8))
1154 self.assertEqual(self.set, set([]))
1155
1156 def test_difference_overlap(self):
1157 self.set -= set((3, 4, 5))
1158 self.assertEqual(self.set, set([2, 6]))
1159
1160 def test_difference_non_overlap(self):
1161 self.set -= set([8])
1162 self.assertEqual(self.set, set([2, 4, 6]))
1163
1164 def test_difference_method_call(self):
1165 self.set.difference_update(set([3, 4, 5]))
1166 self.assertEqual(self.set, set([2, 6]))
1167
1168#==============================================================================
1169
1170class TestMutate(unittest.TestCase):
1171 def setUp(self):
1172 self.values = ["a", "b", "c"]
1173 self.set = set(self.values)
1174
1175 def test_add_present(self):
1176 self.set.add("c")
1177 self.assertEqual(self.set, set("abc"))
1178
1179 def test_add_absent(self):
1180 self.set.add("d")
1181 self.assertEqual(self.set, set("abcd"))
1182
1183 def test_add_until_full(self):
1184 tmp = set()
1185 expected_len = 0
1186 for v in self.values:
1187 tmp.add(v)
1188 expected_len += 1
1189 self.assertEqual(len(tmp), expected_len)
1190 self.assertEqual(tmp, self.set)
1191
1192 def test_remove_present(self):
1193 self.set.remove("b")
1194 self.assertEqual(self.set, set("ac"))
1195
1196 def test_remove_absent(self):
1197 try:
1198 self.set.remove("d")
1199 self.fail("Removing missing element should have raised LookupError")
1200 except LookupError:
1201 pass
1202
1203 def test_remove_until_empty(self):
1204 expected_len = len(self.set)
1205 for v in self.values:
1206 self.set.remove(v)
1207 expected_len -= 1
1208 self.assertEqual(len(self.set), expected_len)
1209
1210 def test_discard_present(self):
1211 self.set.discard("c")
1212 self.assertEqual(self.set, set("ab"))
1213
1214 def test_discard_absent(self):
1215 self.set.discard("d")
1216 self.assertEqual(self.set, set("abc"))
1217
1218 def test_clear(self):
1219 self.set.clear()
1220 self.assertEqual(len(self.set), 0)
1221
1222 def test_pop(self):
1223 popped = {}
1224 while self.set:
1225 popped[self.set.pop()] = None
1226 self.assertEqual(len(popped), len(self.values))
1227 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001228 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001229
1230 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001231 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001232 self.assertEqual(self.set, set(self.values))
1233
1234 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001235 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001236 self.assertEqual(self.set, set(self.values))
1237
1238 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001239 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001240 self.assertEqual(self.set, set(self.values + ["z"]))
1241
1242#==============================================================================
1243
1244class TestSubsets(unittest.TestCase):
1245
1246 case2method = {"<=": "issubset",
1247 ">=": "issuperset",
1248 }
1249
1250 reverse = {"==": "==",
1251 "!=": "!=",
1252 "<": ">",
1253 ">": "<",
1254 "<=": ">=",
1255 ">=": "<=",
1256 }
1257
1258 def test_issubset(self):
1259 x = self.left
1260 y = self.right
1261 for case in "!=", "==", "<", "<=", ">", ">=":
1262 expected = case in self.cases
1263 # Test the binary infix spelling.
1264 result = eval("x" + case + "y", locals())
1265 self.assertEqual(result, expected)
1266 # Test the "friendly" method-name spelling, if one exists.
1267 if case in TestSubsets.case2method:
1268 method = getattr(x, TestSubsets.case2method[case])
1269 result = method(y)
1270 self.assertEqual(result, expected)
1271
1272 # Now do the same for the operands reversed.
1273 rcase = TestSubsets.reverse[case]
1274 result = eval("y" + rcase + "x", locals())
1275 self.assertEqual(result, expected)
1276 if rcase in TestSubsets.case2method:
1277 method = getattr(y, TestSubsets.case2method[rcase])
1278 result = method(x)
1279 self.assertEqual(result, expected)
1280#------------------------------------------------------------------------------
1281
1282class TestSubsetEqualEmpty(TestSubsets):
1283 left = set()
1284 right = set()
1285 name = "both empty"
1286 cases = "==", "<=", ">="
1287
1288#------------------------------------------------------------------------------
1289
1290class TestSubsetEqualNonEmpty(TestSubsets):
1291 left = set([1, 2])
1292 right = set([1, 2])
1293 name = "equal pair"
1294 cases = "==", "<=", ">="
1295
1296#------------------------------------------------------------------------------
1297
1298class TestSubsetEmptyNonEmpty(TestSubsets):
1299 left = set()
1300 right = set([1, 2])
1301 name = "one empty, one non-empty"
1302 cases = "!=", "<", "<="
1303
1304#------------------------------------------------------------------------------
1305
1306class TestSubsetPartial(TestSubsets):
1307 left = set([1])
1308 right = set([1, 2])
1309 name = "one a non-empty proper subset of other"
1310 cases = "!=", "<", "<="
1311
1312#------------------------------------------------------------------------------
1313
1314class TestSubsetNonOverlap(TestSubsets):
1315 left = set([1])
1316 right = set([2])
1317 name = "neither empty, neither contains"
1318 cases = "!="
1319
1320#==============================================================================
1321
1322class TestOnlySetsInBinaryOps(unittest.TestCase):
1323
1324 def test_eq_ne(self):
1325 # Unlike the others, this is testing that == and != *are* allowed.
1326 self.assertEqual(self.other == self.set, False)
1327 self.assertEqual(self.set == self.other, False)
1328 self.assertEqual(self.other != self.set, True)
1329 self.assertEqual(self.set != self.other, True)
1330
1331 def test_ge_gt_le_lt(self):
1332 self.assertRaises(TypeError, lambda: self.set < self.other)
1333 self.assertRaises(TypeError, lambda: self.set <= self.other)
1334 self.assertRaises(TypeError, lambda: self.set > self.other)
1335 self.assertRaises(TypeError, lambda: self.set >= self.other)
1336
1337 self.assertRaises(TypeError, lambda: self.other < self.set)
1338 self.assertRaises(TypeError, lambda: self.other <= self.set)
1339 self.assertRaises(TypeError, lambda: self.other > self.set)
1340 self.assertRaises(TypeError, lambda: self.other >= self.set)
1341
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001342 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001343 try:
1344 self.set |= self.other
1345 except TypeError:
1346 pass
1347 else:
1348 self.fail("expected TypeError")
1349
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001350 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001351 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001352 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001353 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001354 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001355
1356 def test_union(self):
1357 self.assertRaises(TypeError, lambda: self.set | self.other)
1358 self.assertRaises(TypeError, lambda: self.other | self.set)
1359 if self.otherIsIterable:
1360 self.set.union(self.other)
1361 else:
1362 self.assertRaises(TypeError, self.set.union, self.other)
1363
1364 def test_intersection_update_operator(self):
1365 try:
1366 self.set &= self.other
1367 except TypeError:
1368 pass
1369 else:
1370 self.fail("expected TypeError")
1371
1372 def test_intersection_update(self):
1373 if self.otherIsIterable:
1374 self.set.intersection_update(self.other)
1375 else:
1376 self.assertRaises(TypeError,
1377 self.set.intersection_update,
1378 self.other)
1379
1380 def test_intersection(self):
1381 self.assertRaises(TypeError, lambda: self.set & self.other)
1382 self.assertRaises(TypeError, lambda: self.other & self.set)
1383 if self.otherIsIterable:
1384 self.set.intersection(self.other)
1385 else:
1386 self.assertRaises(TypeError, self.set.intersection, self.other)
1387
1388 def test_sym_difference_update_operator(self):
1389 try:
1390 self.set ^= self.other
1391 except TypeError:
1392 pass
1393 else:
1394 self.fail("expected TypeError")
1395
1396 def test_sym_difference_update(self):
1397 if self.otherIsIterable:
1398 self.set.symmetric_difference_update(self.other)
1399 else:
1400 self.assertRaises(TypeError,
1401 self.set.symmetric_difference_update,
1402 self.other)
1403
1404 def test_sym_difference(self):
1405 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1406 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1407 if self.otherIsIterable:
1408 self.set.symmetric_difference(self.other)
1409 else:
1410 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1411
1412 def test_difference_update_operator(self):
1413 try:
1414 self.set -= self.other
1415 except TypeError:
1416 pass
1417 else:
1418 self.fail("expected TypeError")
1419
1420 def test_difference_update(self):
1421 if self.otherIsIterable:
1422 self.set.difference_update(self.other)
1423 else:
1424 self.assertRaises(TypeError,
1425 self.set.difference_update,
1426 self.other)
1427
1428 def test_difference(self):
1429 self.assertRaises(TypeError, lambda: self.set - self.other)
1430 self.assertRaises(TypeError, lambda: self.other - self.set)
1431 if self.otherIsIterable:
1432 self.set.difference(self.other)
1433 else:
1434 self.assertRaises(TypeError, self.set.difference, self.other)
1435
1436#------------------------------------------------------------------------------
1437
1438class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1439 def setUp(self):
1440 self.set = set((1, 2, 3))
1441 self.other = 19
1442 self.otherIsIterable = False
1443
1444#------------------------------------------------------------------------------
1445
1446class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1447 def setUp(self):
1448 self.set = set((1, 2, 3))
1449 self.other = {1:2, 3:4}
1450 self.otherIsIterable = True
1451
1452#------------------------------------------------------------------------------
1453
1454class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1455 def setUp(self):
1456 self.set = set((1, 2, 3))
1457 self.other = operator.add
1458 self.otherIsIterable = False
1459
1460#------------------------------------------------------------------------------
1461
1462class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1463 def setUp(self):
1464 self.set = set((1, 2, 3))
1465 self.other = (2, 4, 6)
1466 self.otherIsIterable = True
1467
1468#------------------------------------------------------------------------------
1469
1470class TestOnlySetsString(TestOnlySetsInBinaryOps):
1471 def setUp(self):
1472 self.set = set((1, 2, 3))
1473 self.other = 'abc'
1474 self.otherIsIterable = True
1475
1476#------------------------------------------------------------------------------
1477
1478class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1479 def setUp(self):
1480 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001481 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001482 yield i
1483 self.set = set((1, 2, 3))
1484 self.other = gen()
1485 self.otherIsIterable = True
1486
1487#==============================================================================
1488
1489class TestCopying(unittest.TestCase):
1490
1491 def test_copy(self):
1492 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001493 dup_list = sorted(dup, key=repr)
1494 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001495 self.assertEqual(len(dup_list), len(set_list))
1496 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001497 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001498
1499 def test_deep_copy(self):
1500 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001501 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001502 dup_list = sorted(dup, key=repr)
1503 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001504 self.assertEqual(len(dup_list), len(set_list))
1505 for i in range(len(dup_list)):
1506 self.assertEqual(dup_list[i], set_list[i])
1507
1508#------------------------------------------------------------------------------
1509
1510class TestCopyingEmpty(TestCopying):
1511 def setUp(self):
1512 self.set = set()
1513
1514#------------------------------------------------------------------------------
1515
1516class TestCopyingSingleton(TestCopying):
1517 def setUp(self):
1518 self.set = set(["hello"])
1519
1520#------------------------------------------------------------------------------
1521
1522class TestCopyingTriple(TestCopying):
1523 def setUp(self):
1524 self.set = set(["zero", 0, None])
1525
1526#------------------------------------------------------------------------------
1527
1528class TestCopyingTuple(TestCopying):
1529 def setUp(self):
1530 self.set = set([(1, 2)])
1531
1532#------------------------------------------------------------------------------
1533
1534class TestCopyingNested(TestCopying):
1535 def setUp(self):
1536 self.set = set([((1, 2), (3, 4))])
1537
1538#==============================================================================
1539
1540class TestIdentities(unittest.TestCase):
1541 def setUp(self):
1542 self.a = set('abracadabra')
1543 self.b = set('alacazam')
1544
1545 def test_binopsVsSubsets(self):
1546 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001547 self.assertTrue(a - b < a)
1548 self.assertTrue(b - a < b)
1549 self.assertTrue(a & b < a)
1550 self.assertTrue(a & b < b)
1551 self.assertTrue(a | b > a)
1552 self.assertTrue(a | b > b)
1553 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001554
1555 def test_commutativity(self):
1556 a, b = self.a, self.b
1557 self.assertEqual(a&b, b&a)
1558 self.assertEqual(a|b, b|a)
1559 self.assertEqual(a^b, b^a)
1560 if a != b:
1561 self.assertNotEqual(a-b, b-a)
1562
1563 def test_summations(self):
1564 # check that sums of parts equal the whole
1565 a, b = self.a, self.b
1566 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1567 self.assertEqual((a&b)|(a^b), a|b)
1568 self.assertEqual(a|(b-a), a|b)
1569 self.assertEqual((a-b)|b, a|b)
1570 self.assertEqual((a-b)|(a&b), a)
1571 self.assertEqual((b-a)|(a&b), b)
1572 self.assertEqual((a-b)|(b-a), a^b)
1573
1574 def test_exclusion(self):
1575 # check that inverse operations show non-overlap
1576 a, b, zero = self.a, self.b, set()
1577 self.assertEqual((a-b)&b, zero)
1578 self.assertEqual((b-a)&a, zero)
1579 self.assertEqual((a&b)&(a^b), zero)
1580
1581# Tests derived from test_itertools.py =======================================
1582
1583def R(seqn):
1584 'Regular generator'
1585 for i in seqn:
1586 yield i
1587
1588class G:
1589 'Sequence using __getitem__'
1590 def __init__(self, seqn):
1591 self.seqn = seqn
1592 def __getitem__(self, i):
1593 return self.seqn[i]
1594
1595class I:
1596 'Sequence using iterator protocol'
1597 def __init__(self, seqn):
1598 self.seqn = seqn
1599 self.i = 0
1600 def __iter__(self):
1601 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001602 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001603 if self.i >= len(self.seqn): raise StopIteration
1604 v = self.seqn[self.i]
1605 self.i += 1
1606 return v
1607
1608class Ig:
1609 'Sequence using iterator protocol defined with a generator'
1610 def __init__(self, seqn):
1611 self.seqn = seqn
1612 self.i = 0
1613 def __iter__(self):
1614 for val in self.seqn:
1615 yield val
1616
1617class X:
1618 'Missing __getitem__ and __iter__'
1619 def __init__(self, seqn):
1620 self.seqn = seqn
1621 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001622 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001623 if self.i >= len(self.seqn): raise StopIteration
1624 v = self.seqn[self.i]
1625 self.i += 1
1626 return v
1627
1628class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001629 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001630 def __init__(self, seqn):
1631 self.seqn = seqn
1632 self.i = 0
1633 def __iter__(self):
1634 return self
1635
1636class E:
1637 'Test propagation of exceptions'
1638 def __init__(self, seqn):
1639 self.seqn = seqn
1640 self.i = 0
1641 def __iter__(self):
1642 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001643 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001644 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001645
1646class S:
1647 'Test immediate stop'
1648 def __init__(self, seqn):
1649 pass
1650 def __iter__(self):
1651 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001652 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001653 raise StopIteration
1654
Raymond Hettingera6c60372008-03-13 01:26:19 +00001655from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001656def L(seqn):
1657 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001658 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001659
1660class TestVariousIteratorArgs(unittest.TestCase):
1661
1662 def test_constructor(self):
1663 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001664 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001665 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001666 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001667 self.assertRaises(TypeError, cons , X(s))
1668 self.assertRaises(TypeError, cons , N(s))
1669 self.assertRaises(ZeroDivisionError, cons , E(s))
1670
1671 def test_inline_methods(self):
1672 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001673 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001674 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001675 for g in (G, I, Ig, L, R):
1676 expected = meth(data)
1677 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001678 if isinstance(expected, bool):
1679 self.assertEqual(actual, expected)
1680 else:
1681 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001682 self.assertRaises(TypeError, meth, X(s))
1683 self.assertRaises(TypeError, meth, N(s))
1684 self.assertRaises(ZeroDivisionError, meth, E(s))
1685
1686 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001687 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001688 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001689 'difference_update', 'symmetric_difference_update'):
1690 for g in (G, I, Ig, S, L, R):
1691 s = set('january')
1692 t = s.copy()
1693 getattr(s, methname)(list(g(data)))
1694 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001695 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001696
1697 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1698 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1699 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1700
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001701class bad_eq:
1702 def __eq__(self, other):
1703 if be_bad:
1704 set2.clear()
1705 raise ZeroDivisionError
1706 return self is other
1707 def __hash__(self):
1708 return 0
1709
1710class bad_dict_clear:
1711 def __eq__(self, other):
1712 if be_bad:
1713 dict2.clear()
1714 return self is other
1715 def __hash__(self):
1716 return 0
1717
Éric Araujo23eae862010-09-05 18:43:07 +00001718class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001719 def test_8420_set_merge(self):
1720 # This used to segfault
1721 global be_bad, set2, dict2
1722 be_bad = False
1723 set1 = {bad_eq()}
1724 set2 = {bad_eq() for i in range(75)}
1725 be_bad = True
1726 self.assertRaises(ZeroDivisionError, set1.update, set2)
1727
1728 be_bad = False
1729 set1 = {bad_dict_clear()}
1730 dict2 = {bad_dict_clear(): None}
1731 be_bad = True
1732 set1.symmetric_difference_update(dict2)
1733
Christian Heimes969fe572008-01-25 11:23:10 +00001734# Application tests (based on David Eppstein's graph recipes ====================================
1735
1736def powerset(U):
1737 """Generates all subsets of a set or sequence U."""
1738 U = iter(U)
1739 try:
1740 x = frozenset([next(U)])
1741 for S in powerset(U):
1742 yield S
1743 yield S | x
1744 except StopIteration:
1745 yield frozenset()
1746
1747def cube(n):
1748 """Graph of n-dimensional hypercube."""
1749 singletons = [frozenset([x]) for x in range(n)]
1750 return dict([(x, frozenset([x^s for s in singletons]))
1751 for x in powerset(range(n))])
1752
1753def linegraph(G):
1754 """Graph, the vertices of which are edges of G,
1755 with two vertices being adjacent iff the corresponding
1756 edges share a vertex."""
1757 L = {}
1758 for x in G:
1759 for y in G[x]:
1760 nx = [frozenset([x,z]) for z in G[x] if z != y]
1761 ny = [frozenset([y,z]) for z in G[y] if z != x]
1762 L[frozenset([x,y])] = frozenset(nx+ny)
1763 return L
1764
1765def faces(G):
1766 'Return a set of faces in G. Where a face is a set of vertices on that face'
1767 # currently limited to triangles,squares, and pentagons
1768 f = set()
1769 for v1, edges in G.items():
1770 for v2 in edges:
1771 for v3 in G[v2]:
1772 if v1 == v3:
1773 continue
1774 if v1 in G[v3]:
1775 f.add(frozenset([v1, v2, v3]))
1776 else:
1777 for v4 in G[v3]:
1778 if v4 == v2:
1779 continue
1780 if v1 in G[v4]:
1781 f.add(frozenset([v1, v2, v3, v4]))
1782 else:
1783 for v5 in G[v4]:
1784 if v5 == v3 or v5 == v2:
1785 continue
1786 if v1 in G[v5]:
1787 f.add(frozenset([v1, v2, v3, v4, v5]))
1788 return f
1789
1790
1791class TestGraphs(unittest.TestCase):
1792
1793 def test_cube(self):
1794
1795 g = cube(3) # vert --> {v1, v2, v3}
1796 vertices1 = set(g)
1797 self.assertEqual(len(vertices1), 8) # eight vertices
1798 for edge in g.values():
1799 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1800 vertices2 = set(v for edges in g.values() for v in edges)
1801 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1802
1803 cubefaces = faces(g)
1804 self.assertEqual(len(cubefaces), 6) # six faces
1805 for face in cubefaces:
1806 self.assertEqual(len(face), 4) # each face is a square
1807
1808 def test_cuboctahedron(self):
1809
1810 # http://en.wikipedia.org/wiki/Cuboctahedron
1811 # 8 triangular faces and 6 square faces
1812 # 12 indentical vertices each connecting a triangle and square
1813
1814 g = cube(3)
1815 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1816 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1817
1818 vertices = set(cuboctahedron)
1819 for edges in cuboctahedron.values():
1820 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1821 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1822 self.assertEqual(vertices, othervertices) # edge vertices in original set
1823
1824 cubofaces = faces(cuboctahedron)
1825 facesizes = collections.defaultdict(int)
1826 for face in cubofaces:
1827 facesizes[len(face)] += 1
1828 self.assertEqual(facesizes[3], 8) # eight triangular faces
1829 self.assertEqual(facesizes[4], 6) # six square faces
1830
1831 for vertex in cuboctahedron:
1832 edge = vertex # Cuboctahedron vertices are edges in Cube
1833 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1834 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001835 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001836
1837
Raymond Hettingera690a992003-11-16 16:17:49 +00001838#==============================================================================
1839
1840def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001841 test_classes = (
1842 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001843 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001844 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001845 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001846 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001847 TestSetOfSets,
1848 TestExceptionPropagation,
1849 TestBasicOpsEmpty,
1850 TestBasicOpsSingleton,
1851 TestBasicOpsTuple,
1852 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001853 TestBasicOpsString,
1854 TestBasicOpsBytes,
1855 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001856 TestBinaryOps,
1857 TestUpdateOps,
1858 TestMutate,
1859 TestSubsetEqualEmpty,
1860 TestSubsetEqualNonEmpty,
1861 TestSubsetEmptyNonEmpty,
1862 TestSubsetPartial,
1863 TestSubsetNonOverlap,
1864 TestOnlySetsNumeric,
1865 TestOnlySetsDict,
1866 TestOnlySetsOperator,
1867 TestOnlySetsTuple,
1868 TestOnlySetsString,
1869 TestOnlySetsGenerator,
1870 TestCopyingEmpty,
1871 TestCopyingSingleton,
1872 TestCopyingTriple,
1873 TestCopyingTuple,
1874 TestCopyingNested,
1875 TestIdentities,
1876 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001877 TestGraphs,
Éric Araujo23eae862010-09-05 18:43:07 +00001878 TestWeirdBugs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001879 )
1880
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001881 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001882
1883 # verify reference counting
1884 if verbose and hasattr(sys, "gettotalrefcount"):
1885 import gc
1886 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001887 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001888 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001889 gc.collect()
1890 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001891 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001892
1893if __name__ == "__main__":
1894 test_main(verbose=True)