blob: ed2db18e5a4695346a43ea6d016f475757c68654 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Raymond Hettinger691d8052004-05-30 07:26:47 +00003from weakref import proxy
Raymond Hettingera690a992003-11-16 16:17:49 +00004import operator
5import copy
6import pickle
Raymond Hettingereae05de2004-07-09 04:51:24 +00007import os
Raymond Hettinger82cb9a22005-07-05 05:34:43 +00008from random import randrange, shuffle
Raymond Hettingerc47e01d2005-08-16 10:44:15 +00009import sys
Christian Heimes0ded5b52007-12-10 15:50:56 +000010import warnings
Christian Heimes969fe572008-01-25 11:23:10 +000011import collections
Raymond Hettingera690a992003-11-16 16:17:49 +000012
13class PassThru(Exception):
14 pass
15
16def check_pass_thru():
17 raise PassThru
18 yield 1
19
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000020class BadCmp:
21 def __hash__(self):
22 return 1
Guido van Rossum47b9ff62006-08-24 00:41:19 +000023 def __eq__(self, other):
Raymond Hettinger9bda1d62005-09-16 07:14:21 +000024 raise RuntimeError
25
Thomas Wouters902d6eb2007-01-09 23:18:33 +000026class ReprWrapper:
27 'Used to test self-referential repr() calls'
28 def __repr__(self):
29 return repr(self.value)
30
Thomas Wouterscf297e42007-02-23 15:07:44 +000031class HashCountingInt(int):
32 'int-like object that counts the number of times __hash__ is called'
33 def __init__(self, *args):
34 self.hash_count = 0
35 def __hash__(self):
36 self.hash_count += 1
37 return int.__hash__(self)
38
Raymond Hettingera690a992003-11-16 16:17:49 +000039class TestJointOps(unittest.TestCase):
40 # Tests common to both set and frozenset
41
42 def setUp(self):
43 self.word = word = 'simsalabim'
44 self.otherword = 'madagascar'
45 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
46 self.s = self.thetype(word)
47 self.d = dict.fromkeys(word)
48
Raymond Hettinger6429a472004-09-28 01:51:35 +000049 def test_new_or_init(self):
50 self.assertRaises(TypeError, self.thetype, [], 2)
51
Raymond Hettingera690a992003-11-16 16:17:49 +000052 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000053 actual = sorted(self.s)
54 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000055 self.assertEqual(actual, expected)
56 self.assertRaises(PassThru, self.thetype, check_pass_thru())
57 self.assertRaises(TypeError, self.thetype, [[]])
58
59 def test_len(self):
60 self.assertEqual(len(self.s), len(self.d))
61
62 def test_contains(self):
63 for c in self.letters:
64 self.assertEqual(c in self.s, c in self.d)
65 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000066 s = self.thetype([frozenset(self.letters)])
67 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000068
Raymond Hettingera690a992003-11-16 16:17:49 +000069 def test_union(self):
70 u = self.s.union(self.otherword)
71 for c in self.letters:
72 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000073 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000074 self.assertEqual(type(u), self.thetype)
75 self.assertRaises(PassThru, self.s.union, check_pass_thru())
76 self.assertRaises(TypeError, self.s.union, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +000077 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000078 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
79 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
80 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
81 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Georg Brandlc28e1fa2008-06-10 19:20:26 +000082 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
Raymond Hettingera690a992003-11-16 16:17:49 +000083
84 def test_or(self):
85 i = self.s.union(self.otherword)
86 self.assertEqual(self.s | set(self.otherword), i)
87 self.assertEqual(self.s | frozenset(self.otherword), i)
88 try:
89 self.s | self.otherword
90 except TypeError:
91 pass
92 else:
93 self.fail("s|t did not screen-out general iterables")
94
95 def test_intersection(self):
96 i = self.s.intersection(self.otherword)
97 for c in self.letters:
98 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000099 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000100 self.assertEqual(type(i), self.thetype)
101 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Guido van Rossum75a902d2007-10-19 22:06:24 +0000102 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000103 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
104 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
105 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
106 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000107 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000108
Guido van Rossum58da9312007-11-10 23:39:45 +0000109 def test_isdisjoint(self):
110 def f(s1, s2):
111 'Pure python equivalent of isdisjoint()'
112 return not set(s1).intersection(s2)
113 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
114 s1 = self.thetype(larg)
115 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
116 for C in set, frozenset, dict.fromkeys, str, list, tuple:
117 s2 = C(rarg)
118 actual = s1.isdisjoint(s2)
119 expected = f(s1, s2)
120 self.assertEqual(actual, expected)
121 self.assert_(actual is True or actual is False)
122
Raymond Hettingera690a992003-11-16 16:17:49 +0000123 def test_and(self):
124 i = self.s.intersection(self.otherword)
125 self.assertEqual(self.s & set(self.otherword), i)
126 self.assertEqual(self.s & frozenset(self.otherword), i)
127 try:
128 self.s & self.otherword
129 except TypeError:
130 pass
131 else:
132 self.fail("s&t did not screen-out general iterables")
133
134 def test_difference(self):
135 i = self.s.difference(self.otherword)
136 for c in self.letters:
137 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000138 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000139 self.assertEqual(type(i), self.thetype)
140 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
141 self.assertRaises(TypeError, self.s.difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000142 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000143 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
144 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
145 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
146 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000147
148 def test_sub(self):
149 i = self.s.difference(self.otherword)
150 self.assertEqual(self.s - set(self.otherword), i)
151 self.assertEqual(self.s - frozenset(self.otherword), i)
152 try:
153 self.s - self.otherword
154 except TypeError:
155 pass
156 else:
157 self.fail("s-t did not screen-out general iterables")
158
159 def test_symmetric_difference(self):
160 i = self.s.symmetric_difference(self.otherword)
161 for c in self.letters:
162 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000163 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000164 self.assertEqual(type(i), self.thetype)
165 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
166 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000167 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000168 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
169 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
170 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
171 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000172
173 def test_xor(self):
174 i = self.s.symmetric_difference(self.otherword)
175 self.assertEqual(self.s ^ set(self.otherword), i)
176 self.assertEqual(self.s ^ frozenset(self.otherword), i)
177 try:
178 self.s ^ self.otherword
179 except TypeError:
180 pass
181 else:
182 self.fail("s^t did not screen-out general iterables")
183
184 def test_equality(self):
185 self.assertEqual(self.s, set(self.word))
186 self.assertEqual(self.s, frozenset(self.word))
187 self.assertEqual(self.s == self.word, False)
188 self.assertNotEqual(self.s, set(self.otherword))
189 self.assertNotEqual(self.s, frozenset(self.otherword))
190 self.assertEqual(self.s != self.word, True)
191
192 def test_setOfFrozensets(self):
193 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
194 s = self.thetype(t)
195 self.assertEqual(len(s), 3)
196
197 def test_compare(self):
198 self.assertRaises(TypeError, self.s.__cmp__, self.s)
199
200 def test_sub_and_super(self):
201 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
202 self.assert_(p < q)
203 self.assert_(p <= q)
204 self.assert_(q <= q)
205 self.assert_(q > p)
206 self.assert_(q >= p)
207 self.failIf(q < r)
208 self.failIf(q <= r)
209 self.failIf(q > r)
210 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000211 self.assert_(set('a').issubset('abc'))
212 self.assert_(set('abc').issuperset('a'))
213 self.failIf(set('a').issubset('cbs'))
214 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000215
216 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000217 for i in (0, 1, 2):
218 p = pickle.dumps(self.s, i)
219 dup = pickle.loads(p)
220 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
221 if type(self.s) not in (set, frozenset):
222 self.s.x = 10
223 p = pickle.dumps(self.s)
224 dup = pickle.loads(p)
225 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000226
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000227 def test_deepcopy(self):
228 class Tracer:
229 def __init__(self, value):
230 self.value = value
231 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000232 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000233 def __deepcopy__(self, memo=None):
234 return Tracer(self.value + 1)
235 t = Tracer(10)
236 s = self.thetype([t])
237 dup = copy.deepcopy(s)
238 self.assertNotEqual(id(s), id(dup))
239 for elem in dup:
240 newt = elem
241 self.assertNotEqual(id(t), id(newt))
242 self.assertEqual(t.value + 1, newt.value)
243
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000244 def test_gc(self):
245 # Create a nest of cycles to exercise overall ref count check
246 class A:
247 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000248 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000249 for elem in s:
250 elem.cycle = s
251 elem.sub = elem
252 elem.set = set([elem])
253
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000254 def test_subclass_with_custom_hash(self):
255 # Bug #1257731
256 class H(self.thetype):
257 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000258 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000259 s=H()
260 f=set()
261 f.add(s)
262 self.assert_(s in f)
263 f.remove(s)
264 f.add(s)
265 f.discard(s)
266
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000267 def test_badcmp(self):
268 s = self.thetype([BadCmp()])
269 # Detect comparison errors during insertion and lookup
270 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
271 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
272 # Detect errors during mutating operations
273 if hasattr(s, 'add'):
274 self.assertRaises(RuntimeError, s.add, BadCmp())
275 self.assertRaises(RuntimeError, s.discard, BadCmp())
276 self.assertRaises(RuntimeError, s.remove, BadCmp())
277
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000278 def test_cyclical_repr(self):
279 w = ReprWrapper()
280 s = self.thetype([w])
281 w.value = s
282 if self.thetype == set:
283 self.assertEqual(repr(s), '{set(...)}')
284 else:
285 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000286 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000287
288 def test_cyclical_print(self):
289 w = ReprWrapper()
290 s = self.thetype([w])
291 w.value = s
292 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000293 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000294 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000295 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000297 self.assertEqual(fo.read(), repr(s))
298 finally:
299 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000300 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000301
Thomas Wouterscf297e42007-02-23 15:07:44 +0000302 def test_do_not_rehash_dict_keys(self):
303 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000304 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000305 self.assertEqual(sum(elem.hash_count for elem in d), n)
306 s = self.thetype(d)
307 self.assertEqual(sum(elem.hash_count for elem in d), n)
308 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000309 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000310 if hasattr(s, 'symmetric_difference_update'):
311 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 self.assertEqual(sum(elem.hash_count for elem in d), n)
313 d2 = dict.fromkeys(set(d))
314 self.assertEqual(sum(elem.hash_count for elem in d), n)
315 d3 = dict.fromkeys(frozenset(d))
316 self.assertEqual(sum(elem.hash_count for elem in d), n)
317 d3 = dict.fromkeys(frozenset(d), 123)
318 self.assertEqual(sum(elem.hash_count for elem in d), n)
319 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000320
Raymond Hettingera690a992003-11-16 16:17:49 +0000321class TestSet(TestJointOps):
322 thetype = set
323
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000324 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000325 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000326 s.__init__(self.word)
327 self.assertEqual(s, set(self.word))
328 s.__init__(self.otherword)
329 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000330 self.assertRaises(TypeError, s.__init__, s, 2);
331 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000332
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000333 def test_constructor_identity(self):
334 s = self.thetype(range(3))
335 t = self.thetype(s)
336 self.assertNotEqual(id(s), id(t))
337
Guido van Rossum86e58e22006-08-28 15:27:34 +0000338 def test_set_literal(self):
339 s = set([1,2,3])
340 t = {1,2,3}
341 self.assertEqual(s, t)
342
Raymond Hettingera690a992003-11-16 16:17:49 +0000343 def test_hash(self):
344 self.assertRaises(TypeError, hash, self.s)
345
346 def test_clear(self):
347 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000348 self.assertEqual(self.s, set())
349 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000350
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000351 def test_copy(self):
352 dup = self.s.copy()
353 self.assertEqual(self.s, dup)
354 self.assertNotEqual(id(self.s), id(dup))
355
Raymond Hettingera690a992003-11-16 16:17:49 +0000356 def test_add(self):
357 self.s.add('Q')
358 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000359 dup = self.s.copy()
360 self.s.add('Q')
361 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000362 self.assertRaises(TypeError, self.s.add, [])
363
364 def test_remove(self):
365 self.s.remove('a')
366 self.assert_('a' not in self.s)
367 self.assertRaises(KeyError, self.s.remove, 'Q')
368 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000369 s = self.thetype([frozenset(self.word)])
370 self.assert_(self.thetype(self.word) in s)
371 s.remove(self.thetype(self.word))
372 self.assert_(self.thetype(self.word) not in s)
373 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000374
Thomas Wouters89f507f2006-12-13 04:49:30 +0000375 def test_remove_keyerror_unpacking(self):
376 # bug: www.python.org/sf/1576657
377 for v1 in ['Q', (1,)]:
378 try:
379 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000380 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000381 v2 = e.args[0]
382 self.assertEqual(v1, v2)
383 else:
384 self.fail()
385
Raymond Hettingera690a992003-11-16 16:17:49 +0000386 def test_discard(self):
387 self.s.discard('a')
388 self.assert_('a' not in self.s)
389 self.s.discard('Q')
390 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000391 s = self.thetype([frozenset(self.word)])
392 self.assert_(self.thetype(self.word) in s)
393 s.discard(self.thetype(self.word))
394 self.assert_(self.thetype(self.word) not in s)
395 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000396
397 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000398 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000399 elem = self.s.pop()
400 self.assert_(elem not in self.s)
401 self.assertRaises(KeyError, self.s.pop)
402
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000403 def test_update(self):
404 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000405 self.assertEqual(retval, None)
406 for c in (self.word + self.otherword):
407 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000408 self.assertRaises(PassThru, self.s.update, check_pass_thru())
409 self.assertRaises(TypeError, self.s.update, [[]])
410 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000411 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000412 s = self.thetype('abcba')
413 self.assertEqual(s.update(C(p)), None)
414 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000415 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
416 q = 'ahi'
417 for C in set, frozenset, dict.fromkeys, str, list, tuple:
418 s = self.thetype('abcba')
419 self.assertEqual(s.update(C(p), C(q)), None)
420 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000421
422 def test_ior(self):
423 self.s |= set(self.otherword)
424 for c in (self.word + self.otherword):
425 self.assert_(c in self.s)
426
427 def test_intersection_update(self):
428 retval = self.s.intersection_update(self.otherword)
429 self.assertEqual(retval, None)
430 for c in (self.word + self.otherword):
431 if c in self.otherword and c in self.word:
432 self.assert_(c in self.s)
433 else:
434 self.assert_(c not in self.s)
435 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
436 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000437 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000438 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000439 s = self.thetype('abcba')
440 self.assertEqual(s.intersection_update(C(p)), None)
441 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000442 ss = 'abcba'
443 s = self.thetype(ss)
444 t = 'cbc'
445 self.assertEqual(s.intersection_update(C(p), C(t)), None)
446 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000447
448 def test_iand(self):
449 self.s &= set(self.otherword)
450 for c in (self.word + self.otherword):
451 if c in self.otherword and c in self.word:
452 self.assert_(c in self.s)
453 else:
454 self.assert_(c not in self.s)
455
456 def test_difference_update(self):
457 retval = self.s.difference_update(self.otherword)
458 self.assertEqual(retval, None)
459 for c in (self.word + self.otherword):
460 if c in self.word and c not in self.otherword:
461 self.assert_(c in self.s)
462 else:
463 self.assert_(c not in self.s)
464 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
465 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000466 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
467 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000468 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000469 s = self.thetype('abcba')
470 self.assertEqual(s.difference_update(C(p)), None)
471 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000472
473 def test_isub(self):
474 self.s -= set(self.otherword)
475 for c in (self.word + self.otherword):
476 if c in self.word and c not in self.otherword:
477 self.assert_(c in self.s)
478 else:
479 self.assert_(c not in self.s)
480
481 def test_symmetric_difference_update(self):
482 retval = self.s.symmetric_difference_update(self.otherword)
483 self.assertEqual(retval, None)
484 for c in (self.word + self.otherword):
485 if (c in self.word) ^ (c in self.otherword):
486 self.assert_(c in self.s)
487 else:
488 self.assert_(c not in self.s)
489 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
490 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000491 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000492 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000493 s = self.thetype('abcba')
494 self.assertEqual(s.symmetric_difference_update(C(p)), None)
495 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000496
497 def test_ixor(self):
498 self.s ^= set(self.otherword)
499 for c in (self.word + self.otherword):
500 if (c in self.word) ^ (c in self.otherword):
501 self.assert_(c in self.s)
502 else:
503 self.assert_(c not in self.s)
504
Raymond Hettingerc991db22005-08-11 07:58:45 +0000505 def test_inplace_on_self(self):
506 t = self.s.copy()
507 t |= t
508 self.assertEqual(t, self.s)
509 t &= t
510 self.assertEqual(t, self.s)
511 t -= t
512 self.assertEqual(t, self.thetype())
513 t = self.s.copy()
514 t ^= t
515 self.assertEqual(t, self.thetype())
516
Raymond Hettinger691d8052004-05-30 07:26:47 +0000517 def test_weakref(self):
518 s = self.thetype('gallahad')
519 p = proxy(s)
520 self.assertEqual(str(p), str(s))
521 s = None
522 self.assertRaises(ReferenceError, str, p)
523
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000524 def test_rich_compare(self):
525 class TestRichSetCompare:
526 def __gt__(self, some_set):
527 self.gt_called = True
528 return False
529 def __lt__(self, some_set):
530 self.lt_called = True
531 return False
532 def __ge__(self, some_set):
533 self.ge_called = True
534 return False
535 def __le__(self, some_set):
536 self.le_called = True
537 return False
538
539 # This first tries the bulitin rich set comparison, which doesn't know
540 # how to handle the custom object. Upon returning NotImplemented, the
541 # corresponding comparison on the right object is invoked.
542 myset = {1, 2, 3}
543
544 myobj = TestRichSetCompare()
545 myset < myobj
546 self.assert_(myobj.gt_called)
547
548 myobj = TestRichSetCompare()
549 myset > myobj
550 self.assert_(myobj.lt_called)
551
552 myobj = TestRichSetCompare()
553 myset <= myobj
554 self.assert_(myobj.ge_called)
555
556 myobj = TestRichSetCompare()
557 myset >= myobj
558 self.assert_(myobj.le_called)
559
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000560 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000562 def test_c_api(self):
563 self.assertEqual(set('abc').test_c_api(), True)
564
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000565class SetSubclass(set):
566 pass
567
568class TestSetSubclass(TestSet):
569 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000570
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000571class SetSubclassWithKeywordArgs(set):
572 def __init__(self, iterable=[], newarg=None):
573 set.__init__(self, iterable)
574
575class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000576
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000577 def test_keywords_in_subclass(self):
578 'SF bug #1486663 -- this used to erroneously raise a TypeError'
579 SetSubclassWithKeywordArgs(newarg=1)
580
Raymond Hettingera690a992003-11-16 16:17:49 +0000581class TestFrozenSet(TestJointOps):
582 thetype = frozenset
583
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000584 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000585 s = self.thetype(self.word)
586 s.__init__(self.otherword)
587 self.assertEqual(s, set(self.word))
588
Raymond Hettingerd7946662005-08-01 21:39:29 +0000589 def test_singleton_empty_frozenset(self):
590 f = frozenset()
591 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
592 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000593 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000594 frozenset(f), f]
595 # All of the empty frozensets should have just one id()
596 self.assertEqual(len(set(map(id, efs))), 1)
597
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000598 def test_constructor_identity(self):
599 s = self.thetype(range(3))
600 t = self.thetype(s)
601 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000602
Raymond Hettingera690a992003-11-16 16:17:49 +0000603 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000604 self.assertEqual(hash(self.thetype('abcdeb')),
605 hash(self.thetype('ebecda')))
606
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000607 # make sure that all permutations give the same hash value
608 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000609 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000610 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000611 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000612 shuffle(seq)
613 results.add(hash(self.thetype(seq)))
614 self.assertEqual(len(results), 1)
615
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000616 def test_copy(self):
617 dup = self.s.copy()
618 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000619
620 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000621 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000622 key1 = self.thetype(seq)
623 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000624 self.assertEqual(key1, key2)
625 self.assertNotEqual(id(key1), id(key2))
626 d = {}
627 d[key1] = 42
628 self.assertEqual(d[key2], 42)
629
630 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000631 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000632 self.assertEqual(hash(f), hash(f))
633
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000634 def test_hash_effectiveness(self):
635 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000636 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000637 addhashvalue = hashvalues.add
638 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000639 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000640 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
641 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000642
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000643class FrozenSetSubclass(frozenset):
644 pass
645
646class TestFrozenSetSubclass(TestFrozenSet):
647 thetype = FrozenSetSubclass
648
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000649 def test_constructor_identity(self):
650 s = self.thetype(range(3))
651 t = self.thetype(s)
652 self.assertNotEqual(id(s), id(t))
653
654 def test_copy(self):
655 dup = self.s.copy()
656 self.assertNotEqual(id(self.s), id(dup))
657
658 def test_nested_empty_constructor(self):
659 s = self.thetype()
660 t = self.thetype(s)
661 self.assertEqual(s, t)
662
Raymond Hettingerd7946662005-08-01 21:39:29 +0000663 def test_singleton_empty_frozenset(self):
664 Frozenset = self.thetype
665 f = frozenset()
666 F = Frozenset()
667 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
668 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000669 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000670 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
671 # All empty frozenset subclass instances should have different ids
672 self.assertEqual(len(set(map(id, efs))), len(efs))
673
Raymond Hettingera690a992003-11-16 16:17:49 +0000674# Tests taken from test_sets.py =============================================
675
676empty_set = set()
677
678#==============================================================================
679
680class TestBasicOps(unittest.TestCase):
681
682 def test_repr(self):
683 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000684 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000685
Raymond Hettingereae05de2004-07-09 04:51:24 +0000686 def test_print(self):
687 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000688 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000689 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000690 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000691 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000692 self.assertEqual(fo.read(), repr(self.set))
693 finally:
694 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000695 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000696
Raymond Hettingera690a992003-11-16 16:17:49 +0000697 def test_length(self):
698 self.assertEqual(len(self.set), self.length)
699
700 def test_self_equality(self):
701 self.assertEqual(self.set, self.set)
702
703 def test_equivalent_equality(self):
704 self.assertEqual(self.set, self.dup)
705
706 def test_copy(self):
707 self.assertEqual(self.set.copy(), self.dup)
708
709 def test_self_union(self):
710 result = self.set | self.set
711 self.assertEqual(result, self.dup)
712
713 def test_empty_union(self):
714 result = self.set | empty_set
715 self.assertEqual(result, self.dup)
716
717 def test_union_empty(self):
718 result = empty_set | self.set
719 self.assertEqual(result, self.dup)
720
721 def test_self_intersection(self):
722 result = self.set & self.set
723 self.assertEqual(result, self.dup)
724
725 def test_empty_intersection(self):
726 result = self.set & empty_set
727 self.assertEqual(result, empty_set)
728
729 def test_intersection_empty(self):
730 result = empty_set & self.set
731 self.assertEqual(result, empty_set)
732
Guido van Rossum58da9312007-11-10 23:39:45 +0000733 def test_self_isdisjoint(self):
734 result = self.set.isdisjoint(self.set)
735 self.assertEqual(result, not self.set)
736
737 def test_empty_isdisjoint(self):
738 result = self.set.isdisjoint(empty_set)
739 self.assertEqual(result, True)
740
741 def test_isdisjoint_empty(self):
742 result = empty_set.isdisjoint(self.set)
743 self.assertEqual(result, True)
744
Raymond Hettingera690a992003-11-16 16:17:49 +0000745 def test_self_symmetric_difference(self):
746 result = self.set ^ self.set
747 self.assertEqual(result, empty_set)
748
749 def checkempty_symmetric_difference(self):
750 result = self.set ^ empty_set
751 self.assertEqual(result, self.set)
752
753 def test_self_difference(self):
754 result = self.set - self.set
755 self.assertEqual(result, empty_set)
756
757 def test_empty_difference(self):
758 result = self.set - empty_set
759 self.assertEqual(result, self.dup)
760
761 def test_empty_difference_rev(self):
762 result = empty_set - self.set
763 self.assertEqual(result, empty_set)
764
765 def test_iteration(self):
766 for v in self.set:
767 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000768 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000769 # note: __length_hint__ is an internal undocumented API,
770 # don't rely on it in your own programs
771 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000772
773 def test_pickling(self):
774 p = pickle.dumps(self.set)
775 copy = pickle.loads(p)
776 self.assertEqual(self.set, copy,
777 "%s != %s" % (self.set, copy))
778
779#------------------------------------------------------------------------------
780
781class TestBasicOpsEmpty(TestBasicOps):
782 def setUp(self):
783 self.case = "empty set"
784 self.values = []
785 self.set = set(self.values)
786 self.dup = set(self.values)
787 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000788 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000789
790#------------------------------------------------------------------------------
791
792class TestBasicOpsSingleton(TestBasicOps):
793 def setUp(self):
794 self.case = "unit set (number)"
795 self.values = [3]
796 self.set = set(self.values)
797 self.dup = set(self.values)
798 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000799 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000800
801 def test_in(self):
802 self.failUnless(3 in self.set)
803
804 def test_not_in(self):
805 self.failUnless(2 not in self.set)
806
807#------------------------------------------------------------------------------
808
809class TestBasicOpsTuple(TestBasicOps):
810 def setUp(self):
811 self.case = "unit set (tuple)"
812 self.values = [(0, "zero")]
813 self.set = set(self.values)
814 self.dup = set(self.values)
815 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000816 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000817
818 def test_in(self):
819 self.failUnless((0, "zero") in self.set)
820
821 def test_not_in(self):
822 self.failUnless(9 not in self.set)
823
824#------------------------------------------------------------------------------
825
826class TestBasicOpsTriple(TestBasicOps):
827 def setUp(self):
828 self.case = "triple set"
829 self.values = [0, "zero", operator.add]
830 self.set = set(self.values)
831 self.dup = set(self.values)
832 self.length = 3
833 self.repr = None
834
Christian Heimes0ded5b52007-12-10 15:50:56 +0000835#------------------------------------------------------------------------------
836
837class TestBasicOpsString(TestBasicOps):
838 def setUp(self):
839 self.case = "string set"
840 self.values = ["a", "b", "c"]
841 self.set = set(self.values)
842 self.dup = set(self.values)
843 self.length = 3
844 self.repr = "{'a', 'c', 'b'}"
845
846#------------------------------------------------------------------------------
847
848class TestBasicOpsBytes(TestBasicOps):
849 def setUp(self):
850 self.case = "string set"
851 self.values = [b"a", b"b", b"c"]
852 self.set = set(self.values)
853 self.dup = set(self.values)
854 self.length = 3
855 self.repr = "{b'a', b'c', b'b'}"
856
857#------------------------------------------------------------------------------
858
859class TestBasicOpsMixedStringBytes(TestBasicOps):
860 def setUp(self):
861 self.warning_filters = warnings.filters[:]
862 warnings.simplefilter('ignore', BytesWarning)
863 self.case = "string and bytes set"
864 self.values = ["a", "b", b"a", b"b"]
865 self.set = set(self.values)
866 self.dup = set(self.values)
867 self.length = 4
868 self.repr = "{'a', b'a', 'b', b'b'}"
869
870 def tearDown(self):
871 warnings.filters = self.warning_filters
872
Raymond Hettingera690a992003-11-16 16:17:49 +0000873#==============================================================================
874
875def baditer():
876 raise TypeError
877 yield True
878
879def gooditer():
880 yield True
881
882class TestExceptionPropagation(unittest.TestCase):
883 """SF 628246: Set constructor should not trap iterator TypeErrors"""
884
885 def test_instanceWithException(self):
886 self.assertRaises(TypeError, set, baditer())
887
888 def test_instancesWithoutException(self):
889 # All of these iterables should load without exception.
890 set([1,2,3])
891 set((1,2,3))
892 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000893 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000894 set('abc')
895 set(gooditer())
896
Neal Norwitzfcf44352005-11-27 20:37:43 +0000897 def test_changingSizeWhileIterating(self):
898 s = set([1,2,3])
899 try:
900 for i in s:
901 s.update([4])
902 except RuntimeError:
903 pass
904 else:
905 self.fail("no exception when changing size during iteration")
906
Raymond Hettingera690a992003-11-16 16:17:49 +0000907#==============================================================================
908
909class TestSetOfSets(unittest.TestCase):
910 def test_constructor(self):
911 inner = frozenset([1])
912 outer = set([inner])
913 element = outer.pop()
914 self.assertEqual(type(element), frozenset)
915 outer.add(inner) # Rebuild set of sets with .add method
916 outer.remove(inner)
917 self.assertEqual(outer, set()) # Verify that remove worked
918 outer.discard(inner) # Absence of KeyError indicates working fine
919
920#==============================================================================
921
922class TestBinaryOps(unittest.TestCase):
923 def setUp(self):
924 self.set = set((2, 4, 6))
925
926 def test_eq(self): # SF bug 643115
927 self.assertEqual(self.set, set({2:1,4:3,6:5}))
928
929 def test_union_subset(self):
930 result = self.set | set([2])
931 self.assertEqual(result, set((2, 4, 6)))
932
933 def test_union_superset(self):
934 result = self.set | set([2, 4, 6, 8])
935 self.assertEqual(result, set([2, 4, 6, 8]))
936
937 def test_union_overlap(self):
938 result = self.set | set([3, 4, 5])
939 self.assertEqual(result, set([2, 3, 4, 5, 6]))
940
941 def test_union_non_overlap(self):
942 result = self.set | set([8])
943 self.assertEqual(result, set([2, 4, 6, 8]))
944
945 def test_intersection_subset(self):
946 result = self.set & set((2, 4))
947 self.assertEqual(result, set((2, 4)))
948
949 def test_intersection_superset(self):
950 result = self.set & set([2, 4, 6, 8])
951 self.assertEqual(result, set([2, 4, 6]))
952
953 def test_intersection_overlap(self):
954 result = self.set & set([3, 4, 5])
955 self.assertEqual(result, set([4]))
956
957 def test_intersection_non_overlap(self):
958 result = self.set & set([8])
959 self.assertEqual(result, empty_set)
960
Guido van Rossum58da9312007-11-10 23:39:45 +0000961 def test_isdisjoint_subset(self):
962 result = self.set.isdisjoint(set((2, 4)))
963 self.assertEqual(result, False)
964
965 def test_isdisjoint_superset(self):
966 result = self.set.isdisjoint(set([2, 4, 6, 8]))
967 self.assertEqual(result, False)
968
969 def test_isdisjoint_overlap(self):
970 result = self.set.isdisjoint(set([3, 4, 5]))
971 self.assertEqual(result, False)
972
973 def test_isdisjoint_non_overlap(self):
974 result = self.set.isdisjoint(set([8]))
975 self.assertEqual(result, True)
976
Raymond Hettingera690a992003-11-16 16:17:49 +0000977 def test_sym_difference_subset(self):
978 result = self.set ^ set((2, 4))
979 self.assertEqual(result, set([6]))
980
981 def test_sym_difference_superset(self):
982 result = self.set ^ set((2, 4, 6, 8))
983 self.assertEqual(result, set([8]))
984
985 def test_sym_difference_overlap(self):
986 result = self.set ^ set((3, 4, 5))
987 self.assertEqual(result, set([2, 3, 5, 6]))
988
989 def test_sym_difference_non_overlap(self):
990 result = self.set ^ set([8])
991 self.assertEqual(result, set([2, 4, 6, 8]))
992
993 def test_cmp(self):
994 a, b = set('a'), set('b')
995 self.assertRaises(TypeError, cmp, a, b)
996
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000997 # In py3k, this works!
998 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +0000999
1000 self.assertRaises(TypeError, cmp, a, 12)
1001 self.assertRaises(TypeError, cmp, "abc", a)
1002
1003#==============================================================================
1004
1005class TestUpdateOps(unittest.TestCase):
1006 def setUp(self):
1007 self.set = set((2, 4, 6))
1008
1009 def test_union_subset(self):
1010 self.set |= set([2])
1011 self.assertEqual(self.set, set((2, 4, 6)))
1012
1013 def test_union_superset(self):
1014 self.set |= set([2, 4, 6, 8])
1015 self.assertEqual(self.set, set([2, 4, 6, 8]))
1016
1017 def test_union_overlap(self):
1018 self.set |= set([3, 4, 5])
1019 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1020
1021 def test_union_non_overlap(self):
1022 self.set |= set([8])
1023 self.assertEqual(self.set, set([2, 4, 6, 8]))
1024
1025 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001026 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001027 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1028
1029 def test_intersection_subset(self):
1030 self.set &= set((2, 4))
1031 self.assertEqual(self.set, set((2, 4)))
1032
1033 def test_intersection_superset(self):
1034 self.set &= set([2, 4, 6, 8])
1035 self.assertEqual(self.set, set([2, 4, 6]))
1036
1037 def test_intersection_overlap(self):
1038 self.set &= set([3, 4, 5])
1039 self.assertEqual(self.set, set([4]))
1040
1041 def test_intersection_non_overlap(self):
1042 self.set &= set([8])
1043 self.assertEqual(self.set, empty_set)
1044
1045 def test_intersection_method_call(self):
1046 self.set.intersection_update(set([3, 4, 5]))
1047 self.assertEqual(self.set, set([4]))
1048
1049 def test_sym_difference_subset(self):
1050 self.set ^= set((2, 4))
1051 self.assertEqual(self.set, set([6]))
1052
1053 def test_sym_difference_superset(self):
1054 self.set ^= set((2, 4, 6, 8))
1055 self.assertEqual(self.set, set([8]))
1056
1057 def test_sym_difference_overlap(self):
1058 self.set ^= set((3, 4, 5))
1059 self.assertEqual(self.set, set([2, 3, 5, 6]))
1060
1061 def test_sym_difference_non_overlap(self):
1062 self.set ^= set([8])
1063 self.assertEqual(self.set, set([2, 4, 6, 8]))
1064
1065 def test_sym_difference_method_call(self):
1066 self.set.symmetric_difference_update(set([3, 4, 5]))
1067 self.assertEqual(self.set, set([2, 3, 5, 6]))
1068
1069 def test_difference_subset(self):
1070 self.set -= set((2, 4))
1071 self.assertEqual(self.set, set([6]))
1072
1073 def test_difference_superset(self):
1074 self.set -= set((2, 4, 6, 8))
1075 self.assertEqual(self.set, set([]))
1076
1077 def test_difference_overlap(self):
1078 self.set -= set((3, 4, 5))
1079 self.assertEqual(self.set, set([2, 6]))
1080
1081 def test_difference_non_overlap(self):
1082 self.set -= set([8])
1083 self.assertEqual(self.set, set([2, 4, 6]))
1084
1085 def test_difference_method_call(self):
1086 self.set.difference_update(set([3, 4, 5]))
1087 self.assertEqual(self.set, set([2, 6]))
1088
1089#==============================================================================
1090
1091class TestMutate(unittest.TestCase):
1092 def setUp(self):
1093 self.values = ["a", "b", "c"]
1094 self.set = set(self.values)
1095
1096 def test_add_present(self):
1097 self.set.add("c")
1098 self.assertEqual(self.set, set("abc"))
1099
1100 def test_add_absent(self):
1101 self.set.add("d")
1102 self.assertEqual(self.set, set("abcd"))
1103
1104 def test_add_until_full(self):
1105 tmp = set()
1106 expected_len = 0
1107 for v in self.values:
1108 tmp.add(v)
1109 expected_len += 1
1110 self.assertEqual(len(tmp), expected_len)
1111 self.assertEqual(tmp, self.set)
1112
1113 def test_remove_present(self):
1114 self.set.remove("b")
1115 self.assertEqual(self.set, set("ac"))
1116
1117 def test_remove_absent(self):
1118 try:
1119 self.set.remove("d")
1120 self.fail("Removing missing element should have raised LookupError")
1121 except LookupError:
1122 pass
1123
1124 def test_remove_until_empty(self):
1125 expected_len = len(self.set)
1126 for v in self.values:
1127 self.set.remove(v)
1128 expected_len -= 1
1129 self.assertEqual(len(self.set), expected_len)
1130
1131 def test_discard_present(self):
1132 self.set.discard("c")
1133 self.assertEqual(self.set, set("ab"))
1134
1135 def test_discard_absent(self):
1136 self.set.discard("d")
1137 self.assertEqual(self.set, set("abc"))
1138
1139 def test_clear(self):
1140 self.set.clear()
1141 self.assertEqual(len(self.set), 0)
1142
1143 def test_pop(self):
1144 popped = {}
1145 while self.set:
1146 popped[self.set.pop()] = None
1147 self.assertEqual(len(popped), len(self.values))
1148 for v in self.values:
1149 self.failUnless(v in popped)
1150
1151 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001152 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001153 self.assertEqual(self.set, set(self.values))
1154
1155 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001156 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001157 self.assertEqual(self.set, set(self.values))
1158
1159 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001160 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001161 self.assertEqual(self.set, set(self.values + ["z"]))
1162
1163#==============================================================================
1164
1165class TestSubsets(unittest.TestCase):
1166
1167 case2method = {"<=": "issubset",
1168 ">=": "issuperset",
1169 }
1170
1171 reverse = {"==": "==",
1172 "!=": "!=",
1173 "<": ">",
1174 ">": "<",
1175 "<=": ">=",
1176 ">=": "<=",
1177 }
1178
1179 def test_issubset(self):
1180 x = self.left
1181 y = self.right
1182 for case in "!=", "==", "<", "<=", ">", ">=":
1183 expected = case in self.cases
1184 # Test the binary infix spelling.
1185 result = eval("x" + case + "y", locals())
1186 self.assertEqual(result, expected)
1187 # Test the "friendly" method-name spelling, if one exists.
1188 if case in TestSubsets.case2method:
1189 method = getattr(x, TestSubsets.case2method[case])
1190 result = method(y)
1191 self.assertEqual(result, expected)
1192
1193 # Now do the same for the operands reversed.
1194 rcase = TestSubsets.reverse[case]
1195 result = eval("y" + rcase + "x", locals())
1196 self.assertEqual(result, expected)
1197 if rcase in TestSubsets.case2method:
1198 method = getattr(y, TestSubsets.case2method[rcase])
1199 result = method(x)
1200 self.assertEqual(result, expected)
1201#------------------------------------------------------------------------------
1202
1203class TestSubsetEqualEmpty(TestSubsets):
1204 left = set()
1205 right = set()
1206 name = "both empty"
1207 cases = "==", "<=", ">="
1208
1209#------------------------------------------------------------------------------
1210
1211class TestSubsetEqualNonEmpty(TestSubsets):
1212 left = set([1, 2])
1213 right = set([1, 2])
1214 name = "equal pair"
1215 cases = "==", "<=", ">="
1216
1217#------------------------------------------------------------------------------
1218
1219class TestSubsetEmptyNonEmpty(TestSubsets):
1220 left = set()
1221 right = set([1, 2])
1222 name = "one empty, one non-empty"
1223 cases = "!=", "<", "<="
1224
1225#------------------------------------------------------------------------------
1226
1227class TestSubsetPartial(TestSubsets):
1228 left = set([1])
1229 right = set([1, 2])
1230 name = "one a non-empty proper subset of other"
1231 cases = "!=", "<", "<="
1232
1233#------------------------------------------------------------------------------
1234
1235class TestSubsetNonOverlap(TestSubsets):
1236 left = set([1])
1237 right = set([2])
1238 name = "neither empty, neither contains"
1239 cases = "!="
1240
1241#==============================================================================
1242
1243class TestOnlySetsInBinaryOps(unittest.TestCase):
1244
1245 def test_eq_ne(self):
1246 # Unlike the others, this is testing that == and != *are* allowed.
1247 self.assertEqual(self.other == self.set, False)
1248 self.assertEqual(self.set == self.other, False)
1249 self.assertEqual(self.other != self.set, True)
1250 self.assertEqual(self.set != self.other, True)
1251
1252 def test_ge_gt_le_lt(self):
1253 self.assertRaises(TypeError, lambda: self.set < self.other)
1254 self.assertRaises(TypeError, lambda: self.set <= self.other)
1255 self.assertRaises(TypeError, lambda: self.set > self.other)
1256 self.assertRaises(TypeError, lambda: self.set >= self.other)
1257
1258 self.assertRaises(TypeError, lambda: self.other < self.set)
1259 self.assertRaises(TypeError, lambda: self.other <= self.set)
1260 self.assertRaises(TypeError, lambda: self.other > self.set)
1261 self.assertRaises(TypeError, lambda: self.other >= self.set)
1262
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001263 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001264 try:
1265 self.set |= self.other
1266 except TypeError:
1267 pass
1268 else:
1269 self.fail("expected TypeError")
1270
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001271 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001272 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001273 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001274 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001275 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001276
1277 def test_union(self):
1278 self.assertRaises(TypeError, lambda: self.set | self.other)
1279 self.assertRaises(TypeError, lambda: self.other | self.set)
1280 if self.otherIsIterable:
1281 self.set.union(self.other)
1282 else:
1283 self.assertRaises(TypeError, self.set.union, self.other)
1284
1285 def test_intersection_update_operator(self):
1286 try:
1287 self.set &= self.other
1288 except TypeError:
1289 pass
1290 else:
1291 self.fail("expected TypeError")
1292
1293 def test_intersection_update(self):
1294 if self.otherIsIterable:
1295 self.set.intersection_update(self.other)
1296 else:
1297 self.assertRaises(TypeError,
1298 self.set.intersection_update,
1299 self.other)
1300
1301 def test_intersection(self):
1302 self.assertRaises(TypeError, lambda: self.set & self.other)
1303 self.assertRaises(TypeError, lambda: self.other & self.set)
1304 if self.otherIsIterable:
1305 self.set.intersection(self.other)
1306 else:
1307 self.assertRaises(TypeError, self.set.intersection, self.other)
1308
1309 def test_sym_difference_update_operator(self):
1310 try:
1311 self.set ^= self.other
1312 except TypeError:
1313 pass
1314 else:
1315 self.fail("expected TypeError")
1316
1317 def test_sym_difference_update(self):
1318 if self.otherIsIterable:
1319 self.set.symmetric_difference_update(self.other)
1320 else:
1321 self.assertRaises(TypeError,
1322 self.set.symmetric_difference_update,
1323 self.other)
1324
1325 def test_sym_difference(self):
1326 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1327 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1328 if self.otherIsIterable:
1329 self.set.symmetric_difference(self.other)
1330 else:
1331 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1332
1333 def test_difference_update_operator(self):
1334 try:
1335 self.set -= self.other
1336 except TypeError:
1337 pass
1338 else:
1339 self.fail("expected TypeError")
1340
1341 def test_difference_update(self):
1342 if self.otherIsIterable:
1343 self.set.difference_update(self.other)
1344 else:
1345 self.assertRaises(TypeError,
1346 self.set.difference_update,
1347 self.other)
1348
1349 def test_difference(self):
1350 self.assertRaises(TypeError, lambda: self.set - self.other)
1351 self.assertRaises(TypeError, lambda: self.other - self.set)
1352 if self.otherIsIterable:
1353 self.set.difference(self.other)
1354 else:
1355 self.assertRaises(TypeError, self.set.difference, self.other)
1356
1357#------------------------------------------------------------------------------
1358
1359class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1360 def setUp(self):
1361 self.set = set((1, 2, 3))
1362 self.other = 19
1363 self.otherIsIterable = False
1364
1365#------------------------------------------------------------------------------
1366
1367class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1368 def setUp(self):
1369 self.set = set((1, 2, 3))
1370 self.other = {1:2, 3:4}
1371 self.otherIsIterable = True
1372
1373#------------------------------------------------------------------------------
1374
1375class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1376 def setUp(self):
1377 self.set = set((1, 2, 3))
1378 self.other = operator.add
1379 self.otherIsIterable = False
1380
1381#------------------------------------------------------------------------------
1382
1383class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1384 def setUp(self):
1385 self.set = set((1, 2, 3))
1386 self.other = (2, 4, 6)
1387 self.otherIsIterable = True
1388
1389#------------------------------------------------------------------------------
1390
1391class TestOnlySetsString(TestOnlySetsInBinaryOps):
1392 def setUp(self):
1393 self.set = set((1, 2, 3))
1394 self.other = 'abc'
1395 self.otherIsIterable = True
1396
1397#------------------------------------------------------------------------------
1398
1399class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1400 def setUp(self):
1401 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001402 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001403 yield i
1404 self.set = set((1, 2, 3))
1405 self.other = gen()
1406 self.otherIsIterable = True
1407
1408#==============================================================================
1409
1410class TestCopying(unittest.TestCase):
1411
1412 def test_copy(self):
1413 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001414 dup_list = sorted(dup, key=repr)
1415 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001416 self.assertEqual(len(dup_list), len(set_list))
1417 for i in range(len(dup_list)):
1418 self.failUnless(dup_list[i] is set_list[i])
1419
1420 def test_deep_copy(self):
1421 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001422 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001423 dup_list = sorted(dup, key=repr)
1424 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001425 self.assertEqual(len(dup_list), len(set_list))
1426 for i in range(len(dup_list)):
1427 self.assertEqual(dup_list[i], set_list[i])
1428
1429#------------------------------------------------------------------------------
1430
1431class TestCopyingEmpty(TestCopying):
1432 def setUp(self):
1433 self.set = set()
1434
1435#------------------------------------------------------------------------------
1436
1437class TestCopyingSingleton(TestCopying):
1438 def setUp(self):
1439 self.set = set(["hello"])
1440
1441#------------------------------------------------------------------------------
1442
1443class TestCopyingTriple(TestCopying):
1444 def setUp(self):
1445 self.set = set(["zero", 0, None])
1446
1447#------------------------------------------------------------------------------
1448
1449class TestCopyingTuple(TestCopying):
1450 def setUp(self):
1451 self.set = set([(1, 2)])
1452
1453#------------------------------------------------------------------------------
1454
1455class TestCopyingNested(TestCopying):
1456 def setUp(self):
1457 self.set = set([((1, 2), (3, 4))])
1458
1459#==============================================================================
1460
1461class TestIdentities(unittest.TestCase):
1462 def setUp(self):
1463 self.a = set('abracadabra')
1464 self.b = set('alacazam')
1465
1466 def test_binopsVsSubsets(self):
1467 a, b = self.a, self.b
1468 self.assert_(a - b < a)
1469 self.assert_(b - a < b)
1470 self.assert_(a & b < a)
1471 self.assert_(a & b < b)
1472 self.assert_(a | b > a)
1473 self.assert_(a | b > b)
1474 self.assert_(a ^ b < a | b)
1475
1476 def test_commutativity(self):
1477 a, b = self.a, self.b
1478 self.assertEqual(a&b, b&a)
1479 self.assertEqual(a|b, b|a)
1480 self.assertEqual(a^b, b^a)
1481 if a != b:
1482 self.assertNotEqual(a-b, b-a)
1483
1484 def test_summations(self):
1485 # check that sums of parts equal the whole
1486 a, b = self.a, self.b
1487 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1488 self.assertEqual((a&b)|(a^b), a|b)
1489 self.assertEqual(a|(b-a), a|b)
1490 self.assertEqual((a-b)|b, a|b)
1491 self.assertEqual((a-b)|(a&b), a)
1492 self.assertEqual((b-a)|(a&b), b)
1493 self.assertEqual((a-b)|(b-a), a^b)
1494
1495 def test_exclusion(self):
1496 # check that inverse operations show non-overlap
1497 a, b, zero = self.a, self.b, set()
1498 self.assertEqual((a-b)&b, zero)
1499 self.assertEqual((b-a)&a, zero)
1500 self.assertEqual((a&b)&(a^b), zero)
1501
1502# Tests derived from test_itertools.py =======================================
1503
1504def R(seqn):
1505 'Regular generator'
1506 for i in seqn:
1507 yield i
1508
1509class G:
1510 'Sequence using __getitem__'
1511 def __init__(self, seqn):
1512 self.seqn = seqn
1513 def __getitem__(self, i):
1514 return self.seqn[i]
1515
1516class I:
1517 'Sequence using iterator protocol'
1518 def __init__(self, seqn):
1519 self.seqn = seqn
1520 self.i = 0
1521 def __iter__(self):
1522 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001523 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001524 if self.i >= len(self.seqn): raise StopIteration
1525 v = self.seqn[self.i]
1526 self.i += 1
1527 return v
1528
1529class Ig:
1530 'Sequence using iterator protocol defined with a generator'
1531 def __init__(self, seqn):
1532 self.seqn = seqn
1533 self.i = 0
1534 def __iter__(self):
1535 for val in self.seqn:
1536 yield val
1537
1538class X:
1539 'Missing __getitem__ and __iter__'
1540 def __init__(self, seqn):
1541 self.seqn = seqn
1542 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001543 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001544 if self.i >= len(self.seqn): raise StopIteration
1545 v = self.seqn[self.i]
1546 self.i += 1
1547 return v
1548
1549class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001550 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001551 def __init__(self, seqn):
1552 self.seqn = seqn
1553 self.i = 0
1554 def __iter__(self):
1555 return self
1556
1557class E:
1558 'Test propagation of exceptions'
1559 def __init__(self, seqn):
1560 self.seqn = seqn
1561 self.i = 0
1562 def __iter__(self):
1563 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001564 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001565 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001566
1567class S:
1568 'Test immediate stop'
1569 def __init__(self, seqn):
1570 pass
1571 def __iter__(self):
1572 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001573 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001574 raise StopIteration
1575
Raymond Hettingera6c60372008-03-13 01:26:19 +00001576from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001577def L(seqn):
1578 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001579 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001580
1581class TestVariousIteratorArgs(unittest.TestCase):
1582
1583 def test_constructor(self):
1584 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001585 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001586 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001587 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001588 self.assertRaises(TypeError, cons , X(s))
1589 self.assertRaises(TypeError, cons , N(s))
1590 self.assertRaises(ZeroDivisionError, cons , E(s))
1591
1592 def test_inline_methods(self):
1593 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001594 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001595 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001596 for g in (G, I, Ig, L, R):
1597 expected = meth(data)
1598 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001599 if isinstance(expected, bool):
1600 self.assertEqual(actual, expected)
1601 else:
1602 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001603 self.assertRaises(TypeError, meth, X(s))
1604 self.assertRaises(TypeError, meth, N(s))
1605 self.assertRaises(ZeroDivisionError, meth, E(s))
1606
1607 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001608 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001609 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001610 'difference_update', 'symmetric_difference_update'):
1611 for g in (G, I, Ig, S, L, R):
1612 s = set('january')
1613 t = s.copy()
1614 getattr(s, methname)(list(g(data)))
1615 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001616 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001617
1618 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1619 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1620 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1621
Christian Heimes969fe572008-01-25 11:23:10 +00001622# Application tests (based on David Eppstein's graph recipes ====================================
1623
1624def powerset(U):
1625 """Generates all subsets of a set or sequence U."""
1626 U = iter(U)
1627 try:
1628 x = frozenset([next(U)])
1629 for S in powerset(U):
1630 yield S
1631 yield S | x
1632 except StopIteration:
1633 yield frozenset()
1634
1635def cube(n):
1636 """Graph of n-dimensional hypercube."""
1637 singletons = [frozenset([x]) for x in range(n)]
1638 return dict([(x, frozenset([x^s for s in singletons]))
1639 for x in powerset(range(n))])
1640
1641def linegraph(G):
1642 """Graph, the vertices of which are edges of G,
1643 with two vertices being adjacent iff the corresponding
1644 edges share a vertex."""
1645 L = {}
1646 for x in G:
1647 for y in G[x]:
1648 nx = [frozenset([x,z]) for z in G[x] if z != y]
1649 ny = [frozenset([y,z]) for z in G[y] if z != x]
1650 L[frozenset([x,y])] = frozenset(nx+ny)
1651 return L
1652
1653def faces(G):
1654 'Return a set of faces in G. Where a face is a set of vertices on that face'
1655 # currently limited to triangles,squares, and pentagons
1656 f = set()
1657 for v1, edges in G.items():
1658 for v2 in edges:
1659 for v3 in G[v2]:
1660 if v1 == v3:
1661 continue
1662 if v1 in G[v3]:
1663 f.add(frozenset([v1, v2, v3]))
1664 else:
1665 for v4 in G[v3]:
1666 if v4 == v2:
1667 continue
1668 if v1 in G[v4]:
1669 f.add(frozenset([v1, v2, v3, v4]))
1670 else:
1671 for v5 in G[v4]:
1672 if v5 == v3 or v5 == v2:
1673 continue
1674 if v1 in G[v5]:
1675 f.add(frozenset([v1, v2, v3, v4, v5]))
1676 return f
1677
1678
1679class TestGraphs(unittest.TestCase):
1680
1681 def test_cube(self):
1682
1683 g = cube(3) # vert --> {v1, v2, v3}
1684 vertices1 = set(g)
1685 self.assertEqual(len(vertices1), 8) # eight vertices
1686 for edge in g.values():
1687 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1688 vertices2 = set(v for edges in g.values() for v in edges)
1689 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1690
1691 cubefaces = faces(g)
1692 self.assertEqual(len(cubefaces), 6) # six faces
1693 for face in cubefaces:
1694 self.assertEqual(len(face), 4) # each face is a square
1695
1696 def test_cuboctahedron(self):
1697
1698 # http://en.wikipedia.org/wiki/Cuboctahedron
1699 # 8 triangular faces and 6 square faces
1700 # 12 indentical vertices each connecting a triangle and square
1701
1702 g = cube(3)
1703 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1704 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1705
1706 vertices = set(cuboctahedron)
1707 for edges in cuboctahedron.values():
1708 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1709 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1710 self.assertEqual(vertices, othervertices) # edge vertices in original set
1711
1712 cubofaces = faces(cuboctahedron)
1713 facesizes = collections.defaultdict(int)
1714 for face in cubofaces:
1715 facesizes[len(face)] += 1
1716 self.assertEqual(facesizes[3], 8) # eight triangular faces
1717 self.assertEqual(facesizes[4], 6) # six square faces
1718
1719 for vertex in cuboctahedron:
1720 edge = vertex # Cuboctahedron vertices are edges in Cube
1721 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1722 for cubevert in edge:
1723 self.assert_(cubevert in g)
1724
1725
Raymond Hettingera690a992003-11-16 16:17:49 +00001726#==============================================================================
1727
1728def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001729 test_classes = (
1730 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001731 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001732 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001733 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001734 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001735 TestSetOfSets,
1736 TestExceptionPropagation,
1737 TestBasicOpsEmpty,
1738 TestBasicOpsSingleton,
1739 TestBasicOpsTuple,
1740 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001741 TestBasicOpsString,
1742 TestBasicOpsBytes,
1743 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001744 TestBinaryOps,
1745 TestUpdateOps,
1746 TestMutate,
1747 TestSubsetEqualEmpty,
1748 TestSubsetEqualNonEmpty,
1749 TestSubsetEmptyNonEmpty,
1750 TestSubsetPartial,
1751 TestSubsetNonOverlap,
1752 TestOnlySetsNumeric,
1753 TestOnlySetsDict,
1754 TestOnlySetsOperator,
1755 TestOnlySetsTuple,
1756 TestOnlySetsString,
1757 TestOnlySetsGenerator,
1758 TestCopyingEmpty,
1759 TestCopyingSingleton,
1760 TestCopyingTriple,
1761 TestCopyingTuple,
1762 TestCopyingNested,
1763 TestIdentities,
1764 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001765 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001766 )
1767
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001768 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001769
1770 # verify reference counting
1771 if verbose and hasattr(sys, "gettotalrefcount"):
1772 import gc
1773 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001774 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001775 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001776 gc.collect()
1777 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001778 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001779
1780if __name__ == "__main__":
1781 test_main(verbose=True)