blob: 13cefec1a912859d0325dd141df3e4b387791b5b [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
Ezio Melottiab5ba792013-04-19 05:58:44 +030040class TestJointOps:
Raymond Hettingera690a992003-11-16 16:17:49 +000041 # 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300364class TestSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000365 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300650class TestFrozenSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000651 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300751class TestBasicOps:
Raymond Hettingera690a992003-11-16 16:17:49 +0000752
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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300861class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000862 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300872class TestBasicOpsSingleton(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000873 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300889class TestBasicOpsTuple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000890 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300906class TestBasicOpsTriple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000907 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300917class TestBasicOpsString(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000918 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300930class TestBasicOpsBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000931 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
Ezio Melottiab5ba792013-04-19 05:58:44 +0300943class TestBasicOpsMixedStringBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000944 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
Ezio Melottiab5ba792013-04-19 05:58:44 +03001242class TestSubsets:
Raymond Hettingera690a992003-11-16 16:17:49 +00001243
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
Ezio Melottiab5ba792013-04-19 05:58:44 +03001280class TestSubsetEqualEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001281 left = set()
1282 right = set()
1283 name = "both empty"
1284 cases = "==", "<=", ">="
1285
1286#------------------------------------------------------------------------------
1287
Ezio Melottiab5ba792013-04-19 05:58:44 +03001288class TestSubsetEqualNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001289 left = set([1, 2])
1290 right = set([1, 2])
1291 name = "equal pair"
1292 cases = "==", "<=", ">="
1293
1294#------------------------------------------------------------------------------
1295
Ezio Melottiab5ba792013-04-19 05:58:44 +03001296class TestSubsetEmptyNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001297 left = set()
1298 right = set([1, 2])
1299 name = "one empty, one non-empty"
1300 cases = "!=", "<", "<="
1301
1302#------------------------------------------------------------------------------
1303
Ezio Melottiab5ba792013-04-19 05:58:44 +03001304class TestSubsetPartial(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001305 left = set([1])
1306 right = set([1, 2])
1307 name = "one a non-empty proper subset of other"
1308 cases = "!=", "<", "<="
1309
1310#------------------------------------------------------------------------------
1311
Ezio Melottiab5ba792013-04-19 05:58:44 +03001312class TestSubsetNonOverlap(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001313 left = set([1])
1314 right = set([2])
1315 name = "neither empty, neither contains"
1316 cases = "!="
1317
1318#==============================================================================
1319
Ezio Melottiab5ba792013-04-19 05:58:44 +03001320class TestOnlySetsInBinaryOps:
Raymond Hettingera690a992003-11-16 16:17:49 +00001321
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
Ezio Melottiab5ba792013-04-19 05:58:44 +03001436class TestOnlySetsNumeric(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001437 def setUp(self):
1438 self.set = set((1, 2, 3))
1439 self.other = 19
1440 self.otherIsIterable = False
1441
1442#------------------------------------------------------------------------------
1443
Ezio Melottiab5ba792013-04-19 05:58:44 +03001444class TestOnlySetsDict(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001445 def setUp(self):
1446 self.set = set((1, 2, 3))
1447 self.other = {1:2, 3:4}
1448 self.otherIsIterable = True
1449
1450#------------------------------------------------------------------------------
1451
Ezio Melottiab5ba792013-04-19 05:58:44 +03001452class TestOnlySetsOperator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001453 def setUp(self):
1454 self.set = set((1, 2, 3))
1455 self.other = operator.add
1456 self.otherIsIterable = False
1457
1458#------------------------------------------------------------------------------
1459
Ezio Melottiab5ba792013-04-19 05:58:44 +03001460class TestOnlySetsTuple(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 def setUp(self):
1462 self.set = set((1, 2, 3))
1463 self.other = (2, 4, 6)
1464 self.otherIsIterable = True
1465
1466#------------------------------------------------------------------------------
1467
Ezio Melottiab5ba792013-04-19 05:58:44 +03001468class TestOnlySetsString(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001469 def setUp(self):
1470 self.set = set((1, 2, 3))
1471 self.other = 'abc'
1472 self.otherIsIterable = True
1473
1474#------------------------------------------------------------------------------
1475
Ezio Melottiab5ba792013-04-19 05:58:44 +03001476class TestOnlySetsGenerator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001477 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
Ezio Melottiab5ba792013-04-19 05:58:44 +03001487class TestCopying:
Raymond Hettingera690a992003-11-16 16:17:49 +00001488
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
Ezio Melottiab5ba792013-04-19 05:58:44 +03001508class TestCopyingEmpty(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001509 def setUp(self):
1510 self.set = set()
1511
1512#------------------------------------------------------------------------------
1513
Ezio Melottiab5ba792013-04-19 05:58:44 +03001514class TestCopyingSingleton(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001515 def setUp(self):
1516 self.set = set(["hello"])
1517
1518#------------------------------------------------------------------------------
1519
Ezio Melottiab5ba792013-04-19 05:58:44 +03001520class TestCopyingTriple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001521 def setUp(self):
1522 self.set = set(["zero", 0, None])
1523
1524#------------------------------------------------------------------------------
1525
Ezio Melottiab5ba792013-04-19 05:58:44 +03001526class TestCopyingTuple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001527 def setUp(self):
1528 self.set = set([(1, 2)])
1529
1530#------------------------------------------------------------------------------
1531
Ezio Melottiab5ba792013-04-19 05:58:44 +03001532class TestCopyingNested(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001533 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)
Tim Peters23d7d4e2013-09-06 15:41:30 -05001675 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
Raymond Hettingera690a992003-11-16 16:17:49 +00001838if __name__ == "__main__":
Ezio Melottiab5ba792013-04-19 05:58:44 +03001839 unittest.main()