blob: 07bfe0657ec07536c0ab95f859079d8271e2e967 [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
Raymond Hettingereae05de2004-07-09 04:51:24 +0000736 def test_print(self):
737 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000738 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000739 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000740 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000741 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000742 self.assertEqual(fo.read(), repr(self.set))
743 finally:
744 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000745 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000746
Raymond Hettingera690a992003-11-16 16:17:49 +0000747 def test_length(self):
748 self.assertEqual(len(self.set), self.length)
749
750 def test_self_equality(self):
751 self.assertEqual(self.set, self.set)
752
753 def test_equivalent_equality(self):
754 self.assertEqual(self.set, self.dup)
755
756 def test_copy(self):
757 self.assertEqual(self.set.copy(), self.dup)
758
759 def test_self_union(self):
760 result = self.set | self.set
761 self.assertEqual(result, self.dup)
762
763 def test_empty_union(self):
764 result = self.set | empty_set
765 self.assertEqual(result, self.dup)
766
767 def test_union_empty(self):
768 result = empty_set | self.set
769 self.assertEqual(result, self.dup)
770
771 def test_self_intersection(self):
772 result = self.set & self.set
773 self.assertEqual(result, self.dup)
774
775 def test_empty_intersection(self):
776 result = self.set & empty_set
777 self.assertEqual(result, empty_set)
778
779 def test_intersection_empty(self):
780 result = empty_set & self.set
781 self.assertEqual(result, empty_set)
782
Guido van Rossum58da9312007-11-10 23:39:45 +0000783 def test_self_isdisjoint(self):
784 result = self.set.isdisjoint(self.set)
785 self.assertEqual(result, not self.set)
786
787 def test_empty_isdisjoint(self):
788 result = self.set.isdisjoint(empty_set)
789 self.assertEqual(result, True)
790
791 def test_isdisjoint_empty(self):
792 result = empty_set.isdisjoint(self.set)
793 self.assertEqual(result, True)
794
Raymond Hettingera690a992003-11-16 16:17:49 +0000795 def test_self_symmetric_difference(self):
796 result = self.set ^ self.set
797 self.assertEqual(result, empty_set)
798
Georg Brandl33b6a312010-08-01 06:44:46 +0000799 def test_empty_symmetric_difference(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000800 result = self.set ^ empty_set
801 self.assertEqual(result, self.set)
802
803 def test_self_difference(self):
804 result = self.set - self.set
805 self.assertEqual(result, empty_set)
806
807 def test_empty_difference(self):
808 result = self.set - empty_set
809 self.assertEqual(result, self.dup)
810
811 def test_empty_difference_rev(self):
812 result = empty_set - self.set
813 self.assertEqual(result, empty_set)
814
815 def test_iteration(self):
816 for v in self.set:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000817 self.assertIn(v, self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000818 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000819 # note: __length_hint__ is an internal undocumented API,
820 # don't rely on it in your own programs
821 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000822
823 def test_pickling(self):
824 p = pickle.dumps(self.set)
825 copy = pickle.loads(p)
826 self.assertEqual(self.set, copy,
827 "%s != %s" % (self.set, copy))
828
829#------------------------------------------------------------------------------
830
831class TestBasicOpsEmpty(TestBasicOps):
832 def setUp(self):
833 self.case = "empty set"
834 self.values = []
835 self.set = set(self.values)
836 self.dup = set(self.values)
837 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000838 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000839
840#------------------------------------------------------------------------------
841
842class TestBasicOpsSingleton(TestBasicOps):
843 def setUp(self):
844 self.case = "unit set (number)"
845 self.values = [3]
846 self.set = set(self.values)
847 self.dup = set(self.values)
848 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000849 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000850
851 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000852 self.assertIn(3, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000853
854 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000855 self.assertNotIn(2, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000856
857#------------------------------------------------------------------------------
858
859class TestBasicOpsTuple(TestBasicOps):
860 def setUp(self):
861 self.case = "unit set (tuple)"
862 self.values = [(0, "zero")]
863 self.set = set(self.values)
864 self.dup = set(self.values)
865 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000866 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000867
868 def test_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000869 self.assertIn((0, "zero"), self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000870
871 def test_not_in(self):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000872 self.assertNotIn(9, self.set)
Raymond Hettingera690a992003-11-16 16:17:49 +0000873
874#------------------------------------------------------------------------------
875
876class TestBasicOpsTriple(TestBasicOps):
877 def setUp(self):
878 self.case = "triple set"
879 self.values = [0, "zero", operator.add]
880 self.set = set(self.values)
881 self.dup = set(self.values)
882 self.length = 3
883 self.repr = None
884
Christian Heimes0ded5b52007-12-10 15:50:56 +0000885#------------------------------------------------------------------------------
886
887class TestBasicOpsString(TestBasicOps):
888 def setUp(self):
889 self.case = "string set"
890 self.values = ["a", "b", "c"]
891 self.set = set(self.values)
892 self.dup = set(self.values)
893 self.length = 3
894 self.repr = "{'a', 'c', 'b'}"
895
896#------------------------------------------------------------------------------
897
898class TestBasicOpsBytes(TestBasicOps):
899 def setUp(self):
900 self.case = "string set"
901 self.values = [b"a", b"b", b"c"]
902 self.set = set(self.values)
903 self.dup = set(self.values)
904 self.length = 3
905 self.repr = "{b'a', b'c', b'b'}"
906
907#------------------------------------------------------------------------------
908
909class TestBasicOpsMixedStringBytes(TestBasicOps):
910 def setUp(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000911 self._warning_filters = support.check_warnings()
912 self._warning_filters.__enter__()
Christian Heimes0ded5b52007-12-10 15:50:56 +0000913 warnings.simplefilter('ignore', BytesWarning)
914 self.case = "string and bytes set"
915 self.values = ["a", "b", b"a", b"b"]
916 self.set = set(self.values)
917 self.dup = set(self.values)
918 self.length = 4
919 self.repr = "{'a', b'a', 'b', b'b'}"
920
921 def tearDown(self):
Brett Cannon241bd982010-03-20 21:55:48 +0000922 self._warning_filters.__exit__(None, None, None)
Christian Heimes0ded5b52007-12-10 15:50:56 +0000923
Raymond Hettingera690a992003-11-16 16:17:49 +0000924#==============================================================================
925
926def baditer():
927 raise TypeError
928 yield True
929
930def gooditer():
931 yield True
932
933class TestExceptionPropagation(unittest.TestCase):
934 """SF 628246: Set constructor should not trap iterator TypeErrors"""
935
936 def test_instanceWithException(self):
937 self.assertRaises(TypeError, set, baditer())
938
939 def test_instancesWithoutException(self):
940 # All of these iterables should load without exception.
941 set([1,2,3])
942 set((1,2,3))
943 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000944 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000945 set('abc')
946 set(gooditer())
947
Neal Norwitzfcf44352005-11-27 20:37:43 +0000948 def test_changingSizeWhileIterating(self):
949 s = set([1,2,3])
950 try:
951 for i in s:
952 s.update([4])
953 except RuntimeError:
954 pass
955 else:
956 self.fail("no exception when changing size during iteration")
957
Raymond Hettingera690a992003-11-16 16:17:49 +0000958#==============================================================================
959
960class TestSetOfSets(unittest.TestCase):
961 def test_constructor(self):
962 inner = frozenset([1])
963 outer = set([inner])
964 element = outer.pop()
965 self.assertEqual(type(element), frozenset)
966 outer.add(inner) # Rebuild set of sets with .add method
967 outer.remove(inner)
968 self.assertEqual(outer, set()) # Verify that remove worked
969 outer.discard(inner) # Absence of KeyError indicates working fine
970
971#==============================================================================
972
973class TestBinaryOps(unittest.TestCase):
974 def setUp(self):
975 self.set = set((2, 4, 6))
976
977 def test_eq(self): # SF bug 643115
978 self.assertEqual(self.set, set({2:1,4:3,6:5}))
979
980 def test_union_subset(self):
981 result = self.set | set([2])
982 self.assertEqual(result, set((2, 4, 6)))
983
984 def test_union_superset(self):
985 result = self.set | set([2, 4, 6, 8])
986 self.assertEqual(result, set([2, 4, 6, 8]))
987
988 def test_union_overlap(self):
989 result = self.set | set([3, 4, 5])
990 self.assertEqual(result, set([2, 3, 4, 5, 6]))
991
992 def test_union_non_overlap(self):
993 result = self.set | set([8])
994 self.assertEqual(result, set([2, 4, 6, 8]))
995
996 def test_intersection_subset(self):
997 result = self.set & set((2, 4))
998 self.assertEqual(result, set((2, 4)))
999
1000 def test_intersection_superset(self):
1001 result = self.set & set([2, 4, 6, 8])
1002 self.assertEqual(result, set([2, 4, 6]))
1003
1004 def test_intersection_overlap(self):
1005 result = self.set & set([3, 4, 5])
1006 self.assertEqual(result, set([4]))
1007
1008 def test_intersection_non_overlap(self):
1009 result = self.set & set([8])
1010 self.assertEqual(result, empty_set)
1011
Guido van Rossum58da9312007-11-10 23:39:45 +00001012 def test_isdisjoint_subset(self):
1013 result = self.set.isdisjoint(set((2, 4)))
1014 self.assertEqual(result, False)
1015
1016 def test_isdisjoint_superset(self):
1017 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1018 self.assertEqual(result, False)
1019
1020 def test_isdisjoint_overlap(self):
1021 result = self.set.isdisjoint(set([3, 4, 5]))
1022 self.assertEqual(result, False)
1023
1024 def test_isdisjoint_non_overlap(self):
1025 result = self.set.isdisjoint(set([8]))
1026 self.assertEqual(result, True)
1027
Raymond Hettingera690a992003-11-16 16:17:49 +00001028 def test_sym_difference_subset(self):
1029 result = self.set ^ set((2, 4))
1030 self.assertEqual(result, set([6]))
1031
1032 def test_sym_difference_superset(self):
1033 result = self.set ^ set((2, 4, 6, 8))
1034 self.assertEqual(result, set([8]))
1035
1036 def test_sym_difference_overlap(self):
1037 result = self.set ^ set((3, 4, 5))
1038 self.assertEqual(result, set([2, 3, 5, 6]))
1039
1040 def test_sym_difference_non_overlap(self):
1041 result = self.set ^ set([8])
1042 self.assertEqual(result, set([2, 4, 6, 8]))
1043
Raymond Hettingera690a992003-11-16 16:17:49 +00001044#==============================================================================
1045
1046class TestUpdateOps(unittest.TestCase):
1047 def setUp(self):
1048 self.set = set((2, 4, 6))
1049
1050 def test_union_subset(self):
1051 self.set |= set([2])
1052 self.assertEqual(self.set, set((2, 4, 6)))
1053
1054 def test_union_superset(self):
1055 self.set |= set([2, 4, 6, 8])
1056 self.assertEqual(self.set, set([2, 4, 6, 8]))
1057
1058 def test_union_overlap(self):
1059 self.set |= set([3, 4, 5])
1060 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1061
1062 def test_union_non_overlap(self):
1063 self.set |= set([8])
1064 self.assertEqual(self.set, set([2, 4, 6, 8]))
1065
1066 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001067 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001068 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1069
1070 def test_intersection_subset(self):
1071 self.set &= set((2, 4))
1072 self.assertEqual(self.set, set((2, 4)))
1073
1074 def test_intersection_superset(self):
1075 self.set &= set([2, 4, 6, 8])
1076 self.assertEqual(self.set, set([2, 4, 6]))
1077
1078 def test_intersection_overlap(self):
1079 self.set &= set([3, 4, 5])
1080 self.assertEqual(self.set, set([4]))
1081
1082 def test_intersection_non_overlap(self):
1083 self.set &= set([8])
1084 self.assertEqual(self.set, empty_set)
1085
1086 def test_intersection_method_call(self):
1087 self.set.intersection_update(set([3, 4, 5]))
1088 self.assertEqual(self.set, set([4]))
1089
1090 def test_sym_difference_subset(self):
1091 self.set ^= set((2, 4))
1092 self.assertEqual(self.set, set([6]))
1093
1094 def test_sym_difference_superset(self):
1095 self.set ^= set((2, 4, 6, 8))
1096 self.assertEqual(self.set, set([8]))
1097
1098 def test_sym_difference_overlap(self):
1099 self.set ^= set((3, 4, 5))
1100 self.assertEqual(self.set, set([2, 3, 5, 6]))
1101
1102 def test_sym_difference_non_overlap(self):
1103 self.set ^= set([8])
1104 self.assertEqual(self.set, set([2, 4, 6, 8]))
1105
1106 def test_sym_difference_method_call(self):
1107 self.set.symmetric_difference_update(set([3, 4, 5]))
1108 self.assertEqual(self.set, set([2, 3, 5, 6]))
1109
1110 def test_difference_subset(self):
1111 self.set -= set((2, 4))
1112 self.assertEqual(self.set, set([6]))
1113
1114 def test_difference_superset(self):
1115 self.set -= set((2, 4, 6, 8))
1116 self.assertEqual(self.set, set([]))
1117
1118 def test_difference_overlap(self):
1119 self.set -= set((3, 4, 5))
1120 self.assertEqual(self.set, set([2, 6]))
1121
1122 def test_difference_non_overlap(self):
1123 self.set -= set([8])
1124 self.assertEqual(self.set, set([2, 4, 6]))
1125
1126 def test_difference_method_call(self):
1127 self.set.difference_update(set([3, 4, 5]))
1128 self.assertEqual(self.set, set([2, 6]))
1129
1130#==============================================================================
1131
1132class TestMutate(unittest.TestCase):
1133 def setUp(self):
1134 self.values = ["a", "b", "c"]
1135 self.set = set(self.values)
1136
1137 def test_add_present(self):
1138 self.set.add("c")
1139 self.assertEqual(self.set, set("abc"))
1140
1141 def test_add_absent(self):
1142 self.set.add("d")
1143 self.assertEqual(self.set, set("abcd"))
1144
1145 def test_add_until_full(self):
1146 tmp = set()
1147 expected_len = 0
1148 for v in self.values:
1149 tmp.add(v)
1150 expected_len += 1
1151 self.assertEqual(len(tmp), expected_len)
1152 self.assertEqual(tmp, self.set)
1153
1154 def test_remove_present(self):
1155 self.set.remove("b")
1156 self.assertEqual(self.set, set("ac"))
1157
1158 def test_remove_absent(self):
1159 try:
1160 self.set.remove("d")
1161 self.fail("Removing missing element should have raised LookupError")
1162 except LookupError:
1163 pass
1164
1165 def test_remove_until_empty(self):
1166 expected_len = len(self.set)
1167 for v in self.values:
1168 self.set.remove(v)
1169 expected_len -= 1
1170 self.assertEqual(len(self.set), expected_len)
1171
1172 def test_discard_present(self):
1173 self.set.discard("c")
1174 self.assertEqual(self.set, set("ab"))
1175
1176 def test_discard_absent(self):
1177 self.set.discard("d")
1178 self.assertEqual(self.set, set("abc"))
1179
1180 def test_clear(self):
1181 self.set.clear()
1182 self.assertEqual(len(self.set), 0)
1183
1184 def test_pop(self):
1185 popped = {}
1186 while self.set:
1187 popped[self.set.pop()] = None
1188 self.assertEqual(len(popped), len(self.values))
1189 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001190 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001191
1192 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001193 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001194 self.assertEqual(self.set, set(self.values))
1195
1196 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001197 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001198 self.assertEqual(self.set, set(self.values))
1199
1200 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001201 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001202 self.assertEqual(self.set, set(self.values + ["z"]))
1203
1204#==============================================================================
1205
1206class TestSubsets(unittest.TestCase):
1207
1208 case2method = {"<=": "issubset",
1209 ">=": "issuperset",
1210 }
1211
1212 reverse = {"==": "==",
1213 "!=": "!=",
1214 "<": ">",
1215 ">": "<",
1216 "<=": ">=",
1217 ">=": "<=",
1218 }
1219
1220 def test_issubset(self):
1221 x = self.left
1222 y = self.right
1223 for case in "!=", "==", "<", "<=", ">", ">=":
1224 expected = case in self.cases
1225 # Test the binary infix spelling.
1226 result = eval("x" + case + "y", locals())
1227 self.assertEqual(result, expected)
1228 # Test the "friendly" method-name spelling, if one exists.
1229 if case in TestSubsets.case2method:
1230 method = getattr(x, TestSubsets.case2method[case])
1231 result = method(y)
1232 self.assertEqual(result, expected)
1233
1234 # Now do the same for the operands reversed.
1235 rcase = TestSubsets.reverse[case]
1236 result = eval("y" + rcase + "x", locals())
1237 self.assertEqual(result, expected)
1238 if rcase in TestSubsets.case2method:
1239 method = getattr(y, TestSubsets.case2method[rcase])
1240 result = method(x)
1241 self.assertEqual(result, expected)
1242#------------------------------------------------------------------------------
1243
1244class TestSubsetEqualEmpty(TestSubsets):
1245 left = set()
1246 right = set()
1247 name = "both empty"
1248 cases = "==", "<=", ">="
1249
1250#------------------------------------------------------------------------------
1251
1252class TestSubsetEqualNonEmpty(TestSubsets):
1253 left = set([1, 2])
1254 right = set([1, 2])
1255 name = "equal pair"
1256 cases = "==", "<=", ">="
1257
1258#------------------------------------------------------------------------------
1259
1260class TestSubsetEmptyNonEmpty(TestSubsets):
1261 left = set()
1262 right = set([1, 2])
1263 name = "one empty, one non-empty"
1264 cases = "!=", "<", "<="
1265
1266#------------------------------------------------------------------------------
1267
1268class TestSubsetPartial(TestSubsets):
1269 left = set([1])
1270 right = set([1, 2])
1271 name = "one a non-empty proper subset of other"
1272 cases = "!=", "<", "<="
1273
1274#------------------------------------------------------------------------------
1275
1276class TestSubsetNonOverlap(TestSubsets):
1277 left = set([1])
1278 right = set([2])
1279 name = "neither empty, neither contains"
1280 cases = "!="
1281
1282#==============================================================================
1283
1284class TestOnlySetsInBinaryOps(unittest.TestCase):
1285
1286 def test_eq_ne(self):
1287 # Unlike the others, this is testing that == and != *are* allowed.
1288 self.assertEqual(self.other == self.set, False)
1289 self.assertEqual(self.set == self.other, False)
1290 self.assertEqual(self.other != self.set, True)
1291 self.assertEqual(self.set != self.other, True)
1292
1293 def test_ge_gt_le_lt(self):
1294 self.assertRaises(TypeError, lambda: self.set < self.other)
1295 self.assertRaises(TypeError, lambda: self.set <= self.other)
1296 self.assertRaises(TypeError, lambda: self.set > self.other)
1297 self.assertRaises(TypeError, lambda: self.set >= self.other)
1298
1299 self.assertRaises(TypeError, lambda: self.other < self.set)
1300 self.assertRaises(TypeError, lambda: self.other <= self.set)
1301 self.assertRaises(TypeError, lambda: self.other > self.set)
1302 self.assertRaises(TypeError, lambda: self.other >= self.set)
1303
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001304 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001305 try:
1306 self.set |= self.other
1307 except TypeError:
1308 pass
1309 else:
1310 self.fail("expected TypeError")
1311
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001312 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001313 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001314 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001315 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001316 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001317
1318 def test_union(self):
1319 self.assertRaises(TypeError, lambda: self.set | self.other)
1320 self.assertRaises(TypeError, lambda: self.other | self.set)
1321 if self.otherIsIterable:
1322 self.set.union(self.other)
1323 else:
1324 self.assertRaises(TypeError, self.set.union, self.other)
1325
1326 def test_intersection_update_operator(self):
1327 try:
1328 self.set &= self.other
1329 except TypeError:
1330 pass
1331 else:
1332 self.fail("expected TypeError")
1333
1334 def test_intersection_update(self):
1335 if self.otherIsIterable:
1336 self.set.intersection_update(self.other)
1337 else:
1338 self.assertRaises(TypeError,
1339 self.set.intersection_update,
1340 self.other)
1341
1342 def test_intersection(self):
1343 self.assertRaises(TypeError, lambda: self.set & self.other)
1344 self.assertRaises(TypeError, lambda: self.other & self.set)
1345 if self.otherIsIterable:
1346 self.set.intersection(self.other)
1347 else:
1348 self.assertRaises(TypeError, self.set.intersection, self.other)
1349
1350 def test_sym_difference_update_operator(self):
1351 try:
1352 self.set ^= self.other
1353 except TypeError:
1354 pass
1355 else:
1356 self.fail("expected TypeError")
1357
1358 def test_sym_difference_update(self):
1359 if self.otherIsIterable:
1360 self.set.symmetric_difference_update(self.other)
1361 else:
1362 self.assertRaises(TypeError,
1363 self.set.symmetric_difference_update,
1364 self.other)
1365
1366 def test_sym_difference(self):
1367 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1368 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1369 if self.otherIsIterable:
1370 self.set.symmetric_difference(self.other)
1371 else:
1372 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1373
1374 def test_difference_update_operator(self):
1375 try:
1376 self.set -= self.other
1377 except TypeError:
1378 pass
1379 else:
1380 self.fail("expected TypeError")
1381
1382 def test_difference_update(self):
1383 if self.otherIsIterable:
1384 self.set.difference_update(self.other)
1385 else:
1386 self.assertRaises(TypeError,
1387 self.set.difference_update,
1388 self.other)
1389
1390 def test_difference(self):
1391 self.assertRaises(TypeError, lambda: self.set - self.other)
1392 self.assertRaises(TypeError, lambda: self.other - self.set)
1393 if self.otherIsIterable:
1394 self.set.difference(self.other)
1395 else:
1396 self.assertRaises(TypeError, self.set.difference, self.other)
1397
1398#------------------------------------------------------------------------------
1399
1400class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1401 def setUp(self):
1402 self.set = set((1, 2, 3))
1403 self.other = 19
1404 self.otherIsIterable = False
1405
1406#------------------------------------------------------------------------------
1407
1408class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1409 def setUp(self):
1410 self.set = set((1, 2, 3))
1411 self.other = {1:2, 3:4}
1412 self.otherIsIterable = True
1413
1414#------------------------------------------------------------------------------
1415
1416class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1417 def setUp(self):
1418 self.set = set((1, 2, 3))
1419 self.other = operator.add
1420 self.otherIsIterable = False
1421
1422#------------------------------------------------------------------------------
1423
1424class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1425 def setUp(self):
1426 self.set = set((1, 2, 3))
1427 self.other = (2, 4, 6)
1428 self.otherIsIterable = True
1429
1430#------------------------------------------------------------------------------
1431
1432class TestOnlySetsString(TestOnlySetsInBinaryOps):
1433 def setUp(self):
1434 self.set = set((1, 2, 3))
1435 self.other = 'abc'
1436 self.otherIsIterable = True
1437
1438#------------------------------------------------------------------------------
1439
1440class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1441 def setUp(self):
1442 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001443 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001444 yield i
1445 self.set = set((1, 2, 3))
1446 self.other = gen()
1447 self.otherIsIterable = True
1448
1449#==============================================================================
1450
1451class TestCopying(unittest.TestCase):
1452
1453 def test_copy(self):
1454 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001455 dup_list = sorted(dup, key=repr)
1456 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001457 self.assertEqual(len(dup_list), len(set_list))
1458 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001459 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001460
1461 def test_deep_copy(self):
1462 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001463 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001464 dup_list = sorted(dup, key=repr)
1465 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001466 self.assertEqual(len(dup_list), len(set_list))
1467 for i in range(len(dup_list)):
1468 self.assertEqual(dup_list[i], set_list[i])
1469
1470#------------------------------------------------------------------------------
1471
1472class TestCopyingEmpty(TestCopying):
1473 def setUp(self):
1474 self.set = set()
1475
1476#------------------------------------------------------------------------------
1477
1478class TestCopyingSingleton(TestCopying):
1479 def setUp(self):
1480 self.set = set(["hello"])
1481
1482#------------------------------------------------------------------------------
1483
1484class TestCopyingTriple(TestCopying):
1485 def setUp(self):
1486 self.set = set(["zero", 0, None])
1487
1488#------------------------------------------------------------------------------
1489
1490class TestCopyingTuple(TestCopying):
1491 def setUp(self):
1492 self.set = set([(1, 2)])
1493
1494#------------------------------------------------------------------------------
1495
1496class TestCopyingNested(TestCopying):
1497 def setUp(self):
1498 self.set = set([((1, 2), (3, 4))])
1499
1500#==============================================================================
1501
1502class TestIdentities(unittest.TestCase):
1503 def setUp(self):
1504 self.a = set('abracadabra')
1505 self.b = set('alacazam')
1506
1507 def test_binopsVsSubsets(self):
1508 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001509 self.assertTrue(a - b < a)
1510 self.assertTrue(b - a < b)
1511 self.assertTrue(a & b < a)
1512 self.assertTrue(a & b < b)
1513 self.assertTrue(a | b > a)
1514 self.assertTrue(a | b > b)
1515 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001516
1517 def test_commutativity(self):
1518 a, b = self.a, self.b
1519 self.assertEqual(a&b, b&a)
1520 self.assertEqual(a|b, b|a)
1521 self.assertEqual(a^b, b^a)
1522 if a != b:
1523 self.assertNotEqual(a-b, b-a)
1524
1525 def test_summations(self):
1526 # check that sums of parts equal the whole
1527 a, b = self.a, self.b
1528 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1529 self.assertEqual((a&b)|(a^b), a|b)
1530 self.assertEqual(a|(b-a), a|b)
1531 self.assertEqual((a-b)|b, a|b)
1532 self.assertEqual((a-b)|(a&b), a)
1533 self.assertEqual((b-a)|(a&b), b)
1534 self.assertEqual((a-b)|(b-a), a^b)
1535
1536 def test_exclusion(self):
1537 # check that inverse operations show non-overlap
1538 a, b, zero = self.a, self.b, set()
1539 self.assertEqual((a-b)&b, zero)
1540 self.assertEqual((b-a)&a, zero)
1541 self.assertEqual((a&b)&(a^b), zero)
1542
1543# Tests derived from test_itertools.py =======================================
1544
1545def R(seqn):
1546 'Regular generator'
1547 for i in seqn:
1548 yield i
1549
1550class G:
1551 'Sequence using __getitem__'
1552 def __init__(self, seqn):
1553 self.seqn = seqn
1554 def __getitem__(self, i):
1555 return self.seqn[i]
1556
1557class I:
1558 'Sequence using iterator protocol'
1559 def __init__(self, seqn):
1560 self.seqn = seqn
1561 self.i = 0
1562 def __iter__(self):
1563 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001564 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001565 if self.i >= len(self.seqn): raise StopIteration
1566 v = self.seqn[self.i]
1567 self.i += 1
1568 return v
1569
1570class Ig:
1571 'Sequence using iterator protocol defined with a generator'
1572 def __init__(self, seqn):
1573 self.seqn = seqn
1574 self.i = 0
1575 def __iter__(self):
1576 for val in self.seqn:
1577 yield val
1578
1579class X:
1580 'Missing __getitem__ and __iter__'
1581 def __init__(self, seqn):
1582 self.seqn = seqn
1583 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001584 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001585 if self.i >= len(self.seqn): raise StopIteration
1586 v = self.seqn[self.i]
1587 self.i += 1
1588 return v
1589
1590class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001591 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001592 def __init__(self, seqn):
1593 self.seqn = seqn
1594 self.i = 0
1595 def __iter__(self):
1596 return self
1597
1598class E:
1599 'Test propagation of exceptions'
1600 def __init__(self, seqn):
1601 self.seqn = seqn
1602 self.i = 0
1603 def __iter__(self):
1604 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001605 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001606 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001607
1608class S:
1609 'Test immediate stop'
1610 def __init__(self, seqn):
1611 pass
1612 def __iter__(self):
1613 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001614 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001615 raise StopIteration
1616
Raymond Hettingera6c60372008-03-13 01:26:19 +00001617from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001618def L(seqn):
1619 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001620 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001621
1622class TestVariousIteratorArgs(unittest.TestCase):
1623
1624 def test_constructor(self):
1625 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001626 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001627 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001628 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001629 self.assertRaises(TypeError, cons , X(s))
1630 self.assertRaises(TypeError, cons , N(s))
1631 self.assertRaises(ZeroDivisionError, cons , E(s))
1632
1633 def test_inline_methods(self):
1634 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001635 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001636 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001637 for g in (G, I, Ig, L, R):
1638 expected = meth(data)
1639 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001640 if isinstance(expected, bool):
1641 self.assertEqual(actual, expected)
1642 else:
1643 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001644 self.assertRaises(TypeError, meth, X(s))
1645 self.assertRaises(TypeError, meth, N(s))
1646 self.assertRaises(ZeroDivisionError, meth, E(s))
1647
1648 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001649 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001650 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001651 'difference_update', 'symmetric_difference_update'):
1652 for g in (G, I, Ig, S, L, R):
1653 s = set('january')
1654 t = s.copy()
1655 getattr(s, methname)(list(g(data)))
1656 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001657 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001658
1659 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1660 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1661 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1662
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001663class bad_eq:
1664 def __eq__(self, other):
1665 if be_bad:
1666 set2.clear()
1667 raise ZeroDivisionError
1668 return self is other
1669 def __hash__(self):
1670 return 0
1671
1672class bad_dict_clear:
1673 def __eq__(self, other):
1674 if be_bad:
1675 dict2.clear()
1676 return self is other
1677 def __hash__(self):
1678 return 0
1679
Éric Araujo23eae862010-09-05 18:43:07 +00001680class TestWeirdBugs(unittest.TestCase):
Raymond Hettingerfaf7b7f2010-09-03 10:00:50 +00001681 def test_8420_set_merge(self):
1682 # This used to segfault
1683 global be_bad, set2, dict2
1684 be_bad = False
1685 set1 = {bad_eq()}
1686 set2 = {bad_eq() for i in range(75)}
1687 be_bad = True
1688 self.assertRaises(ZeroDivisionError, set1.update, set2)
1689
1690 be_bad = False
1691 set1 = {bad_dict_clear()}
1692 dict2 = {bad_dict_clear(): None}
1693 be_bad = True
1694 set1.symmetric_difference_update(dict2)
1695
Christian Heimes969fe572008-01-25 11:23:10 +00001696# Application tests (based on David Eppstein's graph recipes ====================================
1697
1698def powerset(U):
1699 """Generates all subsets of a set or sequence U."""
1700 U = iter(U)
1701 try:
1702 x = frozenset([next(U)])
1703 for S in powerset(U):
1704 yield S
1705 yield S | x
1706 except StopIteration:
1707 yield frozenset()
1708
1709def cube(n):
1710 """Graph of n-dimensional hypercube."""
1711 singletons = [frozenset([x]) for x in range(n)]
1712 return dict([(x, frozenset([x^s for s in singletons]))
1713 for x in powerset(range(n))])
1714
1715def linegraph(G):
1716 """Graph, the vertices of which are edges of G,
1717 with two vertices being adjacent iff the corresponding
1718 edges share a vertex."""
1719 L = {}
1720 for x in G:
1721 for y in G[x]:
1722 nx = [frozenset([x,z]) for z in G[x] if z != y]
1723 ny = [frozenset([y,z]) for z in G[y] if z != x]
1724 L[frozenset([x,y])] = frozenset(nx+ny)
1725 return L
1726
1727def faces(G):
1728 'Return a set of faces in G. Where a face is a set of vertices on that face'
1729 # currently limited to triangles,squares, and pentagons
1730 f = set()
1731 for v1, edges in G.items():
1732 for v2 in edges:
1733 for v3 in G[v2]:
1734 if v1 == v3:
1735 continue
1736 if v1 in G[v3]:
1737 f.add(frozenset([v1, v2, v3]))
1738 else:
1739 for v4 in G[v3]:
1740 if v4 == v2:
1741 continue
1742 if v1 in G[v4]:
1743 f.add(frozenset([v1, v2, v3, v4]))
1744 else:
1745 for v5 in G[v4]:
1746 if v5 == v3 or v5 == v2:
1747 continue
1748 if v1 in G[v5]:
1749 f.add(frozenset([v1, v2, v3, v4, v5]))
1750 return f
1751
1752
1753class TestGraphs(unittest.TestCase):
1754
1755 def test_cube(self):
1756
1757 g = cube(3) # vert --> {v1, v2, v3}
1758 vertices1 = set(g)
1759 self.assertEqual(len(vertices1), 8) # eight vertices
1760 for edge in g.values():
1761 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1762 vertices2 = set(v for edges in g.values() for v in edges)
1763 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1764
1765 cubefaces = faces(g)
1766 self.assertEqual(len(cubefaces), 6) # six faces
1767 for face in cubefaces:
1768 self.assertEqual(len(face), 4) # each face is a square
1769
1770 def test_cuboctahedron(self):
1771
1772 # http://en.wikipedia.org/wiki/Cuboctahedron
1773 # 8 triangular faces and 6 square faces
1774 # 12 indentical vertices each connecting a triangle and square
1775
1776 g = cube(3)
1777 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1778 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1779
1780 vertices = set(cuboctahedron)
1781 for edges in cuboctahedron.values():
1782 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1783 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1784 self.assertEqual(vertices, othervertices) # edge vertices in original set
1785
1786 cubofaces = faces(cuboctahedron)
1787 facesizes = collections.defaultdict(int)
1788 for face in cubofaces:
1789 facesizes[len(face)] += 1
1790 self.assertEqual(facesizes[3], 8) # eight triangular faces
1791 self.assertEqual(facesizes[4], 6) # six square faces
1792
1793 for vertex in cuboctahedron:
1794 edge = vertex # Cuboctahedron vertices are edges in Cube
1795 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1796 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001797 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001798
1799
Raymond Hettingera690a992003-11-16 16:17:49 +00001800#==============================================================================
1801
1802def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001803 test_classes = (
1804 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001805 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001806 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001807 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001808 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001809 TestSetOfSets,
1810 TestExceptionPropagation,
1811 TestBasicOpsEmpty,
1812 TestBasicOpsSingleton,
1813 TestBasicOpsTuple,
1814 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001815 TestBasicOpsString,
1816 TestBasicOpsBytes,
1817 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001818 TestBinaryOps,
1819 TestUpdateOps,
1820 TestMutate,
1821 TestSubsetEqualEmpty,
1822 TestSubsetEqualNonEmpty,
1823 TestSubsetEmptyNonEmpty,
1824 TestSubsetPartial,
1825 TestSubsetNonOverlap,
1826 TestOnlySetsNumeric,
1827 TestOnlySetsDict,
1828 TestOnlySetsOperator,
1829 TestOnlySetsTuple,
1830 TestOnlySetsString,
1831 TestOnlySetsGenerator,
1832 TestCopyingEmpty,
1833 TestCopyingSingleton,
1834 TestCopyingTriple,
1835 TestCopyingTuple,
1836 TestCopyingNested,
1837 TestIdentities,
1838 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001839 TestGraphs,
Éric Araujo23eae862010-09-05 18:43:07 +00001840 TestWeirdBugs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001841 )
1842
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001843 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001844
1845 # verify reference counting
1846 if verbose and hasattr(sys, "gettotalrefcount"):
1847 import gc
1848 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001849 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001850 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001851 gc.collect()
1852 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001853 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001854
1855if __name__ == "__main__":
1856 test_main(verbose=True)