blob: 5a8819f52a88f951ff7e6c79f7e61a46a25a5845 [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)])
68 self.assert_(self.thetype(self.letters) in 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
85 def test_or(self):
86 i = self.s.union(self.otherword)
87 self.assertEqual(self.s | set(self.otherword), i)
88 self.assertEqual(self.s | frozenset(self.otherword), i)
89 try:
90 self.s | self.otherword
91 except TypeError:
92 pass
93 else:
94 self.fail("s|t did not screen-out general iterables")
95
96 def test_intersection(self):
97 i = self.s.intersection(self.otherword)
98 for c in self.letters:
99 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000100 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000101 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000102 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000103 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000104 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
105 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
106 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
107 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000108 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000109 s = self.thetype('abcba')
110 z = s.intersection()
111 if self.thetype == frozenset():
112 self.assertEqual(id(s), id(z))
113 else:
114 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000115
Guido van Rossum58da9312007-11-10 23:39:45 +0000116 def test_isdisjoint(self):
117 def f(s1, s2):
118 'Pure python equivalent of isdisjoint()'
119 return not set(s1).intersection(s2)
120 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
121 s1 = self.thetype(larg)
122 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
123 for C in set, frozenset, dict.fromkeys, str, list, tuple:
124 s2 = C(rarg)
125 actual = s1.isdisjoint(s2)
126 expected = f(s1, s2)
127 self.assertEqual(actual, expected)
128 self.assert_(actual is True or actual is False)
129
Raymond Hettingera690a992003-11-16 16:17:49 +0000130 def test_and(self):
131 i = self.s.intersection(self.otherword)
132 self.assertEqual(self.s & set(self.otherword), i)
133 self.assertEqual(self.s & frozenset(self.otherword), i)
134 try:
135 self.s & self.otherword
136 except TypeError:
137 pass
138 else:
139 self.fail("s&t did not screen-out general iterables")
140
141 def test_difference(self):
142 i = self.s.difference(self.otherword)
143 for c in self.letters:
144 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000145 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000146 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000147 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
148 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000149 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000150 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
151 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
152 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
153 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000154 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
155 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000156
157 def test_sub(self):
158 i = self.s.difference(self.otherword)
159 self.assertEqual(self.s - set(self.otherword), i)
160 self.assertEqual(self.s - frozenset(self.otherword), i)
161 try:
162 self.s - self.otherword
163 except TypeError:
164 pass
165 else:
166 self.fail("s-t did not screen-out general iterables")
167
168 def test_symmetric_difference(self):
169 i = self.s.symmetric_difference(self.otherword)
170 for c in self.letters:
171 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000172 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000173 self.assertEqual(type(i), self.basetype)
Raymond Hettingera690a992003-11-16 16:17:49 +0000174 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
175 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000176 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000177 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
178 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
179 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
180 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000181
182 def test_xor(self):
183 i = self.s.symmetric_difference(self.otherword)
184 self.assertEqual(self.s ^ set(self.otherword), i)
185 self.assertEqual(self.s ^ frozenset(self.otherword), i)
186 try:
187 self.s ^ self.otherword
188 except TypeError:
189 pass
190 else:
191 self.fail("s^t did not screen-out general iterables")
192
193 def test_equality(self):
194 self.assertEqual(self.s, set(self.word))
195 self.assertEqual(self.s, frozenset(self.word))
196 self.assertEqual(self.s == self.word, False)
197 self.assertNotEqual(self.s, set(self.otherword))
198 self.assertNotEqual(self.s, frozenset(self.otherword))
199 self.assertEqual(self.s != self.word, True)
200
201 def test_setOfFrozensets(self):
202 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
203 s = self.thetype(t)
204 self.assertEqual(len(s), 3)
205
Raymond Hettingera690a992003-11-16 16:17:49 +0000206 def test_sub_and_super(self):
207 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
208 self.assert_(p < q)
209 self.assert_(p <= q)
210 self.assert_(q <= q)
211 self.assert_(q > p)
212 self.assert_(q >= p)
213 self.failIf(q < r)
214 self.failIf(q <= r)
215 self.failIf(q > r)
216 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000217 self.assert_(set('a').issubset('abc'))
218 self.assert_(set('abc').issuperset('a'))
219 self.failIf(set('a').issubset('cbs'))
220 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000221
222 def test_pickling(self):
Hirokazu Yamamoto801f9d32008-12-27 04:21:44 +0000223 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000224 p = pickle.dumps(self.s, i)
225 dup = pickle.loads(p)
226 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
227 if type(self.s) not in (set, frozenset):
228 self.s.x = 10
229 p = pickle.dumps(self.s)
230 dup = pickle.loads(p)
231 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000232
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000233 def test_deepcopy(self):
234 class Tracer:
235 def __init__(self, value):
236 self.value = value
237 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000238 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000239 def __deepcopy__(self, memo=None):
240 return Tracer(self.value + 1)
241 t = Tracer(10)
242 s = self.thetype([t])
243 dup = copy.deepcopy(s)
244 self.assertNotEqual(id(s), id(dup))
245 for elem in dup:
246 newt = elem
247 self.assertNotEqual(id(t), id(newt))
248 self.assertEqual(t.value + 1, newt.value)
249
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000250 def test_gc(self):
251 # Create a nest of cycles to exercise overall ref count check
252 class A:
253 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000254 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000255 for elem in s:
256 elem.cycle = s
257 elem.sub = elem
258 elem.set = set([elem])
259
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000260 def test_subclass_with_custom_hash(self):
261 # Bug #1257731
262 class H(self.thetype):
263 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000264 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000265 s=H()
266 f=set()
267 f.add(s)
268 self.assert_(s in f)
269 f.remove(s)
270 f.add(s)
271 f.discard(s)
272
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000273 def test_badcmp(self):
274 s = self.thetype([BadCmp()])
275 # Detect comparison errors during insertion and lookup
276 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
277 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
278 # Detect errors during mutating operations
279 if hasattr(s, 'add'):
280 self.assertRaises(RuntimeError, s.add, BadCmp())
281 self.assertRaises(RuntimeError, s.discard, BadCmp())
282 self.assertRaises(RuntimeError, s.remove, BadCmp())
283
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000284 def test_cyclical_repr(self):
285 w = ReprWrapper()
286 s = self.thetype([w])
287 w.value = s
288 if self.thetype == set:
289 self.assertEqual(repr(s), '{set(...)}')
290 else:
291 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000292 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000293
294 def test_cyclical_print(self):
295 w = ReprWrapper()
296 s = self.thetype([w])
297 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000298 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000299 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000300 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000301 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000302 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000303 self.assertEqual(fo.read(), repr(s))
304 finally:
305 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000306 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000307
Thomas Wouterscf297e42007-02-23 15:07:44 +0000308 def test_do_not_rehash_dict_keys(self):
309 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000310 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000311 self.assertEqual(sum(elem.hash_count for elem in d), n)
312 s = self.thetype(d)
313 self.assertEqual(sum(elem.hash_count for elem in d), n)
314 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000315 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000316 if hasattr(s, 'symmetric_difference_update'):
317 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000318 self.assertEqual(sum(elem.hash_count for elem in d), n)
319 d2 = dict.fromkeys(set(d))
320 self.assertEqual(sum(elem.hash_count for elem in d), n)
321 d3 = dict.fromkeys(frozenset(d))
322 self.assertEqual(sum(elem.hash_count for elem in d), n)
323 d3 = dict.fromkeys(frozenset(d), 123)
324 self.assertEqual(sum(elem.hash_count for elem in d), n)
325 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000326
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000327 def test_container_iterator(self):
328 # Bug #3680: tp_traverse was not implemented for set iterator object
329 class C(object):
330 pass
331 obj = C()
332 ref = weakref.ref(obj)
333 container = set([obj, 1])
334 obj.x = iter(container)
335 del obj, container
336 gc.collect()
337 self.assert_(ref() is None, "Cycle was not collected")
338
Raymond Hettingera690a992003-11-16 16:17:49 +0000339class TestSet(TestJointOps):
340 thetype = set
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000341 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000342
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000343 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000344 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000345 s.__init__(self.word)
346 self.assertEqual(s, set(self.word))
347 s.__init__(self.otherword)
348 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000349 self.assertRaises(TypeError, s.__init__, s, 2);
350 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000351
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000352 def test_constructor_identity(self):
353 s = self.thetype(range(3))
354 t = self.thetype(s)
355 self.assertNotEqual(id(s), id(t))
356
Guido van Rossum86e58e22006-08-28 15:27:34 +0000357 def test_set_literal(self):
358 s = set([1,2,3])
359 t = {1,2,3}
360 self.assertEqual(s, t)
361
Raymond Hettingera690a992003-11-16 16:17:49 +0000362 def test_hash(self):
363 self.assertRaises(TypeError, hash, self.s)
364
365 def test_clear(self):
366 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000367 self.assertEqual(self.s, set())
368 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000369
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000370 def test_copy(self):
371 dup = self.s.copy()
372 self.assertEqual(self.s, dup)
373 self.assertNotEqual(id(self.s), id(dup))
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000374 self.assertEqual(type(dup), self.basetype)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000375
Raymond Hettingera690a992003-11-16 16:17:49 +0000376 def test_add(self):
377 self.s.add('Q')
378 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000379 dup = self.s.copy()
380 self.s.add('Q')
381 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000382 self.assertRaises(TypeError, self.s.add, [])
383
384 def test_remove(self):
385 self.s.remove('a')
386 self.assert_('a' not in self.s)
387 self.assertRaises(KeyError, self.s.remove, 'Q')
388 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000389 s = self.thetype([frozenset(self.word)])
390 self.assert_(self.thetype(self.word) in s)
391 s.remove(self.thetype(self.word))
392 self.assert_(self.thetype(self.word) not in s)
393 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000394
Thomas Wouters89f507f2006-12-13 04:49:30 +0000395 def test_remove_keyerror_unpacking(self):
396 # bug: www.python.org/sf/1576657
397 for v1 in ['Q', (1,)]:
398 try:
399 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000400 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 v2 = e.args[0]
402 self.assertEqual(v1, v2)
403 else:
404 self.fail()
405
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000406 def test_remove_keyerror_set(self):
407 key = self.thetype([3, 4])
408 try:
409 self.s.remove(key)
410 except KeyError as e:
411 self.assert_(e.args[0] is key,
412 "KeyError should be {0}, not {1}".format(key,
413 e.args[0]))
414 else:
415 self.fail()
416
Raymond Hettingera690a992003-11-16 16:17:49 +0000417 def test_discard(self):
418 self.s.discard('a')
419 self.assert_('a' not in self.s)
420 self.s.discard('Q')
421 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000422 s = self.thetype([frozenset(self.word)])
423 self.assert_(self.thetype(self.word) in s)
424 s.discard(self.thetype(self.word))
425 self.assert_(self.thetype(self.word) not in s)
426 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000427
428 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000429 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000430 elem = self.s.pop()
431 self.assert_(elem not in self.s)
432 self.assertRaises(KeyError, self.s.pop)
433
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000434 def test_update(self):
435 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000436 self.assertEqual(retval, None)
437 for c in (self.word + self.otherword):
438 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000439 self.assertRaises(PassThru, self.s.update, check_pass_thru())
440 self.assertRaises(TypeError, self.s.update, [[]])
441 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000442 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000443 s = self.thetype('abcba')
444 self.assertEqual(s.update(C(p)), None)
445 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000446 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
447 q = 'ahi'
448 for C in set, frozenset, dict.fromkeys, str, list, tuple:
449 s = self.thetype('abcba')
450 self.assertEqual(s.update(C(p), C(q)), None)
451 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000452
453 def test_ior(self):
454 self.s |= set(self.otherword)
455 for c in (self.word + self.otherword):
456 self.assert_(c in self.s)
457
458 def test_intersection_update(self):
459 retval = self.s.intersection_update(self.otherword)
460 self.assertEqual(retval, None)
461 for c in (self.word + self.otherword):
462 if c in self.otherword and c in self.word:
463 self.assert_(c in self.s)
464 else:
465 self.assert_(c not in self.s)
466 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
467 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000468 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000469 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000470 s = self.thetype('abcba')
471 self.assertEqual(s.intersection_update(C(p)), None)
472 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000473 ss = 'abcba'
474 s = self.thetype(ss)
475 t = 'cbc'
476 self.assertEqual(s.intersection_update(C(p), C(t)), None)
477 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000478
479 def test_iand(self):
480 self.s &= set(self.otherword)
481 for c in (self.word + self.otherword):
482 if c in self.otherword and c in self.word:
483 self.assert_(c in self.s)
484 else:
485 self.assert_(c not in self.s)
486
487 def test_difference_update(self):
488 retval = self.s.difference_update(self.otherword)
489 self.assertEqual(retval, None)
490 for c in (self.word + self.otherword):
491 if c in self.word and c not in self.otherword:
492 self.assert_(c in self.s)
493 else:
494 self.assert_(c not in self.s)
495 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
496 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000497 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
498 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000499 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000500 s = self.thetype('abcba')
501 self.assertEqual(s.difference_update(C(p)), None)
502 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000503
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000504 s = self.thetype('abcdefghih')
505 s.difference_update()
506 self.assertEqual(s, self.thetype('abcdefghih'))
507
508 s = self.thetype('abcdefghih')
509 s.difference_update(C('aba'))
510 self.assertEqual(s, self.thetype('cdefghih'))
511
512 s = self.thetype('abcdefghih')
513 s.difference_update(C('cdc'), C('aba'))
514 self.assertEqual(s, self.thetype('efghih'))
515
Raymond Hettingera690a992003-11-16 16:17:49 +0000516 def test_isub(self):
517 self.s -= set(self.otherword)
518 for c in (self.word + self.otherword):
519 if c in self.word and c not in self.otherword:
520 self.assert_(c in self.s)
521 else:
522 self.assert_(c not in self.s)
523
524 def test_symmetric_difference_update(self):
525 retval = self.s.symmetric_difference_update(self.otherword)
526 self.assertEqual(retval, None)
527 for c in (self.word + self.otherword):
528 if (c in self.word) ^ (c in self.otherword):
529 self.assert_(c in self.s)
530 else:
531 self.assert_(c not in self.s)
532 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
533 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000534 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000535 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000536 s = self.thetype('abcba')
537 self.assertEqual(s.symmetric_difference_update(C(p)), None)
538 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000539
540 def test_ixor(self):
541 self.s ^= set(self.otherword)
542 for c in (self.word + self.otherword):
543 if (c in self.word) ^ (c in self.otherword):
544 self.assert_(c in self.s)
545 else:
546 self.assert_(c not in self.s)
547
Raymond Hettingerc991db22005-08-11 07:58:45 +0000548 def test_inplace_on_self(self):
549 t = self.s.copy()
550 t |= t
551 self.assertEqual(t, self.s)
552 t &= t
553 self.assertEqual(t, self.s)
554 t -= t
555 self.assertEqual(t, self.thetype())
556 t = self.s.copy()
557 t ^= t
558 self.assertEqual(t, self.thetype())
559
Raymond Hettinger691d8052004-05-30 07:26:47 +0000560 def test_weakref(self):
561 s = self.thetype('gallahad')
Antoine Pitrou7ddda782009-01-01 15:35:33 +0000562 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000563 self.assertEqual(str(p), str(s))
564 s = None
565 self.assertRaises(ReferenceError, str, p)
566
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000567 def test_rich_compare(self):
568 class TestRichSetCompare:
569 def __gt__(self, some_set):
570 self.gt_called = True
571 return False
572 def __lt__(self, some_set):
573 self.lt_called = True
574 return False
575 def __ge__(self, some_set):
576 self.ge_called = True
577 return False
578 def __le__(self, some_set):
579 self.le_called = True
580 return False
581
582 # This first tries the bulitin rich set comparison, which doesn't know
583 # how to handle the custom object. Upon returning NotImplemented, the
584 # corresponding comparison on the right object is invoked.
585 myset = {1, 2, 3}
586
587 myobj = TestRichSetCompare()
588 myset < myobj
589 self.assert_(myobj.gt_called)
590
591 myobj = TestRichSetCompare()
592 myset > myobj
593 self.assert_(myobj.lt_called)
594
595 myobj = TestRichSetCompare()
596 myset <= myobj
597 self.assert_(myobj.ge_called)
598
599 myobj = TestRichSetCompare()
600 myset >= myobj
601 self.assert_(myobj.le_called)
602
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000603 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000604 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000605 def test_c_api(self):
606 self.assertEqual(set('abc').test_c_api(), True)
607
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000608class SetSubclass(set):
609 pass
610
611class TestSetSubclass(TestSet):
612 thetype = SetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000613 basetype = set
Raymond Hettingera690a992003-11-16 16:17:49 +0000614
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000615class SetSubclassWithKeywordArgs(set):
616 def __init__(self, iterable=[], newarg=None):
617 set.__init__(self, iterable)
618
619class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000620
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000621 def test_keywords_in_subclass(self):
622 'SF bug #1486663 -- this used to erroneously raise a TypeError'
623 SetSubclassWithKeywordArgs(newarg=1)
624
Raymond Hettingera690a992003-11-16 16:17:49 +0000625class TestFrozenSet(TestJointOps):
626 thetype = frozenset
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000627 basetype = frozenset
Raymond Hettingera690a992003-11-16 16:17:49 +0000628
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000629 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000630 s = self.thetype(self.word)
631 s.__init__(self.otherword)
632 self.assertEqual(s, set(self.word))
633
Raymond Hettingerd7946662005-08-01 21:39:29 +0000634 def test_singleton_empty_frozenset(self):
635 f = frozenset()
636 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
637 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000638 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000639 frozenset(f), f]
640 # All of the empty frozensets should have just one id()
641 self.assertEqual(len(set(map(id, efs))), 1)
642
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000643 def test_constructor_identity(self):
644 s = self.thetype(range(3))
645 t = self.thetype(s)
646 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000647
Raymond Hettingera690a992003-11-16 16:17:49 +0000648 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000649 self.assertEqual(hash(self.thetype('abcdeb')),
650 hash(self.thetype('ebecda')))
651
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000652 # make sure that all permutations give the same hash value
653 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000654 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000655 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000656 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000657 shuffle(seq)
658 results.add(hash(self.thetype(seq)))
659 self.assertEqual(len(results), 1)
660
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000661 def test_copy(self):
662 dup = self.s.copy()
663 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000664
665 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000666 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000667 key1 = self.thetype(seq)
668 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000669 self.assertEqual(key1, key2)
670 self.assertNotEqual(id(key1), id(key2))
671 d = {}
672 d[key1] = 42
673 self.assertEqual(d[key2], 42)
674
675 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000676 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000677 self.assertEqual(hash(f), hash(f))
678
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000679 def test_hash_effectiveness(self):
680 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000681 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000682 addhashvalue = hashvalues.add
683 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000684 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000685 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
686 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000687
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000688class FrozenSetSubclass(frozenset):
689 pass
690
691class TestFrozenSetSubclass(TestFrozenSet):
692 thetype = FrozenSetSubclass
Raymond Hettinger7d99f092008-11-16 11:44:54 +0000693 basetype = frozenset
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000694
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000695 def test_constructor_identity(self):
696 s = self.thetype(range(3))
697 t = self.thetype(s)
698 self.assertNotEqual(id(s), id(t))
699
700 def test_copy(self):
701 dup = self.s.copy()
702 self.assertNotEqual(id(self.s), id(dup))
703
704 def test_nested_empty_constructor(self):
705 s = self.thetype()
706 t = self.thetype(s)
707 self.assertEqual(s, t)
708
Raymond Hettingerd7946662005-08-01 21:39:29 +0000709 def test_singleton_empty_frozenset(self):
710 Frozenset = self.thetype
711 f = frozenset()
712 F = Frozenset()
713 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
714 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000715 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000716 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
717 # All empty frozenset subclass instances should have different ids
718 self.assertEqual(len(set(map(id, efs))), len(efs))
719
Raymond Hettingera690a992003-11-16 16:17:49 +0000720# Tests taken from test_sets.py =============================================
721
722empty_set = set()
723
724#==============================================================================
725
726class TestBasicOps(unittest.TestCase):
727
728 def test_repr(self):
729 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000730 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000731
Raymond Hettingereae05de2004-07-09 04:51:24 +0000732 def test_print(self):
733 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000734 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000735 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000736 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000737 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000738 self.assertEqual(fo.read(), repr(self.set))
739 finally:
740 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000741 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000742
Raymond Hettingera690a992003-11-16 16:17:49 +0000743 def test_length(self):
744 self.assertEqual(len(self.set), self.length)
745
746 def test_self_equality(self):
747 self.assertEqual(self.set, self.set)
748
749 def test_equivalent_equality(self):
750 self.assertEqual(self.set, self.dup)
751
752 def test_copy(self):
753 self.assertEqual(self.set.copy(), self.dup)
754
755 def test_self_union(self):
756 result = self.set | self.set
757 self.assertEqual(result, self.dup)
758
759 def test_empty_union(self):
760 result = self.set | empty_set
761 self.assertEqual(result, self.dup)
762
763 def test_union_empty(self):
764 result = empty_set | self.set
765 self.assertEqual(result, self.dup)
766
767 def test_self_intersection(self):
768 result = self.set & self.set
769 self.assertEqual(result, self.dup)
770
771 def test_empty_intersection(self):
772 result = self.set & empty_set
773 self.assertEqual(result, empty_set)
774
775 def test_intersection_empty(self):
776 result = empty_set & self.set
777 self.assertEqual(result, empty_set)
778
Guido van Rossum58da9312007-11-10 23:39:45 +0000779 def test_self_isdisjoint(self):
780 result = self.set.isdisjoint(self.set)
781 self.assertEqual(result, not self.set)
782
783 def test_empty_isdisjoint(self):
784 result = self.set.isdisjoint(empty_set)
785 self.assertEqual(result, True)
786
787 def test_isdisjoint_empty(self):
788 result = empty_set.isdisjoint(self.set)
789 self.assertEqual(result, True)
790
Raymond Hettingera690a992003-11-16 16:17:49 +0000791 def test_self_symmetric_difference(self):
792 result = self.set ^ self.set
793 self.assertEqual(result, empty_set)
794
795 def checkempty_symmetric_difference(self):
796 result = self.set ^ empty_set
797 self.assertEqual(result, self.set)
798
799 def test_self_difference(self):
800 result = self.set - self.set
801 self.assertEqual(result, empty_set)
802
803 def test_empty_difference(self):
804 result = self.set - empty_set
805 self.assertEqual(result, self.dup)
806
807 def test_empty_difference_rev(self):
808 result = empty_set - self.set
809 self.assertEqual(result, empty_set)
810
811 def test_iteration(self):
812 for v in self.set:
813 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000814 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000815 # note: __length_hint__ is an internal undocumented API,
816 # don't rely on it in your own programs
817 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000818
819 def test_pickling(self):
820 p = pickle.dumps(self.set)
821 copy = pickle.loads(p)
822 self.assertEqual(self.set, copy,
823 "%s != %s" % (self.set, copy))
824
825#------------------------------------------------------------------------------
826
827class TestBasicOpsEmpty(TestBasicOps):
828 def setUp(self):
829 self.case = "empty set"
830 self.values = []
831 self.set = set(self.values)
832 self.dup = set(self.values)
833 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000834 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000835
836#------------------------------------------------------------------------------
837
838class TestBasicOpsSingleton(TestBasicOps):
839 def setUp(self):
840 self.case = "unit set (number)"
841 self.values = [3]
842 self.set = set(self.values)
843 self.dup = set(self.values)
844 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000845 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000846
847 def test_in(self):
848 self.failUnless(3 in self.set)
849
850 def test_not_in(self):
851 self.failUnless(2 not in self.set)
852
853#------------------------------------------------------------------------------
854
855class TestBasicOpsTuple(TestBasicOps):
856 def setUp(self):
857 self.case = "unit set (tuple)"
858 self.values = [(0, "zero")]
859 self.set = set(self.values)
860 self.dup = set(self.values)
861 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000862 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000863
864 def test_in(self):
865 self.failUnless((0, "zero") in self.set)
866
867 def test_not_in(self):
868 self.failUnless(9 not in self.set)
869
870#------------------------------------------------------------------------------
871
872class TestBasicOpsTriple(TestBasicOps):
873 def setUp(self):
874 self.case = "triple set"
875 self.values = [0, "zero", operator.add]
876 self.set = set(self.values)
877 self.dup = set(self.values)
878 self.length = 3
879 self.repr = None
880
Christian Heimes0ded5b52007-12-10 15:50:56 +0000881#------------------------------------------------------------------------------
882
883class TestBasicOpsString(TestBasicOps):
884 def setUp(self):
885 self.case = "string set"
886 self.values = ["a", "b", "c"]
887 self.set = set(self.values)
888 self.dup = set(self.values)
889 self.length = 3
890 self.repr = "{'a', 'c', 'b'}"
891
892#------------------------------------------------------------------------------
893
894class TestBasicOpsBytes(TestBasicOps):
895 def setUp(self):
896 self.case = "string set"
897 self.values = [b"a", b"b", b"c"]
898 self.set = set(self.values)
899 self.dup = set(self.values)
900 self.length = 3
901 self.repr = "{b'a', b'c', b'b'}"
902
903#------------------------------------------------------------------------------
904
905class TestBasicOpsMixedStringBytes(TestBasicOps):
906 def setUp(self):
907 self.warning_filters = warnings.filters[:]
908 warnings.simplefilter('ignore', BytesWarning)
909 self.case = "string and bytes set"
910 self.values = ["a", "b", b"a", b"b"]
911 self.set = set(self.values)
912 self.dup = set(self.values)
913 self.length = 4
914 self.repr = "{'a', b'a', 'b', b'b'}"
915
916 def tearDown(self):
917 warnings.filters = self.warning_filters
918
Raymond Hettingera690a992003-11-16 16:17:49 +0000919#==============================================================================
920
921def baditer():
922 raise TypeError
923 yield True
924
925def gooditer():
926 yield True
927
928class TestExceptionPropagation(unittest.TestCase):
929 """SF 628246: Set constructor should not trap iterator TypeErrors"""
930
931 def test_instanceWithException(self):
932 self.assertRaises(TypeError, set, baditer())
933
934 def test_instancesWithoutException(self):
935 # All of these iterables should load without exception.
936 set([1,2,3])
937 set((1,2,3))
938 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000939 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000940 set('abc')
941 set(gooditer())
942
Neal Norwitzfcf44352005-11-27 20:37:43 +0000943 def test_changingSizeWhileIterating(self):
944 s = set([1,2,3])
945 try:
946 for i in s:
947 s.update([4])
948 except RuntimeError:
949 pass
950 else:
951 self.fail("no exception when changing size during iteration")
952
Raymond Hettingera690a992003-11-16 16:17:49 +0000953#==============================================================================
954
955class TestSetOfSets(unittest.TestCase):
956 def test_constructor(self):
957 inner = frozenset([1])
958 outer = set([inner])
959 element = outer.pop()
960 self.assertEqual(type(element), frozenset)
961 outer.add(inner) # Rebuild set of sets with .add method
962 outer.remove(inner)
963 self.assertEqual(outer, set()) # Verify that remove worked
964 outer.discard(inner) # Absence of KeyError indicates working fine
965
966#==============================================================================
967
968class TestBinaryOps(unittest.TestCase):
969 def setUp(self):
970 self.set = set((2, 4, 6))
971
972 def test_eq(self): # SF bug 643115
973 self.assertEqual(self.set, set({2:1,4:3,6:5}))
974
975 def test_union_subset(self):
976 result = self.set | set([2])
977 self.assertEqual(result, set((2, 4, 6)))
978
979 def test_union_superset(self):
980 result = self.set | set([2, 4, 6, 8])
981 self.assertEqual(result, set([2, 4, 6, 8]))
982
983 def test_union_overlap(self):
984 result = self.set | set([3, 4, 5])
985 self.assertEqual(result, set([2, 3, 4, 5, 6]))
986
987 def test_union_non_overlap(self):
988 result = self.set | set([8])
989 self.assertEqual(result, set([2, 4, 6, 8]))
990
991 def test_intersection_subset(self):
992 result = self.set & set((2, 4))
993 self.assertEqual(result, set((2, 4)))
994
995 def test_intersection_superset(self):
996 result = self.set & set([2, 4, 6, 8])
997 self.assertEqual(result, set([2, 4, 6]))
998
999 def test_intersection_overlap(self):
1000 result = self.set & set([3, 4, 5])
1001 self.assertEqual(result, set([4]))
1002
1003 def test_intersection_non_overlap(self):
1004 result = self.set & set([8])
1005 self.assertEqual(result, empty_set)
1006
Guido van Rossum58da9312007-11-10 23:39:45 +00001007 def test_isdisjoint_subset(self):
1008 result = self.set.isdisjoint(set((2, 4)))
1009 self.assertEqual(result, False)
1010
1011 def test_isdisjoint_superset(self):
1012 result = self.set.isdisjoint(set([2, 4, 6, 8]))
1013 self.assertEqual(result, False)
1014
1015 def test_isdisjoint_overlap(self):
1016 result = self.set.isdisjoint(set([3, 4, 5]))
1017 self.assertEqual(result, False)
1018
1019 def test_isdisjoint_non_overlap(self):
1020 result = self.set.isdisjoint(set([8]))
1021 self.assertEqual(result, True)
1022
Raymond Hettingera690a992003-11-16 16:17:49 +00001023 def test_sym_difference_subset(self):
1024 result = self.set ^ set((2, 4))
1025 self.assertEqual(result, set([6]))
1026
1027 def test_sym_difference_superset(self):
1028 result = self.set ^ set((2, 4, 6, 8))
1029 self.assertEqual(result, set([8]))
1030
1031 def test_sym_difference_overlap(self):
1032 result = self.set ^ set((3, 4, 5))
1033 self.assertEqual(result, set([2, 3, 5, 6]))
1034
1035 def test_sym_difference_non_overlap(self):
1036 result = self.set ^ set([8])
1037 self.assertEqual(result, set([2, 4, 6, 8]))
1038
1039 def test_cmp(self):
1040 a, b = set('a'), set('b')
1041 self.assertRaises(TypeError, cmp, a, b)
1042
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001043 # In py3k, this works!
1044 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +00001045
1046 self.assertRaises(TypeError, cmp, a, 12)
1047 self.assertRaises(TypeError, cmp, "abc", a)
1048
1049#==============================================================================
1050
1051class TestUpdateOps(unittest.TestCase):
1052 def setUp(self):
1053 self.set = set((2, 4, 6))
1054
1055 def test_union_subset(self):
1056 self.set |= set([2])
1057 self.assertEqual(self.set, set((2, 4, 6)))
1058
1059 def test_union_superset(self):
1060 self.set |= set([2, 4, 6, 8])
1061 self.assertEqual(self.set, set([2, 4, 6, 8]))
1062
1063 def test_union_overlap(self):
1064 self.set |= set([3, 4, 5])
1065 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1066
1067 def test_union_non_overlap(self):
1068 self.set |= set([8])
1069 self.assertEqual(self.set, set([2, 4, 6, 8]))
1070
1071 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001072 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001073 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1074
1075 def test_intersection_subset(self):
1076 self.set &= set((2, 4))
1077 self.assertEqual(self.set, set((2, 4)))
1078
1079 def test_intersection_superset(self):
1080 self.set &= set([2, 4, 6, 8])
1081 self.assertEqual(self.set, set([2, 4, 6]))
1082
1083 def test_intersection_overlap(self):
1084 self.set &= set([3, 4, 5])
1085 self.assertEqual(self.set, set([4]))
1086
1087 def test_intersection_non_overlap(self):
1088 self.set &= set([8])
1089 self.assertEqual(self.set, empty_set)
1090
1091 def test_intersection_method_call(self):
1092 self.set.intersection_update(set([3, 4, 5]))
1093 self.assertEqual(self.set, set([4]))
1094
1095 def test_sym_difference_subset(self):
1096 self.set ^= set((2, 4))
1097 self.assertEqual(self.set, set([6]))
1098
1099 def test_sym_difference_superset(self):
1100 self.set ^= set((2, 4, 6, 8))
1101 self.assertEqual(self.set, set([8]))
1102
1103 def test_sym_difference_overlap(self):
1104 self.set ^= set((3, 4, 5))
1105 self.assertEqual(self.set, set([2, 3, 5, 6]))
1106
1107 def test_sym_difference_non_overlap(self):
1108 self.set ^= set([8])
1109 self.assertEqual(self.set, set([2, 4, 6, 8]))
1110
1111 def test_sym_difference_method_call(self):
1112 self.set.symmetric_difference_update(set([3, 4, 5]))
1113 self.assertEqual(self.set, set([2, 3, 5, 6]))
1114
1115 def test_difference_subset(self):
1116 self.set -= set((2, 4))
1117 self.assertEqual(self.set, set([6]))
1118
1119 def test_difference_superset(self):
1120 self.set -= set((2, 4, 6, 8))
1121 self.assertEqual(self.set, set([]))
1122
1123 def test_difference_overlap(self):
1124 self.set -= set((3, 4, 5))
1125 self.assertEqual(self.set, set([2, 6]))
1126
1127 def test_difference_non_overlap(self):
1128 self.set -= set([8])
1129 self.assertEqual(self.set, set([2, 4, 6]))
1130
1131 def test_difference_method_call(self):
1132 self.set.difference_update(set([3, 4, 5]))
1133 self.assertEqual(self.set, set([2, 6]))
1134
1135#==============================================================================
1136
1137class TestMutate(unittest.TestCase):
1138 def setUp(self):
1139 self.values = ["a", "b", "c"]
1140 self.set = set(self.values)
1141
1142 def test_add_present(self):
1143 self.set.add("c")
1144 self.assertEqual(self.set, set("abc"))
1145
1146 def test_add_absent(self):
1147 self.set.add("d")
1148 self.assertEqual(self.set, set("abcd"))
1149
1150 def test_add_until_full(self):
1151 tmp = set()
1152 expected_len = 0
1153 for v in self.values:
1154 tmp.add(v)
1155 expected_len += 1
1156 self.assertEqual(len(tmp), expected_len)
1157 self.assertEqual(tmp, self.set)
1158
1159 def test_remove_present(self):
1160 self.set.remove("b")
1161 self.assertEqual(self.set, set("ac"))
1162
1163 def test_remove_absent(self):
1164 try:
1165 self.set.remove("d")
1166 self.fail("Removing missing element should have raised LookupError")
1167 except LookupError:
1168 pass
1169
1170 def test_remove_until_empty(self):
1171 expected_len = len(self.set)
1172 for v in self.values:
1173 self.set.remove(v)
1174 expected_len -= 1
1175 self.assertEqual(len(self.set), expected_len)
1176
1177 def test_discard_present(self):
1178 self.set.discard("c")
1179 self.assertEqual(self.set, set("ab"))
1180
1181 def test_discard_absent(self):
1182 self.set.discard("d")
1183 self.assertEqual(self.set, set("abc"))
1184
1185 def test_clear(self):
1186 self.set.clear()
1187 self.assertEqual(len(self.set), 0)
1188
1189 def test_pop(self):
1190 popped = {}
1191 while self.set:
1192 popped[self.set.pop()] = None
1193 self.assertEqual(len(popped), len(self.values))
1194 for v in self.values:
1195 self.failUnless(v in popped)
1196
1197 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001198 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001199 self.assertEqual(self.set, set(self.values))
1200
1201 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001202 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001203 self.assertEqual(self.set, set(self.values))
1204
1205 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001206 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001207 self.assertEqual(self.set, set(self.values + ["z"]))
1208
1209#==============================================================================
1210
1211class TestSubsets(unittest.TestCase):
1212
1213 case2method = {"<=": "issubset",
1214 ">=": "issuperset",
1215 }
1216
1217 reverse = {"==": "==",
1218 "!=": "!=",
1219 "<": ">",
1220 ">": "<",
1221 "<=": ">=",
1222 ">=": "<=",
1223 }
1224
1225 def test_issubset(self):
1226 x = self.left
1227 y = self.right
1228 for case in "!=", "==", "<", "<=", ">", ">=":
1229 expected = case in self.cases
1230 # Test the binary infix spelling.
1231 result = eval("x" + case + "y", locals())
1232 self.assertEqual(result, expected)
1233 # Test the "friendly" method-name spelling, if one exists.
1234 if case in TestSubsets.case2method:
1235 method = getattr(x, TestSubsets.case2method[case])
1236 result = method(y)
1237 self.assertEqual(result, expected)
1238
1239 # Now do the same for the operands reversed.
1240 rcase = TestSubsets.reverse[case]
1241 result = eval("y" + rcase + "x", locals())
1242 self.assertEqual(result, expected)
1243 if rcase in TestSubsets.case2method:
1244 method = getattr(y, TestSubsets.case2method[rcase])
1245 result = method(x)
1246 self.assertEqual(result, expected)
1247#------------------------------------------------------------------------------
1248
1249class TestSubsetEqualEmpty(TestSubsets):
1250 left = set()
1251 right = set()
1252 name = "both empty"
1253 cases = "==", "<=", ">="
1254
1255#------------------------------------------------------------------------------
1256
1257class TestSubsetEqualNonEmpty(TestSubsets):
1258 left = set([1, 2])
1259 right = set([1, 2])
1260 name = "equal pair"
1261 cases = "==", "<=", ">="
1262
1263#------------------------------------------------------------------------------
1264
1265class TestSubsetEmptyNonEmpty(TestSubsets):
1266 left = set()
1267 right = set([1, 2])
1268 name = "one empty, one non-empty"
1269 cases = "!=", "<", "<="
1270
1271#------------------------------------------------------------------------------
1272
1273class TestSubsetPartial(TestSubsets):
1274 left = set([1])
1275 right = set([1, 2])
1276 name = "one a non-empty proper subset of other"
1277 cases = "!=", "<", "<="
1278
1279#------------------------------------------------------------------------------
1280
1281class TestSubsetNonOverlap(TestSubsets):
1282 left = set([1])
1283 right = set([2])
1284 name = "neither empty, neither contains"
1285 cases = "!="
1286
1287#==============================================================================
1288
1289class TestOnlySetsInBinaryOps(unittest.TestCase):
1290
1291 def test_eq_ne(self):
1292 # Unlike the others, this is testing that == and != *are* allowed.
1293 self.assertEqual(self.other == self.set, False)
1294 self.assertEqual(self.set == self.other, False)
1295 self.assertEqual(self.other != self.set, True)
1296 self.assertEqual(self.set != self.other, True)
1297
1298 def test_ge_gt_le_lt(self):
1299 self.assertRaises(TypeError, lambda: self.set < self.other)
1300 self.assertRaises(TypeError, lambda: self.set <= self.other)
1301 self.assertRaises(TypeError, lambda: self.set > self.other)
1302 self.assertRaises(TypeError, lambda: self.set >= self.other)
1303
1304 self.assertRaises(TypeError, lambda: self.other < self.set)
1305 self.assertRaises(TypeError, lambda: self.other <= self.set)
1306 self.assertRaises(TypeError, lambda: self.other > self.set)
1307 self.assertRaises(TypeError, lambda: self.other >= self.set)
1308
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001309 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001310 try:
1311 self.set |= self.other
1312 except TypeError:
1313 pass
1314 else:
1315 self.fail("expected TypeError")
1316
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001317 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001318 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001319 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001320 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001321 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001322
1323 def test_union(self):
1324 self.assertRaises(TypeError, lambda: self.set | self.other)
1325 self.assertRaises(TypeError, lambda: self.other | self.set)
1326 if self.otherIsIterable:
1327 self.set.union(self.other)
1328 else:
1329 self.assertRaises(TypeError, self.set.union, self.other)
1330
1331 def test_intersection_update_operator(self):
1332 try:
1333 self.set &= self.other
1334 except TypeError:
1335 pass
1336 else:
1337 self.fail("expected TypeError")
1338
1339 def test_intersection_update(self):
1340 if self.otherIsIterable:
1341 self.set.intersection_update(self.other)
1342 else:
1343 self.assertRaises(TypeError,
1344 self.set.intersection_update,
1345 self.other)
1346
1347 def test_intersection(self):
1348 self.assertRaises(TypeError, lambda: self.set & self.other)
1349 self.assertRaises(TypeError, lambda: self.other & self.set)
1350 if self.otherIsIterable:
1351 self.set.intersection(self.other)
1352 else:
1353 self.assertRaises(TypeError, self.set.intersection, self.other)
1354
1355 def test_sym_difference_update_operator(self):
1356 try:
1357 self.set ^= self.other
1358 except TypeError:
1359 pass
1360 else:
1361 self.fail("expected TypeError")
1362
1363 def test_sym_difference_update(self):
1364 if self.otherIsIterable:
1365 self.set.symmetric_difference_update(self.other)
1366 else:
1367 self.assertRaises(TypeError,
1368 self.set.symmetric_difference_update,
1369 self.other)
1370
1371 def test_sym_difference(self):
1372 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1373 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1374 if self.otherIsIterable:
1375 self.set.symmetric_difference(self.other)
1376 else:
1377 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1378
1379 def test_difference_update_operator(self):
1380 try:
1381 self.set -= self.other
1382 except TypeError:
1383 pass
1384 else:
1385 self.fail("expected TypeError")
1386
1387 def test_difference_update(self):
1388 if self.otherIsIterable:
1389 self.set.difference_update(self.other)
1390 else:
1391 self.assertRaises(TypeError,
1392 self.set.difference_update,
1393 self.other)
1394
1395 def test_difference(self):
1396 self.assertRaises(TypeError, lambda: self.set - self.other)
1397 self.assertRaises(TypeError, lambda: self.other - self.set)
1398 if self.otherIsIterable:
1399 self.set.difference(self.other)
1400 else:
1401 self.assertRaises(TypeError, self.set.difference, self.other)
1402
1403#------------------------------------------------------------------------------
1404
1405class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1406 def setUp(self):
1407 self.set = set((1, 2, 3))
1408 self.other = 19
1409 self.otherIsIterable = False
1410
1411#------------------------------------------------------------------------------
1412
1413class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1414 def setUp(self):
1415 self.set = set((1, 2, 3))
1416 self.other = {1:2, 3:4}
1417 self.otherIsIterable = True
1418
1419#------------------------------------------------------------------------------
1420
1421class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1422 def setUp(self):
1423 self.set = set((1, 2, 3))
1424 self.other = operator.add
1425 self.otherIsIterable = False
1426
1427#------------------------------------------------------------------------------
1428
1429class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1430 def setUp(self):
1431 self.set = set((1, 2, 3))
1432 self.other = (2, 4, 6)
1433 self.otherIsIterable = True
1434
1435#------------------------------------------------------------------------------
1436
1437class TestOnlySetsString(TestOnlySetsInBinaryOps):
1438 def setUp(self):
1439 self.set = set((1, 2, 3))
1440 self.other = 'abc'
1441 self.otherIsIterable = True
1442
1443#------------------------------------------------------------------------------
1444
1445class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1446 def setUp(self):
1447 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001448 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001449 yield i
1450 self.set = set((1, 2, 3))
1451 self.other = gen()
1452 self.otherIsIterable = True
1453
1454#==============================================================================
1455
1456class TestCopying(unittest.TestCase):
1457
1458 def test_copy(self):
1459 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001460 dup_list = sorted(dup, key=repr)
1461 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001462 self.assertEqual(len(dup_list), len(set_list))
1463 for i in range(len(dup_list)):
1464 self.failUnless(dup_list[i] is set_list[i])
1465
1466 def test_deep_copy(self):
1467 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001468 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001469 dup_list = sorted(dup, key=repr)
1470 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001471 self.assertEqual(len(dup_list), len(set_list))
1472 for i in range(len(dup_list)):
1473 self.assertEqual(dup_list[i], set_list[i])
1474
1475#------------------------------------------------------------------------------
1476
1477class TestCopyingEmpty(TestCopying):
1478 def setUp(self):
1479 self.set = set()
1480
1481#------------------------------------------------------------------------------
1482
1483class TestCopyingSingleton(TestCopying):
1484 def setUp(self):
1485 self.set = set(["hello"])
1486
1487#------------------------------------------------------------------------------
1488
1489class TestCopyingTriple(TestCopying):
1490 def setUp(self):
1491 self.set = set(["zero", 0, None])
1492
1493#------------------------------------------------------------------------------
1494
1495class TestCopyingTuple(TestCopying):
1496 def setUp(self):
1497 self.set = set([(1, 2)])
1498
1499#------------------------------------------------------------------------------
1500
1501class TestCopyingNested(TestCopying):
1502 def setUp(self):
1503 self.set = set([((1, 2), (3, 4))])
1504
1505#==============================================================================
1506
1507class TestIdentities(unittest.TestCase):
1508 def setUp(self):
1509 self.a = set('abracadabra')
1510 self.b = set('alacazam')
1511
1512 def test_binopsVsSubsets(self):
1513 a, b = self.a, self.b
1514 self.assert_(a - b < a)
1515 self.assert_(b - a < b)
1516 self.assert_(a & b < a)
1517 self.assert_(a & b < b)
1518 self.assert_(a | b > a)
1519 self.assert_(a | b > b)
1520 self.assert_(a ^ b < a | b)
1521
1522 def test_commutativity(self):
1523 a, b = self.a, self.b
1524 self.assertEqual(a&b, b&a)
1525 self.assertEqual(a|b, b|a)
1526 self.assertEqual(a^b, b^a)
1527 if a != b:
1528 self.assertNotEqual(a-b, b-a)
1529
1530 def test_summations(self):
1531 # check that sums of parts equal the whole
1532 a, b = self.a, self.b
1533 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1534 self.assertEqual((a&b)|(a^b), a|b)
1535 self.assertEqual(a|(b-a), a|b)
1536 self.assertEqual((a-b)|b, a|b)
1537 self.assertEqual((a-b)|(a&b), a)
1538 self.assertEqual((b-a)|(a&b), b)
1539 self.assertEqual((a-b)|(b-a), a^b)
1540
1541 def test_exclusion(self):
1542 # check that inverse operations show non-overlap
1543 a, b, zero = self.a, self.b, set()
1544 self.assertEqual((a-b)&b, zero)
1545 self.assertEqual((b-a)&a, zero)
1546 self.assertEqual((a&b)&(a^b), zero)
1547
1548# Tests derived from test_itertools.py =======================================
1549
1550def R(seqn):
1551 'Regular generator'
1552 for i in seqn:
1553 yield i
1554
1555class G:
1556 'Sequence using __getitem__'
1557 def __init__(self, seqn):
1558 self.seqn = seqn
1559 def __getitem__(self, i):
1560 return self.seqn[i]
1561
1562class I:
1563 'Sequence using iterator protocol'
1564 def __init__(self, seqn):
1565 self.seqn = seqn
1566 self.i = 0
1567 def __iter__(self):
1568 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001569 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001570 if self.i >= len(self.seqn): raise StopIteration
1571 v = self.seqn[self.i]
1572 self.i += 1
1573 return v
1574
1575class Ig:
1576 'Sequence using iterator protocol defined with a generator'
1577 def __init__(self, seqn):
1578 self.seqn = seqn
1579 self.i = 0
1580 def __iter__(self):
1581 for val in self.seqn:
1582 yield val
1583
1584class X:
1585 'Missing __getitem__ and __iter__'
1586 def __init__(self, seqn):
1587 self.seqn = seqn
1588 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001589 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001590 if self.i >= len(self.seqn): raise StopIteration
1591 v = self.seqn[self.i]
1592 self.i += 1
1593 return v
1594
1595class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001596 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001597 def __init__(self, seqn):
1598 self.seqn = seqn
1599 self.i = 0
1600 def __iter__(self):
1601 return self
1602
1603class E:
1604 'Test propagation of exceptions'
1605 def __init__(self, seqn):
1606 self.seqn = seqn
1607 self.i = 0
1608 def __iter__(self):
1609 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001610 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001611 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001612
1613class S:
1614 'Test immediate stop'
1615 def __init__(self, seqn):
1616 pass
1617 def __iter__(self):
1618 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001619 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001620 raise StopIteration
1621
Raymond Hettingera6c60372008-03-13 01:26:19 +00001622from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001623def L(seqn):
1624 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001625 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001626
1627class TestVariousIteratorArgs(unittest.TestCase):
1628
1629 def test_constructor(self):
1630 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001631 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001632 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001633 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001634 self.assertRaises(TypeError, cons , X(s))
1635 self.assertRaises(TypeError, cons , N(s))
1636 self.assertRaises(ZeroDivisionError, cons , E(s))
1637
1638 def test_inline_methods(self):
1639 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001640 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001641 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001642 for g in (G, I, Ig, L, R):
1643 expected = meth(data)
1644 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001645 if isinstance(expected, bool):
1646 self.assertEqual(actual, expected)
1647 else:
1648 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001649 self.assertRaises(TypeError, meth, X(s))
1650 self.assertRaises(TypeError, meth, N(s))
1651 self.assertRaises(ZeroDivisionError, meth, E(s))
1652
1653 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001654 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001655 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001656 'difference_update', 'symmetric_difference_update'):
1657 for g in (G, I, Ig, S, L, R):
1658 s = set('january')
1659 t = s.copy()
1660 getattr(s, methname)(list(g(data)))
1661 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001662 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001663
1664 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1665 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1666 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1667
Christian Heimes969fe572008-01-25 11:23:10 +00001668# Application tests (based on David Eppstein's graph recipes ====================================
1669
1670def powerset(U):
1671 """Generates all subsets of a set or sequence U."""
1672 U = iter(U)
1673 try:
1674 x = frozenset([next(U)])
1675 for S in powerset(U):
1676 yield S
1677 yield S | x
1678 except StopIteration:
1679 yield frozenset()
1680
1681def cube(n):
1682 """Graph of n-dimensional hypercube."""
1683 singletons = [frozenset([x]) for x in range(n)]
1684 return dict([(x, frozenset([x^s for s in singletons]))
1685 for x in powerset(range(n))])
1686
1687def linegraph(G):
1688 """Graph, the vertices of which are edges of G,
1689 with two vertices being adjacent iff the corresponding
1690 edges share a vertex."""
1691 L = {}
1692 for x in G:
1693 for y in G[x]:
1694 nx = [frozenset([x,z]) for z in G[x] if z != y]
1695 ny = [frozenset([y,z]) for z in G[y] if z != x]
1696 L[frozenset([x,y])] = frozenset(nx+ny)
1697 return L
1698
1699def faces(G):
1700 'Return a set of faces in G. Where a face is a set of vertices on that face'
1701 # currently limited to triangles,squares, and pentagons
1702 f = set()
1703 for v1, edges in G.items():
1704 for v2 in edges:
1705 for v3 in G[v2]:
1706 if v1 == v3:
1707 continue
1708 if v1 in G[v3]:
1709 f.add(frozenset([v1, v2, v3]))
1710 else:
1711 for v4 in G[v3]:
1712 if v4 == v2:
1713 continue
1714 if v1 in G[v4]:
1715 f.add(frozenset([v1, v2, v3, v4]))
1716 else:
1717 for v5 in G[v4]:
1718 if v5 == v3 or v5 == v2:
1719 continue
1720 if v1 in G[v5]:
1721 f.add(frozenset([v1, v2, v3, v4, v5]))
1722 return f
1723
1724
1725class TestGraphs(unittest.TestCase):
1726
1727 def test_cube(self):
1728
1729 g = cube(3) # vert --> {v1, v2, v3}
1730 vertices1 = set(g)
1731 self.assertEqual(len(vertices1), 8) # eight vertices
1732 for edge in g.values():
1733 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1734 vertices2 = set(v for edges in g.values() for v in edges)
1735 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1736
1737 cubefaces = faces(g)
1738 self.assertEqual(len(cubefaces), 6) # six faces
1739 for face in cubefaces:
1740 self.assertEqual(len(face), 4) # each face is a square
1741
1742 def test_cuboctahedron(self):
1743
1744 # http://en.wikipedia.org/wiki/Cuboctahedron
1745 # 8 triangular faces and 6 square faces
1746 # 12 indentical vertices each connecting a triangle and square
1747
1748 g = cube(3)
1749 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1750 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1751
1752 vertices = set(cuboctahedron)
1753 for edges in cuboctahedron.values():
1754 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1755 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1756 self.assertEqual(vertices, othervertices) # edge vertices in original set
1757
1758 cubofaces = faces(cuboctahedron)
1759 facesizes = collections.defaultdict(int)
1760 for face in cubofaces:
1761 facesizes[len(face)] += 1
1762 self.assertEqual(facesizes[3], 8) # eight triangular faces
1763 self.assertEqual(facesizes[4], 6) # six square faces
1764
1765 for vertex in cuboctahedron:
1766 edge = vertex # Cuboctahedron vertices are edges in Cube
1767 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1768 for cubevert in edge:
1769 self.assert_(cubevert in g)
1770
1771
Raymond Hettingera690a992003-11-16 16:17:49 +00001772#==============================================================================
1773
1774def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001775 test_classes = (
1776 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001777 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001778 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001779 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001780 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001781 TestSetOfSets,
1782 TestExceptionPropagation,
1783 TestBasicOpsEmpty,
1784 TestBasicOpsSingleton,
1785 TestBasicOpsTuple,
1786 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001787 TestBasicOpsString,
1788 TestBasicOpsBytes,
1789 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001790 TestBinaryOps,
1791 TestUpdateOps,
1792 TestMutate,
1793 TestSubsetEqualEmpty,
1794 TestSubsetEqualNonEmpty,
1795 TestSubsetEmptyNonEmpty,
1796 TestSubsetPartial,
1797 TestSubsetNonOverlap,
1798 TestOnlySetsNumeric,
1799 TestOnlySetsDict,
1800 TestOnlySetsOperator,
1801 TestOnlySetsTuple,
1802 TestOnlySetsString,
1803 TestOnlySetsGenerator,
1804 TestCopyingEmpty,
1805 TestCopyingSingleton,
1806 TestCopyingTriple,
1807 TestCopyingTuple,
1808 TestCopyingNested,
1809 TestIdentities,
1810 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001811 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001812 )
1813
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001814 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001815
1816 # verify reference counting
1817 if verbose and hasattr(sys, "gettotalrefcount"):
1818 import gc
1819 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001820 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001821 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001822 gc.collect()
1823 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001824 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001825
1826if __name__ == "__main__":
1827 test_main(verbose=True)