blob: 26977d9257eae70973fb695c4f042aa3fab00f79 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17: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 Hettingereae05de2004-07-09 04:51:24 +00008import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00009from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +000010import sys
Christian Heimes0ded5b52007-12-10 15:50:56 +000011import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000012import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000013
14class PassThru(Exception):
15 pass
16
17def check_pass_thru():
18 raise PassThru
19 yield 1
20
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000021class BadCmp:
22 def __hash__(self):
23 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000024 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000025 raise RuntimeError
26
Thomas Wouters902d6eb2007-01-09 23:18:33 +000027class ReprWrapper:
28 'Used to test self-referential repr() calls'
29 def __repr__(self):
30 return repr(self.value)
31
Thomas Wouterscf297e42007-02-23 15:07:44 +000032class HashCountingInt(int):
33 'int-like object that counts the number of times __hash__ is called'
34 def __init__(self, *args):
35 self.hash_count = 0
36 def __hash__(self):
37 self.hash_count += 1
38 return int.__hash__(self)
39
Raymond Hettingera690a992003-11-16 16:17:49 +000040class TestJointOps(unittest.TestCase):
41 # Tests common to both set and frozenset
42
43 def setUp(self):
44 self.word = word = 'simsalabim'
45 self.otherword = 'madagascar'
46 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
47 self.s = self.thetype(word)
48 self.d = dict.fromkeys(word)
49
Raymond Hettinger6429a472004-09-28 01:51:35 +000050 def test_new_or_init(self):
51 self.assertRaises(TypeError, self.thetype, [], 2)
52
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
586 # This first tries the bulitin rich set comparison, which doesn't know
587 # 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):
610 self.assertEqual(set('abc').test_c_api(), True)
611
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
799 def checkempty_symmetric_difference(self):
800 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):
911 self.warning_filters = warnings.filters[:]
912 warnings.simplefilter('ignore', BytesWarning)
913 self.case = "string and bytes set"
914 self.values = ["a", "b", b"a", b"b"]
915 self.set = set(self.values)
916 self.dup = set(self.values)
917 self.length = 4
918 self.repr = "{'a', b'a', 'b', b'b'}"
919
920 def tearDown(self):
921 warnings.filters = self.warning_filters
922
Raymond Hettingera690a992003-11-16 16:17:49 +0000923#==============================================================================
924
925def baditer():
926 raise TypeError
927 yield True
928
929def gooditer():
930 yield True
931
932class TestExceptionPropagation(unittest.TestCase):
933 """SF 628246: Set constructor should not trap iterator TypeErrors"""
934
935 def test_instanceWithException(self):
936 self.assertRaises(TypeError, set, baditer())
937
938 def test_instancesWithoutException(self):
939 # All of these iterables should load without exception.
940 set([1,2,3])
941 set((1,2,3))
942 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000943 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000944 set('abc')
945 set(gooditer())
946
Neal Norwitzfcf44352005-11-27 20:37:43 +0000947 def test_changingSizeWhileIterating(self):
948 s = set([1,2,3])
949 try:
950 for i in s:
951 s.update([4])
952 except RuntimeError:
953 pass
954 else:
955 self.fail("no exception when changing size during iteration")
956
Raymond Hettingera690a992003-11-16 16:17:49 +0000957#==============================================================================
958
959class TestSetOfSets(unittest.TestCase):
960 def test_constructor(self):
961 inner = frozenset([1])
962 outer = set([inner])
963 element = outer.pop()
964 self.assertEqual(type(element), frozenset)
965 outer.add(inner) # Rebuild set of sets with .add method
966 outer.remove(inner)
967 self.assertEqual(outer, set()) # Verify that remove worked
968 outer.discard(inner) # Absence of KeyError indicates working fine
969
970#==============================================================================
971
972class TestBinaryOps(unittest.TestCase):
973 def setUp(self):
974 self.set = set((2, 4, 6))
975
976 def test_eq(self): # SF bug 643115
977 self.assertEqual(self.set, set({2:1,4:3,6:5}))
978
979 def test_union_subset(self):
980 result = self.set | set([2])
981 self.assertEqual(result, set((2, 4, 6)))
982
983 def test_union_superset(self):
984 result = self.set | set([2, 4, 6, 8])
985 self.assertEqual(result, set([2, 4, 6, 8]))
986
987 def test_union_overlap(self):
988 result = self.set | set([3, 4, 5])
989 self.assertEqual(result, set([2, 3, 4, 5, 6]))
990
991 def test_union_non_overlap(self):
992 result = self.set | set([8])
993 self.assertEqual(result, set([2, 4, 6, 8]))
994
995 def test_intersection_subset(self):
996 result = self.set & set((2, 4))
997 self.assertEqual(result, set((2, 4)))
998
999 def test_intersection_superset(self):
1000 result = self.set & set([2, 4, 6, 8])
1001 self.assertEqual(result, set([2, 4, 6]))
1002
1003 def test_intersection_overlap(self):
1004 result = self.set & set([3, 4, 5])
1005 self.assertEqual(result, set([4]))
1006
1007 def test_intersection_non_overlap(self):
1008 result = self.set & set([8])
1009 self.assertEqual(result, empty_set)
1010
Guido van Rossum58da9312007-11-10 23:39:45 +00001011 def test_isdisjoint_subset(self):
1012 result = self.set.isdisjoint(set((2, 4)))
1013 self.assertEqual(result, False)
1014
1015 def test_isdisjoint_superset(self):
1016 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1017 self.assertEqual(result, False)
1018
1019 def test_isdisjoint_overlap(self):
1020 result = self.set.isdisjoint(set([3, 4, 5]))
1021 self.assertEqual(result, False)
1022
1023 def test_isdisjoint_non_overlap(self):
1024 result = self.set.isdisjoint(set([8]))
1025 self.assertEqual(result, True)
1026
Raymond Hettingera690a992003-11-16 16:17:49 +00001027 def test_sym_difference_subset(self):
1028 result = self.set ^ set((2, 4))
1029 self.assertEqual(result, set([6]))
1030
1031 def test_sym_difference_superset(self):
1032 result = self.set ^ set((2, 4, 6, 8))
1033 self.assertEqual(result, set([8]))
1034
1035 def test_sym_difference_overlap(self):
1036 result = self.set ^ set((3, 4, 5))
1037 self.assertEqual(result, set([2, 3, 5, 6]))
1038
1039 def test_sym_difference_non_overlap(self):
1040 result = self.set ^ set([8])
1041 self.assertEqual(result, set([2, 4, 6, 8]))
1042
Raymond Hettingera690a992003-11-16 16:17:49 +00001043#==============================================================================
1044
1045class TestUpdateOps(unittest.TestCase):
1046 def setUp(self):
1047 self.set = set((2, 4, 6))
1048
1049 def test_union_subset(self):
1050 self.set |= set([2])
1051 self.assertEqual(self.set, set((2, 4, 6)))
1052
1053 def test_union_superset(self):
1054 self.set |= set([2, 4, 6, 8])
1055 self.assertEqual(self.set, set([2, 4, 6, 8]))
1056
1057 def test_union_overlap(self):
1058 self.set |= set([3, 4, 5])
1059 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1060
1061 def test_union_non_overlap(self):
1062 self.set |= set([8])
1063 self.assertEqual(self.set, set([2, 4, 6, 8]))
1064
1065 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001066 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001067 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1068
1069 def test_intersection_subset(self):
1070 self.set &= set((2, 4))
1071 self.assertEqual(self.set, set((2, 4)))
1072
1073 def test_intersection_superset(self):
1074 self.set &= set([2, 4, 6, 8])
1075 self.assertEqual(self.set, set([2, 4, 6]))
1076
1077 def test_intersection_overlap(self):
1078 self.set &= set([3, 4, 5])
1079 self.assertEqual(self.set, set([4]))
1080
1081 def test_intersection_non_overlap(self):
1082 self.set &= set([8])
1083 self.assertEqual(self.set, empty_set)
1084
1085 def test_intersection_method_call(self):
1086 self.set.intersection_update(set([3, 4, 5]))
1087 self.assertEqual(self.set, set([4]))
1088
1089 def test_sym_difference_subset(self):
1090 self.set ^= set((2, 4))
1091 self.assertEqual(self.set, set([6]))
1092
1093 def test_sym_difference_superset(self):
1094 self.set ^= set((2, 4, 6, 8))
1095 self.assertEqual(self.set, set([8]))
1096
1097 def test_sym_difference_overlap(self):
1098 self.set ^= set((3, 4, 5))
1099 self.assertEqual(self.set, set([2, 3, 5, 6]))
1100
1101 def test_sym_difference_non_overlap(self):
1102 self.set ^= set([8])
1103 self.assertEqual(self.set, set([2, 4, 6, 8]))
1104
1105 def test_sym_difference_method_call(self):
1106 self.set.symmetric_difference_update(set([3, 4, 5]))
1107 self.assertEqual(self.set, set([2, 3, 5, 6]))
1108
1109 def test_difference_subset(self):
1110 self.set -= set((2, 4))
1111 self.assertEqual(self.set, set([6]))
1112
1113 def test_difference_superset(self):
1114 self.set -= set((2, 4, 6, 8))
1115 self.assertEqual(self.set, set([]))
1116
1117 def test_difference_overlap(self):
1118 self.set -= set((3, 4, 5))
1119 self.assertEqual(self.set, set([2, 6]))
1120
1121 def test_difference_non_overlap(self):
1122 self.set -= set([8])
1123 self.assertEqual(self.set, set([2, 4, 6]))
1124
1125 def test_difference_method_call(self):
1126 self.set.difference_update(set([3, 4, 5]))
1127 self.assertEqual(self.set, set([2, 6]))
1128
1129#==============================================================================
1130
1131class TestMutate(unittest.TestCase):
1132 def setUp(self):
1133 self.values = ["a", "b", "c"]
1134 self.set = set(self.values)
1135
1136 def test_add_present(self):
1137 self.set.add("c")
1138 self.assertEqual(self.set, set("abc"))
1139
1140 def test_add_absent(self):
1141 self.set.add("d")
1142 self.assertEqual(self.set, set("abcd"))
1143
1144 def test_add_until_full(self):
1145 tmp = set()
1146 expected_len = 0
1147 for v in self.values:
1148 tmp.add(v)
1149 expected_len += 1
1150 self.assertEqual(len(tmp), expected_len)
1151 self.assertEqual(tmp, self.set)
1152
1153 def test_remove_present(self):
1154 self.set.remove("b")
1155 self.assertEqual(self.set, set("ac"))
1156
1157 def test_remove_absent(self):
1158 try:
1159 self.set.remove("d")
1160 self.fail("Removing missing element should have raised LookupError")
1161 except LookupError:
1162 pass
1163
1164 def test_remove_until_empty(self):
1165 expected_len = len(self.set)
1166 for v in self.values:
1167 self.set.remove(v)
1168 expected_len -= 1
1169 self.assertEqual(len(self.set), expected_len)
1170
1171 def test_discard_present(self):
1172 self.set.discard("c")
1173 self.assertEqual(self.set, set("ab"))
1174
1175 def test_discard_absent(self):
1176 self.set.discard("d")
1177 self.assertEqual(self.set, set("abc"))
1178
1179 def test_clear(self):
1180 self.set.clear()
1181 self.assertEqual(len(self.set), 0)
1182
1183 def test_pop(self):
1184 popped = {}
1185 while self.set:
1186 popped[self.set.pop()] = None
1187 self.assertEqual(len(popped), len(self.values))
1188 for v in self.values:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001189 self.assertIn(v, popped)
Raymond Hettingera690a992003-11-16 16:17:49 +00001190
1191 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001192 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001193 self.assertEqual(self.set, set(self.values))
1194
1195 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001196 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001197 self.assertEqual(self.set, set(self.values))
1198
1199 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001200 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001201 self.assertEqual(self.set, set(self.values + ["z"]))
1202
1203#==============================================================================
1204
1205class TestSubsets(unittest.TestCase):
1206
1207 case2method = {"<=": "issubset",
1208 ">=": "issuperset",
1209 }
1210
1211 reverse = {"==": "==",
1212 "!=": "!=",
1213 "<": ">",
1214 ">": "<",
1215 "<=": ">=",
1216 ">=": "<=",
1217 }
1218
1219 def test_issubset(self):
1220 x = self.left
1221 y = self.right
1222 for case in "!=", "==", "<", "<=", ">", ">=":
1223 expected = case in self.cases
1224 # Test the binary infix spelling.
1225 result = eval("x" + case + "y", locals())
1226 self.assertEqual(result, expected)
1227 # Test the "friendly" method-name spelling, if one exists.
1228 if case in TestSubsets.case2method:
1229 method = getattr(x, TestSubsets.case2method[case])
1230 result = method(y)
1231 self.assertEqual(result, expected)
1232
1233 # Now do the same for the operands reversed.
1234 rcase = TestSubsets.reverse[case]
1235 result = eval("y" + rcase + "x", locals())
1236 self.assertEqual(result, expected)
1237 if rcase in TestSubsets.case2method:
1238 method = getattr(y, TestSubsets.case2method[rcase])
1239 result = method(x)
1240 self.assertEqual(result, expected)
1241#------------------------------------------------------------------------------
1242
1243class TestSubsetEqualEmpty(TestSubsets):
1244 left = set()
1245 right = set()
1246 name = "both empty"
1247 cases = "==", "<=", ">="
1248
1249#------------------------------------------------------------------------------
1250
1251class TestSubsetEqualNonEmpty(TestSubsets):
1252 left = set([1, 2])
1253 right = set([1, 2])
1254 name = "equal pair"
1255 cases = "==", "<=", ">="
1256
1257#------------------------------------------------------------------------------
1258
1259class TestSubsetEmptyNonEmpty(TestSubsets):
1260 left = set()
1261 right = set([1, 2])
1262 name = "one empty, one non-empty"
1263 cases = "!=", "<", "<="
1264
1265#------------------------------------------------------------------------------
1266
1267class TestSubsetPartial(TestSubsets):
1268 left = set([1])
1269 right = set([1, 2])
1270 name = "one a non-empty proper subset of other"
1271 cases = "!=", "<", "<="
1272
1273#------------------------------------------------------------------------------
1274
1275class TestSubsetNonOverlap(TestSubsets):
1276 left = set([1])
1277 right = set([2])
1278 name = "neither empty, neither contains"
1279 cases = "!="
1280
1281#==============================================================================
1282
1283class TestOnlySetsInBinaryOps(unittest.TestCase):
1284
1285 def test_eq_ne(self):
1286 # Unlike the others, this is testing that == and != *are* allowed.
1287 self.assertEqual(self.other == self.set, False)
1288 self.assertEqual(self.set == self.other, False)
1289 self.assertEqual(self.other != self.set, True)
1290 self.assertEqual(self.set != self.other, True)
1291
1292 def test_ge_gt_le_lt(self):
1293 self.assertRaises(TypeError, lambda: self.set < self.other)
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
1298 self.assertRaises(TypeError, lambda: self.other < self.set)
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
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001303 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001304 try:
1305 self.set |= self.other
1306 except TypeError:
1307 pass
1308 else:
1309 self.fail("expected TypeError")
1310
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001311 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001312 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001313 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001314 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001315 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001316
1317 def test_union(self):
1318 self.assertRaises(TypeError, lambda: self.set | self.other)
1319 self.assertRaises(TypeError, lambda: self.other | self.set)
1320 if self.otherIsIterable:
1321 self.set.union(self.other)
1322 else:
1323 self.assertRaises(TypeError, self.set.union, self.other)
1324
1325 def test_intersection_update_operator(self):
1326 try:
1327 self.set &= self.other
1328 except TypeError:
1329 pass
1330 else:
1331 self.fail("expected TypeError")
1332
1333 def test_intersection_update(self):
1334 if self.otherIsIterable:
1335 self.set.intersection_update(self.other)
1336 else:
1337 self.assertRaises(TypeError,
1338 self.set.intersection_update,
1339 self.other)
1340
1341 def test_intersection(self):
1342 self.assertRaises(TypeError, lambda: self.set & self.other)
1343 self.assertRaises(TypeError, lambda: self.other & self.set)
1344 if self.otherIsIterable:
1345 self.set.intersection(self.other)
1346 else:
1347 self.assertRaises(TypeError, self.set.intersection, self.other)
1348
1349 def test_sym_difference_update_operator(self):
1350 try:
1351 self.set ^= self.other
1352 except TypeError:
1353 pass
1354 else:
1355 self.fail("expected TypeError")
1356
1357 def test_sym_difference_update(self):
1358 if self.otherIsIterable:
1359 self.set.symmetric_difference_update(self.other)
1360 else:
1361 self.assertRaises(TypeError,
1362 self.set.symmetric_difference_update,
1363 self.other)
1364
1365 def test_sym_difference(self):
1366 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1367 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1368 if self.otherIsIterable:
1369 self.set.symmetric_difference(self.other)
1370 else:
1371 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1372
1373 def test_difference_update_operator(self):
1374 try:
1375 self.set -= self.other
1376 except TypeError:
1377 pass
1378 else:
1379 self.fail("expected TypeError")
1380
1381 def test_difference_update(self):
1382 if self.otherIsIterable:
1383 self.set.difference_update(self.other)
1384 else:
1385 self.assertRaises(TypeError,
1386 self.set.difference_update,
1387 self.other)
1388
1389 def test_difference(self):
1390 self.assertRaises(TypeError, lambda: self.set - self.other)
1391 self.assertRaises(TypeError, lambda: self.other - self.set)
1392 if self.otherIsIterable:
1393 self.set.difference(self.other)
1394 else:
1395 self.assertRaises(TypeError, self.set.difference, self.other)
1396
1397#------------------------------------------------------------------------------
1398
1399class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1400 def setUp(self):
1401 self.set = set((1, 2, 3))
1402 self.other = 19
1403 self.otherIsIterable = False
1404
1405#------------------------------------------------------------------------------
1406
1407class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1408 def setUp(self):
1409 self.set = set((1, 2, 3))
1410 self.other = {1:2, 3:4}
1411 self.otherIsIterable = True
1412
1413#------------------------------------------------------------------------------
1414
1415class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1416 def setUp(self):
1417 self.set = set((1, 2, 3))
1418 self.other = operator.add
1419 self.otherIsIterable = False
1420
1421#------------------------------------------------------------------------------
1422
1423class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1424 def setUp(self):
1425 self.set = set((1, 2, 3))
1426 self.other = (2, 4, 6)
1427 self.otherIsIterable = True
1428
1429#------------------------------------------------------------------------------
1430
1431class TestOnlySetsString(TestOnlySetsInBinaryOps):
1432 def setUp(self):
1433 self.set = set((1, 2, 3))
1434 self.other = 'abc'
1435 self.otherIsIterable = True
1436
1437#------------------------------------------------------------------------------
1438
1439class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1440 def setUp(self):
1441 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001442 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001443 yield i
1444 self.set = set((1, 2, 3))
1445 self.other = gen()
1446 self.otherIsIterable = True
1447
1448#==============================================================================
1449
1450class TestCopying(unittest.TestCase):
1451
1452 def test_copy(self):
1453 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001454 dup_list = sorted(dup, key=repr)
1455 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001456 self.assertEqual(len(dup_list), len(set_list))
1457 for i in range(len(dup_list)):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001458 self.assertTrue(dup_list[i] is set_list[i])
Raymond Hettingera690a992003-11-16 16:17:49 +00001459
1460 def test_deep_copy(self):
1461 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001462 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001463 dup_list = sorted(dup, key=repr)
1464 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001465 self.assertEqual(len(dup_list), len(set_list))
1466 for i in range(len(dup_list)):
1467 self.assertEqual(dup_list[i], set_list[i])
1468
1469#------------------------------------------------------------------------------
1470
1471class TestCopyingEmpty(TestCopying):
1472 def setUp(self):
1473 self.set = set()
1474
1475#------------------------------------------------------------------------------
1476
1477class TestCopyingSingleton(TestCopying):
1478 def setUp(self):
1479 self.set = set(["hello"])
1480
1481#------------------------------------------------------------------------------
1482
1483class TestCopyingTriple(TestCopying):
1484 def setUp(self):
1485 self.set = set(["zero", 0, None])
1486
1487#------------------------------------------------------------------------------
1488
1489class TestCopyingTuple(TestCopying):
1490 def setUp(self):
1491 self.set = set([(1, 2)])
1492
1493#------------------------------------------------------------------------------
1494
1495class TestCopyingNested(TestCopying):
1496 def setUp(self):
1497 self.set = set([((1, 2), (3, 4))])
1498
1499#==============================================================================
1500
1501class TestIdentities(unittest.TestCase):
1502 def setUp(self):
1503 self.a = set('abracadabra')
1504 self.b = set('alacazam')
1505
1506 def test_binopsVsSubsets(self):
1507 a, b = self.a, self.b
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001508 self.assertTrue(a - b < a)
1509 self.assertTrue(b - a < b)
1510 self.assertTrue(a & b < a)
1511 self.assertTrue(a & b < b)
1512 self.assertTrue(a | b > a)
1513 self.assertTrue(a | b > b)
1514 self.assertTrue(a ^ b < a | b)
Raymond Hettingera690a992003-11-16 16:17:49 +00001515
1516 def test_commutativity(self):
1517 a, b = self.a, self.b
1518 self.assertEqual(a&b, b&a)
1519 self.assertEqual(a|b, b|a)
1520 self.assertEqual(a^b, b^a)
1521 if a != b:
1522 self.assertNotEqual(a-b, b-a)
1523
1524 def test_summations(self):
1525 # check that sums of parts equal the whole
1526 a, b = self.a, self.b
1527 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1528 self.assertEqual((a&b)|(a^b), a|b)
1529 self.assertEqual(a|(b-a), a|b)
1530 self.assertEqual((a-b)|b, a|b)
1531 self.assertEqual((a-b)|(a&b), a)
1532 self.assertEqual((b-a)|(a&b), b)
1533 self.assertEqual((a-b)|(b-a), a^b)
1534
1535 def test_exclusion(self):
1536 # check that inverse operations show non-overlap
1537 a, b, zero = self.a, self.b, set()
1538 self.assertEqual((a-b)&b, zero)
1539 self.assertEqual((b-a)&a, zero)
1540 self.assertEqual((a&b)&(a^b), zero)
1541
1542# Tests derived from test_itertools.py =======================================
1543
1544def R(seqn):
1545 'Regular generator'
1546 for i in seqn:
1547 yield i
1548
1549class G:
1550 'Sequence using __getitem__'
1551 def __init__(self, seqn):
1552 self.seqn = seqn
1553 def __getitem__(self, i):
1554 return self.seqn[i]
1555
1556class I:
1557 'Sequence using iterator protocol'
1558 def __init__(self, seqn):
1559 self.seqn = seqn
1560 self.i = 0
1561 def __iter__(self):
1562 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001563 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001564 if self.i >= len(self.seqn): raise StopIteration
1565 v = self.seqn[self.i]
1566 self.i += 1
1567 return v
1568
1569class Ig:
1570 'Sequence using iterator protocol defined with a generator'
1571 def __init__(self, seqn):
1572 self.seqn = seqn
1573 self.i = 0
1574 def __iter__(self):
1575 for val in self.seqn:
1576 yield val
1577
1578class X:
1579 'Missing __getitem__ and __iter__'
1580 def __init__(self, seqn):
1581 self.seqn = seqn
1582 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001583 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001584 if self.i >= len(self.seqn): raise StopIteration
1585 v = self.seqn[self.i]
1586 self.i += 1
1587 return v
1588
1589class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001590 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001591 def __init__(self, seqn):
1592 self.seqn = seqn
1593 self.i = 0
1594 def __iter__(self):
1595 return self
1596
1597class E:
1598 'Test propagation of exceptions'
1599 def __init__(self, seqn):
1600 self.seqn = seqn
1601 self.i = 0
1602 def __iter__(self):
1603 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001604 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001605 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001606
1607class S:
1608 'Test immediate stop'
1609 def __init__(self, seqn):
1610 pass
1611 def __iter__(self):
1612 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001613 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001614 raise StopIteration
1615
Raymond Hettingera6c60372008-03-13 01:26:19 +00001616from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001617def L(seqn):
1618 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001619 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001620
1621class TestVariousIteratorArgs(unittest.TestCase):
1622
1623 def test_constructor(self):
1624 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001625 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001626 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001627 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001628 self.assertRaises(TypeError, cons , X(s))
1629 self.assertRaises(TypeError, cons , N(s))
1630 self.assertRaises(ZeroDivisionError, cons , E(s))
1631
1632 def test_inline_methods(self):
1633 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001634 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001635 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001636 for g in (G, I, Ig, L, R):
1637 expected = meth(data)
1638 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001639 if isinstance(expected, bool):
1640 self.assertEqual(actual, expected)
1641 else:
1642 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001643 self.assertRaises(TypeError, meth, X(s))
1644 self.assertRaises(TypeError, meth, N(s))
1645 self.assertRaises(ZeroDivisionError, meth, E(s))
1646
1647 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001648 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001649 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001650 'difference_update', 'symmetric_difference_update'):
1651 for g in (G, I, Ig, S, L, R):
1652 s = set('january')
1653 t = s.copy()
1654 getattr(s, methname)(list(g(data)))
1655 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001656 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001657
1658 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1659 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1660 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1661
Christian Heimes969fe572008-01-25 11:23:10 +00001662# Application tests (based on David Eppstein's graph recipes ====================================
1663
1664def powerset(U):
1665 """Generates all subsets of a set or sequence U."""
1666 U = iter(U)
1667 try:
1668 x = frozenset([next(U)])
1669 for S in powerset(U):
1670 yield S
1671 yield S | x
1672 except StopIteration:
1673 yield frozenset()
1674
1675def cube(n):
1676 """Graph of n-dimensional hypercube."""
1677 singletons = [frozenset([x]) for x in range(n)]
1678 return dict([(x, frozenset([x^s for s in singletons]))
1679 for x in powerset(range(n))])
1680
1681def linegraph(G):
1682 """Graph, the vertices of which are edges of G,
1683 with two vertices being adjacent iff the corresponding
1684 edges share a vertex."""
1685 L = {}
1686 for x in G:
1687 for y in G[x]:
1688 nx = [frozenset([x,z]) for z in G[x] if z != y]
1689 ny = [frozenset([y,z]) for z in G[y] if z != x]
1690 L[frozenset([x,y])] = frozenset(nx+ny)
1691 return L
1692
1693def faces(G):
1694 'Return a set of faces in G. Where a face is a set of vertices on that face'
1695 # currently limited to triangles,squares, and pentagons
1696 f = set()
1697 for v1, edges in G.items():
1698 for v2 in edges:
1699 for v3 in G[v2]:
1700 if v1 == v3:
1701 continue
1702 if v1 in G[v3]:
1703 f.add(frozenset([v1, v2, v3]))
1704 else:
1705 for v4 in G[v3]:
1706 if v4 == v2:
1707 continue
1708 if v1 in G[v4]:
1709 f.add(frozenset([v1, v2, v3, v4]))
1710 else:
1711 for v5 in G[v4]:
1712 if v5 == v3 or v5 == v2:
1713 continue
1714 if v1 in G[v5]:
1715 f.add(frozenset([v1, v2, v3, v4, v5]))
1716 return f
1717
1718
1719class TestGraphs(unittest.TestCase):
1720
1721 def test_cube(self):
1722
1723 g = cube(3) # vert --> {v1, v2, v3}
1724 vertices1 = set(g)
1725 self.assertEqual(len(vertices1), 8) # eight vertices
1726 for edge in g.values():
1727 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1728 vertices2 = set(v for edges in g.values() for v in edges)
1729 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1730
1731 cubefaces = faces(g)
1732 self.assertEqual(len(cubefaces), 6) # six faces
1733 for face in cubefaces:
1734 self.assertEqual(len(face), 4) # each face is a square
1735
1736 def test_cuboctahedron(self):
1737
1738 # http://en.wikipedia.org/wiki/Cuboctahedron
1739 # 8 triangular faces and 6 square faces
1740 # 12 indentical vertices each connecting a triangle and square
1741
1742 g = cube(3)
1743 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1744 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1745
1746 vertices = set(cuboctahedron)
1747 for edges in cuboctahedron.values():
1748 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1749 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1750 self.assertEqual(vertices, othervertices) # edge vertices in original set
1751
1752 cubofaces = faces(cuboctahedron)
1753 facesizes = collections.defaultdict(int)
1754 for face in cubofaces:
1755 facesizes[len(face)] += 1
1756 self.assertEqual(facesizes[3], 8) # eight triangular faces
1757 self.assertEqual(facesizes[4], 6) # six square faces
1758
1759 for vertex in cuboctahedron:
1760 edge = vertex # Cuboctahedron vertices are edges in Cube
1761 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1762 for cubevert in edge:
Benjamin Peterson577473f2010-01-19 00:09:57 +00001763 self.assertIn(cubevert, g)
Christian Heimes969fe572008-01-25 11:23:10 +00001764
1765
Raymond Hettingera690a992003-11-16 16:17:49 +00001766#==============================================================================
1767
1768def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001769 test_classes = (
1770 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001771 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001772 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001773 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001774 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001775 TestSetOfSets,
1776 TestExceptionPropagation,
1777 TestBasicOpsEmpty,
1778 TestBasicOpsSingleton,
1779 TestBasicOpsTuple,
1780 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001781 TestBasicOpsString,
1782 TestBasicOpsBytes,
1783 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001784 TestBinaryOps,
1785 TestUpdateOps,
1786 TestMutate,
1787 TestSubsetEqualEmpty,
1788 TestSubsetEqualNonEmpty,
1789 TestSubsetEmptyNonEmpty,
1790 TestSubsetPartial,
1791 TestSubsetNonOverlap,
1792 TestOnlySetsNumeric,
1793 TestOnlySetsDict,
1794 TestOnlySetsOperator,
1795 TestOnlySetsTuple,
1796 TestOnlySetsString,
1797 TestOnlySetsGenerator,
1798 TestCopyingEmpty,
1799 TestCopyingSingleton,
1800 TestCopyingTriple,
1801 TestCopyingTuple,
1802 TestCopyingNested,
1803 TestIdentities,
1804 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001805 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001806 )
1807
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001808 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001809
1810 # verify reference counting
1811 if verbose and hasattr(sys, "gettotalrefcount"):
1812 import gc
1813 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001814 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001815 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001816 gc.collect()
1817 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001818 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001819
1820if __name__ == "__main__":
1821 test_main(verbose=True)