blob: ade39fb75872c1d635ff13f88e391687f0b36df9 [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 Hettinger455b5092015-08-09 00:35:00 -070013import itertools
14import string
Raymond Hettingera690a992003-11-16 16:17:49 +000015
16class PassThru(Exception):
17 pass
18
19def check_pass_thru():
20 raise PassThru
21 yield 1
22
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000023class BadCmp:
24 def __hash__(self):
25 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000026 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000027 raise RuntimeError
28
Thomas Wouters902d6eb2007-01-09 23:18:33 +000029class ReprWrapper:
30 'Used to test self-referential repr() calls'
31 def __repr__(self):
32 return repr(self.value)
33
Thomas Wouterscf297e42007-02-23 15:07:44 +000034class HashCountingInt(int):
35 'int-like object that counts the number of times __hash__ is called'
36 def __init__(self, *args):
37 self.hash_count = 0
38 def __hash__(self):
39 self.hash_count += 1
40 return int.__hash__(self)
41
Ezio Melottiab5ba792013-04-19 05:58:44 +030042class TestJointOps:
Raymond Hettingera690a992003-11-16 16:17:49 +000043 # Tests common to both set and frozenset
44
45 def setUp(self):
46 self.word = word = 'simsalabim'
47 self.otherword = 'madagascar'
48 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
49 self.s = self.thetype(word)
50 self.d = dict.fromkeys(word)
51
Raymond Hettinger6429a472004-09-28 01:51:35 +000052 def test_new_or_init(self):
53 self.assertRaises(TypeError, self.thetype, [], 2)
Raymond Hettinger3fb156c2010-04-18 23:05:22 +000054 self.assertRaises(TypeError, set().__init__, a=1)
Raymond Hettinger6429a472004-09-28 01:51:35 +000055
Raymond Hettingera690a992003-11-16 16:17:49 +000056 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000057 actual = sorted(self.s)
58 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000059 self.assertEqual(actual, expected)
60 self.assertRaises(PassThru, self.thetype, check_pass_thru())
61 self.assertRaises(TypeError, self.thetype, [[]])
62
63 def test_len(self):
64 self.assertEqual(len(self.s), len(self.d))
65
66 def test_contains(self):
67 for c in self.letters:
68 self.assertEqual(c in self.s, c in self.d)
69 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000070 s = self.thetype([frozenset(self.letters)])
Benjamin Peterson577473f2010-01-19 00:09:57 +000071 self.assertIn(self.thetype(self.letters), s)
Raymond Hettingera690a992003-11-16 16:17:49 +000072
Raymond Hettingera690a992003-11-16 16:17:49 +000073 def test_union(self):
74 u = self.s.union(self.otherword)
75 for c in self.letters:
76 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000077 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000078 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000079 self.assertRaises(PassThru, self.s.union, check_pass_thru())
80 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000081 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000082 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
83 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
84 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
85 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000086 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000087
Raymond Hettingere805ecc2009-07-27 20:16:37 +000088 # Issue #6573
89 x = self.thetype()
90 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
91
Raymond Hettingera690a992003-11-16 16:17:49 +000092 def test_or(self):
93 i = self.s.union(self.otherword)
94 self.assertEqual(self.s | set(self.otherword), i)
95 self.assertEqual(self.s | frozenset(self.otherword), i)
96 try:
97 self.s | self.otherword
98 except TypeError:
99 pass
100 else:
101 self.fail("s|t did not screen-out general iterables")
102
103 def test_intersection(self):
104 i = self.s.intersection(self.otherword)
105 for c in self.letters:
106 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000107 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000108 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000109 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000110 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000111 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
112 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
113 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
114 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000115 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000116 s = self.thetype('abcba')
117 z = s.intersection()
118 if self.thetype == frozenset():
119 self.assertEqual(id(s), id(z))
120 else:
121 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000122
Guido van Rossum58da9312007-11-10 23:39:45 +0000123 def test_isdisjoint(self):
124 def f(s1, s2):
125 'Pure python equivalent of isdisjoint()'
126 return not set(s1).intersection(s2)
127 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
128 s1 = self.thetype(larg)
129 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
130 for C in set, frozenset, dict.fromkeys, str, list, tuple:
131 s2 = C(rarg)
132 actual = s1.isdisjoint(s2)
133 expected = f(s1, s2)
134 self.assertEqual(actual, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000135 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000136
Raymond Hettingera690a992003-11-16 16:17:49 +0000137 def test_and(self):
138 i = self.s.intersection(self.otherword)
139 self.assertEqual(self.s & set(self.otherword), i)
140 self.assertEqual(self.s & frozenset(self.otherword), i)
141 try:
142 self.s & self.otherword
143 except TypeError:
144 pass
145 else:
146 self.fail("s&t did not screen-out general iterables")
147
148 def test_difference(self):
149 i = self.s.difference(self.otherword)
150 for c in self.letters:
151 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000152 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000153 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000154 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
155 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000156 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000157 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
158 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
159 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
160 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000161 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
162 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000163
164 def test_sub(self):
165 i = self.s.difference(self.otherword)
166 self.assertEqual(self.s - set(self.otherword), i)
167 self.assertEqual(self.s - frozenset(self.otherword), i)
168 try:
169 self.s - self.otherword
170 except TypeError:
171 pass
172 else:
173 self.fail("s-t did not screen-out general iterables")
174
175 def test_symmetric_difference(self):
176 i = self.s.symmetric_difference(self.otherword)
177 for c in self.letters:
178 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000179 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000180 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000181 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
182 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000183 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000184 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
185 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
186 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
187 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000188
189 def test_xor(self):
190 i = self.s.symmetric_difference(self.otherword)
191 self.assertEqual(self.s ^ set(self.otherword), i)
192 self.assertEqual(self.s ^ frozenset(self.otherword), i)
193 try:
194 self.s ^ self.otherword
195 except TypeError:
196 pass
197 else:
198 self.fail("s^t did not screen-out general iterables")
199
200 def test_equality(self):
201 self.assertEqual(self.s, set(self.word))
202 self.assertEqual(self.s, frozenset(self.word))
203 self.assertEqual(self.s == self.word, False)
204 self.assertNotEqual(self.s, set(self.otherword))
205 self.assertNotEqual(self.s, frozenset(self.otherword))
206 self.assertEqual(self.s != self.word, True)
207
208 def test_setOfFrozensets(self):
209 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
210 s = self.thetype(t)
211 self.assertEqual(len(s), 3)
212
Raymond Hettingera690a992003-11-16 16:17:49 +0000213 def test_sub_and_super(self):
214 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000215 self.assertTrue(p < q)
216 self.assertTrue(p <= q)
217 self.assertTrue(q <= q)
218 self.assertTrue(q > p)
219 self.assertTrue(q >= p)
220 self.assertFalse(q < r)
221 self.assertFalse(q <= r)
222 self.assertFalse(q > r)
223 self.assertFalse(q >= r)
224 self.assertTrue(set('a').issubset('abc'))
225 self.assertTrue(set('abc').issuperset('a'))
226 self.assertFalse(set('a').issubset('cbs'))
227 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000228
229 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000230 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000231 p = pickle.dumps(self.s, i)
232 dup = pickle.loads(p)
233 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
234 if type(self.s) not in (set, frozenset):
235 self.s.x = 10
Serhiy Storchakabad12572014-12-15 14:03:42 +0200236 p = pickle.dumps(self.s, i)
Raymond Hettinger15056a52004-11-09 07:25:31 +0000237 dup = pickle.loads(p)
238 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000239
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000240 def test_iterator_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200241 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
242 itorg = iter(self.s)
243 data = self.thetype(self.s)
244 d = pickle.dumps(itorg, proto)
245 it = pickle.loads(d)
246 # Set iterators unpickle as list iterators due to the
247 # undefined order of set items.
248 # self.assertEqual(type(itorg), type(it))
249 self.assertIsInstance(it, collections.abc.Iterator)
250 self.assertEqual(self.thetype(it), data)
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000251
Serhiy Storchakabad12572014-12-15 14:03:42 +0200252 it = pickle.loads(d)
253 try:
254 drop = next(it)
255 except StopIteration:
256 continue
257 d = pickle.dumps(it, proto)
258 it = pickle.loads(d)
259 self.assertEqual(self.thetype(it), data - self.thetype((drop,)))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000260
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000261 def test_deepcopy(self):
262 class Tracer:
263 def __init__(self, value):
264 self.value = value
265 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000266 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000267 def __deepcopy__(self, memo=None):
268 return Tracer(self.value + 1)
269 t = Tracer(10)
270 s = self.thetype([t])
271 dup = copy.deepcopy(s)
272 self.assertNotEqual(id(s), id(dup))
273 for elem in dup:
274 newt = elem
275 self.assertNotEqual(id(t), id(newt))
276 self.assertEqual(t.value + 1, newt.value)
277
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000278 def test_gc(self):
279 # Create a nest of cycles to exercise overall ref count check
280 class A:
281 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000282 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000283 for elem in s:
284 elem.cycle = s
285 elem.sub = elem
286 elem.set = set([elem])
287
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000288 def test_subclass_with_custom_hash(self):
289 # Bug #1257731
290 class H(self.thetype):
291 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000292 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000293 s=H()
294 f=set()
295 f.add(s)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000296 self.assertIn(s, f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000297 f.remove(s)
298 f.add(s)
299 f.discard(s)
300
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000301 def test_badcmp(self):
302 s = self.thetype([BadCmp()])
303 # Detect comparison errors during insertion and lookup
304 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
305 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
306 # Detect errors during mutating operations
307 if hasattr(s, 'add'):
308 self.assertRaises(RuntimeError, s.add, BadCmp())
309 self.assertRaises(RuntimeError, s.discard, BadCmp())
310 self.assertRaises(RuntimeError, s.remove, BadCmp())
311
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000312 def test_cyclical_repr(self):
313 w = ReprWrapper()
314 s = self.thetype([w])
315 w.value = s
316 if self.thetype == set:
317 self.assertEqual(repr(s), '{set(...)}')
318 else:
319 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000320 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000321
322 def test_cyclical_print(self):
323 w = ReprWrapper()
324 s = self.thetype([w])
325 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000326 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000327 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000328 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000329 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000330 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000331 self.assertEqual(fo.read(), repr(s))
332 finally:
333 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000334 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000335
Thomas Wouterscf297e42007-02-23 15:07:44 +0000336 def test_do_not_rehash_dict_keys(self):
337 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000338 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000339 self.assertEqual(sum(elem.hash_count for elem in d), n)
340 s = self.thetype(d)
341 self.assertEqual(sum(elem.hash_count for elem in d), n)
342 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000343 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000344 if hasattr(s, 'symmetric_difference_update'):
345 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000346 self.assertEqual(sum(elem.hash_count for elem in d), n)
347 d2 = dict.fromkeys(set(d))
348 self.assertEqual(sum(elem.hash_count for elem in d), n)
349 d3 = dict.fromkeys(frozenset(d))
350 self.assertEqual(sum(elem.hash_count for elem in d), n)
351 d3 = dict.fromkeys(frozenset(d), 123)
352 self.assertEqual(sum(elem.hash_count for elem in d), n)
353 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000354
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000355 def test_container_iterator(self):
356 # Bug #3680: tp_traverse was not implemented for set iterator object
357 class C(object):
358 pass
359 obj = C()
360 ref = weakref.ref(obj)
361 container = set([obj, 1])
362 obj.x = iter(container)
363 del obj, container
364 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000365 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000366
Ezio Melottiab5ba792013-04-19 05:58:44 +0300367class TestSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000368 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000369 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000370
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000371 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000372 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000373 s.__init__(self.word)
374 self.assertEqual(s, set(self.word))
375 s.__init__(self.otherword)
376 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000377 self.assertRaises(TypeError, s.__init__, s, 2);
378 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000379
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000380 def test_constructor_identity(self):
381 s = self.thetype(range(3))
382 t = self.thetype(s)
383 self.assertNotEqual(id(s), id(t))
384
Guido van Rossum86e58e22006-08-28 15:27:34 +0000385 def test_set_literal(self):
386 s = set([1,2,3])
387 t = {1,2,3}
388 self.assertEqual(s, t)
389
Raymond Hettingera690a992003-11-16 16:17:49 +0000390 def test_hash(self):
391 self.assertRaises(TypeError, hash, self.s)
392
393 def test_clear(self):
394 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000395 self.assertEqual(self.s, set())
396 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000397
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000398 def test_copy(self):
399 dup = self.s.copy()
400 self.assertEqual(self.s, dup)
401 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000402 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000403
Raymond Hettingera690a992003-11-16 16:17:49 +0000404 def test_add(self):
405 self.s.add('Q')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000406 self.assertIn('Q', self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000407 dup = self.s.copy()
408 self.s.add('Q')
409 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000410 self.assertRaises(TypeError, self.s.add, [])
411
412 def test_remove(self):
413 self.s.remove('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000414 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000415 self.assertRaises(KeyError, self.s.remove, 'Q')
416 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000417 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000418 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000419 s.remove(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000420 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000421 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000422
Thomas Wouters89f507f2006-12-13 04:49:30 +0000423 def test_remove_keyerror_unpacking(self):
424 # bug: www.python.org/sf/1576657
425 for v1 in ['Q', (1,)]:
426 try:
427 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000428 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429 v2 = e.args[0]
430 self.assertEqual(v1, v2)
431 else:
432 self.fail()
433
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000434 def test_remove_keyerror_set(self):
435 key = self.thetype([3, 4])
436 try:
437 self.s.remove(key)
438 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000439 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000440 "KeyError should be {0}, not {1}".format(key,
441 e.args[0]))
442 else:
443 self.fail()
444
Raymond Hettingera690a992003-11-16 16:17:49 +0000445 def test_discard(self):
446 self.s.discard('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000447 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000448 self.s.discard('Q')
449 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000450 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000451 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000452 s.discard(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000453 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000454 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000455
456 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000457 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000458 elem = self.s.pop()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000459 self.assertNotIn(elem, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000460 self.assertRaises(KeyError, self.s.pop)
461
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000462 def test_update(self):
463 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000464 self.assertEqual(retval, None)
465 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000466 self.assertIn(c, self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000467 self.assertRaises(PassThru, self.s.update, check_pass_thru())
468 self.assertRaises(TypeError, self.s.update, [[]])
469 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000470 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000471 s = self.thetype('abcba')
472 self.assertEqual(s.update(C(p)), None)
473 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000474 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
475 q = 'ahi'
476 for C in set, frozenset, dict.fromkeys, str, list, tuple:
477 s = self.thetype('abcba')
478 self.assertEqual(s.update(C(p), C(q)), None)
479 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000480
481 def test_ior(self):
482 self.s |= set(self.otherword)
483 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000484 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000485
486 def test_intersection_update(self):
487 retval = self.s.intersection_update(self.otherword)
488 self.assertEqual(retval, None)
489 for c in (self.word + self.otherword):
490 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000491 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000492 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000493 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000494 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
495 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000496 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000497 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000498 s = self.thetype('abcba')
499 self.assertEqual(s.intersection_update(C(p)), None)
500 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000501 ss = 'abcba'
502 s = self.thetype(ss)
503 t = 'cbc'
504 self.assertEqual(s.intersection_update(C(p), C(t)), None)
505 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000506
507 def test_iand(self):
508 self.s &= set(self.otherword)
509 for c in (self.word + self.otherword):
510 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000511 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000512 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000513 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000514
515 def test_difference_update(self):
516 retval = self.s.difference_update(self.otherword)
517 self.assertEqual(retval, None)
518 for c in (self.word + self.otherword):
519 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000520 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000521 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000522 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000523 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
524 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000525 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
526 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000527 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000528 s = self.thetype('abcba')
529 self.assertEqual(s.difference_update(C(p)), None)
530 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000531
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000532 s = self.thetype('abcdefghih')
533 s.difference_update()
534 self.assertEqual(s, self.thetype('abcdefghih'))
535
536 s = self.thetype('abcdefghih')
537 s.difference_update(C('aba'))
538 self.assertEqual(s, self.thetype('cdefghih'))
539
540 s = self.thetype('abcdefghih')
541 s.difference_update(C('cdc'), C('aba'))
542 self.assertEqual(s, self.thetype('efghih'))
543
Raymond Hettingera690a992003-11-16 16:17:49 +0000544 def test_isub(self):
545 self.s -= set(self.otherword)
546 for c in (self.word + self.otherword):
547 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000548 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000549 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000550 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000551
552 def test_symmetric_difference_update(self):
553 retval = self.s.symmetric_difference_update(self.otherword)
554 self.assertEqual(retval, None)
555 for c in (self.word + self.otherword):
556 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000557 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000558 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000559 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000560 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
561 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000562 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000563 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000564 s = self.thetype('abcba')
565 self.assertEqual(s.symmetric_difference_update(C(p)), None)
566 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000567
568 def test_ixor(self):
569 self.s ^= set(self.otherword)
570 for c in (self.word + self.otherword):
571 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000572 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000573 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000574 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000575
Raymond Hettingerc991db22005-08-11 07:58:45 +0000576 def test_inplace_on_self(self):
577 t = self.s.copy()
578 t |= t
579 self.assertEqual(t, self.s)
580 t &= t
581 self.assertEqual(t, self.s)
582 t -= t
583 self.assertEqual(t, self.thetype())
584 t = self.s.copy()
585 t ^= t
586 self.assertEqual(t, self.thetype())
587
Raymond Hettinger691d8052004-05-30 07:26:47 +0000588 def test_weakref(self):
589 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000590 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000591 self.assertEqual(str(p), str(s))
592 s = None
593 self.assertRaises(ReferenceError, str, p)
594
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000595 def test_rich_compare(self):
596 class TestRichSetCompare:
597 def __gt__(self, some_set):
598 self.gt_called = True
599 return False
600 def __lt__(self, some_set):
601 self.lt_called = True
602 return False
603 def __ge__(self, some_set):
604 self.ge_called = True
605 return False
606 def __le__(self, some_set):
607 self.le_called = True
608 return False
609
Ezio Melotti42da6632011-03-15 05:18:48 +0200610 # This first tries the builtin rich set comparison, which doesn't know
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000611 # how to handle the custom object. Upon returning NotImplemented, the
612 # corresponding comparison on the right object is invoked.
613 myset = {1, 2, 3}
614
615 myobj = TestRichSetCompare()
616 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000617 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000618
619 myobj = TestRichSetCompare()
620 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000621 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000622
623 myobj = TestRichSetCompare()
624 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000625 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000626
627 myobj = TestRichSetCompare()
628 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000629 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000630
Serhiy Storchaka43767632013-11-03 21:31:38 +0200631 @unittest.skipUnless(hasattr(set, "test_c_api"),
632 'C API test only available in a debug build')
633 def test_c_api(self):
634 self.assertEqual(set().test_c_api(), True)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000635
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000636class SetSubclass(set):
637 pass
638
639class TestSetSubclass(TestSet):
640 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000641 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000642
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000643class SetSubclassWithKeywordArgs(set):
644 def __init__(self, iterable=[], newarg=None):
645 set.__init__(self, iterable)
646
647class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000648
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000649 def test_keywords_in_subclass(self):
650 'SF bug #1486663 -- this used to erroneously raise a TypeError'
651 SetSubclassWithKeywordArgs(newarg=1)
652
Ezio Melottiab5ba792013-04-19 05:58:44 +0300653class TestFrozenSet(TestJointOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000654 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000655 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000656
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000657 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000658 s = self.thetype(self.word)
659 s.__init__(self.otherword)
660 self.assertEqual(s, set(self.word))
661
Raymond Hettingerd7946662005-08-01 21:39:29 +0000662 def test_singleton_empty_frozenset(self):
663 f = frozenset()
664 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
665 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000666 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000667 frozenset(f), f]
668 # All of the empty frozensets should have just one id()
669 self.assertEqual(len(set(map(id, efs))), 1)
670
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000671 def test_constructor_identity(self):
672 s = self.thetype(range(3))
673 t = self.thetype(s)
674 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000675
Raymond Hettingera690a992003-11-16 16:17:49 +0000676 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000677 self.assertEqual(hash(self.thetype('abcdeb')),
678 hash(self.thetype('ebecda')))
679
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000680 # make sure that all permutations give the same hash value
681 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000682 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000683 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000684 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000685 shuffle(seq)
686 results.add(hash(self.thetype(seq)))
687 self.assertEqual(len(results), 1)
688
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000689 def test_copy(self):
690 dup = self.s.copy()
691 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000692
693 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000694 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000695 key1 = self.thetype(seq)
696 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000697 self.assertEqual(key1, key2)
698 self.assertNotEqual(id(key1), id(key2))
699 d = {}
700 d[key1] = 42
701 self.assertEqual(d[key2], 42)
702
703 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000704 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000705 self.assertEqual(hash(f), hash(f))
706
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000707 def test_hash_effectiveness(self):
708 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000709 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000710 addhashvalue = hashvalues.add
711 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000712 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000713 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
714 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000715
Raymond Hettinger455b5092015-08-09 00:35:00 -0700716 def letter_range(n):
717 return string.ascii_letters[:n]
718
719 def zf_range(n):
720 # https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
721 nums = [frozenset()]
722 for i in range(n-1):
723 num = frozenset(nums)
724 nums.append(num)
725 return nums[:n]
726
727 def powerset(s):
728 for i in range(len(s)+1):
729 yield from map(frozenset, itertools.combinations(s, i))
730
731 for n in range(18):
732 t = 2 ** n
733 mask = t - 1
734 for nums in (range, letter_range, zf_range):
735 u = len({h & mask for h in map(hash, powerset(nums(n)))})
736 self.assertGreater(4*u, t)
737
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000738class FrozenSetSubclass(frozenset):
739 pass
740
741class TestFrozenSetSubclass(TestFrozenSet):
742 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000743 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000744
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000745 def test_constructor_identity(self):
746 s = self.thetype(range(3))
747 t = self.thetype(s)
748 self.assertNotEqual(id(s), id(t))
749
750 def test_copy(self):
751 dup = self.s.copy()
752 self.assertNotEqual(id(self.s), id(dup))
753
754 def test_nested_empty_constructor(self):
755 s = self.thetype()
756 t = self.thetype(s)
757 self.assertEqual(s, t)
758
Raymond Hettingerd7946662005-08-01 21:39:29 +0000759 def test_singleton_empty_frozenset(self):
760 Frozenset = self.thetype
761 f = frozenset()
762 F = Frozenset()
763 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
764 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000765 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000766 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
767 # All empty frozenset subclass instances should have different ids
768 self.assertEqual(len(set(map(id, efs))), len(efs))
769
Raymond Hettingera690a992003-11-16 16:17:49 +0000770# Tests taken from test_sets.py =============================================
771
772empty_set = set()
773
774#==============================================================================
775
Ezio Melottiab5ba792013-04-19 05:58:44 +0300776class TestBasicOps:
Raymond Hettingera690a992003-11-16 16:17:49 +0000777
778 def test_repr(self):
779 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000780 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000781
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100782 def check_repr_against_values(self):
783 text = repr(self.set)
784 self.assertTrue(text.startswith('{'))
785 self.assertTrue(text.endswith('}'))
786
787 result = text[1:-1].split(', ')
788 result.sort()
789 sorted_repr_values = [repr(value) for value in self.values]
790 sorted_repr_values.sort()
791 self.assertEqual(result, sorted_repr_values)
792
Raymond Hettingereae05de2004-07-09 04:51:24 +0000793 def test_print(self):
794 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000795 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000796 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000797 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000798 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000799 self.assertEqual(fo.read(), repr(self.set))
800 finally:
801 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000802 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000803
Raymond Hettingera690a992003-11-16 16:17:49 +0000804 def test_length(self):
805 self.assertEqual(len(self.set), self.length)
806
807 def test_self_equality(self):
808 self.assertEqual(self.set, self.set)
809
810 def test_equivalent_equality(self):
811 self.assertEqual(self.set, self.dup)
812
813 def test_copy(self):
814 self.assertEqual(self.set.copy(), self.dup)
815
816 def test_self_union(self):
817 result = self.set | self.set
818 self.assertEqual(result, self.dup)
819
820 def test_empty_union(self):
821 result = self.set | empty_set
822 self.assertEqual(result, self.dup)
823
824 def test_union_empty(self):
825 result = empty_set | self.set
826 self.assertEqual(result, self.dup)
827
828 def test_self_intersection(self):
829 result = self.set & self.set
830 self.assertEqual(result, self.dup)
831
832 def test_empty_intersection(self):
833 result = self.set & empty_set
834 self.assertEqual(result, empty_set)
835
836 def test_intersection_empty(self):
837 result = empty_set & self.set
838 self.assertEqual(result, empty_set)
839
Guido van Rossum58da9312007-11-10 23:39:45 +0000840 def test_self_isdisjoint(self):
841 result = self.set.isdisjoint(self.set)
842 self.assertEqual(result, not self.set)
843
844 def test_empty_isdisjoint(self):
845 result = self.set.isdisjoint(empty_set)
846 self.assertEqual(result, True)
847
848 def test_isdisjoint_empty(self):
849 result = empty_set.isdisjoint(self.set)
850 self.assertEqual(result, True)
851
Raymond Hettingera690a992003-11-16 16:17:49 +0000852 def test_self_symmetric_difference(self):
853 result = self.set ^ self.set
854 self.assertEqual(result, empty_set)
855
Georg Brandl33b6a312010-08-01 06:44:46 +0000856 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000857 result = self.set ^ empty_set
858 self.assertEqual(result, self.set)
859
860 def test_self_difference(self):
861 result = self.set - self.set
862 self.assertEqual(result, empty_set)
863
864 def test_empty_difference(self):
865 result = self.set - empty_set
866 self.assertEqual(result, self.dup)
867
868 def test_empty_difference_rev(self):
869 result = empty_set - self.set
870 self.assertEqual(result, empty_set)
871
872 def test_iteration(self):
873 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000874 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000875 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000876 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000877
878 def test_pickling(self):
Serhiy Storchakabad12572014-12-15 14:03:42 +0200879 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
880 p = pickle.dumps(self.set, proto)
881 copy = pickle.loads(p)
882 self.assertEqual(self.set, copy,
883 "%s != %s" % (self.set, copy))
Raymond Hettingera690a992003-11-16 16:17:49 +0000884
885#------------------------------------------------------------------------------
886
Ezio Melottiab5ba792013-04-19 05:58:44 +0300887class TestBasicOpsEmpty(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000888 def setUp(self):
889 self.case = "empty set"
890 self.values = []
891 self.set = set(self.values)
892 self.dup = set(self.values)
893 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000894 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000895
896#------------------------------------------------------------------------------
897
Ezio Melottiab5ba792013-04-19 05:58:44 +0300898class TestBasicOpsSingleton(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000899 def setUp(self):
900 self.case = "unit set (number)"
901 self.values = [3]
902 self.set = set(self.values)
903 self.dup = set(self.values)
904 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000905 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000906
907 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000908 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000909
910 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000911 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000912
913#------------------------------------------------------------------------------
914
Ezio Melottiab5ba792013-04-19 05:58:44 +0300915class TestBasicOpsTuple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000916 def setUp(self):
917 self.case = "unit set (tuple)"
918 self.values = [(0, "zero")]
919 self.set = set(self.values)
920 self.dup = set(self.values)
921 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000922 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000923
924 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000925 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000926
927 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000928 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000929
930#------------------------------------------------------------------------------
931
Ezio Melottiab5ba792013-04-19 05:58:44 +0300932class TestBasicOpsTriple(TestBasicOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +0000933 def setUp(self):
934 self.case = "triple set"
935 self.values = [0, "zero", operator.add]
936 self.set = set(self.values)
937 self.dup = set(self.values)
938 self.length = 3
939 self.repr = None
940
Christian Heimes0ded5b52007-12-10 15:50:56 +0000941#------------------------------------------------------------------------------
942
Ezio Melottiab5ba792013-04-19 05:58:44 +0300943class TestBasicOpsString(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000944 def setUp(self):
945 self.case = "string set"
946 self.values = ["a", "b", "c"]
947 self.set = set(self.values)
948 self.dup = set(self.values)
949 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100950
951 def test_repr(self):
952 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000953
954#------------------------------------------------------------------------------
955
Ezio Melottiab5ba792013-04-19 05:58:44 +0300956class TestBasicOpsBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000957 def setUp(self):
Philip Jenvey1226db42014-04-18 11:10:50 -0700958 self.case = "bytes set"
Christian Heimes0ded5b52007-12-10 15:50:56 +0000959 self.values = [b"a", b"b", b"c"]
960 self.set = set(self.values)
961 self.dup = set(self.values)
962 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100963
964 def test_repr(self):
965 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000966
967#------------------------------------------------------------------------------
968
Ezio Melottiab5ba792013-04-19 05:58:44 +0300969class TestBasicOpsMixedStringBytes(TestBasicOps, unittest.TestCase):
Christian Heimes0ded5b52007-12-10 15:50:56 +0000970 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000971 self._warning_filters = support.check_warnings()
972 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000973 warnings.simplefilter('ignore', BytesWarning)
974 self.case = "string and bytes set"
975 self.values = ["a", "b", b"a", b"b"]
976 self.set = set(self.values)
977 self.dup = set(self.values)
978 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000979
980 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000981 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000982
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100983 def test_repr(self):
984 self.check_repr_against_values()
985
Raymond Hettingera690a992003-11-16 16:17:49 +0000986#==============================================================================
987
988def baditer():
989 raise TypeError
990 yield True
991
992def gooditer():
993 yield True
994
995class TestExceptionPropagation(unittest.TestCase):
996 """SF 628246: Set constructor should not trap iterator TypeErrors"""
997
998 def test_instanceWithException(self):
999 self.assertRaises(TypeError, set, baditer())
1000
1001 def test_instancesWithoutException(self):
1002 # All of these iterables should load without exception.
1003 set([1,2,3])
1004 set((1,2,3))
1005 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +00001006 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +00001007 set('abc')
1008 set(gooditer())
1009
Neal Norwitzfcf44352005-11-27 20:37:43 +00001010 def test_changingSizeWhileIterating(self):
1011 s = set([1,2,3])
1012 try:
1013 for i in s:
1014 s.update([4])
1015 except RuntimeError:
1016 pass
1017 else:
1018 self.fail("no exception when changing size during iteration")
1019
Raymond Hettingera690a992003-11-16 16:17:49 +00001020#==============================================================================
1021
1022class TestSetOfSets(unittest.TestCase):
1023 def test_constructor(self):
1024 inner = frozenset([1])
1025 outer = set([inner])
1026 element = outer.pop()
1027 self.assertEqual(type(element), frozenset)
1028 outer.add(inner) # Rebuild set of sets with .add method
1029 outer.remove(inner)
1030 self.assertEqual(outer, set()) # Verify that remove worked
1031 outer.discard(inner) # Absence of KeyError indicates working fine
1032
1033#==============================================================================
1034
1035class TestBinaryOps(unittest.TestCase):
1036 def setUp(self):
1037 self.set = set((2, 4, 6))
1038
1039 def test_eq(self): # SF bug 643115
1040 self.assertEqual(self.set, set({2:1,4:3,6:5}))
1041
1042 def test_union_subset(self):
1043 result = self.set | set([2])
1044 self.assertEqual(result, set((2, 4, 6)))
1045
1046 def test_union_superset(self):
1047 result = self.set | set([2, 4, 6, 8])
1048 self.assertEqual(result, set([2, 4, 6, 8]))
1049
1050 def test_union_overlap(self):
1051 result = self.set | set([3, 4, 5])
1052 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1053
1054 def test_union_non_overlap(self):
1055 result = self.set | set([8])
1056 self.assertEqual(result, set([2, 4, 6, 8]))
1057
1058 def test_intersection_subset(self):
1059 result = self.set & set((2, 4))
1060 self.assertEqual(result, set((2, 4)))
1061
1062 def test_intersection_superset(self):
1063 result = self.set & set([2, 4, 6, 8])
1064 self.assertEqual(result, set([2, 4, 6]))
1065
1066 def test_intersection_overlap(self):
1067 result = self.set & set([3, 4, 5])
1068 self.assertEqual(result, set([4]))
1069
1070 def test_intersection_non_overlap(self):
1071 result = self.set & set([8])
1072 self.assertEqual(result, empty_set)
1073
Guido van Rossum58da9312007-11-10 23:39:45 +00001074 def test_isdisjoint_subset(self):
1075 result = self.set.isdisjoint(set((2, 4)))
1076 self.assertEqual(result, False)
1077
1078 def test_isdisjoint_superset(self):
1079 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1080 self.assertEqual(result, False)
1081
1082 def test_isdisjoint_overlap(self):
1083 result = self.set.isdisjoint(set([3, 4, 5]))
1084 self.assertEqual(result, False)
1085
1086 def test_isdisjoint_non_overlap(self):
1087 result = self.set.isdisjoint(set([8]))
1088 self.assertEqual(result, True)
1089
Raymond Hettingera690a992003-11-16 16:17:49 +00001090 def test_sym_difference_subset(self):
1091 result = self.set ^ set((2, 4))
1092 self.assertEqual(result, set([6]))
1093
1094 def test_sym_difference_superset(self):
1095 result = self.set ^ set((2, 4, 6, 8))
1096 self.assertEqual(result, set([8]))
1097
1098 def test_sym_difference_overlap(self):
1099 result = self.set ^ set((3, 4, 5))
1100 self.assertEqual(result, set([2, 3, 5, 6]))
1101
1102 def test_sym_difference_non_overlap(self):
1103 result = self.set ^ set([8])
1104 self.assertEqual(result, set([2, 4, 6, 8]))
1105
Raymond Hettingera690a992003-11-16 16:17:49 +00001106#==============================================================================
1107
1108class TestUpdateOps(unittest.TestCase):
1109 def setUp(self):
1110 self.set = set((2, 4, 6))
1111
1112 def test_union_subset(self):
1113 self.set |= set([2])
1114 self.assertEqual(self.set, set((2, 4, 6)))
1115
1116 def test_union_superset(self):
1117 self.set |= set([2, 4, 6, 8])
1118 self.assertEqual(self.set, set([2, 4, 6, 8]))
1119
1120 def test_union_overlap(self):
1121 self.set |= set([3, 4, 5])
1122 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1123
1124 def test_union_non_overlap(self):
1125 self.set |= set([8])
1126 self.assertEqual(self.set, set([2, 4, 6, 8]))
1127
1128 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001129 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001130 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1131
1132 def test_intersection_subset(self):
1133 self.set &= set((2, 4))
1134 self.assertEqual(self.set, set((2, 4)))
1135
1136 def test_intersection_superset(self):
1137 self.set &= set([2, 4, 6, 8])
1138 self.assertEqual(self.set, set([2, 4, 6]))
1139
1140 def test_intersection_overlap(self):
1141 self.set &= set([3, 4, 5])
1142 self.assertEqual(self.set, set([4]))
1143
1144 def test_intersection_non_overlap(self):
1145 self.set &= set([8])
1146 self.assertEqual(self.set, empty_set)
1147
1148 def test_intersection_method_call(self):
1149 self.set.intersection_update(set([3, 4, 5]))
1150 self.assertEqual(self.set, set([4]))
1151
1152 def test_sym_difference_subset(self):
1153 self.set ^= set((2, 4))
1154 self.assertEqual(self.set, set([6]))
1155
1156 def test_sym_difference_superset(self):
1157 self.set ^= set((2, 4, 6, 8))
1158 self.assertEqual(self.set, set([8]))
1159
1160 def test_sym_difference_overlap(self):
1161 self.set ^= set((3, 4, 5))
1162 self.assertEqual(self.set, set([2, 3, 5, 6]))
1163
1164 def test_sym_difference_non_overlap(self):
1165 self.set ^= set([8])
1166 self.assertEqual(self.set, set([2, 4, 6, 8]))
1167
1168 def test_sym_difference_method_call(self):
1169 self.set.symmetric_difference_update(set([3, 4, 5]))
1170 self.assertEqual(self.set, set([2, 3, 5, 6]))
1171
1172 def test_difference_subset(self):
1173 self.set -= set((2, 4))
1174 self.assertEqual(self.set, set([6]))
1175
1176 def test_difference_superset(self):
1177 self.set -= set((2, 4, 6, 8))
1178 self.assertEqual(self.set, set([]))
1179
1180 def test_difference_overlap(self):
1181 self.set -= set((3, 4, 5))
1182 self.assertEqual(self.set, set([2, 6]))
1183
1184 def test_difference_non_overlap(self):
1185 self.set -= set([8])
1186 self.assertEqual(self.set, set([2, 4, 6]))
1187
1188 def test_difference_method_call(self):
1189 self.set.difference_update(set([3, 4, 5]))
1190 self.assertEqual(self.set, set([2, 6]))
1191
1192#==============================================================================
1193
1194class TestMutate(unittest.TestCase):
1195 def setUp(self):
1196 self.values = ["a", "b", "c"]
1197 self.set = set(self.values)
1198
1199 def test_add_present(self):
1200 self.set.add("c")
1201 self.assertEqual(self.set, set("abc"))
1202
1203 def test_add_absent(self):
1204 self.set.add("d")
1205 self.assertEqual(self.set, set("abcd"))
1206
1207 def test_add_until_full(self):
1208 tmp = set()
1209 expected_len = 0
1210 for v in self.values:
1211 tmp.add(v)
1212 expected_len += 1
1213 self.assertEqual(len(tmp), expected_len)
1214 self.assertEqual(tmp, self.set)
1215
1216 def test_remove_present(self):
1217 self.set.remove("b")
1218 self.assertEqual(self.set, set("ac"))
1219
1220 def test_remove_absent(self):
1221 try:
1222 self.set.remove("d")
1223 self.fail("Removing missing element should have raised LookupError")
1224 except LookupError:
1225 pass
1226
1227 def test_remove_until_empty(self):
1228 expected_len = len(self.set)
1229 for v in self.values:
1230 self.set.remove(v)
1231 expected_len -= 1
1232 self.assertEqual(len(self.set), expected_len)
1233
1234 def test_discard_present(self):
1235 self.set.discard("c")
1236 self.assertEqual(self.set, set("ab"))
1237
1238 def test_discard_absent(self):
1239 self.set.discard("d")
1240 self.assertEqual(self.set, set("abc"))
1241
1242 def test_clear(self):
1243 self.set.clear()
1244 self.assertEqual(len(self.set), 0)
1245
1246 def test_pop(self):
1247 popped = {}
1248 while self.set:
1249 popped[self.set.pop()] = None
1250 self.assertEqual(len(popped), len(self.values))
1251 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001252 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001253
1254 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001255 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001256 self.assertEqual(self.set, set(self.values))
1257
1258 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001259 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001260 self.assertEqual(self.set, set(self.values))
1261
1262 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001263 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001264 self.assertEqual(self.set, set(self.values + ["z"]))
1265
1266#==============================================================================
1267
Ezio Melottiab5ba792013-04-19 05:58:44 +03001268class TestSubsets:
Raymond Hettingera690a992003-11-16 16:17:49 +00001269
1270 case2method = {"<=": "issubset",
1271 ">=": "issuperset",
1272 }
1273
1274 reverse = {"==": "==",
1275 "!=": "!=",
1276 "<": ">",
1277 ">": "<",
1278 "<=": ">=",
1279 ">=": "<=",
1280 }
1281
1282 def test_issubset(self):
1283 x = self.left
1284 y = self.right
1285 for case in "!=", "==", "<", "<=", ">", ">=":
1286 expected = case in self.cases
1287 # Test the binary infix spelling.
1288 result = eval("x" + case + "y", locals())
1289 self.assertEqual(result, expected)
1290 # Test the "friendly" method-name spelling, if one exists.
1291 if case in TestSubsets.case2method:
1292 method = getattr(x, TestSubsets.case2method[case])
1293 result = method(y)
1294 self.assertEqual(result, expected)
1295
1296 # Now do the same for the operands reversed.
1297 rcase = TestSubsets.reverse[case]
1298 result = eval("y" + rcase + "x", locals())
1299 self.assertEqual(result, expected)
1300 if rcase in TestSubsets.case2method:
1301 method = getattr(y, TestSubsets.case2method[rcase])
1302 result = method(x)
1303 self.assertEqual(result, expected)
1304#------------------------------------------------------------------------------
1305
Ezio Melottiab5ba792013-04-19 05:58:44 +03001306class TestSubsetEqualEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001307 left = set()
1308 right = set()
1309 name = "both empty"
1310 cases = "==", "<=", ">="
1311
1312#------------------------------------------------------------------------------
1313
Ezio Melottiab5ba792013-04-19 05:58:44 +03001314class TestSubsetEqualNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001315 left = set([1, 2])
1316 right = set([1, 2])
1317 name = "equal pair"
1318 cases = "==", "<=", ">="
1319
1320#------------------------------------------------------------------------------
1321
Ezio Melottiab5ba792013-04-19 05:58:44 +03001322class TestSubsetEmptyNonEmpty(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001323 left = set()
1324 right = set([1, 2])
1325 name = "one empty, one non-empty"
1326 cases = "!=", "<", "<="
1327
1328#------------------------------------------------------------------------------
1329
Ezio Melottiab5ba792013-04-19 05:58:44 +03001330class TestSubsetPartial(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001331 left = set([1])
1332 right = set([1, 2])
1333 name = "one a non-empty proper subset of other"
1334 cases = "!=", "<", "<="
1335
1336#------------------------------------------------------------------------------
1337
Ezio Melottiab5ba792013-04-19 05:58:44 +03001338class TestSubsetNonOverlap(TestSubsets, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001339 left = set([1])
1340 right = set([2])
1341 name = "neither empty, neither contains"
1342 cases = "!="
1343
1344#==============================================================================
1345
Ezio Melottiab5ba792013-04-19 05:58:44 +03001346class TestOnlySetsInBinaryOps:
Raymond Hettingera690a992003-11-16 16:17:49 +00001347
1348 def test_eq_ne(self):
1349 # Unlike the others, this is testing that == and != *are* allowed.
1350 self.assertEqual(self.other == self.set, False)
1351 self.assertEqual(self.set == self.other, False)
1352 self.assertEqual(self.other != self.set, True)
1353 self.assertEqual(self.set != self.other, True)
1354
1355 def test_ge_gt_le_lt(self):
1356 self.assertRaises(TypeError, lambda: self.set < self.other)
1357 self.assertRaises(TypeError, lambda: self.set <= self.other)
1358 self.assertRaises(TypeError, lambda: self.set > self.other)
1359 self.assertRaises(TypeError, lambda: self.set >= self.other)
1360
1361 self.assertRaises(TypeError, lambda: self.other < self.set)
1362 self.assertRaises(TypeError, lambda: self.other <= self.set)
1363 self.assertRaises(TypeError, lambda: self.other > self.set)
1364 self.assertRaises(TypeError, lambda: self.other >= self.set)
1365
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001366 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001367 try:
1368 self.set |= self.other
1369 except TypeError:
1370 pass
1371 else:
1372 self.fail("expected TypeError")
1373
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001374 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001375 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001376 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001377 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001378 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001379
1380 def test_union(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.union(self.other)
1385 else:
1386 self.assertRaises(TypeError, self.set.union, self.other)
1387
1388 def test_intersection_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_intersection_update(self):
1397 if self.otherIsIterable:
1398 self.set.intersection_update(self.other)
1399 else:
1400 self.assertRaises(TypeError,
1401 self.set.intersection_update,
1402 self.other)
1403
1404 def test_intersection(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.intersection(self.other)
1409 else:
1410 self.assertRaises(TypeError, self.set.intersection, self.other)
1411
1412 def test_sym_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_sym_difference_update(self):
1421 if self.otherIsIterable:
1422 self.set.symmetric_difference_update(self.other)
1423 else:
1424 self.assertRaises(TypeError,
1425 self.set.symmetric_difference_update,
1426 self.other)
1427
1428 def test_sym_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.symmetric_difference(self.other)
1433 else:
1434 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1435
1436 def test_difference_update_operator(self):
1437 try:
1438 self.set -= self.other
1439 except TypeError:
1440 pass
1441 else:
1442 self.fail("expected TypeError")
1443
1444 def test_difference_update(self):
1445 if self.otherIsIterable:
1446 self.set.difference_update(self.other)
1447 else:
1448 self.assertRaises(TypeError,
1449 self.set.difference_update,
1450 self.other)
1451
1452 def test_difference(self):
1453 self.assertRaises(TypeError, lambda: self.set - self.other)
1454 self.assertRaises(TypeError, lambda: self.other - self.set)
1455 if self.otherIsIterable:
1456 self.set.difference(self.other)
1457 else:
1458 self.assertRaises(TypeError, self.set.difference, self.other)
1459
1460#------------------------------------------------------------------------------
1461
Ezio Melottiab5ba792013-04-19 05:58:44 +03001462class TestOnlySetsNumeric(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001463 def setUp(self):
1464 self.set = set((1, 2, 3))
1465 self.other = 19
1466 self.otherIsIterable = False
1467
1468#------------------------------------------------------------------------------
1469
Ezio Melottiab5ba792013-04-19 05:58:44 +03001470class TestOnlySetsDict(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001471 def setUp(self):
1472 self.set = set((1, 2, 3))
1473 self.other = {1:2, 3:4}
1474 self.otherIsIterable = True
1475
1476#------------------------------------------------------------------------------
1477
Ezio Melottiab5ba792013-04-19 05:58:44 +03001478class TestOnlySetsOperator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001479 def setUp(self):
1480 self.set = set((1, 2, 3))
1481 self.other = operator.add
1482 self.otherIsIterable = False
1483
1484#------------------------------------------------------------------------------
1485
Ezio Melottiab5ba792013-04-19 05:58:44 +03001486class TestOnlySetsTuple(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001487 def setUp(self):
1488 self.set = set((1, 2, 3))
1489 self.other = (2, 4, 6)
1490 self.otherIsIterable = True
1491
1492#------------------------------------------------------------------------------
1493
Ezio Melottiab5ba792013-04-19 05:58:44 +03001494class TestOnlySetsString(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001495 def setUp(self):
1496 self.set = set((1, 2, 3))
1497 self.other = 'abc'
1498 self.otherIsIterable = True
1499
1500#------------------------------------------------------------------------------
1501
Ezio Melottiab5ba792013-04-19 05:58:44 +03001502class TestOnlySetsGenerator(TestOnlySetsInBinaryOps, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001503 def setUp(self):
1504 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001505 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001506 yield i
1507 self.set = set((1, 2, 3))
1508 self.other = gen()
1509 self.otherIsIterable = True
1510
1511#==============================================================================
1512
Ezio Melottiab5ba792013-04-19 05:58:44 +03001513class TestCopying:
Raymond Hettingera690a992003-11-16 16:17:49 +00001514
1515 def test_copy(self):
1516 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001517 dup_list = sorted(dup, key=repr)
1518 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001519 self.assertEqual(len(dup_list), len(set_list))
1520 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001521 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001522
1523 def test_deep_copy(self):
1524 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001525 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001526 dup_list = sorted(dup, key=repr)
1527 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001528 self.assertEqual(len(dup_list), len(set_list))
1529 for i in range(len(dup_list)):
1530 self.assertEqual(dup_list[i], set_list[i])
1531
1532#------------------------------------------------------------------------------
1533
Ezio Melottiab5ba792013-04-19 05:58:44 +03001534class TestCopyingEmpty(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001535 def setUp(self):
1536 self.set = set()
1537
1538#------------------------------------------------------------------------------
1539
Ezio Melottiab5ba792013-04-19 05:58:44 +03001540class TestCopyingSingleton(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001541 def setUp(self):
1542 self.set = set(["hello"])
1543
1544#------------------------------------------------------------------------------
1545
Ezio Melottiab5ba792013-04-19 05:58:44 +03001546class TestCopyingTriple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001547 def setUp(self):
1548 self.set = set(["zero", 0, None])
1549
1550#------------------------------------------------------------------------------
1551
Ezio Melottiab5ba792013-04-19 05:58:44 +03001552class TestCopyingTuple(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001553 def setUp(self):
1554 self.set = set([(1, 2)])
1555
1556#------------------------------------------------------------------------------
1557
Ezio Melottiab5ba792013-04-19 05:58:44 +03001558class TestCopyingNested(TestCopying, unittest.TestCase):
Raymond Hettingera690a992003-11-16 16:17:49 +00001559 def setUp(self):
1560 self.set = set([((1, 2), (3, 4))])
1561
1562#==============================================================================
1563
1564class TestIdentities(unittest.TestCase):
1565 def setUp(self):
1566 self.a = set('abracadabra')
1567 self.b = set('alacazam')
1568
1569 def test_binopsVsSubsets(self):
1570 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001571 self.assertTrue(a - b < a)
1572 self.assertTrue(b - a < b)
1573 self.assertTrue(a & b < a)
1574 self.assertTrue(a & b < b)
1575 self.assertTrue(a | b > a)
1576 self.assertTrue(a | b > b)
1577 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001578
1579 def test_commutativity(self):
1580 a, b = self.a, self.b
1581 self.assertEqual(a&b, b&a)
1582 self.assertEqual(a|b, b|a)
1583 self.assertEqual(a^b, b^a)
1584 if a != b:
1585 self.assertNotEqual(a-b, b-a)
1586
1587 def test_summations(self):
1588 # check that sums of parts equal the whole
1589 a, b = self.a, self.b
1590 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1591 self.assertEqual((a&b)|(a^b), a|b)
1592 self.assertEqual(a|(b-a), a|b)
1593 self.assertEqual((a-b)|b, a|b)
1594 self.assertEqual((a-b)|(a&b), a)
1595 self.assertEqual((b-a)|(a&b), b)
1596 self.assertEqual((a-b)|(b-a), a^b)
1597
1598 def test_exclusion(self):
1599 # check that inverse operations show non-overlap
1600 a, b, zero = self.a, self.b, set()
1601 self.assertEqual((a-b)&b, zero)
1602 self.assertEqual((b-a)&a, zero)
1603 self.assertEqual((a&b)&(a^b), zero)
1604
1605# Tests derived from test_itertools.py =======================================
1606
1607def R(seqn):
1608 'Regular generator'
1609 for i in seqn:
1610 yield i
1611
1612class G:
1613 'Sequence using __getitem__'
1614 def __init__(self, seqn):
1615 self.seqn = seqn
1616 def __getitem__(self, i):
1617 return self.seqn[i]
1618
1619class I:
1620 'Sequence using iterator protocol'
1621 def __init__(self, seqn):
1622 self.seqn = seqn
1623 self.i = 0
1624 def __iter__(self):
1625 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001626 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001627 if self.i >= len(self.seqn): raise StopIteration
1628 v = self.seqn[self.i]
1629 self.i += 1
1630 return v
1631
1632class Ig:
1633 'Sequence using iterator protocol defined with a generator'
1634 def __init__(self, seqn):
1635 self.seqn = seqn
1636 self.i = 0
1637 def __iter__(self):
1638 for val in self.seqn:
1639 yield val
1640
1641class X:
1642 'Missing __getitem__ and __iter__'
1643 def __init__(self, seqn):
1644 self.seqn = seqn
1645 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001646 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001647 if self.i >= len(self.seqn): raise StopIteration
1648 v = self.seqn[self.i]
1649 self.i += 1
1650 return v
1651
1652class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001653 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001654 def __init__(self, seqn):
1655 self.seqn = seqn
1656 self.i = 0
1657 def __iter__(self):
1658 return self
1659
1660class E:
1661 'Test propagation of exceptions'
1662 def __init__(self, seqn):
1663 self.seqn = seqn
1664 self.i = 0
1665 def __iter__(self):
1666 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001667 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001668 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001669
1670class S:
1671 'Test immediate stop'
1672 def __init__(self, seqn):
1673 pass
1674 def __iter__(self):
1675 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001676 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001677 raise StopIteration
1678
Raymond Hettingera6c60372008-03-13 01:26:19 +00001679from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001680def L(seqn):
1681 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001682 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001683
1684class TestVariousIteratorArgs(unittest.TestCase):
1685
1686 def test_constructor(self):
1687 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001688 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001689 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001690 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001691 self.assertRaises(TypeError, cons , X(s))
1692 self.assertRaises(TypeError, cons , N(s))
1693 self.assertRaises(ZeroDivisionError, cons , E(s))
1694
1695 def test_inline_methods(self):
1696 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001697 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001698 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001699 for g in (G, I, Ig, L, R):
1700 expected = meth(data)
Tim Peters23d7d4e2013-09-06 15:41:30 -05001701 actual = meth(g(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001702 if isinstance(expected, bool):
1703 self.assertEqual(actual, expected)
1704 else:
1705 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001706 self.assertRaises(TypeError, meth, X(s))
1707 self.assertRaises(TypeError, meth, N(s))
1708 self.assertRaises(ZeroDivisionError, meth, E(s))
1709
1710 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001711 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001712 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001713 'difference_update', 'symmetric_difference_update'):
1714 for g in (G, I, Ig, S, L, R):
1715 s = set('january')
1716 t = s.copy()
1717 getattr(s, methname)(list(g(data)))
1718 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001719 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001720
1721 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1722 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1723 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1724
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001725class bad_eq:
1726 def __eq__(self, other):
1727 if be_bad:
1728 set2.clear()
1729 raise ZeroDivisionError
1730 return self is other
1731 def __hash__(self):
1732 return 0
1733
1734class bad_dict_clear:
1735 def __eq__(self, other):
1736 if be_bad:
1737 dict2.clear()
1738 return self is other
1739 def __hash__(self):
1740 return 0
1741
Éric Araujo23eae862010-09-05 18:43:07 +00001742class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001743 def test_8420_set_merge(self):
1744 # This used to segfault
1745 global be_bad, set2, dict2
1746 be_bad = False
1747 set1 = {bad_eq()}
1748 set2 = {bad_eq() for i in range(75)}
1749 be_bad = True
1750 self.assertRaises(ZeroDivisionError, set1.update, set2)
1751
1752 be_bad = False
1753 set1 = {bad_dict_clear()}
1754 dict2 = {bad_dict_clear(): None}
1755 be_bad = True
1756 set1.symmetric_difference_update(dict2)
1757
Serhiy Storchakaaf320b32015-07-08 22:58:55 +03001758 def test_iter_and_mutate(self):
1759 # Issue #24581
1760 s = set(range(100))
1761 s.clear()
1762 s.update(range(100))
1763 si = iter(s)
1764 s.clear()
1765 a = list(range(100))
1766 s.update(range(100))
1767 list(si)
1768
Raymond Hettingera3626bc2015-07-15 23:50:14 -07001769 def test_merge_and_mutate(self):
1770 class X:
1771 def __hash__(self):
1772 return hash(0)
1773 def __eq__(self, o):
1774 other.clear()
1775 return False
1776
1777 other = set()
1778 other = {X() for i in range(10)}
1779 s = {0}
1780 s.update(other)
1781
Christian Heimes969fe572008-01-25 11:23:10 +00001782# Application tests (based on David Eppstein's graph recipes ====================================
1783
1784def powerset(U):
1785 """Generates all subsets of a set or sequence U."""
1786 U = iter(U)
1787 try:
1788 x = frozenset([next(U)])
1789 for S in powerset(U):
1790 yield S
1791 yield S | x
1792 except StopIteration:
1793 yield frozenset()
1794
1795def cube(n):
1796 """Graph of n-dimensional hypercube."""
1797 singletons = [frozenset([x]) for x in range(n)]
1798 return dict([(x, frozenset([x^s for s in singletons]))
1799 for x in powerset(range(n))])
1800
1801def linegraph(G):
1802 """Graph, the vertices of which are edges of G,
1803 with two vertices being adjacent iff the corresponding
1804 edges share a vertex."""
1805 L = {}
1806 for x in G:
1807 for y in G[x]:
1808 nx = [frozenset([x,z]) for z in G[x] if z != y]
1809 ny = [frozenset([y,z]) for z in G[y] if z != x]
1810 L[frozenset([x,y])] = frozenset(nx+ny)
1811 return L
1812
1813def faces(G):
1814 'Return a set of faces in G. Where a face is a set of vertices on that face'
1815 # currently limited to triangles,squares, and pentagons
1816 f = set()
1817 for v1, edges in G.items():
1818 for v2 in edges:
1819 for v3 in G[v2]:
1820 if v1 == v3:
1821 continue
1822 if v1 in G[v3]:
1823 f.add(frozenset([v1, v2, v3]))
1824 else:
1825 for v4 in G[v3]:
1826 if v4 == v2:
1827 continue
1828 if v1 in G[v4]:
1829 f.add(frozenset([v1, v2, v3, v4]))
1830 else:
1831 for v5 in G[v4]:
1832 if v5 == v3 or v5 == v2:
1833 continue
1834 if v1 in G[v5]:
1835 f.add(frozenset([v1, v2, v3, v4, v5]))
1836 return f
1837
1838
1839class TestGraphs(unittest.TestCase):
1840
1841 def test_cube(self):
1842
1843 g = cube(3) # vert --> {v1, v2, v3}
1844 vertices1 = set(g)
1845 self.assertEqual(len(vertices1), 8) # eight vertices
1846 for edge in g.values():
1847 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1848 vertices2 = set(v for edges in g.values() for v in edges)
1849 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1850
1851 cubefaces = faces(g)
1852 self.assertEqual(len(cubefaces), 6) # six faces
1853 for face in cubefaces:
1854 self.assertEqual(len(face), 4) # each face is a square
1855
1856 def test_cuboctahedron(self):
1857
1858 # http://en.wikipedia.org/wiki/Cuboctahedron
1859 # 8 triangular faces and 6 square faces
1860 # 12 indentical vertices each connecting a triangle and square
1861
1862 g = cube(3)
1863 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1864 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1865
1866 vertices = set(cuboctahedron)
1867 for edges in cuboctahedron.values():
1868 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1869 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1870 self.assertEqual(vertices, othervertices) # edge vertices in original set
1871
1872 cubofaces = faces(cuboctahedron)
1873 facesizes = collections.defaultdict(int)
1874 for face in cubofaces:
1875 facesizes[len(face)] += 1
1876 self.assertEqual(facesizes[3], 8) # eight triangular faces
1877 self.assertEqual(facesizes[4], 6) # six square faces
1878
1879 for vertex in cuboctahedron:
1880 edge = vertex # Cuboctahedron vertices are edges in Cube
1881 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1882 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001883 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001884
1885
Raymond Hettingera690a992003-11-16 16:17:49 +00001886#==============================================================================
1887
Raymond Hettingera690a992003-11-16 16:17:49 +00001888if __name__ == "__main__":
Ezio Melottiab5ba792013-04-19 05:58:44 +03001889 unittest.main()