blob: 886c4b8db36b9c1663b58dff712cf13a9b8febea [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
2from test import test_support
Antoine Pitrouaa687902009-01-01 14:11:22 +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
Raymond Hettinger61708742008-01-24 21:23:58 +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
23 def __cmp__(self, other):
24 raise RuntimeError
25
Raymond Hettinger53999102006-12-30 04:01:17 +000026class ReprWrapper:
27 'Used to test self-referential repr() calls'
28 def __repr__(self):
29 return repr(self.value)
30
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +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, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000077 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
78 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'))
Raymond Hettingeree4bcad2008-06-09 08:33:37 +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())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000102 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
103 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(''))
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +0000107 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
Raymond Hettinger610a93e2008-06-11 00:44:47 +0000108 s = self.thetype('abcba')
109 z = s.intersection()
110 if self.thetype == frozenset():
111 self.assertEqual(id(s), id(z))
112 else:
113 self.assertNotEqual(id(s), id(z))
Raymond Hettingera690a992003-11-16 16:17:49 +0000114
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000115 def test_isdisjoint(self):
116 def f(s1, s2):
117 'Pure python equivalent of isdisjoint()'
118 return not set(s1).intersection(s2)
119 for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
120 s1 = self.thetype(larg)
121 for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
122 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
123 s2 = C(rarg)
124 actual = s1.isdisjoint(s2)
125 expected = f(s1, s2)
126 self.assertEqual(actual, expected)
127 self.assert_(actual is True or actual is False)
128
Raymond Hettingera690a992003-11-16 16:17:49 +0000129 def test_and(self):
130 i = self.s.intersection(self.otherword)
131 self.assertEqual(self.s & set(self.otherword), i)
132 self.assertEqual(self.s & frozenset(self.otherword), i)
133 try:
134 self.s & self.otherword
135 except TypeError:
136 pass
137 else:
138 self.fail("s&t did not screen-out general iterables")
139
140 def test_difference(self):
141 i = self.s.difference(self.otherword)
142 for c in self.letters:
143 self.assertEqual(c in i, c in self.d and c not in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000144 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000145 self.assertEqual(type(i), self.thetype)
146 self.assertRaises(PassThru, self.s.difference, check_pass_thru())
147 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000148 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
149 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
150 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
151 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
152 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettinger4267be62008-06-11 10:30:54 +0000153 self.assertEqual(self.thetype('abcba').difference(), set('abc'))
154 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000155
156 def test_sub(self):
157 i = self.s.difference(self.otherword)
158 self.assertEqual(self.s - set(self.otherword), i)
159 self.assertEqual(self.s - frozenset(self.otherword), i)
160 try:
161 self.s - self.otherword
162 except TypeError:
163 pass
164 else:
165 self.fail("s-t did not screen-out general iterables")
166
167 def test_symmetric_difference(self):
168 i = self.s.symmetric_difference(self.otherword)
169 for c in self.letters:
170 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000171 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000172 self.assertEqual(type(i), self.thetype)
173 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
174 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000175 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
176 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
177 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
178 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
179 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000180
181 def test_xor(self):
182 i = self.s.symmetric_difference(self.otherword)
183 self.assertEqual(self.s ^ set(self.otherword), i)
184 self.assertEqual(self.s ^ frozenset(self.otherword), i)
185 try:
186 self.s ^ self.otherword
187 except TypeError:
188 pass
189 else:
190 self.fail("s^t did not screen-out general iterables")
191
192 def test_equality(self):
193 self.assertEqual(self.s, set(self.word))
194 self.assertEqual(self.s, frozenset(self.word))
195 self.assertEqual(self.s == self.word, False)
196 self.assertNotEqual(self.s, set(self.otherword))
197 self.assertNotEqual(self.s, frozenset(self.otherword))
198 self.assertEqual(self.s != self.word, True)
199
200 def test_setOfFrozensets(self):
201 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
202 s = self.thetype(t)
203 self.assertEqual(len(s), 3)
204
205 def test_compare(self):
206 self.assertRaises(TypeError, self.s.__cmp__, self.s)
207
208 def test_sub_and_super(self):
209 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
210 self.assert_(p < q)
211 self.assert_(p <= q)
212 self.assert_(q <= q)
213 self.assert_(q > p)
214 self.assert_(q >= p)
215 self.failIf(q < r)
216 self.failIf(q <= r)
217 self.failIf(q > r)
218 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000219 self.assert_(set('a').issubset('abc'))
220 self.assert_(set('abc').issuperset('a'))
221 self.failIf(set('a').issubset('cbs'))
222 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000223
224 def test_pickling(self):
Hirokazu Yamamoto0fc07472008-12-27 04:19:48 +0000225 for i in range(pickle.HIGHEST_PROTOCOL + 1):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000226 p = pickle.dumps(self.s, i)
227 dup = pickle.loads(p)
228 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
229 if type(self.s) not in (set, frozenset):
230 self.s.x = 10
231 p = pickle.dumps(self.s)
232 dup = pickle.loads(p)
233 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000234
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000235 def test_deepcopy(self):
236 class Tracer:
237 def __init__(self, value):
238 self.value = value
239 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000240 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000241 def __deepcopy__(self, memo=None):
242 return Tracer(self.value + 1)
243 t = Tracer(10)
244 s = self.thetype([t])
245 dup = copy.deepcopy(s)
246 self.assertNotEqual(id(s), id(dup))
247 for elem in dup:
248 newt = elem
249 self.assertNotEqual(id(t), id(newt))
250 self.assertEqual(t.value + 1, newt.value)
251
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000252 def test_gc(self):
253 # Create a nest of cycles to exercise overall ref count check
254 class A:
255 pass
256 s = set(A() for i in xrange(1000))
257 for elem in s:
258 elem.cycle = s
259 elem.sub = elem
260 elem.set = set([elem])
261
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000262 def test_subclass_with_custom_hash(self):
263 # Bug #1257731
264 class H(self.thetype):
265 def __hash__(self):
Tim Peters6902b442006-04-11 00:43:27 +0000266 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000267 s=H()
268 f=set()
269 f.add(s)
270 self.assert_(s in f)
271 f.remove(s)
272 f.add(s)
273 f.discard(s)
274
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000275 def test_badcmp(self):
276 s = self.thetype([BadCmp()])
277 # Detect comparison errors during insertion and lookup
278 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
279 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
280 # Detect errors during mutating operations
281 if hasattr(s, 'add'):
282 self.assertRaises(RuntimeError, s.add, BadCmp())
283 self.assertRaises(RuntimeError, s.discard, BadCmp())
284 self.assertRaises(RuntimeError, s.remove, BadCmp())
285
Raymond Hettinger53999102006-12-30 04:01:17 +0000286 def test_cyclical_repr(self):
287 w = ReprWrapper()
288 s = self.thetype([w])
289 w.value = s
290 name = repr(s).partition('(')[0] # strip class name from repr string
291 self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
292
293 def test_cyclical_print(self):
294 w = ReprWrapper()
295 s = self.thetype([w])
296 w.value = s
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000297 fo = open(test_support.TESTFN, "wb")
Raymond Hettinger53999102006-12-30 04:01:17 +0000298 try:
Raymond Hettinger53999102006-12-30 04:01:17 +0000299 print >> fo, s,
300 fo.close()
301 fo = open(test_support.TESTFN, "rb")
302 self.assertEqual(fo.read(), repr(s))
303 finally:
304 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000305 test_support.unlink(test_support.TESTFN)
Raymond Hettinger53999102006-12-30 04:01:17 +0000306
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000307 def test_do_not_rehash_dict_keys(self):
308 n = 10
309 d = dict.fromkeys(map(HashCountingInt, xrange(n)))
310 self.assertEqual(sum(elem.hash_count for elem in d), n)
311 s = self.thetype(d)
312 self.assertEqual(sum(elem.hash_count for elem in d), n)
313 s.difference(d)
Tim Petersea5962f2007-03-12 18:07:52 +0000314 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000315 if hasattr(s, 'symmetric_difference_update'):
316 s.symmetric_difference_update(d)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000317 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettinger0bbbfc42007-03-20 21:27:24 +0000318 d2 = dict.fromkeys(set(d))
319 self.assertEqual(sum(elem.hash_count for elem in d), n)
320 d3 = dict.fromkeys(frozenset(d))
Tim Petersea5962f2007-03-12 18:07:52 +0000321 self.assertEqual(sum(elem.hash_count for elem in d), n)
Raymond Hettingere3146f52007-03-21 20:33:57 +0000322 d3 = dict.fromkeys(frozenset(d), 123)
323 self.assertEqual(sum(elem.hash_count for elem in d), n)
324 self.assertEqual(d3, dict.fromkeys(d, 123))
Raymond Hettingerd6fc72a2007-02-19 02:03:19 +0000325
Antoine Pitrouaa687902009-01-01 14:11:22 +0000326 def test_container_iterator(self):
Antoine Pitrou733dc742009-01-01 15:38:03 +0000327 # Bug #3680: tp_traverse was not implemented for set iterator object
Antoine Pitrouaa687902009-01-01 14:11:22 +0000328 class C(object):
329 pass
330 obj = C()
331 ref = weakref.ref(obj)
332 container = set([obj, 1])
333 obj.x = iter(container)
334 del obj, container
335 gc.collect()
336 self.assert_(ref() is None, "Cycle was not collected")
337
Raymond Hettingera690a992003-11-16 16:17:49 +0000338class TestSet(TestJointOps):
339 thetype = set
340
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000341 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000342 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000343 s.__init__(self.word)
344 self.assertEqual(s, set(self.word))
345 s.__init__(self.otherword)
346 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000347 self.assertRaises(TypeError, s.__init__, s, 2);
348 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000349
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000350 def test_constructor_identity(self):
351 s = self.thetype(range(3))
352 t = self.thetype(s)
353 self.assertNotEqual(id(s), id(t))
354
Raymond Hettingera690a992003-11-16 16:17:49 +0000355 def test_hash(self):
356 self.assertRaises(TypeError, hash, self.s)
357
358 def test_clear(self):
359 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000360 self.assertEqual(self.s, set())
361 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000362
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000363 def test_copy(self):
364 dup = self.s.copy()
365 self.assertEqual(self.s, dup)
366 self.assertNotEqual(id(self.s), id(dup))
367
Raymond Hettingera690a992003-11-16 16:17:49 +0000368 def test_add(self):
369 self.s.add('Q')
370 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000371 dup = self.s.copy()
372 self.s.add('Q')
373 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000374 self.assertRaises(TypeError, self.s.add, [])
375
376 def test_remove(self):
377 self.s.remove('a')
378 self.assert_('a' not in self.s)
379 self.assertRaises(KeyError, self.s.remove, 'Q')
380 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000381 s = self.thetype([frozenset(self.word)])
382 self.assert_(self.thetype(self.word) in s)
383 s.remove(self.thetype(self.word))
384 self.assert_(self.thetype(self.word) not in s)
385 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000386
Raymond Hettingerc789f342006-12-08 17:35:25 +0000387 def test_remove_keyerror_unpacking(self):
388 # bug: www.python.org/sf/1576657
389 for v1 in ['Q', (1,)]:
390 try:
391 self.s.remove(v1)
392 except KeyError, e:
393 v2 = e.args[0]
394 self.assertEqual(v1, v2)
395 else:
396 self.fail()
397
Amaury Forgeot d'Arcd78b9dc2008-10-07 20:32:10 +0000398 def test_remove_keyerror_set(self):
399 key = self.thetype([3, 4])
400 try:
401 self.s.remove(key)
402 except KeyError as e:
403 self.assert_(e.args[0] is key,
404 "KeyError should be {0}, not {1}".format(key,
405 e.args[0]))
406 else:
407 self.fail()
408
Raymond Hettingera690a992003-11-16 16:17:49 +0000409 def test_discard(self):
410 self.s.discard('a')
411 self.assert_('a' not in self.s)
412 self.s.discard('Q')
413 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000414 s = self.thetype([frozenset(self.word)])
415 self.assert_(self.thetype(self.word) in s)
416 s.discard(self.thetype(self.word))
417 self.assert_(self.thetype(self.word) not in s)
418 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000419
420 def test_pop(self):
421 for i in xrange(len(self.s)):
422 elem = self.s.pop()
423 self.assert_(elem not in self.s)
424 self.assertRaises(KeyError, self.s.pop)
425
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000426 def test_update(self):
427 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000428 self.assertEqual(retval, None)
429 for c in (self.word + self.otherword):
430 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000431 self.assertRaises(PassThru, self.s.update, check_pass_thru())
432 self.assertRaises(TypeError, self.s.update, [[]])
433 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
434 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
435 s = self.thetype('abcba')
436 self.assertEqual(s.update(C(p)), None)
437 self.assertEqual(s, set(q))
Raymond Hettingeree4bcad2008-06-09 08:33:37 +0000438 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
439 q = 'ahi'
440 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
441 s = self.thetype('abcba')
442 self.assertEqual(s.update(C(p), C(q)), None)
443 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000444
445 def test_ior(self):
446 self.s |= set(self.otherword)
447 for c in (self.word + self.otherword):
448 self.assert_(c in self.s)
449
450 def test_intersection_update(self):
451 retval = self.s.intersection_update(self.otherword)
452 self.assertEqual(retval, None)
453 for c in (self.word + self.otherword):
454 if c in self.otherword and c in self.word:
455 self.assert_(c in self.s)
456 else:
457 self.assert_(c not in self.s)
458 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
459 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000460 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
461 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
462 s = self.thetype('abcba')
463 self.assertEqual(s.intersection_update(C(p)), None)
464 self.assertEqual(s, set(q))
Raymond Hettinger5c4d3d02008-06-09 13:07:27 +0000465 ss = 'abcba'
466 s = self.thetype(ss)
467 t = 'cbc'
468 self.assertEqual(s.intersection_update(C(p), C(t)), None)
469 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000470
471 def test_iand(self):
472 self.s &= set(self.otherword)
473 for c in (self.word + self.otherword):
474 if c in self.otherword and c in self.word:
475 self.assert_(c in self.s)
476 else:
477 self.assert_(c not in self.s)
478
479 def test_difference_update(self):
480 retval = self.s.difference_update(self.otherword)
481 self.assertEqual(retval, None)
482 for c in (self.word + self.otherword):
483 if c in self.word and c not in self.otherword:
484 self.assert_(c in self.s)
485 else:
486 self.assert_(c not in self.s)
487 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
488 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000489 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
490 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
491 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
492 s = self.thetype('abcba')
493 self.assertEqual(s.difference_update(C(p)), None)
494 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000495
Raymond Hettinger4267be62008-06-11 10:30:54 +0000496 s = self.thetype('abcdefghih')
497 s.difference_update()
498 self.assertEqual(s, self.thetype('abcdefghih'))
499
500 s = self.thetype('abcdefghih')
501 s.difference_update(C('aba'))
502 self.assertEqual(s, self.thetype('cdefghih'))
503
504 s = self.thetype('abcdefghih')
505 s.difference_update(C('cdc'), C('aba'))
506 self.assertEqual(s, self.thetype('efghih'))
507
Raymond Hettingera690a992003-11-16 16:17:49 +0000508 def test_isub(self):
509 self.s -= set(self.otherword)
510 for c in (self.word + self.otherword):
511 if c in self.word and c not in self.otherword:
512 self.assert_(c in self.s)
513 else:
514 self.assert_(c not in self.s)
515
516 def test_symmetric_difference_update(self):
517 retval = self.s.symmetric_difference_update(self.otherword)
518 self.assertEqual(retval, None)
519 for c in (self.word + self.otherword):
520 if (c in self.word) ^ (c in self.otherword):
521 self.assert_(c in self.s)
522 else:
523 self.assert_(c not in self.s)
524 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
525 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000526 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
527 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
528 s = self.thetype('abcba')
529 self.assertEqual(s.symmetric_difference_update(C(p)), None)
530 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000531
532 def test_ixor(self):
533 self.s ^= set(self.otherword)
534 for c in (self.word + self.otherword):
535 if (c in self.word) ^ (c in self.otherword):
536 self.assert_(c in self.s)
537 else:
538 self.assert_(c not in self.s)
539
Raymond Hettingerc991db22005-08-11 07:58:45 +0000540 def test_inplace_on_self(self):
541 t = self.s.copy()
542 t |= t
543 self.assertEqual(t, self.s)
544 t &= t
545 self.assertEqual(t, self.s)
546 t -= t
547 self.assertEqual(t, self.thetype())
548 t = self.s.copy()
549 t ^= t
550 self.assertEqual(t, self.thetype())
551
Raymond Hettinger691d8052004-05-30 07:26:47 +0000552 def test_weakref(self):
553 s = self.thetype('gallahad')
Antoine Pitrouaa687902009-01-01 14:11:22 +0000554 p = weakref.proxy(s)
Raymond Hettinger691d8052004-05-30 07:26:47 +0000555 self.assertEqual(str(p), str(s))
556 s = None
557 self.assertRaises(ReferenceError, str, p)
558
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000559 # C API test only available in a debug build
Barry Warsaw176014f2006-03-30 22:45:35 +0000560 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000561 def test_c_api(self):
562 self.assertEqual(set('abc').test_c_api(), True)
563
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000564class SetSubclass(set):
565 pass
566
567class TestSetSubclass(TestSet):
568 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000569
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000570class SetSubclassWithKeywordArgs(set):
571 def __init__(self, iterable=[], newarg=None):
572 set.__init__(self, iterable)
573
574class TestSetSubclassWithKeywordArgs(TestSet):
Tim Petersf733abb2007-01-30 03:03:46 +0000575
Raymond Hettinger9fdfadb2007-01-11 18:22:55 +0000576 def test_keywords_in_subclass(self):
577 'SF bug #1486663 -- this used to erroneously raise a TypeError'
578 SetSubclassWithKeywordArgs(newarg=1)
579
Raymond Hettingera690a992003-11-16 16:17:49 +0000580class TestFrozenSet(TestJointOps):
581 thetype = frozenset
582
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000583 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000584 s = self.thetype(self.word)
585 s.__init__(self.otherword)
586 self.assertEqual(s, set(self.word))
587
Raymond Hettingerd7946662005-08-01 21:39:29 +0000588 def test_singleton_empty_frozenset(self):
589 f = frozenset()
590 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
591 frozenset(), frozenset([]), frozenset(()), frozenset(''),
592 frozenset(xrange(0)), frozenset(frozenset()),
593 frozenset(f), f]
594 # All of the empty frozensets should have just one id()
595 self.assertEqual(len(set(map(id, efs))), 1)
596
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000597 def test_constructor_identity(self):
598 s = self.thetype(range(3))
599 t = self.thetype(s)
600 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000601
Raymond Hettingera690a992003-11-16 16:17:49 +0000602 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000603 self.assertEqual(hash(self.thetype('abcdeb')),
604 hash(self.thetype('ebecda')))
605
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000606 # make sure that all permutations give the same hash value
607 n = 100
608 seq = [randrange(n) for i in xrange(n)]
609 results = set()
610 for i in xrange(200):
611 shuffle(seq)
612 results.add(hash(self.thetype(seq)))
613 self.assertEqual(len(results), 1)
614
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000615 def test_copy(self):
616 dup = self.s.copy()
617 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000618
619 def test_frozen_as_dictkey(self):
620 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000621 key1 = self.thetype(seq)
622 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000623 self.assertEqual(key1, key2)
624 self.assertNotEqual(id(key1), id(key2))
625 d = {}
626 d[key1] = 42
627 self.assertEqual(d[key2], 42)
628
629 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000630 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000631 self.assertEqual(hash(f), hash(f))
632
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000633 def test_hash_effectiveness(self):
634 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000635 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000636 addhashvalue = hashvalues.add
637 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000638 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000639 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
640 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000641
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000642class FrozenSetSubclass(frozenset):
643 pass
644
645class TestFrozenSetSubclass(TestFrozenSet):
646 thetype = FrozenSetSubclass
647
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000648 def test_constructor_identity(self):
649 s = self.thetype(range(3))
650 t = self.thetype(s)
651 self.assertNotEqual(id(s), id(t))
652
653 def test_copy(self):
654 dup = self.s.copy()
655 self.assertNotEqual(id(self.s), id(dup))
656
657 def test_nested_empty_constructor(self):
658 s = self.thetype()
659 t = self.thetype(s)
660 self.assertEqual(s, t)
661
Raymond Hettingerd7946662005-08-01 21:39:29 +0000662 def test_singleton_empty_frozenset(self):
663 Frozenset = self.thetype
664 f = frozenset()
665 F = Frozenset()
666 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
667 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
668 Frozenset(xrange(0)), Frozenset(Frozenset()),
669 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
670 # All empty frozenset subclass instances should have different ids
671 self.assertEqual(len(set(map(id, efs))), len(efs))
672
Raymond Hettingera690a992003-11-16 16:17:49 +0000673# Tests taken from test_sets.py =============================================
674
675empty_set = set()
676
677#==============================================================================
678
679class TestBasicOps(unittest.TestCase):
680
681 def test_repr(self):
682 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000683 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000684
Raymond Hettingereae05de2004-07-09 04:51:24 +0000685 def test_print(self):
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000686 fo = open(test_support.TESTFN, "wb")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000687 try:
Raymond Hettingereae05de2004-07-09 04:51:24 +0000688 print >> fo, self.set,
689 fo.close()
690 fo = open(test_support.TESTFN, "rb")
691 self.assertEqual(fo.read(), repr(self.set))
692 finally:
693 fo.close()
Neal Norwitzbe9160b2008-03-25 06:35:10 +0000694 test_support.unlink(test_support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000695
Raymond Hettingera690a992003-11-16 16:17:49 +0000696 def test_length(self):
697 self.assertEqual(len(self.set), self.length)
698
699 def test_self_equality(self):
700 self.assertEqual(self.set, self.set)
701
702 def test_equivalent_equality(self):
703 self.assertEqual(self.set, self.dup)
704
705 def test_copy(self):
706 self.assertEqual(self.set.copy(), self.dup)
707
708 def test_self_union(self):
709 result = self.set | self.set
710 self.assertEqual(result, self.dup)
711
712 def test_empty_union(self):
713 result = self.set | empty_set
714 self.assertEqual(result, self.dup)
715
716 def test_union_empty(self):
717 result = empty_set | self.set
718 self.assertEqual(result, self.dup)
719
720 def test_self_intersection(self):
721 result = self.set & self.set
722 self.assertEqual(result, self.dup)
723
724 def test_empty_intersection(self):
725 result = self.set & empty_set
726 self.assertEqual(result, empty_set)
727
728 def test_intersection_empty(self):
729 result = empty_set & self.set
730 self.assertEqual(result, empty_set)
731
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000732 def test_self_isdisjoint(self):
733 result = self.set.isdisjoint(self.set)
734 self.assertEqual(result, not self.set)
735
736 def test_empty_isdisjoint(self):
737 result = self.set.isdisjoint(empty_set)
738 self.assertEqual(result, True)
739
740 def test_isdisjoint_empty(self):
741 result = empty_set.isdisjoint(self.set)
742 self.assertEqual(result, True)
743
Raymond Hettingera690a992003-11-16 16:17:49 +0000744 def test_self_symmetric_difference(self):
745 result = self.set ^ self.set
746 self.assertEqual(result, empty_set)
747
748 def checkempty_symmetric_difference(self):
749 result = self.set ^ empty_set
750 self.assertEqual(result, self.set)
751
752 def test_self_difference(self):
753 result = self.set - self.set
754 self.assertEqual(result, empty_set)
755
756 def test_empty_difference(self):
757 result = self.set - empty_set
758 self.assertEqual(result, self.dup)
759
760 def test_empty_difference_rev(self):
761 result = empty_set - self.set
762 self.assertEqual(result, empty_set)
763
764 def test_iteration(self):
765 for v in self.set:
766 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000767 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000768 # note: __length_hint__ is an internal undocumented API,
769 # don't rely on it in your own programs
770 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000771
772 def test_pickling(self):
773 p = pickle.dumps(self.set)
774 copy = pickle.loads(p)
775 self.assertEqual(self.set, copy,
776 "%s != %s" % (self.set, copy))
777
778#------------------------------------------------------------------------------
779
780class TestBasicOpsEmpty(TestBasicOps):
781 def setUp(self):
782 self.case = "empty set"
783 self.values = []
784 self.set = set(self.values)
785 self.dup = set(self.values)
786 self.length = 0
787 self.repr = "set([])"
788
789#------------------------------------------------------------------------------
790
791class TestBasicOpsSingleton(TestBasicOps):
792 def setUp(self):
793 self.case = "unit set (number)"
794 self.values = [3]
795 self.set = set(self.values)
796 self.dup = set(self.values)
797 self.length = 1
798 self.repr = "set([3])"
799
800 def test_in(self):
801 self.failUnless(3 in self.set)
802
803 def test_not_in(self):
804 self.failUnless(2 not in self.set)
805
806#------------------------------------------------------------------------------
807
808class TestBasicOpsTuple(TestBasicOps):
809 def setUp(self):
810 self.case = "unit set (tuple)"
811 self.values = [(0, "zero")]
812 self.set = set(self.values)
813 self.dup = set(self.values)
814 self.length = 1
815 self.repr = "set([(0, 'zero')])"
816
817 def test_in(self):
818 self.failUnless((0, "zero") in self.set)
819
820 def test_not_in(self):
821 self.failUnless(9 not in self.set)
822
823#------------------------------------------------------------------------------
824
825class TestBasicOpsTriple(TestBasicOps):
826 def setUp(self):
827 self.case = "triple set"
828 self.values = [0, "zero", operator.add]
829 self.set = set(self.values)
830 self.dup = set(self.values)
831 self.length = 3
832 self.repr = None
833
834#==============================================================================
835
836def baditer():
837 raise TypeError
838 yield True
839
840def gooditer():
841 yield True
842
843class TestExceptionPropagation(unittest.TestCase):
844 """SF 628246: Set constructor should not trap iterator TypeErrors"""
845
846 def test_instanceWithException(self):
847 self.assertRaises(TypeError, set, baditer())
848
849 def test_instancesWithoutException(self):
850 # All of these iterables should load without exception.
851 set([1,2,3])
852 set((1,2,3))
853 set({'one':1, 'two':2, 'three':3})
854 set(xrange(3))
855 set('abc')
856 set(gooditer())
857
Neal Norwitzfcf44352005-11-27 20:37:43 +0000858 def test_changingSizeWhileIterating(self):
859 s = set([1,2,3])
860 try:
861 for i in s:
862 s.update([4])
863 except RuntimeError:
864 pass
865 else:
866 self.fail("no exception when changing size during iteration")
867
Raymond Hettingera690a992003-11-16 16:17:49 +0000868#==============================================================================
869
870class TestSetOfSets(unittest.TestCase):
871 def test_constructor(self):
872 inner = frozenset([1])
873 outer = set([inner])
874 element = outer.pop()
875 self.assertEqual(type(element), frozenset)
876 outer.add(inner) # Rebuild set of sets with .add method
877 outer.remove(inner)
878 self.assertEqual(outer, set()) # Verify that remove worked
879 outer.discard(inner) # Absence of KeyError indicates working fine
880
881#==============================================================================
882
883class TestBinaryOps(unittest.TestCase):
884 def setUp(self):
885 self.set = set((2, 4, 6))
886
887 def test_eq(self): # SF bug 643115
888 self.assertEqual(self.set, set({2:1,4:3,6:5}))
889
890 def test_union_subset(self):
891 result = self.set | set([2])
892 self.assertEqual(result, set((2, 4, 6)))
893
894 def test_union_superset(self):
895 result = self.set | set([2, 4, 6, 8])
896 self.assertEqual(result, set([2, 4, 6, 8]))
897
898 def test_union_overlap(self):
899 result = self.set | set([3, 4, 5])
900 self.assertEqual(result, set([2, 3, 4, 5, 6]))
901
902 def test_union_non_overlap(self):
903 result = self.set | set([8])
904 self.assertEqual(result, set([2, 4, 6, 8]))
905
906 def test_intersection_subset(self):
907 result = self.set & set((2, 4))
908 self.assertEqual(result, set((2, 4)))
909
910 def test_intersection_superset(self):
911 result = self.set & set([2, 4, 6, 8])
912 self.assertEqual(result, set([2, 4, 6]))
913
914 def test_intersection_overlap(self):
915 result = self.set & set([3, 4, 5])
916 self.assertEqual(result, set([4]))
917
918 def test_intersection_non_overlap(self):
919 result = self.set & set([8])
920 self.assertEqual(result, empty_set)
921
Raymond Hettinger1760c8a2007-11-08 02:52:43 +0000922 def test_isdisjoint_subset(self):
923 result = self.set.isdisjoint(set((2, 4)))
924 self.assertEqual(result, False)
925
926 def test_isdisjoint_superset(self):
927 result = self.set.isdisjoint(set([2, 4, 6, 8]))
928 self.assertEqual(result, False)
929
930 def test_isdisjoint_overlap(self):
931 result = self.set.isdisjoint(set([3, 4, 5]))
932 self.assertEqual(result, False)
933
934 def test_isdisjoint_non_overlap(self):
935 result = self.set.isdisjoint(set([8]))
936 self.assertEqual(result, True)
937
Raymond Hettingera690a992003-11-16 16:17:49 +0000938 def test_sym_difference_subset(self):
939 result = self.set ^ set((2, 4))
940 self.assertEqual(result, set([6]))
941
942 def test_sym_difference_superset(self):
943 result = self.set ^ set((2, 4, 6, 8))
944 self.assertEqual(result, set([8]))
945
946 def test_sym_difference_overlap(self):
947 result = self.set ^ set((3, 4, 5))
948 self.assertEqual(result, set([2, 3, 5, 6]))
949
950 def test_sym_difference_non_overlap(self):
951 result = self.set ^ set([8])
952 self.assertEqual(result, set([2, 4, 6, 8]))
953
954 def test_cmp(self):
955 a, b = set('a'), set('b')
956 self.assertRaises(TypeError, cmp, a, b)
957
958 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
959 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
960 # which Python thinks is good enough to synthesize a cmp() result
961 # without calling __cmp__.
962 self.assertEqual(cmp(a, a), 0)
963
964 self.assertRaises(TypeError, cmp, a, 12)
965 self.assertRaises(TypeError, cmp, "abc", a)
966
967#==============================================================================
968
969class TestUpdateOps(unittest.TestCase):
970 def setUp(self):
971 self.set = set((2, 4, 6))
972
973 def test_union_subset(self):
974 self.set |= set([2])
975 self.assertEqual(self.set, set((2, 4, 6)))
976
977 def test_union_superset(self):
978 self.set |= set([2, 4, 6, 8])
979 self.assertEqual(self.set, set([2, 4, 6, 8]))
980
981 def test_union_overlap(self):
982 self.set |= set([3, 4, 5])
983 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
984
985 def test_union_non_overlap(self):
986 self.set |= set([8])
987 self.assertEqual(self.set, set([2, 4, 6, 8]))
988
989 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000990 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000991 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
992
993 def test_intersection_subset(self):
994 self.set &= set((2, 4))
995 self.assertEqual(self.set, set((2, 4)))
996
997 def test_intersection_superset(self):
998 self.set &= set([2, 4, 6, 8])
999 self.assertEqual(self.set, set([2, 4, 6]))
1000
1001 def test_intersection_overlap(self):
1002 self.set &= set([3, 4, 5])
1003 self.assertEqual(self.set, set([4]))
1004
1005 def test_intersection_non_overlap(self):
1006 self.set &= set([8])
1007 self.assertEqual(self.set, empty_set)
1008
1009 def test_intersection_method_call(self):
1010 self.set.intersection_update(set([3, 4, 5]))
1011 self.assertEqual(self.set, set([4]))
1012
1013 def test_sym_difference_subset(self):
1014 self.set ^= set((2, 4))
1015 self.assertEqual(self.set, set([6]))
1016
1017 def test_sym_difference_superset(self):
1018 self.set ^= set((2, 4, 6, 8))
1019 self.assertEqual(self.set, set([8]))
1020
1021 def test_sym_difference_overlap(self):
1022 self.set ^= set((3, 4, 5))
1023 self.assertEqual(self.set, set([2, 3, 5, 6]))
1024
1025 def test_sym_difference_non_overlap(self):
1026 self.set ^= set([8])
1027 self.assertEqual(self.set, set([2, 4, 6, 8]))
1028
1029 def test_sym_difference_method_call(self):
1030 self.set.symmetric_difference_update(set([3, 4, 5]))
1031 self.assertEqual(self.set, set([2, 3, 5, 6]))
1032
1033 def test_difference_subset(self):
1034 self.set -= set((2, 4))
1035 self.assertEqual(self.set, set([6]))
1036
1037 def test_difference_superset(self):
1038 self.set -= set((2, 4, 6, 8))
1039 self.assertEqual(self.set, set([]))
1040
1041 def test_difference_overlap(self):
1042 self.set -= set((3, 4, 5))
1043 self.assertEqual(self.set, set([2, 6]))
1044
1045 def test_difference_non_overlap(self):
1046 self.set -= set([8])
1047 self.assertEqual(self.set, set([2, 4, 6]))
1048
1049 def test_difference_method_call(self):
1050 self.set.difference_update(set([3, 4, 5]))
1051 self.assertEqual(self.set, set([2, 6]))
1052
1053#==============================================================================
1054
1055class TestMutate(unittest.TestCase):
1056 def setUp(self):
1057 self.values = ["a", "b", "c"]
1058 self.set = set(self.values)
1059
1060 def test_add_present(self):
1061 self.set.add("c")
1062 self.assertEqual(self.set, set("abc"))
1063
1064 def test_add_absent(self):
1065 self.set.add("d")
1066 self.assertEqual(self.set, set("abcd"))
1067
1068 def test_add_until_full(self):
1069 tmp = set()
1070 expected_len = 0
1071 for v in self.values:
1072 tmp.add(v)
1073 expected_len += 1
1074 self.assertEqual(len(tmp), expected_len)
1075 self.assertEqual(tmp, self.set)
1076
1077 def test_remove_present(self):
1078 self.set.remove("b")
1079 self.assertEqual(self.set, set("ac"))
1080
1081 def test_remove_absent(self):
1082 try:
1083 self.set.remove("d")
1084 self.fail("Removing missing element should have raised LookupError")
1085 except LookupError:
1086 pass
1087
1088 def test_remove_until_empty(self):
1089 expected_len = len(self.set)
1090 for v in self.values:
1091 self.set.remove(v)
1092 expected_len -= 1
1093 self.assertEqual(len(self.set), expected_len)
1094
1095 def test_discard_present(self):
1096 self.set.discard("c")
1097 self.assertEqual(self.set, set("ab"))
1098
1099 def test_discard_absent(self):
1100 self.set.discard("d")
1101 self.assertEqual(self.set, set("abc"))
1102
1103 def test_clear(self):
1104 self.set.clear()
1105 self.assertEqual(len(self.set), 0)
1106
1107 def test_pop(self):
1108 popped = {}
1109 while self.set:
1110 popped[self.set.pop()] = None
1111 self.assertEqual(len(popped), len(self.values))
1112 for v in self.values:
1113 self.failUnless(v in popped)
1114
1115 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001116 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001117 self.assertEqual(self.set, set(self.values))
1118
1119 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001120 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001121 self.assertEqual(self.set, set(self.values))
1122
1123 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001124 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001125 self.assertEqual(self.set, set(self.values + ["z"]))
1126
1127#==============================================================================
1128
1129class TestSubsets(unittest.TestCase):
1130
1131 case2method = {"<=": "issubset",
1132 ">=": "issuperset",
1133 }
1134
1135 reverse = {"==": "==",
1136 "!=": "!=",
1137 "<": ">",
1138 ">": "<",
1139 "<=": ">=",
1140 ">=": "<=",
1141 }
1142
1143 def test_issubset(self):
1144 x = self.left
1145 y = self.right
1146 for case in "!=", "==", "<", "<=", ">", ">=":
1147 expected = case in self.cases
1148 # Test the binary infix spelling.
1149 result = eval("x" + case + "y", locals())
1150 self.assertEqual(result, expected)
1151 # Test the "friendly" method-name spelling, if one exists.
1152 if case in TestSubsets.case2method:
1153 method = getattr(x, TestSubsets.case2method[case])
1154 result = method(y)
1155 self.assertEqual(result, expected)
1156
1157 # Now do the same for the operands reversed.
1158 rcase = TestSubsets.reverse[case]
1159 result = eval("y" + rcase + "x", locals())
1160 self.assertEqual(result, expected)
1161 if rcase in TestSubsets.case2method:
1162 method = getattr(y, TestSubsets.case2method[rcase])
1163 result = method(x)
1164 self.assertEqual(result, expected)
1165#------------------------------------------------------------------------------
1166
1167class TestSubsetEqualEmpty(TestSubsets):
1168 left = set()
1169 right = set()
1170 name = "both empty"
1171 cases = "==", "<=", ">="
1172
1173#------------------------------------------------------------------------------
1174
1175class TestSubsetEqualNonEmpty(TestSubsets):
1176 left = set([1, 2])
1177 right = set([1, 2])
1178 name = "equal pair"
1179 cases = "==", "<=", ">="
1180
1181#------------------------------------------------------------------------------
1182
1183class TestSubsetEmptyNonEmpty(TestSubsets):
1184 left = set()
1185 right = set([1, 2])
1186 name = "one empty, one non-empty"
1187 cases = "!=", "<", "<="
1188
1189#------------------------------------------------------------------------------
1190
1191class TestSubsetPartial(TestSubsets):
1192 left = set([1])
1193 right = set([1, 2])
1194 name = "one a non-empty proper subset of other"
1195 cases = "!=", "<", "<="
1196
1197#------------------------------------------------------------------------------
1198
1199class TestSubsetNonOverlap(TestSubsets):
1200 left = set([1])
1201 right = set([2])
1202 name = "neither empty, neither contains"
1203 cases = "!="
1204
1205#==============================================================================
1206
1207class TestOnlySetsInBinaryOps(unittest.TestCase):
1208
1209 def test_eq_ne(self):
1210 # Unlike the others, this is testing that == and != *are* allowed.
1211 self.assertEqual(self.other == self.set, False)
1212 self.assertEqual(self.set == self.other, False)
1213 self.assertEqual(self.other != self.set, True)
1214 self.assertEqual(self.set != self.other, True)
1215
1216 def test_ge_gt_le_lt(self):
1217 self.assertRaises(TypeError, lambda: self.set < self.other)
1218 self.assertRaises(TypeError, lambda: self.set <= self.other)
1219 self.assertRaises(TypeError, lambda: self.set > self.other)
1220 self.assertRaises(TypeError, lambda: self.set >= self.other)
1221
1222 self.assertRaises(TypeError, lambda: self.other < self.set)
1223 self.assertRaises(TypeError, lambda: self.other <= self.set)
1224 self.assertRaises(TypeError, lambda: self.other > self.set)
1225 self.assertRaises(TypeError, lambda: self.other >= self.set)
1226
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001227 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001228 try:
1229 self.set |= self.other
1230 except TypeError:
1231 pass
1232 else:
1233 self.fail("expected TypeError")
1234
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001235 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001236 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001237 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001238 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001239 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001240
1241 def test_union(self):
1242 self.assertRaises(TypeError, lambda: self.set | self.other)
1243 self.assertRaises(TypeError, lambda: self.other | self.set)
1244 if self.otherIsIterable:
1245 self.set.union(self.other)
1246 else:
1247 self.assertRaises(TypeError, self.set.union, self.other)
1248
1249 def test_intersection_update_operator(self):
1250 try:
1251 self.set &= self.other
1252 except TypeError:
1253 pass
1254 else:
1255 self.fail("expected TypeError")
1256
1257 def test_intersection_update(self):
1258 if self.otherIsIterable:
1259 self.set.intersection_update(self.other)
1260 else:
1261 self.assertRaises(TypeError,
1262 self.set.intersection_update,
1263 self.other)
1264
1265 def test_intersection(self):
1266 self.assertRaises(TypeError, lambda: self.set & self.other)
1267 self.assertRaises(TypeError, lambda: self.other & self.set)
1268 if self.otherIsIterable:
1269 self.set.intersection(self.other)
1270 else:
1271 self.assertRaises(TypeError, self.set.intersection, self.other)
1272
1273 def test_sym_difference_update_operator(self):
1274 try:
1275 self.set ^= self.other
1276 except TypeError:
1277 pass
1278 else:
1279 self.fail("expected TypeError")
1280
1281 def test_sym_difference_update(self):
1282 if self.otherIsIterable:
1283 self.set.symmetric_difference_update(self.other)
1284 else:
1285 self.assertRaises(TypeError,
1286 self.set.symmetric_difference_update,
1287 self.other)
1288
1289 def test_sym_difference(self):
1290 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1291 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1292 if self.otherIsIterable:
1293 self.set.symmetric_difference(self.other)
1294 else:
1295 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1296
1297 def test_difference_update_operator(self):
1298 try:
1299 self.set -= self.other
1300 except TypeError:
1301 pass
1302 else:
1303 self.fail("expected TypeError")
1304
1305 def test_difference_update(self):
1306 if self.otherIsIterable:
1307 self.set.difference_update(self.other)
1308 else:
1309 self.assertRaises(TypeError,
1310 self.set.difference_update,
1311 self.other)
1312
1313 def test_difference(self):
1314 self.assertRaises(TypeError, lambda: self.set - self.other)
1315 self.assertRaises(TypeError, lambda: self.other - self.set)
1316 if self.otherIsIterable:
1317 self.set.difference(self.other)
1318 else:
1319 self.assertRaises(TypeError, self.set.difference, self.other)
1320
1321#------------------------------------------------------------------------------
1322
1323class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1324 def setUp(self):
1325 self.set = set((1, 2, 3))
1326 self.other = 19
1327 self.otherIsIterable = False
1328
1329#------------------------------------------------------------------------------
1330
1331class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1332 def setUp(self):
1333 self.set = set((1, 2, 3))
1334 self.other = {1:2, 3:4}
1335 self.otherIsIterable = True
1336
1337#------------------------------------------------------------------------------
1338
1339class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1340 def setUp(self):
1341 self.set = set((1, 2, 3))
1342 self.other = operator.add
1343 self.otherIsIterable = False
1344
1345#------------------------------------------------------------------------------
1346
1347class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1348 def setUp(self):
1349 self.set = set((1, 2, 3))
1350 self.other = (2, 4, 6)
1351 self.otherIsIterable = True
1352
1353#------------------------------------------------------------------------------
1354
1355class TestOnlySetsString(TestOnlySetsInBinaryOps):
1356 def setUp(self):
1357 self.set = set((1, 2, 3))
1358 self.other = 'abc'
1359 self.otherIsIterable = True
1360
1361#------------------------------------------------------------------------------
1362
1363class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1364 def setUp(self):
1365 def gen():
1366 for i in xrange(0, 10, 2):
1367 yield i
1368 self.set = set((1, 2, 3))
1369 self.other = gen()
1370 self.otherIsIterable = True
1371
1372#==============================================================================
1373
1374class TestCopying(unittest.TestCase):
1375
1376 def test_copy(self):
1377 dup = self.set.copy()
1378 dup_list = list(dup); dup_list.sort()
1379 set_list = list(self.set); set_list.sort()
1380 self.assertEqual(len(dup_list), len(set_list))
1381 for i in range(len(dup_list)):
1382 self.failUnless(dup_list[i] is set_list[i])
1383
1384 def test_deep_copy(self):
1385 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001386 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001387 dup_list = list(dup); dup_list.sort()
1388 set_list = list(self.set); set_list.sort()
1389 self.assertEqual(len(dup_list), len(set_list))
1390 for i in range(len(dup_list)):
1391 self.assertEqual(dup_list[i], set_list[i])
1392
1393#------------------------------------------------------------------------------
1394
1395class TestCopyingEmpty(TestCopying):
1396 def setUp(self):
1397 self.set = set()
1398
1399#------------------------------------------------------------------------------
1400
1401class TestCopyingSingleton(TestCopying):
1402 def setUp(self):
1403 self.set = set(["hello"])
1404
1405#------------------------------------------------------------------------------
1406
1407class TestCopyingTriple(TestCopying):
1408 def setUp(self):
1409 self.set = set(["zero", 0, None])
1410
1411#------------------------------------------------------------------------------
1412
1413class TestCopyingTuple(TestCopying):
1414 def setUp(self):
1415 self.set = set([(1, 2)])
1416
1417#------------------------------------------------------------------------------
1418
1419class TestCopyingNested(TestCopying):
1420 def setUp(self):
1421 self.set = set([((1, 2), (3, 4))])
1422
1423#==============================================================================
1424
1425class TestIdentities(unittest.TestCase):
1426 def setUp(self):
1427 self.a = set('abracadabra')
1428 self.b = set('alacazam')
1429
1430 def test_binopsVsSubsets(self):
1431 a, b = self.a, self.b
1432 self.assert_(a - b < a)
1433 self.assert_(b - a < b)
1434 self.assert_(a & b < a)
1435 self.assert_(a & b < b)
1436 self.assert_(a | b > a)
1437 self.assert_(a | b > b)
1438 self.assert_(a ^ b < a | b)
1439
1440 def test_commutativity(self):
1441 a, b = self.a, self.b
1442 self.assertEqual(a&b, b&a)
1443 self.assertEqual(a|b, b|a)
1444 self.assertEqual(a^b, b^a)
1445 if a != b:
1446 self.assertNotEqual(a-b, b-a)
1447
1448 def test_summations(self):
1449 # check that sums of parts equal the whole
1450 a, b = self.a, self.b
1451 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1452 self.assertEqual((a&b)|(a^b), a|b)
1453 self.assertEqual(a|(b-a), a|b)
1454 self.assertEqual((a-b)|b, a|b)
1455 self.assertEqual((a-b)|(a&b), a)
1456 self.assertEqual((b-a)|(a&b), b)
1457 self.assertEqual((a-b)|(b-a), a^b)
1458
1459 def test_exclusion(self):
1460 # check that inverse operations show non-overlap
1461 a, b, zero = self.a, self.b, set()
1462 self.assertEqual((a-b)&b, zero)
1463 self.assertEqual((b-a)&a, zero)
1464 self.assertEqual((a&b)&(a^b), zero)
1465
1466# Tests derived from test_itertools.py =======================================
1467
1468def R(seqn):
1469 'Regular generator'
1470 for i in seqn:
1471 yield i
1472
1473class G:
1474 'Sequence using __getitem__'
1475 def __init__(self, seqn):
1476 self.seqn = seqn
1477 def __getitem__(self, i):
1478 return self.seqn[i]
1479
1480class I:
1481 'Sequence using iterator protocol'
1482 def __init__(self, seqn):
1483 self.seqn = seqn
1484 self.i = 0
1485 def __iter__(self):
1486 return self
1487 def next(self):
1488 if self.i >= len(self.seqn): raise StopIteration
1489 v = self.seqn[self.i]
1490 self.i += 1
1491 return v
1492
1493class Ig:
1494 'Sequence using iterator protocol defined with a generator'
1495 def __init__(self, seqn):
1496 self.seqn = seqn
1497 self.i = 0
1498 def __iter__(self):
1499 for val in self.seqn:
1500 yield val
1501
1502class X:
1503 'Missing __getitem__ and __iter__'
1504 def __init__(self, seqn):
1505 self.seqn = seqn
1506 self.i = 0
1507 def next(self):
1508 if self.i >= len(self.seqn): raise StopIteration
1509 v = self.seqn[self.i]
1510 self.i += 1
1511 return v
1512
1513class N:
1514 'Iterator missing next()'
1515 def __init__(self, seqn):
1516 self.seqn = seqn
1517 self.i = 0
1518 def __iter__(self):
1519 return self
1520
1521class E:
1522 'Test propagation of exceptions'
1523 def __init__(self, seqn):
1524 self.seqn = seqn
1525 self.i = 0
1526 def __iter__(self):
1527 return self
1528 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001529 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001530
1531class S:
1532 'Test immediate stop'
1533 def __init__(self, seqn):
1534 pass
1535 def __iter__(self):
1536 return self
1537 def next(self):
1538 raise StopIteration
1539
1540from itertools import chain, imap
1541def L(seqn):
1542 'Test multiple tiers of iterators'
1543 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1544
1545class TestVariousIteratorArgs(unittest.TestCase):
1546
1547 def test_constructor(self):
1548 for cons in (set, frozenset):
1549 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1550 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001551 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001552 self.assertRaises(TypeError, cons , X(s))
1553 self.assertRaises(TypeError, cons , N(s))
1554 self.assertRaises(ZeroDivisionError, cons , E(s))
1555
1556 def test_inline_methods(self):
1557 s = set('november')
1558 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001559 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001560 for g in (G, I, Ig, L, R):
1561 expected = meth(data)
1562 actual = meth(G(data))
Raymond Hettinger1760c8a2007-11-08 02:52:43 +00001563 if isinstance(expected, bool):
1564 self.assertEqual(actual, expected)
1565 else:
1566 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001567 self.assertRaises(TypeError, meth, X(s))
1568 self.assertRaises(TypeError, meth, N(s))
1569 self.assertRaises(ZeroDivisionError, meth, E(s))
1570
1571 def test_inplace_methods(self):
1572 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001573 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001574 'difference_update', 'symmetric_difference_update'):
1575 for g in (G, I, Ig, S, L, R):
1576 s = set('january')
1577 t = s.copy()
1578 getattr(s, methname)(list(g(data)))
1579 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001580 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001581
1582 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1583 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1584 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1585
Raymond Hettinger61708742008-01-24 21:23:58 +00001586# Application tests (based on David Eppstein's graph recipes ====================================
1587
1588def powerset(U):
1589 """Generates all subsets of a set or sequence U."""
1590 U = iter(U)
1591 try:
1592 x = frozenset([U.next()])
1593 for S in powerset(U):
1594 yield S
1595 yield S | x
1596 except StopIteration:
1597 yield frozenset()
1598
1599def cube(n):
1600 """Graph of n-dimensional hypercube."""
1601 singletons = [frozenset([x]) for x in range(n)]
1602 return dict([(x, frozenset([x^s for s in singletons]))
1603 for x in powerset(range(n))])
1604
1605def linegraph(G):
1606 """Graph, the vertices of which are edges of G,
1607 with two vertices being adjacent iff the corresponding
1608 edges share a vertex."""
1609 L = {}
1610 for x in G:
1611 for y in G[x]:
1612 nx = [frozenset([x,z]) for z in G[x] if z != y]
1613 ny = [frozenset([y,z]) for z in G[y] if z != x]
1614 L[frozenset([x,y])] = frozenset(nx+ny)
1615 return L
1616
1617def faces(G):
1618 'Return a set of faces in G. Where a face is a set of vertices on that face'
1619 # currently limited to triangles,squares, and pentagons
1620 f = set()
1621 for v1, edges in G.items():
1622 for v2 in edges:
1623 for v3 in G[v2]:
1624 if v1 == v3:
1625 continue
1626 if v1 in G[v3]:
1627 f.add(frozenset([v1, v2, v3]))
1628 else:
1629 for v4 in G[v3]:
1630 if v4 == v2:
1631 continue
1632 if v1 in G[v4]:
1633 f.add(frozenset([v1, v2, v3, v4]))
1634 else:
1635 for v5 in G[v4]:
1636 if v5 == v3 or v5 == v2:
1637 continue
1638 if v1 in G[v5]:
1639 f.add(frozenset([v1, v2, v3, v4, v5]))
1640 return f
1641
1642
1643class TestGraphs(unittest.TestCase):
1644
1645 def test_cube(self):
1646
1647 g = cube(3) # vert --> {v1, v2, v3}
1648 vertices1 = set(g)
1649 self.assertEqual(len(vertices1), 8) # eight vertices
1650 for edge in g.values():
1651 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1652 vertices2 = set(v for edges in g.values() for v in edges)
1653 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1654
1655 cubefaces = faces(g)
1656 self.assertEqual(len(cubefaces), 6) # six faces
1657 for face in cubefaces:
1658 self.assertEqual(len(face), 4) # each face is a square
1659
1660 def test_cuboctahedron(self):
1661
1662 # http://en.wikipedia.org/wiki/Cuboctahedron
1663 # 8 triangular faces and 6 square faces
1664 # 12 indentical vertices each connecting a triangle and square
1665
1666 g = cube(3)
1667 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1668 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1669
1670 vertices = set(cuboctahedron)
1671 for edges in cuboctahedron.values():
1672 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1673 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1674 self.assertEqual(vertices, othervertices) # edge vertices in original set
1675
1676 cubofaces = faces(cuboctahedron)
1677 facesizes = collections.defaultdict(int)
1678 for face in cubofaces:
1679 facesizes[len(face)] += 1
1680 self.assertEqual(facesizes[3], 8) # eight triangular faces
1681 self.assertEqual(facesizes[4], 6) # six square faces
1682
1683 for vertex in cuboctahedron:
1684 edge = vertex # Cuboctahedron vertices are edges in Cube
1685 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1686 for cubevert in edge:
1687 self.assert_(cubevert in g)
1688
1689
Raymond Hettingera690a992003-11-16 16:17:49 +00001690#==============================================================================
1691
1692def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001693 from test import test_sets
1694 test_classes = (
1695 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001696 TestSetSubclass,
Tim Petersf733abb2007-01-30 03:03:46 +00001697 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001698 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001699 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001700 TestSetOfSets,
1701 TestExceptionPropagation,
1702 TestBasicOpsEmpty,
1703 TestBasicOpsSingleton,
1704 TestBasicOpsTuple,
1705 TestBasicOpsTriple,
1706 TestBinaryOps,
1707 TestUpdateOps,
1708 TestMutate,
1709 TestSubsetEqualEmpty,
1710 TestSubsetEqualNonEmpty,
1711 TestSubsetEmptyNonEmpty,
1712 TestSubsetPartial,
1713 TestSubsetNonOverlap,
1714 TestOnlySetsNumeric,
1715 TestOnlySetsDict,
1716 TestOnlySetsOperator,
1717 TestOnlySetsTuple,
1718 TestOnlySetsString,
1719 TestOnlySetsGenerator,
1720 TestCopyingEmpty,
1721 TestCopyingSingleton,
1722 TestCopyingTriple,
1723 TestCopyingTuple,
1724 TestCopyingNested,
1725 TestIdentities,
1726 TestVariousIteratorArgs,
Raymond Hettinger61708742008-01-24 21:23:58 +00001727 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001728 )
1729
1730 test_support.run_unittest(*test_classes)
1731
1732 # verify reference counting
1733 if verbose and hasattr(sys, "gettotalrefcount"):
1734 import gc
1735 counts = [None] * 5
1736 for i in xrange(len(counts)):
1737 test_support.run_unittest(*test_classes)
1738 gc.collect()
1739 counts[i] = sys.gettotalrefcount()
1740 print counts
1741
1742if __name__ == "__main__":
1743 test_main(verbose=True)