blob: 6642440deae83dc4f8c02bcc18f0dbca184df26f [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
Raymond Hettingera690a992003-11-16 16:17:49 +000012
13class PassThru(Exception):
14 pass
15
16def check_pass_thru():
17 raise PassThru
18 yield 1
19
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000020class BadCmp:
21 def __hash__(self):
22 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000023 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000024 raise RuntimeError
25
Thomas Wouters902d6eb2007-01-09 23:18:33 +000026class ReprWrapper:
27 'Used to test self-referential repr() calls'
28 def __repr__(self):
29 return repr(self.value)
30
Thomas Wouterscf297e42007-02-23 15:07:44 +000031class HashCountingInt(int):
32 'int-like object that counts the number of times __hash__ is called'
33 def __init__(self, *args):
34 self.hash_count = 0
35 def __hash__(self):
36 self.hash_count += 1
37 return int.__hash__(self)
38
Raymond Hettingera690a992003-11-16 16:17:49 +000039class TestJointOps(unittest.TestCase):
40 # Tests common to both set and frozenset
41
42 def setUp(self):
43 self.word = word = 'simsalabim'
44 self.otherword = 'madagascar'
45 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
46 self.s = self.thetype(word)
47 self.d = dict.fromkeys(word)
48
Raymond Hettinger6429a472004-09-28 01:51:35 +000049 def test_new_or_init(self):
50 self.assertRaises(TypeError, self.thetype, [], 2)
Raymond Hettinger3fb156c2010-04-18 23:05:22 +000051 self.assertRaises(TypeError, set().__init__, a=1)
Raymond Hettinger6429a472004-09-28 01:51:35 +000052
Raymond Hettingera690a992003-11-16 16:17:49 +000053 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000054 actual = sorted(self.s)
55 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000056 self.assertEqual(actual, expected)
57 self.assertRaises(PassThru, self.thetype, check_pass_thru())
58 self.assertRaises(TypeError, self.thetype, [[]])
59
60 def test_len(self):
61 self.assertEqual(len(self.s), len(self.d))
62
63 def test_contains(self):
64 for c in self.letters:
65 self.assertEqual(c in self.s, c in self.d)
66 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000067 s = self.thetype([frozenset(self.letters)])
Benjamin Peterson577473f2010-01-19 00:09:57 +000068 self.assertIn(self.thetype(self.letters), s)
Raymond Hettingera690a992003-11-16 16:17:49 +000069
Raymond Hettingera690a992003-11-16 16:17:49 +000070 def test_union(self):
71 u = self.s.union(self.otherword)
72 for c in self.letters:
73 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000074 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +000075 self.assertEqual(type(u), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +000076 self.assertRaises(PassThru, self.s.union, check_pass_thru())
77 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000078 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000079 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
80 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
81 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
82 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000083 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000084
Raymond Hettingere805ecc2009-07-27 20:16:37 +000085 # Issue #6573
86 x = self.thetype()
87 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
88
Raymond Hettingera690a992003-11-16 16:17:49 +000089 def test_or(self):
90 i = self.s.union(self.otherword)
91 self.assertEqual(self.s | set(self.otherword), i)
92 self.assertEqual(self.s | frozenset(self.otherword), i)
93 try:
94 self.s | self.otherword
95 except TypeError:
96 pass
97 else:
98 self.fail("s|t did not screen-out general iterables")
99
100 def test_intersection(self):
101 i = self.s.intersection(self.otherword)
102 for c in self.letters:
103 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000104 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000105 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000106 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000107 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000108 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
109 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
110 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
111 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000112 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000113 s = self.thetype('abcba')
114 z = s.intersection()
115 if self.thetype == frozenset():
116 self.assertEqual(id(s), id(z))
117 else:
118 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000119
Guido van Rossum58da9312007-11-10 23:39:45 +0000120 def test_isdisjoint(self):
121 def f(s1, s2):
122 'Pure python equivalent of isdisjoint()'
123 return not set(s1).intersection(s2)
124 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
125 s1 = self.thetype(larg)
126 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
127 for C in set, frozenset, dict.fromkeys, str, list, tuple:
128 s2 = C(rarg)
129 actual = s1.isdisjoint(s2)
130 expected = f(s1, s2)
131 self.assertEqual(actual, expected)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000132 self.assertTrue(actual is True or actual is False)
Guido van Rossum58da9312007-11-10 23:39:45 +0000133
Raymond Hettingera690a992003-11-16 16:17:49 +0000134 def test_and(self):
135 i = self.s.intersection(self.otherword)
136 self.assertEqual(self.s & set(self.otherword), i)
137 self.assertEqual(self.s & frozenset(self.otherword), i)
138 try:
139 self.s & self.otherword
140 except TypeError:
141 pass
142 else:
143 self.fail("s&t did not screen-out general iterables")
144
145 def test_difference(self):
146 i = self.s.difference(self.otherword)
147 for c in self.letters:
148 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000149 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000150 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000151 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
152 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000153 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000154 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
155 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
156 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
157 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000158 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
159 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000160
161 def test_sub(self):
162 i = self.s.difference(self.otherword)
163 self.assertEqual(self.s - set(self.otherword), i)
164 self.assertEqual(self.s - frozenset(self.otherword), i)
165 try:
166 self.s - self.otherword
167 except TypeError:
168 pass
169 else:
170 self.fail("s-t did not screen-out general iterables")
171
172 def test_symmetric_difference(self):
173 i = self.s.symmetric_difference(self.otherword)
174 for c in self.letters:
175 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000176 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000177 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000178 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
179 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000180 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000181 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
182 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
183 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
184 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000185
186 def test_xor(self):
187 i = self.s.symmetric_difference(self.otherword)
188 self.assertEqual(self.s ^ set(self.otherword), i)
189 self.assertEqual(self.s ^ frozenset(self.otherword), i)
190 try:
191 self.s ^ self.otherword
192 except TypeError:
193 pass
194 else:
195 self.fail("s^t did not screen-out general iterables")
196
197 def test_equality(self):
198 self.assertEqual(self.s, set(self.word))
199 self.assertEqual(self.s, frozenset(self.word))
200 self.assertEqual(self.s == self.word, False)
201 self.assertNotEqual(self.s, set(self.otherword))
202 self.assertNotEqual(self.s, frozenset(self.otherword))
203 self.assertEqual(self.s != self.word, True)
204
205 def test_setOfFrozensets(self):
206 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
207 s = self.thetype(t)
208 self.assertEqual(len(s), 3)
209
Raymond Hettingera690a992003-11-16 16:17:49 +0000210 def test_sub_and_super(self):
211 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000212 self.assertTrue(p < q)
213 self.assertTrue(p <= q)
214 self.assertTrue(q <= q)
215 self.assertTrue(q > p)
216 self.assertTrue(q >= p)
217 self.assertFalse(q < r)
218 self.assertFalse(q <= r)
219 self.assertFalse(q > r)
220 self.assertFalse(q >= r)
221 self.assertTrue(set('a').issubset('abc'))
222 self.assertTrue(set('abc').issuperset('a'))
223 self.assertFalse(set('a').issubset('cbs'))
224 self.assertFalse(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000225
226 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000227 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000228 p = pickle.dumps(self.s, i)
229 dup = pickle.loads(p)
230 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
231 if type(self.s) not in (set, frozenset):
232 self.s.x = 10
233 p = pickle.dumps(self.s)
234 dup = pickle.loads(p)
235 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000236
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000237 def test_deepcopy(self):
238 class Tracer:
239 def __init__(self, value):
240 self.value = value
241 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000242 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000243 def __deepcopy__(self, memo=None):
244 return Tracer(self.value + 1)
245 t = Tracer(10)
246 s = self.thetype([t])
247 dup = copy.deepcopy(s)
248 self.assertNotEqual(id(s), id(dup))
249 for elem in dup:
250 newt = elem
251 self.assertNotEqual(id(t), id(newt))
252 self.assertEqual(t.value + 1, newt.value)
253
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000254 def test_gc(self):
255 # Create a nest of cycles to exercise overall ref count check
256 class A:
257 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000258 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000259 for elem in s:
260 elem.cycle = s
261 elem.sub = elem
262 elem.set = set([elem])
263
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000264 def test_subclass_with_custom_hash(self):
265 # Bug #1257731
266 class H(self.thetype):
267 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000268 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000269 s=H()
270 f=set()
271 f.add(s)
Benjamin Peterson577473f2010-01-19 00:09:57 +0000272 self.assertIn(s, f)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000273 f.remove(s)
274 f.add(s)
275 f.discard(s)
276
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000277 def test_badcmp(self):
278 s = self.thetype([BadCmp()])
279 # Detect comparison errors during insertion and lookup
280 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
281 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
282 # Detect errors during mutating operations
283 if hasattr(s, 'add'):
284 self.assertRaises(RuntimeError, s.add, BadCmp())
285 self.assertRaises(RuntimeError, s.discard, BadCmp())
286 self.assertRaises(RuntimeError, s.remove, BadCmp())
287
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000288 def test_cyclical_repr(self):
289 w = ReprWrapper()
290 s = self.thetype([w])
291 w.value = s
292 if self.thetype == set:
293 self.assertEqual(repr(s), '{set(...)}')
294 else:
295 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000296 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000297
298 def test_cyclical_print(self):
299 w = ReprWrapper()
300 s = self.thetype([w])
301 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000302 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000303 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000304 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000305 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000306 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000307 self.assertEqual(fo.read(), repr(s))
308 finally:
309 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000310 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000311
Thomas Wouterscf297e42007-02-23 15:07:44 +0000312 def test_do_not_rehash_dict_keys(self):
313 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000314 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000315 self.assertEqual(sum(elem.hash_count for elem in d), n)
316 s = self.thetype(d)
317 self.assertEqual(sum(elem.hash_count for elem in d), n)
318 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000319 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000320 if hasattr(s, 'symmetric_difference_update'):
321 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000322 self.assertEqual(sum(elem.hash_count for elem in d), n)
323 d2 = dict.fromkeys(set(d))
324 self.assertEqual(sum(elem.hash_count for elem in d), n)
325 d3 = dict.fromkeys(frozenset(d))
326 self.assertEqual(sum(elem.hash_count for elem in d), n)
327 d3 = dict.fromkeys(frozenset(d), 123)
328 self.assertEqual(sum(elem.hash_count for elem in d), n)
329 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000330
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000331 def test_container_iterator(self):
332 # Bug #3680: tp_traverse was not implemented for set iterator object
333 class C(object):
334 pass
335 obj = C()
336 ref = weakref.ref(obj)
337 container = set([obj, 1])
338 obj.x = iter(container)
339 del obj, container
340 gc.collect()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000341 self.assertTrue(ref() is None, "Cycle was not collected")
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000342
Raymond Hettingera690a992003-11-16 16:17:49 +0000343class TestSet(TestJointOps):
344 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000345 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000346
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000347 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000348 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000349 s.__init__(self.word)
350 self.assertEqual(s, set(self.word))
351 s.__init__(self.otherword)
352 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000353 self.assertRaises(TypeError, s.__init__, s, 2);
354 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000355
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000356 def test_constructor_identity(self):
357 s = self.thetype(range(3))
358 t = self.thetype(s)
359 self.assertNotEqual(id(s), id(t))
360
Guido van Rossum86e58e22006-08-28 15:27:34 +0000361 def test_set_literal(self):
362 s = set([1,2,3])
363 t = {1,2,3}
364 self.assertEqual(s, t)
365
Raymond Hettingera690a992003-11-16 16:17:49 +0000366 def test_hash(self):
367 self.assertRaises(TypeError, hash, self.s)
368
369 def test_clear(self):
370 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000371 self.assertEqual(self.s, set())
372 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000373
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000374 def test_copy(self):
375 dup = self.s.copy()
376 self.assertEqual(self.s, dup)
377 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000378 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000379
Raymond Hettingera690a992003-11-16 16:17:49 +0000380 def test_add(self):
381 self.s.add('Q')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000382 self.assertIn('Q', self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000383 dup = self.s.copy()
384 self.s.add('Q')
385 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000386 self.assertRaises(TypeError, self.s.add, [])
387
388 def test_remove(self):
389 self.s.remove('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000390 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000391 self.assertRaises(KeyError, self.s.remove, 'Q')
392 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000393 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000394 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000395 s.remove(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000396 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000397 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000398
Thomas Wouters89f507f2006-12-13 04:49:30 +0000399 def test_remove_keyerror_unpacking(self):
400 # bug: www.python.org/sf/1576657
401 for v1 in ['Q', (1,)]:
402 try:
403 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000404 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405 v2 = e.args[0]
406 self.assertEqual(v1, v2)
407 else:
408 self.fail()
409
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000410 def test_remove_keyerror_set(self):
411 key = self.thetype([3, 4])
412 try:
413 self.s.remove(key)
414 except KeyError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000415 self.assertTrue(e.args[0] is key,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000416 "KeyError should be {0}, not {1}".format(key,
417 e.args[0]))
418 else:
419 self.fail()
420
Raymond Hettingera690a992003-11-16 16:17:49 +0000421 def test_discard(self):
422 self.s.discard('a')
Benjamin Peterson577473f2010-01-19 00:09:57 +0000423 self.assertNotIn('a', self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000424 self.s.discard('Q')
425 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000426 s = self.thetype([frozenset(self.word)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000427 self.assertIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000428 s.discard(self.thetype(self.word))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000429 self.assertNotIn(self.thetype(self.word), s)
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000430 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000431
432 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000433 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000434 elem = self.s.pop()
Benjamin Peterson577473f2010-01-19 00:09:57 +0000435 self.assertNotIn(elem, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000436 self.assertRaises(KeyError, self.s.pop)
437
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000438 def test_update(self):
439 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000440 self.assertEqual(retval, None)
441 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000442 self.assertIn(c, self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000443 self.assertRaises(PassThru, self.s.update, check_pass_thru())
444 self.assertRaises(TypeError, self.s.update, [[]])
445 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000446 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000447 s = self.thetype('abcba')
448 self.assertEqual(s.update(C(p)), None)
449 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000450 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
451 q = 'ahi'
452 for C in set, frozenset, dict.fromkeys, str, list, tuple:
453 s = self.thetype('abcba')
454 self.assertEqual(s.update(C(p), C(q)), None)
455 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000456
457 def test_ior(self):
458 self.s |= set(self.otherword)
459 for c in (self.word + self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000460 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000461
462 def test_intersection_update(self):
463 retval = self.s.intersection_update(self.otherword)
464 self.assertEqual(retval, None)
465 for c in (self.word + self.otherword):
466 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000467 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000468 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000469 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000470 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
471 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000472 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000473 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000474 s = self.thetype('abcba')
475 self.assertEqual(s.intersection_update(C(p)), None)
476 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000477 ss = 'abcba'
478 s = self.thetype(ss)
479 t = 'cbc'
480 self.assertEqual(s.intersection_update(C(p), C(t)), None)
481 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000482
483 def test_iand(self):
484 self.s &= set(self.otherword)
485 for c in (self.word + self.otherword):
486 if c in self.otherword and c in self.word:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000487 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000488 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000489 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000490
491 def test_difference_update(self):
492 retval = self.s.difference_update(self.otherword)
493 self.assertEqual(retval, None)
494 for c in (self.word + self.otherword):
495 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000496 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000497 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000498 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000499 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
500 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000501 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
502 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000503 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000504 s = self.thetype('abcba')
505 self.assertEqual(s.difference_update(C(p)), None)
506 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000507
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000508 s = self.thetype('abcdefghih')
509 s.difference_update()
510 self.assertEqual(s, self.thetype('abcdefghih'))
511
512 s = self.thetype('abcdefghih')
513 s.difference_update(C('aba'))
514 self.assertEqual(s, self.thetype('cdefghih'))
515
516 s = self.thetype('abcdefghih')
517 s.difference_update(C('cdc'), C('aba'))
518 self.assertEqual(s, self.thetype('efghih'))
519
Raymond Hettingera690a992003-11-16 16:17:49 +0000520 def test_isub(self):
521 self.s -= set(self.otherword)
522 for c in (self.word + self.otherword):
523 if c in self.word and c not in self.otherword:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000524 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000525 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000526 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000527
528 def test_symmetric_difference_update(self):
529 retval = self.s.symmetric_difference_update(self.otherword)
530 self.assertEqual(retval, None)
531 for c in (self.word + self.otherword):
532 if (c in self.word) ^ (c in self.otherword):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000533 self.assertIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000534 else:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000535 self.assertNotIn(c, self.s)
Raymond Hettingera690a992003-11-16 16:17:49 +0000536 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
537 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000538 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000539 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000540 s = self.thetype('abcba')
541 self.assertEqual(s.symmetric_difference_update(C(p)), None)
542 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000543
544 def test_ixor(self):
545 self.s ^= set(self.otherword)
546 for c in (self.word + self.otherword):
547 if (c in self.word) ^ (c 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
Raymond Hettingerc991db22005-08-11 07:58:45 +0000552 def test_inplace_on_self(self):
553 t = self.s.copy()
554 t |= t
555 self.assertEqual(t, self.s)
556 t &= t
557 self.assertEqual(t, self.s)
558 t -= t
559 self.assertEqual(t, self.thetype())
560 t = self.s.copy()
561 t ^= t
562 self.assertEqual(t, self.thetype())
563
Raymond Hettinger691d8052004-05-30 07:26:47 +0000564 def test_weakref(self):
565 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000566 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000567 self.assertEqual(str(p), str(s))
568 s = None
569 self.assertRaises(ReferenceError, str, p)
570
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000571 def test_rich_compare(self):
572 class TestRichSetCompare:
573 def __gt__(self, some_set):
574 self.gt_called = True
575 return False
576 def __lt__(self, some_set):
577 self.lt_called = True
578 return False
579 def __ge__(self, some_set):
580 self.ge_called = True
581 return False
582 def __le__(self, some_set):
583 self.le_called = True
584 return False
585
Ezio Melotti42da6632011-03-15 05:18:48 +0200586 # This first tries the builtin rich set comparison, which doesn't know
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000587 # how to handle the custom object. Upon returning NotImplemented, the
588 # corresponding comparison on the right object is invoked.
589 myset = {1, 2, 3}
590
591 myobj = TestRichSetCompare()
592 myset < myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000593 self.assertTrue(myobj.gt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000594
595 myobj = TestRichSetCompare()
596 myset > myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000597 self.assertTrue(myobj.lt_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000598
599 myobj = TestRichSetCompare()
600 myset <= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(myobj.ge_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000602
603 myobj = TestRichSetCompare()
604 myset >= myobj
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000605 self.assertTrue(myobj.le_called)
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000606
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000607 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000608 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000609 def test_c_api(self):
Victor Stinner08b36bd2010-03-13 00:19:17 +0000610 self.assertEqual(set().test_c_api(), True)
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000611
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000612class SetSubclass(set):
613 pass
614
615class TestSetSubclass(TestSet):
616 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000617 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000618
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000619class SetSubclassWithKeywordArgs(set):
620 def __init__(self, iterable=[], newarg=None):
621 set.__init__(self, iterable)
622
623class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000624
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000625 def test_keywords_in_subclass(self):
626 'SF bug #1486663 -- this used to erroneously raise a TypeError'
627 SetSubclassWithKeywordArgs(newarg=1)
628
Raymond Hettingera690a992003-11-16 16:17:49 +0000629class TestFrozenSet(TestJointOps):
630 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000631 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000632
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000633 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000634 s = self.thetype(self.word)
635 s.__init__(self.otherword)
636 self.assertEqual(s, set(self.word))
637
Raymond Hettingerd7946662005-08-01 21:39:29 +0000638 def test_singleton_empty_frozenset(self):
639 f = frozenset()
640 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
641 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000642 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000643 frozenset(f), f]
644 # All of the empty frozensets should have just one id()
645 self.assertEqual(len(set(map(id, efs))), 1)
646
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000647 def test_constructor_identity(self):
648 s = self.thetype(range(3))
649 t = self.thetype(s)
650 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000651
Raymond Hettingera690a992003-11-16 16:17:49 +0000652 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000653 self.assertEqual(hash(self.thetype('abcdeb')),
654 hash(self.thetype('ebecda')))
655
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000656 # make sure that all permutations give the same hash value
657 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000658 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000659 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000660 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000661 shuffle(seq)
662 results.add(hash(self.thetype(seq)))
663 self.assertEqual(len(results), 1)
664
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000665 def test_copy(self):
666 dup = self.s.copy()
667 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000668
669 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000670 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000671 key1 = self.thetype(seq)
672 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000673 self.assertEqual(key1, key2)
674 self.assertNotEqual(id(key1), id(key2))
675 d = {}
676 d[key1] = 42
677 self.assertEqual(d[key2], 42)
678
679 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000680 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000681 self.assertEqual(hash(f), hash(f))
682
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000683 def test_hash_effectiveness(self):
684 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000685 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000686 addhashvalue = hashvalues.add
687 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000688 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000689 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
690 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000691
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000692class FrozenSetSubclass(frozenset):
693 pass
694
695class TestFrozenSetSubclass(TestFrozenSet):
696 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000697 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000698
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000699 def test_constructor_identity(self):
700 s = self.thetype(range(3))
701 t = self.thetype(s)
702 self.assertNotEqual(id(s), id(t))
703
704 def test_copy(self):
705 dup = self.s.copy()
706 self.assertNotEqual(id(self.s), id(dup))
707
708 def test_nested_empty_constructor(self):
709 s = self.thetype()
710 t = self.thetype(s)
711 self.assertEqual(s, t)
712
Raymond Hettingerd7946662005-08-01 21:39:29 +0000713 def test_singleton_empty_frozenset(self):
714 Frozenset = self.thetype
715 f = frozenset()
716 F = Frozenset()
717 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
718 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000719 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000720 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
721 # All empty frozenset subclass instances should have different ids
722 self.assertEqual(len(set(map(id, efs))), len(efs))
723
Raymond Hettingera690a992003-11-16 16:17:49 +0000724# Tests taken from test_sets.py =============================================
725
726empty_set = set()
727
728#==============================================================================
729
730class TestBasicOps(unittest.TestCase):
731
732 def test_repr(self):
733 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000734 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000735
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100736 def check_repr_against_values(self):
737 text = repr(self.set)
738 self.assertTrue(text.startswith('{'))
739 self.assertTrue(text.endswith('}'))
740
741 result = text[1:-1].split(', ')
742 result.sort()
743 sorted_repr_values = [repr(value) for value in self.values]
744 sorted_repr_values.sort()
745 self.assertEqual(result, sorted_repr_values)
746
Raymond Hettingereae05de2004-07-09 04:51:24 +0000747 def test_print(self):
748 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000749 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000750 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000751 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000752 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000753 self.assertEqual(fo.read(), repr(self.set))
754 finally:
755 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000756 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000757
Raymond Hettingera690a992003-11-16 16:17:49 +0000758 def test_length(self):
759 self.assertEqual(len(self.set), self.length)
760
761 def test_self_equality(self):
762 self.assertEqual(self.set, self.set)
763
764 def test_equivalent_equality(self):
765 self.assertEqual(self.set, self.dup)
766
767 def test_copy(self):
768 self.assertEqual(self.set.copy(), self.dup)
769
770 def test_self_union(self):
771 result = self.set | self.set
772 self.assertEqual(result, self.dup)
773
774 def test_empty_union(self):
775 result = self.set | empty_set
776 self.assertEqual(result, self.dup)
777
778 def test_union_empty(self):
779 result = empty_set | self.set
780 self.assertEqual(result, self.dup)
781
782 def test_self_intersection(self):
783 result = self.set & self.set
784 self.assertEqual(result, self.dup)
785
786 def test_empty_intersection(self):
787 result = self.set & empty_set
788 self.assertEqual(result, empty_set)
789
790 def test_intersection_empty(self):
791 result = empty_set & self.set
792 self.assertEqual(result, empty_set)
793
Guido van Rossum58da9312007-11-10 23:39:45 +0000794 def test_self_isdisjoint(self):
795 result = self.set.isdisjoint(self.set)
796 self.assertEqual(result, not self.set)
797
798 def test_empty_isdisjoint(self):
799 result = self.set.isdisjoint(empty_set)
800 self.assertEqual(result, True)
801
802 def test_isdisjoint_empty(self):
803 result = empty_set.isdisjoint(self.set)
804 self.assertEqual(result, True)
805
Raymond Hettingera690a992003-11-16 16:17:49 +0000806 def test_self_symmetric_difference(self):
807 result = self.set ^ self.set
808 self.assertEqual(result, empty_set)
809
Georg Brandl33b6a312010-08-01 06:44:46 +0000810 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000811 result = self.set ^ empty_set
812 self.assertEqual(result, self.set)
813
814 def test_self_difference(self):
815 result = self.set - self.set
816 self.assertEqual(result, empty_set)
817
818 def test_empty_difference(self):
819 result = self.set - empty_set
820 self.assertEqual(result, self.dup)
821
822 def test_empty_difference_rev(self):
823 result = empty_set - self.set
824 self.assertEqual(result, empty_set)
825
826 def test_iteration(self):
827 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000828 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000829 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000830 # note: __length_hint__ is an internal undocumented API,
831 # don't rely on it in your own programs
832 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000833
834 def test_pickling(self):
835 p = pickle.dumps(self.set)
836 copy = pickle.loads(p)
837 self.assertEqual(self.set, copy,
838 "%s != %s" % (self.set, copy))
839
840#------------------------------------------------------------------------------
841
842class TestBasicOpsEmpty(TestBasicOps):
843 def setUp(self):
844 self.case = "empty set"
845 self.values = []
846 self.set = set(self.values)
847 self.dup = set(self.values)
848 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000849 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000850
851#------------------------------------------------------------------------------
852
853class TestBasicOpsSingleton(TestBasicOps):
854 def setUp(self):
855 self.case = "unit set (number)"
856 self.values = [3]
857 self.set = set(self.values)
858 self.dup = set(self.values)
859 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000860 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000861
862 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000863 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000864
865 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000866 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000867
868#------------------------------------------------------------------------------
869
870class TestBasicOpsTuple(TestBasicOps):
871 def setUp(self):
872 self.case = "unit set (tuple)"
873 self.values = [(0, "zero")]
874 self.set = set(self.values)
875 self.dup = set(self.values)
876 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000877 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000878
879 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000880 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000881
882 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000883 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000884
885#------------------------------------------------------------------------------
886
887class TestBasicOpsTriple(TestBasicOps):
888 def setUp(self):
889 self.case = "triple set"
890 self.values = [0, "zero", operator.add]
891 self.set = set(self.values)
892 self.dup = set(self.values)
893 self.length = 3
894 self.repr = None
895
Christian Heimes0ded5b52007-12-10 15:50:56 +0000896#------------------------------------------------------------------------------
897
898class TestBasicOpsString(TestBasicOps):
899 def setUp(self):
900 self.case = "string set"
901 self.values = ["a", "b", "c"]
902 self.set = set(self.values)
903 self.dup = set(self.values)
904 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100905
906 def test_repr(self):
907 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000908
909#------------------------------------------------------------------------------
910
911class TestBasicOpsBytes(TestBasicOps):
912 def setUp(self):
913 self.case = "string set"
914 self.values = [b"a", b"b", b"c"]
915 self.set = set(self.values)
916 self.dup = set(self.values)
917 self.length = 3
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100918
919 def test_repr(self):
920 self.check_repr_against_values()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000921
922#------------------------------------------------------------------------------
923
924class TestBasicOpsMixedStringBytes(TestBasicOps):
925 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000926 self._warning_filters = support.check_warnings()
927 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000928 warnings.simplefilter('ignore', BytesWarning)
929 self.case = "string and bytes set"
930 self.values = ["a", "b", b"a", b"b"]
931 self.set = set(self.values)
932 self.dup = set(self.values)
933 self.length = 4
Christian Heimes0ded5b52007-12-10 15:50:56 +0000934
935 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000936 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000937
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100938 def test_repr(self):
939 self.check_repr_against_values()
940
Raymond Hettingera690a992003-11-16 16:17:49 +0000941#==============================================================================
942
943def baditer():
944 raise TypeError
945 yield True
946
947def gooditer():
948 yield True
949
950class TestExceptionPropagation(unittest.TestCase):
951 """SF 628246: Set constructor should not trap iterator TypeErrors"""
952
953 def test_instanceWithException(self):
954 self.assertRaises(TypeError, set, baditer())
955
956 def test_instancesWithoutException(self):
957 # All of these iterables should load without exception.
958 set([1,2,3])
959 set((1,2,3))
960 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000961 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000962 set('abc')
963 set(gooditer())
964
Neal Norwitzfcf44352005-11-27 20:37:43 +0000965 def test_changingSizeWhileIterating(self):
966 s = set([1,2,3])
967 try:
968 for i in s:
969 s.update([4])
970 except RuntimeError:
971 pass
972 else:
973 self.fail("no exception when changing size during iteration")
974
Raymond Hettingera690a992003-11-16 16:17:49 +0000975#==============================================================================
976
977class TestSetOfSets(unittest.TestCase):
978 def test_constructor(self):
979 inner = frozenset([1])
980 outer = set([inner])
981 element = outer.pop()
982 self.assertEqual(type(element), frozenset)
983 outer.add(inner) # Rebuild set of sets with .add method
984 outer.remove(inner)
985 self.assertEqual(outer, set()) # Verify that remove worked
986 outer.discard(inner) # Absence of KeyError indicates working fine
987
988#==============================================================================
989
990class TestBinaryOps(unittest.TestCase):
991 def setUp(self):
992 self.set = set((2, 4, 6))
993
994 def test_eq(self): # SF bug 643115
995 self.assertEqual(self.set, set({2:1,4:3,6:5}))
996
997 def test_union_subset(self):
998 result = self.set | set([2])
999 self.assertEqual(result, set((2, 4, 6)))
1000
1001 def test_union_superset(self):
1002 result = self.set | set([2, 4, 6, 8])
1003 self.assertEqual(result, set([2, 4, 6, 8]))
1004
1005 def test_union_overlap(self):
1006 result = self.set | set([3, 4, 5])
1007 self.assertEqual(result, set([2, 3, 4, 5, 6]))
1008
1009 def test_union_non_overlap(self):
1010 result = self.set | set([8])
1011 self.assertEqual(result, set([2, 4, 6, 8]))
1012
1013 def test_intersection_subset(self):
1014 result = self.set & set((2, 4))
1015 self.assertEqual(result, set((2, 4)))
1016
1017 def test_intersection_superset(self):
1018 result = self.set & set([2, 4, 6, 8])
1019 self.assertEqual(result, set([2, 4, 6]))
1020
1021 def test_intersection_overlap(self):
1022 result = self.set & set([3, 4, 5])
1023 self.assertEqual(result, set([4]))
1024
1025 def test_intersection_non_overlap(self):
1026 result = self.set & set([8])
1027 self.assertEqual(result, empty_set)
1028
Guido van Rossum58da9312007-11-10 23:39:45 +00001029 def test_isdisjoint_subset(self):
1030 result = self.set.isdisjoint(set((2, 4)))
1031 self.assertEqual(result, False)
1032
1033 def test_isdisjoint_superset(self):
1034 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1035 self.assertEqual(result, False)
1036
1037 def test_isdisjoint_overlap(self):
1038 result = self.set.isdisjoint(set([3, 4, 5]))
1039 self.assertEqual(result, False)
1040
1041 def test_isdisjoint_non_overlap(self):
1042 result = self.set.isdisjoint(set([8]))
1043 self.assertEqual(result, True)
1044
Raymond Hettingera690a992003-11-16 16:17:49 +00001045 def test_sym_difference_subset(self):
1046 result = self.set ^ set((2, 4))
1047 self.assertEqual(result, set([6]))
1048
1049 def test_sym_difference_superset(self):
1050 result = self.set ^ set((2, 4, 6, 8))
1051 self.assertEqual(result, set([8]))
1052
1053 def test_sym_difference_overlap(self):
1054 result = self.set ^ set((3, 4, 5))
1055 self.assertEqual(result, set([2, 3, 5, 6]))
1056
1057 def test_sym_difference_non_overlap(self):
1058 result = self.set ^ set([8])
1059 self.assertEqual(result, set([2, 4, 6, 8]))
1060
Raymond Hettingera690a992003-11-16 16:17:49 +00001061#==============================================================================
1062
1063class TestUpdateOps(unittest.TestCase):
1064 def setUp(self):
1065 self.set = set((2, 4, 6))
1066
1067 def test_union_subset(self):
1068 self.set |= set([2])
1069 self.assertEqual(self.set, set((2, 4, 6)))
1070
1071 def test_union_superset(self):
1072 self.set |= set([2, 4, 6, 8])
1073 self.assertEqual(self.set, set([2, 4, 6, 8]))
1074
1075 def test_union_overlap(self):
1076 self.set |= set([3, 4, 5])
1077 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1078
1079 def test_union_non_overlap(self):
1080 self.set |= set([8])
1081 self.assertEqual(self.set, set([2, 4, 6, 8]))
1082
1083 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001084 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001085 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1086
1087 def test_intersection_subset(self):
1088 self.set &= set((2, 4))
1089 self.assertEqual(self.set, set((2, 4)))
1090
1091 def test_intersection_superset(self):
1092 self.set &= set([2, 4, 6, 8])
1093 self.assertEqual(self.set, set([2, 4, 6]))
1094
1095 def test_intersection_overlap(self):
1096 self.set &= set([3, 4, 5])
1097 self.assertEqual(self.set, set([4]))
1098
1099 def test_intersection_non_overlap(self):
1100 self.set &= set([8])
1101 self.assertEqual(self.set, empty_set)
1102
1103 def test_intersection_method_call(self):
1104 self.set.intersection_update(set([3, 4, 5]))
1105 self.assertEqual(self.set, set([4]))
1106
1107 def test_sym_difference_subset(self):
1108 self.set ^= set((2, 4))
1109 self.assertEqual(self.set, set([6]))
1110
1111 def test_sym_difference_superset(self):
1112 self.set ^= set((2, 4, 6, 8))
1113 self.assertEqual(self.set, set([8]))
1114
1115 def test_sym_difference_overlap(self):
1116 self.set ^= set((3, 4, 5))
1117 self.assertEqual(self.set, set([2, 3, 5, 6]))
1118
1119 def test_sym_difference_non_overlap(self):
1120 self.set ^= set([8])
1121 self.assertEqual(self.set, set([2, 4, 6, 8]))
1122
1123 def test_sym_difference_method_call(self):
1124 self.set.symmetric_difference_update(set([3, 4, 5]))
1125 self.assertEqual(self.set, set([2, 3, 5, 6]))
1126
1127 def test_difference_subset(self):
1128 self.set -= set((2, 4))
1129 self.assertEqual(self.set, set([6]))
1130
1131 def test_difference_superset(self):
1132 self.set -= set((2, 4, 6, 8))
1133 self.assertEqual(self.set, set([]))
1134
1135 def test_difference_overlap(self):
1136 self.set -= set((3, 4, 5))
1137 self.assertEqual(self.set, set([2, 6]))
1138
1139 def test_difference_non_overlap(self):
1140 self.set -= set([8])
1141 self.assertEqual(self.set, set([2, 4, 6]))
1142
1143 def test_difference_method_call(self):
1144 self.set.difference_update(set([3, 4, 5]))
1145 self.assertEqual(self.set, set([2, 6]))
1146
1147#==============================================================================
1148
1149class TestMutate(unittest.TestCase):
1150 def setUp(self):
1151 self.values = ["a", "b", "c"]
1152 self.set = set(self.values)
1153
1154 def test_add_present(self):
1155 self.set.add("c")
1156 self.assertEqual(self.set, set("abc"))
1157
1158 def test_add_absent(self):
1159 self.set.add("d")
1160 self.assertEqual(self.set, set("abcd"))
1161
1162 def test_add_until_full(self):
1163 tmp = set()
1164 expected_len = 0
1165 for v in self.values:
1166 tmp.add(v)
1167 expected_len += 1
1168 self.assertEqual(len(tmp), expected_len)
1169 self.assertEqual(tmp, self.set)
1170
1171 def test_remove_present(self):
1172 self.set.remove("b")
1173 self.assertEqual(self.set, set("ac"))
1174
1175 def test_remove_absent(self):
1176 try:
1177 self.set.remove("d")
1178 self.fail("Removing missing element should have raised LookupError")
1179 except LookupError:
1180 pass
1181
1182 def test_remove_until_empty(self):
1183 expected_len = len(self.set)
1184 for v in self.values:
1185 self.set.remove(v)
1186 expected_len -= 1
1187 self.assertEqual(len(self.set), expected_len)
1188
1189 def test_discard_present(self):
1190 self.set.discard("c")
1191 self.assertEqual(self.set, set("ab"))
1192
1193 def test_discard_absent(self):
1194 self.set.discard("d")
1195 self.assertEqual(self.set, set("abc"))
1196
1197 def test_clear(self):
1198 self.set.clear()
1199 self.assertEqual(len(self.set), 0)
1200
1201 def test_pop(self):
1202 popped = {}
1203 while self.set:
1204 popped[self.set.pop()] = None
1205 self.assertEqual(len(popped), len(self.values))
1206 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001207 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001208
1209 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001210 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001211 self.assertEqual(self.set, set(self.values))
1212
1213 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001214 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001215 self.assertEqual(self.set, set(self.values))
1216
1217 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001218 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001219 self.assertEqual(self.set, set(self.values + ["z"]))
1220
1221#==============================================================================
1222
1223class TestSubsets(unittest.TestCase):
1224
1225 case2method = {"<=": "issubset",
1226 ">=": "issuperset",
1227 }
1228
1229 reverse = {"==": "==",
1230 "!=": "!=",
1231 "<": ">",
1232 ">": "<",
1233 "<=": ">=",
1234 ">=": "<=",
1235 }
1236
1237 def test_issubset(self):
1238 x = self.left
1239 y = self.right
1240 for case in "!=", "==", "<", "<=", ">", ">=":
1241 expected = case in self.cases
1242 # Test the binary infix spelling.
1243 result = eval("x" + case + "y", locals())
1244 self.assertEqual(result, expected)
1245 # Test the "friendly" method-name spelling, if one exists.
1246 if case in TestSubsets.case2method:
1247 method = getattr(x, TestSubsets.case2method[case])
1248 result = method(y)
1249 self.assertEqual(result, expected)
1250
1251 # Now do the same for the operands reversed.
1252 rcase = TestSubsets.reverse[case]
1253 result = eval("y" + rcase + "x", locals())
1254 self.assertEqual(result, expected)
1255 if rcase in TestSubsets.case2method:
1256 method = getattr(y, TestSubsets.case2method[rcase])
1257 result = method(x)
1258 self.assertEqual(result, expected)
1259#------------------------------------------------------------------------------
1260
1261class TestSubsetEqualEmpty(TestSubsets):
1262 left = set()
1263 right = set()
1264 name = "both empty"
1265 cases = "==", "<=", ">="
1266
1267#------------------------------------------------------------------------------
1268
1269class TestSubsetEqualNonEmpty(TestSubsets):
1270 left = set([1, 2])
1271 right = set([1, 2])
1272 name = "equal pair"
1273 cases = "==", "<=", ">="
1274
1275#------------------------------------------------------------------------------
1276
1277class TestSubsetEmptyNonEmpty(TestSubsets):
1278 left = set()
1279 right = set([1, 2])
1280 name = "one empty, one non-empty"
1281 cases = "!=", "<", "<="
1282
1283#------------------------------------------------------------------------------
1284
1285class TestSubsetPartial(TestSubsets):
1286 left = set([1])
1287 right = set([1, 2])
1288 name = "one a non-empty proper subset of other"
1289 cases = "!=", "<", "<="
1290
1291#------------------------------------------------------------------------------
1292
1293class TestSubsetNonOverlap(TestSubsets):
1294 left = set([1])
1295 right = set([2])
1296 name = "neither empty, neither contains"
1297 cases = "!="
1298
1299#==============================================================================
1300
1301class TestOnlySetsInBinaryOps(unittest.TestCase):
1302
1303 def test_eq_ne(self):
1304 # Unlike the others, this is testing that == and != *are* allowed.
1305 self.assertEqual(self.other == self.set, False)
1306 self.assertEqual(self.set == self.other, False)
1307 self.assertEqual(self.other != self.set, True)
1308 self.assertEqual(self.set != self.other, True)
1309
1310 def test_ge_gt_le_lt(self):
1311 self.assertRaises(TypeError, lambda: self.set < self.other)
1312 self.assertRaises(TypeError, lambda: self.set <= self.other)
1313 self.assertRaises(TypeError, lambda: self.set > self.other)
1314 self.assertRaises(TypeError, lambda: self.set >= self.other)
1315
1316 self.assertRaises(TypeError, lambda: self.other < self.set)
1317 self.assertRaises(TypeError, lambda: self.other <= self.set)
1318 self.assertRaises(TypeError, lambda: self.other > self.set)
1319 self.assertRaises(TypeError, lambda: self.other >= self.set)
1320
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001321 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001322 try:
1323 self.set |= self.other
1324 except TypeError:
1325 pass
1326 else:
1327 self.fail("expected TypeError")
1328
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001329 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001330 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001331 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001332 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001333 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001334
1335 def test_union(self):
1336 self.assertRaises(TypeError, lambda: self.set | self.other)
1337 self.assertRaises(TypeError, lambda: self.other | self.set)
1338 if self.otherIsIterable:
1339 self.set.union(self.other)
1340 else:
1341 self.assertRaises(TypeError, self.set.union, self.other)
1342
1343 def test_intersection_update_operator(self):
1344 try:
1345 self.set &= self.other
1346 except TypeError:
1347 pass
1348 else:
1349 self.fail("expected TypeError")
1350
1351 def test_intersection_update(self):
1352 if self.otherIsIterable:
1353 self.set.intersection_update(self.other)
1354 else:
1355 self.assertRaises(TypeError,
1356 self.set.intersection_update,
1357 self.other)
1358
1359 def test_intersection(self):
1360 self.assertRaises(TypeError, lambda: self.set & self.other)
1361 self.assertRaises(TypeError, lambda: self.other & self.set)
1362 if self.otherIsIterable:
1363 self.set.intersection(self.other)
1364 else:
1365 self.assertRaises(TypeError, self.set.intersection, self.other)
1366
1367 def test_sym_difference_update_operator(self):
1368 try:
1369 self.set ^= self.other
1370 except TypeError:
1371 pass
1372 else:
1373 self.fail("expected TypeError")
1374
1375 def test_sym_difference_update(self):
1376 if self.otherIsIterable:
1377 self.set.symmetric_difference_update(self.other)
1378 else:
1379 self.assertRaises(TypeError,
1380 self.set.symmetric_difference_update,
1381 self.other)
1382
1383 def test_sym_difference(self):
1384 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1385 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1386 if self.otherIsIterable:
1387 self.set.symmetric_difference(self.other)
1388 else:
1389 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1390
1391 def test_difference_update_operator(self):
1392 try:
1393 self.set -= self.other
1394 except TypeError:
1395 pass
1396 else:
1397 self.fail("expected TypeError")
1398
1399 def test_difference_update(self):
1400 if self.otherIsIterable:
1401 self.set.difference_update(self.other)
1402 else:
1403 self.assertRaises(TypeError,
1404 self.set.difference_update,
1405 self.other)
1406
1407 def test_difference(self):
1408 self.assertRaises(TypeError, lambda: self.set - self.other)
1409 self.assertRaises(TypeError, lambda: self.other - self.set)
1410 if self.otherIsIterable:
1411 self.set.difference(self.other)
1412 else:
1413 self.assertRaises(TypeError, self.set.difference, self.other)
1414
1415#------------------------------------------------------------------------------
1416
1417class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1418 def setUp(self):
1419 self.set = set((1, 2, 3))
1420 self.other = 19
1421 self.otherIsIterable = False
1422
1423#------------------------------------------------------------------------------
1424
1425class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1426 def setUp(self):
1427 self.set = set((1, 2, 3))
1428 self.other = {1:2, 3:4}
1429 self.otherIsIterable = True
1430
1431#------------------------------------------------------------------------------
1432
1433class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1434 def setUp(self):
1435 self.set = set((1, 2, 3))
1436 self.other = operator.add
1437 self.otherIsIterable = False
1438
1439#------------------------------------------------------------------------------
1440
1441class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1442 def setUp(self):
1443 self.set = set((1, 2, 3))
1444 self.other = (2, 4, 6)
1445 self.otherIsIterable = True
1446
1447#------------------------------------------------------------------------------
1448
1449class TestOnlySetsString(TestOnlySetsInBinaryOps):
1450 def setUp(self):
1451 self.set = set((1, 2, 3))
1452 self.other = 'abc'
1453 self.otherIsIterable = True
1454
1455#------------------------------------------------------------------------------
1456
1457class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1458 def setUp(self):
1459 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001460 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001461 yield i
1462 self.set = set((1, 2, 3))
1463 self.other = gen()
1464 self.otherIsIterable = True
1465
1466#==============================================================================
1467
1468class TestCopying(unittest.TestCase):
1469
1470 def test_copy(self):
1471 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001472 dup_list = sorted(dup, key=repr)
1473 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001474 self.assertEqual(len(dup_list), len(set_list))
1475 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001476 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001477
1478 def test_deep_copy(self):
1479 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001480 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001481 dup_list = sorted(dup, key=repr)
1482 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001483 self.assertEqual(len(dup_list), len(set_list))
1484 for i in range(len(dup_list)):
1485 self.assertEqual(dup_list[i], set_list[i])
1486
1487#------------------------------------------------------------------------------
1488
1489class TestCopyingEmpty(TestCopying):
1490 def setUp(self):
1491 self.set = set()
1492
1493#------------------------------------------------------------------------------
1494
1495class TestCopyingSingleton(TestCopying):
1496 def setUp(self):
1497 self.set = set(["hello"])
1498
1499#------------------------------------------------------------------------------
1500
1501class TestCopyingTriple(TestCopying):
1502 def setUp(self):
1503 self.set = set(["zero", 0, None])
1504
1505#------------------------------------------------------------------------------
1506
1507class TestCopyingTuple(TestCopying):
1508 def setUp(self):
1509 self.set = set([(1, 2)])
1510
1511#------------------------------------------------------------------------------
1512
1513class TestCopyingNested(TestCopying):
1514 def setUp(self):
1515 self.set = set([((1, 2), (3, 4))])
1516
1517#==============================================================================
1518
1519class TestIdentities(unittest.TestCase):
1520 def setUp(self):
1521 self.a = set('abracadabra')
1522 self.b = set('alacazam')
1523
1524 def test_binopsVsSubsets(self):
1525 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001526 self.assertTrue(a - b < a)
1527 self.assertTrue(b - a < b)
1528 self.assertTrue(a & b < a)
1529 self.assertTrue(a & b < b)
1530 self.assertTrue(a | b > a)
1531 self.assertTrue(a | b > b)
1532 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001533
1534 def test_commutativity(self):
1535 a, b = self.a, self.b
1536 self.assertEqual(a&b, b&a)
1537 self.assertEqual(a|b, b|a)
1538 self.assertEqual(a^b, b^a)
1539 if a != b:
1540 self.assertNotEqual(a-b, b-a)
1541
1542 def test_summations(self):
1543 # check that sums of parts equal the whole
1544 a, b = self.a, self.b
1545 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1546 self.assertEqual((a&b)|(a^b), a|b)
1547 self.assertEqual(a|(b-a), a|b)
1548 self.assertEqual((a-b)|b, a|b)
1549 self.assertEqual((a-b)|(a&b), a)
1550 self.assertEqual((b-a)|(a&b), b)
1551 self.assertEqual((a-b)|(b-a), a^b)
1552
1553 def test_exclusion(self):
1554 # check that inverse operations show non-overlap
1555 a, b, zero = self.a, self.b, set()
1556 self.assertEqual((a-b)&b, zero)
1557 self.assertEqual((b-a)&a, zero)
1558 self.assertEqual((a&b)&(a^b), zero)
1559
1560# Tests derived from test_itertools.py =======================================
1561
1562def R(seqn):
1563 'Regular generator'
1564 for i in seqn:
1565 yield i
1566
1567class G:
1568 'Sequence using __getitem__'
1569 def __init__(self, seqn):
1570 self.seqn = seqn
1571 def __getitem__(self, i):
1572 return self.seqn[i]
1573
1574class I:
1575 'Sequence using iterator protocol'
1576 def __init__(self, seqn):
1577 self.seqn = seqn
1578 self.i = 0
1579 def __iter__(self):
1580 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001581 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001582 if self.i >= len(self.seqn): raise StopIteration
1583 v = self.seqn[self.i]
1584 self.i += 1
1585 return v
1586
1587class Ig:
1588 'Sequence using iterator protocol defined with a generator'
1589 def __init__(self, seqn):
1590 self.seqn = seqn
1591 self.i = 0
1592 def __iter__(self):
1593 for val in self.seqn:
1594 yield val
1595
1596class X:
1597 'Missing __getitem__ and __iter__'
1598 def __init__(self, seqn):
1599 self.seqn = seqn
1600 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001601 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001602 if self.i >= len(self.seqn): raise StopIteration
1603 v = self.seqn[self.i]
1604 self.i += 1
1605 return v
1606
1607class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001608 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001609 def __init__(self, seqn):
1610 self.seqn = seqn
1611 self.i = 0
1612 def __iter__(self):
1613 return self
1614
1615class E:
1616 'Test propagation of exceptions'
1617 def __init__(self, seqn):
1618 self.seqn = seqn
1619 self.i = 0
1620 def __iter__(self):
1621 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001622 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001623 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001624
1625class S:
1626 'Test immediate stop'
1627 def __init__(self, seqn):
1628 pass
1629 def __iter__(self):
1630 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001631 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001632 raise StopIteration
1633
Raymond Hettingera6c60372008-03-13 01:26:19 +00001634from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001635def L(seqn):
1636 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001637 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001638
1639class TestVariousIteratorArgs(unittest.TestCase):
1640
1641 def test_constructor(self):
1642 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001643 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001644 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001645 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001646 self.assertRaises(TypeError, cons , X(s))
1647 self.assertRaises(TypeError, cons , N(s))
1648 self.assertRaises(ZeroDivisionError, cons , E(s))
1649
1650 def test_inline_methods(self):
1651 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001652 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001653 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001654 for g in (G, I, Ig, L, R):
1655 expected = meth(data)
1656 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001657 if isinstance(expected, bool):
1658 self.assertEqual(actual, expected)
1659 else:
1660 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001661 self.assertRaises(TypeError, meth, X(s))
1662 self.assertRaises(TypeError, meth, N(s))
1663 self.assertRaises(ZeroDivisionError, meth, E(s))
1664
1665 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001666 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001667 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001668 'difference_update', 'symmetric_difference_update'):
1669 for g in (G, I, Ig, S, L, R):
1670 s = set('january')
1671 t = s.copy()
1672 getattr(s, methname)(list(g(data)))
1673 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001674 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001675
1676 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1677 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1678 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1679
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001680class bad_eq:
1681 def __eq__(self, other):
1682 if be_bad:
1683 set2.clear()
1684 raise ZeroDivisionError
1685 return self is other
1686 def __hash__(self):
1687 return 0
1688
1689class bad_dict_clear:
1690 def __eq__(self, other):
1691 if be_bad:
1692 dict2.clear()
1693 return self is other
1694 def __hash__(self):
1695 return 0
1696
Éric Araujo23eae862010-09-05 18:43:07 +00001697class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001698 def test_8420_set_merge(self):
1699 # This used to segfault
1700 global be_bad, set2, dict2
1701 be_bad = False
1702 set1 = {bad_eq()}
1703 set2 = {bad_eq() for i in range(75)}
1704 be_bad = True
1705 self.assertRaises(ZeroDivisionError, set1.update, set2)
1706
1707 be_bad = False
1708 set1 = {bad_dict_clear()}
1709 dict2 = {bad_dict_clear(): None}
1710 be_bad = True
1711 set1.symmetric_difference_update(dict2)
1712
Christian Heimes969fe572008-01-25 11:23:10 +00001713# Application tests (based on David Eppstein's graph recipes ====================================
1714
1715def powerset(U):
1716 """Generates all subsets of a set or sequence U."""
1717 U = iter(U)
1718 try:
1719 x = frozenset([next(U)])
1720 for S in powerset(U):
1721 yield S
1722 yield S | x
1723 except StopIteration:
1724 yield frozenset()
1725
1726def cube(n):
1727 """Graph of n-dimensional hypercube."""
1728 singletons = [frozenset([x]) for x in range(n)]
1729 return dict([(x, frozenset([x^s for s in singletons]))
1730 for x in powerset(range(n))])
1731
1732def linegraph(G):
1733 """Graph, the vertices of which are edges of G,
1734 with two vertices being adjacent iff the corresponding
1735 edges share a vertex."""
1736 L = {}
1737 for x in G:
1738 for y in G[x]:
1739 nx = [frozenset([x,z]) for z in G[x] if z != y]
1740 ny = [frozenset([y,z]) for z in G[y] if z != x]
1741 L[frozenset([x,y])] = frozenset(nx+ny)
1742 return L
1743
1744def faces(G):
1745 'Return a set of faces in G. Where a face is a set of vertices on that face'
1746 # currently limited to triangles,squares, and pentagons
1747 f = set()
1748 for v1, edges in G.items():
1749 for v2 in edges:
1750 for v3 in G[v2]:
1751 if v1 == v3:
1752 continue
1753 if v1 in G[v3]:
1754 f.add(frozenset([v1, v2, v3]))
1755 else:
1756 for v4 in G[v3]:
1757 if v4 == v2:
1758 continue
1759 if v1 in G[v4]:
1760 f.add(frozenset([v1, v2, v3, v4]))
1761 else:
1762 for v5 in G[v4]:
1763 if v5 == v3 or v5 == v2:
1764 continue
1765 if v1 in G[v5]:
1766 f.add(frozenset([v1, v2, v3, v4, v5]))
1767 return f
1768
1769
1770class TestGraphs(unittest.TestCase):
1771
1772 def test_cube(self):
1773
1774 g = cube(3) # vert --> {v1, v2, v3}
1775 vertices1 = set(g)
1776 self.assertEqual(len(vertices1), 8) # eight vertices
1777 for edge in g.values():
1778 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1779 vertices2 = set(v for edges in g.values() for v in edges)
1780 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1781
1782 cubefaces = faces(g)
1783 self.assertEqual(len(cubefaces), 6) # six faces
1784 for face in cubefaces:
1785 self.assertEqual(len(face), 4) # each face is a square
1786
1787 def test_cuboctahedron(self):
1788
1789 # http://en.wikipedia.org/wiki/Cuboctahedron
1790 # 8 triangular faces and 6 square faces
1791 # 12 indentical vertices each connecting a triangle and square
1792
1793 g = cube(3)
1794 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1795 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1796
1797 vertices = set(cuboctahedron)
1798 for edges in cuboctahedron.values():
1799 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1800 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1801 self.assertEqual(vertices, othervertices) # edge vertices in original set
1802
1803 cubofaces = faces(cuboctahedron)
1804 facesizes = collections.defaultdict(int)
1805 for face in cubofaces:
1806 facesizes[len(face)] += 1
1807 self.assertEqual(facesizes[3], 8) # eight triangular faces
1808 self.assertEqual(facesizes[4], 6) # six square faces
1809
1810 for vertex in cuboctahedron:
1811 edge = vertex # Cuboctahedron vertices are edges in Cube
1812 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1813 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001814 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001815
1816
Raymond Hettingera690a992003-11-16 16:17:49 +00001817#==============================================================================
1818
1819def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001820 test_classes = (
1821 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001822 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001823 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001824 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001825 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001826 TestSetOfSets,
1827 TestExceptionPropagation,
1828 TestBasicOpsEmpty,
1829 TestBasicOpsSingleton,
1830 TestBasicOpsTuple,
1831 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001832 TestBasicOpsString,
1833 TestBasicOpsBytes,
1834 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001835 TestBinaryOps,
1836 TestUpdateOps,
1837 TestMutate,
1838 TestSubsetEqualEmpty,
1839 TestSubsetEqualNonEmpty,
1840 TestSubsetEmptyNonEmpty,
1841 TestSubsetPartial,
1842 TestSubsetNonOverlap,
1843 TestOnlySetsNumeric,
1844 TestOnlySetsDict,
1845 TestOnlySetsOperator,
1846 TestOnlySetsTuple,
1847 TestOnlySetsString,
1848 TestOnlySetsGenerator,
1849 TestCopyingEmpty,
1850 TestCopyingSingleton,
1851 TestCopyingTriple,
1852 TestCopyingTuple,
1853 TestCopyingNested,
1854 TestIdentities,
1855 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001856 TestGraphs,
Éric Araujo23eae862010-09-05 18:43:07 +00001857 TestWeirdBugs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001858 )
1859
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001860 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001861
1862 # verify reference counting
1863 if verbose and hasattr(sys, "gettotalrefcount"):
1864 import gc
1865 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001866 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001867 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001868 gc.collect()
1869 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001870 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001871
1872if __name__ == "__main__":
1873 test_main(verbose=True)