blob: 614c9c09b0e1614c942729b2ec65ca35891fd5c1 [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'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +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
Guido van Rossum58da9312007-11-10 23:39:45 +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, 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, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000148 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000149 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'))
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +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, [[]])
Guido van Rossum75a902d2007-10-19 22:06:24 +0000175 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000176 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
Raymond Hettingera690a992003-11-16 16:17:49 +0000205 def test_sub_and_super(self):
206 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
207 self.assert_(p < q)
208 self.assert_(p <= q)
209 self.assert_(q <= q)
210 self.assert_(q > p)
211 self.assert_(q >= p)
212 self.failIf(q < r)
213 self.failIf(q <= r)
214 self.failIf(q > r)
215 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000216 self.assert_(set('a').issubset('abc'))
217 self.assert_(set('abc').issuperset('a'))
218 self.failIf(set('a').issubset('cbs'))
219 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000220
221 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000222 for i in (0, 1, 2):
223 p = pickle.dumps(self.s, i)
224 dup = pickle.loads(p)
225 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
226 if type(self.s) not in (set, frozenset):
227 self.s.x = 10
228 p = pickle.dumps(self.s)
229 dup = pickle.loads(p)
230 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000231
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000232 def test_deepcopy(self):
233 class Tracer:
234 def __init__(self, value):
235 self.value = value
236 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000237 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000238 def __deepcopy__(self, memo=None):
239 return Tracer(self.value + 1)
240 t = Tracer(10)
241 s = self.thetype([t])
242 dup = copy.deepcopy(s)
243 self.assertNotEqual(id(s), id(dup))
244 for elem in dup:
245 newt = elem
246 self.assertNotEqual(id(t), id(newt))
247 self.assertEqual(t.value + 1, newt.value)
248
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000249 def test_gc(self):
250 # Create a nest of cycles to exercise overall ref count check
251 class A:
252 pass
Guido van Rossum805365e2007-05-07 22:24:25 +0000253 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000254 for elem in s:
255 elem.cycle = s
256 elem.sub = elem
257 elem.set = set([elem])
258
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000259 def test_subclass_with_custom_hash(self):
260 # Bug #1257731
261 class H(self.thetype):
262 def __hash__(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000263 return int(id(self) & 0x7fffffff)
Raymond Hettinger97979dd2005-08-12 23:58:22 +0000264 s=H()
265 f=set()
266 f.add(s)
267 self.assert_(s in f)
268 f.remove(s)
269 f.add(s)
270 f.discard(s)
271
Raymond Hettinger9bda1d62005-09-16 07:14:21 +0000272 def test_badcmp(self):
273 s = self.thetype([BadCmp()])
274 # Detect comparison errors during insertion and lookup
275 self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
276 self.assertRaises(RuntimeError, s.__contains__, BadCmp())
277 # Detect errors during mutating operations
278 if hasattr(s, 'add'):
279 self.assertRaises(RuntimeError, s.add, BadCmp())
280 self.assertRaises(RuntimeError, s.discard, BadCmp())
281 self.assertRaises(RuntimeError, s.remove, BadCmp())
282
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000283 def test_cyclical_repr(self):
284 w = ReprWrapper()
285 s = self.thetype([w])
286 w.value = s
287 if self.thetype == set:
288 self.assertEqual(repr(s), '{set(...)}')
289 else:
290 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000291 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000292
293 def test_cyclical_print(self):
294 w = ReprWrapper()
295 s = self.thetype([w])
296 w.value = s
Thomas Heller0d755b42008-07-15 17:14:09 +0000297 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000298 try:
Guido van Rossumd8c19672007-02-09 21:54:58 +0000299 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000300 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000301 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000302 self.assertEqual(fo.read(), repr(s))
303 finally:
304 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000305 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000306
Thomas Wouterscf297e42007-02-23 15:07:44 +0000307 def test_do_not_rehash_dict_keys(self):
308 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000309 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000310 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)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000314 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000315 if hasattr(s, 'symmetric_difference_update'):
316 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317 self.assertEqual(sum(elem.hash_count for elem in d), n)
318 d2 = dict.fromkeys(set(d))
319 self.assertEqual(sum(elem.hash_count for elem in d), n)
320 d3 = dict.fromkeys(frozenset(d))
321 self.assertEqual(sum(elem.hash_count for elem in d), n)
322 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))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000325
Raymond Hettingera690a992003-11-16 16:17:49 +0000326class TestSet(TestJointOps):
327 thetype = set
328
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000329 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000330 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000331 s.__init__(self.word)
332 self.assertEqual(s, set(self.word))
333 s.__init__(self.otherword)
334 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000335 self.assertRaises(TypeError, s.__init__, s, 2);
336 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000337
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000338 def test_constructor_identity(self):
339 s = self.thetype(range(3))
340 t = self.thetype(s)
341 self.assertNotEqual(id(s), id(t))
342
Guido van Rossum86e58e22006-08-28 15:27:34 +0000343 def test_set_literal(self):
344 s = set([1,2,3])
345 t = {1,2,3}
346 self.assertEqual(s, t)
347
Raymond Hettingera690a992003-11-16 16:17:49 +0000348 def test_hash(self):
349 self.assertRaises(TypeError, hash, self.s)
350
351 def test_clear(self):
352 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000353 self.assertEqual(self.s, set())
354 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000355
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000356 def test_copy(self):
357 dup = self.s.copy()
358 self.assertEqual(self.s, dup)
359 self.assertNotEqual(id(self.s), id(dup))
360
Raymond Hettingera690a992003-11-16 16:17:49 +0000361 def test_add(self):
362 self.s.add('Q')
363 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000364 dup = self.s.copy()
365 self.s.add('Q')
366 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000367 self.assertRaises(TypeError, self.s.add, [])
368
369 def test_remove(self):
370 self.s.remove('a')
371 self.assert_('a' not in self.s)
372 self.assertRaises(KeyError, self.s.remove, 'Q')
373 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000374 s = self.thetype([frozenset(self.word)])
375 self.assert_(self.thetype(self.word) in s)
376 s.remove(self.thetype(self.word))
377 self.assert_(self.thetype(self.word) not in s)
378 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000379
Thomas Wouters89f507f2006-12-13 04:49:30 +0000380 def test_remove_keyerror_unpacking(self):
381 # bug: www.python.org/sf/1576657
382 for v1 in ['Q', (1,)]:
383 try:
384 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000385 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000386 v2 = e.args[0]
387 self.assertEqual(v1, v2)
388 else:
389 self.fail()
390
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000391 def test_remove_keyerror_set(self):
392 key = self.thetype([3, 4])
393 try:
394 self.s.remove(key)
395 except KeyError as e:
396 self.assert_(e.args[0] is key,
397 "KeyError should be {0}, not {1}".format(key,
398 e.args[0]))
399 else:
400 self.fail()
401
Raymond Hettingera690a992003-11-16 16:17:49 +0000402 def test_discard(self):
403 self.s.discard('a')
404 self.assert_('a' not in self.s)
405 self.s.discard('Q')
406 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000407 s = self.thetype([frozenset(self.word)])
408 self.assert_(self.thetype(self.word) in s)
409 s.discard(self.thetype(self.word))
410 self.assert_(self.thetype(self.word) not in s)
411 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000412
413 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000414 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000415 elem = self.s.pop()
416 self.assert_(elem not in self.s)
417 self.assertRaises(KeyError, self.s.pop)
418
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000419 def test_update(self):
420 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000421 self.assertEqual(retval, None)
422 for c in (self.word + self.otherword):
423 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000424 self.assertRaises(PassThru, self.s.update, check_pass_thru())
425 self.assertRaises(TypeError, self.s.update, [[]])
426 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000427 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000428 s = self.thetype('abcba')
429 self.assertEqual(s.update(C(p)), None)
430 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000431 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
432 q = 'ahi'
433 for C in set, frozenset, dict.fromkeys, str, list, tuple:
434 s = self.thetype('abcba')
435 self.assertEqual(s.update(C(p), C(q)), None)
436 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000437
438 def test_ior(self):
439 self.s |= set(self.otherword)
440 for c in (self.word + self.otherword):
441 self.assert_(c in self.s)
442
443 def test_intersection_update(self):
444 retval = self.s.intersection_update(self.otherword)
445 self.assertEqual(retval, None)
446 for c in (self.word + self.otherword):
447 if c in self.otherword and c in self.word:
448 self.assert_(c in self.s)
449 else:
450 self.assert_(c not in self.s)
451 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
452 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000453 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000454 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000455 s = self.thetype('abcba')
456 self.assertEqual(s.intersection_update(C(p)), None)
457 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000458 ss = 'abcba'
459 s = self.thetype(ss)
460 t = 'cbc'
461 self.assertEqual(s.intersection_update(C(p), C(t)), None)
462 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000463
464 def test_iand(self):
465 self.s &= set(self.otherword)
466 for c in (self.word + self.otherword):
467 if c in self.otherword and c in self.word:
468 self.assert_(c in self.s)
469 else:
470 self.assert_(c not in self.s)
471
472 def test_difference_update(self):
473 retval = self.s.difference_update(self.otherword)
474 self.assertEqual(retval, None)
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 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
481 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000482 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
483 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000484 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000485 s = self.thetype('abcba')
486 self.assertEqual(s.difference_update(C(p)), None)
487 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000488
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000489 s = self.thetype('abcdefghih')
490 s.difference_update()
491 self.assertEqual(s, self.thetype('abcdefghih'))
492
493 s = self.thetype('abcdefghih')
494 s.difference_update(C('aba'))
495 self.assertEqual(s, self.thetype('cdefghih'))
496
497 s = self.thetype('abcdefghih')
498 s.difference_update(C('cdc'), C('aba'))
499 self.assertEqual(s, self.thetype('efghih'))
500
Raymond Hettingera690a992003-11-16 16:17:49 +0000501 def test_isub(self):
502 self.s -= set(self.otherword)
503 for c in (self.word + self.otherword):
504 if c in self.word and c not in self.otherword:
505 self.assert_(c in self.s)
506 else:
507 self.assert_(c not in self.s)
508
509 def test_symmetric_difference_update(self):
510 retval = self.s.symmetric_difference_update(self.otherword)
511 self.assertEqual(retval, None)
512 for c in (self.word + self.otherword):
513 if (c in self.word) ^ (c in self.otherword):
514 self.assert_(c in self.s)
515 else:
516 self.assert_(c not in self.s)
517 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
518 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000519 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000520 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000521 s = self.thetype('abcba')
522 self.assertEqual(s.symmetric_difference_update(C(p)), None)
523 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000524
525 def test_ixor(self):
526 self.s ^= set(self.otherword)
527 for c in (self.word + self.otherword):
528 if (c in self.word) ^ (c in self.otherword):
529 self.assert_(c in self.s)
530 else:
531 self.assert_(c not in self.s)
532
Raymond Hettingerc991db22005-08-11 07:58:45 +0000533 def test_inplace_on_self(self):
534 t = self.s.copy()
535 t |= t
536 self.assertEqual(t, self.s)
537 t &= t
538 self.assertEqual(t, self.s)
539 t -= t
540 self.assertEqual(t, self.thetype())
541 t = self.s.copy()
542 t ^= t
543 self.assertEqual(t, self.thetype())
544
Raymond Hettinger691d8052004-05-30 07:26:47 +0000545 def test_weakref(self):
546 s = self.thetype('gallahad')
547 p = proxy(s)
548 self.assertEqual(str(p), str(s))
549 s = None
550 self.assertRaises(ReferenceError, str, p)
551
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000552 def test_rich_compare(self):
553 class TestRichSetCompare:
554 def __gt__(self, some_set):
555 self.gt_called = True
556 return False
557 def __lt__(self, some_set):
558 self.lt_called = True
559 return False
560 def __ge__(self, some_set):
561 self.ge_called = True
562 return False
563 def __le__(self, some_set):
564 self.le_called = True
565 return False
566
567 # This first tries the bulitin rich set comparison, which doesn't know
568 # how to handle the custom object. Upon returning NotImplemented, the
569 # corresponding comparison on the right object is invoked.
570 myset = {1, 2, 3}
571
572 myobj = TestRichSetCompare()
573 myset < myobj
574 self.assert_(myobj.gt_called)
575
576 myobj = TestRichSetCompare()
577 myset > myobj
578 self.assert_(myobj.lt_called)
579
580 myobj = TestRichSetCompare()
581 myset <= myobj
582 self.assert_(myobj.ge_called)
583
584 myobj = TestRichSetCompare()
585 myset >= myobj
586 self.assert_(myobj.le_called)
587
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000588 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000589 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000590 def test_c_api(self):
591 self.assertEqual(set('abc').test_c_api(), True)
592
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000593class SetSubclass(set):
594 pass
595
596class TestSetSubclass(TestSet):
597 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000598
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000599class SetSubclassWithKeywordArgs(set):
600 def __init__(self, iterable=[], newarg=None):
601 set.__init__(self, iterable)
602
603class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000604
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000605 def test_keywords_in_subclass(self):
606 'SF bug #1486663 -- this used to erroneously raise a TypeError'
607 SetSubclassWithKeywordArgs(newarg=1)
608
Raymond Hettingera690a992003-11-16 16:17:49 +0000609class TestFrozenSet(TestJointOps):
610 thetype = frozenset
611
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000612 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000613 s = self.thetype(self.word)
614 s.__init__(self.otherword)
615 self.assertEqual(s, set(self.word))
616
Raymond Hettingerd7946662005-08-01 21:39:29 +0000617 def test_singleton_empty_frozenset(self):
618 f = frozenset()
619 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
620 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000621 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000622 frozenset(f), f]
623 # All of the empty frozensets should have just one id()
624 self.assertEqual(len(set(map(id, efs))), 1)
625
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000626 def test_constructor_identity(self):
627 s = self.thetype(range(3))
628 t = self.thetype(s)
629 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000630
Raymond Hettingera690a992003-11-16 16:17:49 +0000631 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000632 self.assertEqual(hash(self.thetype('abcdeb')),
633 hash(self.thetype('ebecda')))
634
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000635 # make sure that all permutations give the same hash value
636 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000637 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000638 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000639 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000640 shuffle(seq)
641 results.add(hash(self.thetype(seq)))
642 self.assertEqual(len(results), 1)
643
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000644 def test_copy(self):
645 dup = self.s.copy()
646 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000647
648 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000649 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000650 key1 = self.thetype(seq)
651 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000652 self.assertEqual(key1, key2)
653 self.assertNotEqual(id(key1), id(key2))
654 d = {}
655 d[key1] = 42
656 self.assertEqual(d[key2], 42)
657
658 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000659 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000660 self.assertEqual(hash(f), hash(f))
661
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000662 def test_hash_effectiveness(self):
663 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000664 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000665 addhashvalue = hashvalues.add
666 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000667 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000668 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
669 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000670
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000671class FrozenSetSubclass(frozenset):
672 pass
673
674class TestFrozenSetSubclass(TestFrozenSet):
675 thetype = FrozenSetSubclass
676
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000677 def test_constructor_identity(self):
678 s = self.thetype(range(3))
679 t = self.thetype(s)
680 self.assertNotEqual(id(s), id(t))
681
682 def test_copy(self):
683 dup = self.s.copy()
684 self.assertNotEqual(id(self.s), id(dup))
685
686 def test_nested_empty_constructor(self):
687 s = self.thetype()
688 t = self.thetype(s)
689 self.assertEqual(s, t)
690
Raymond Hettingerd7946662005-08-01 21:39:29 +0000691 def test_singleton_empty_frozenset(self):
692 Frozenset = self.thetype
693 f = frozenset()
694 F = Frozenset()
695 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
696 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000697 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000698 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
699 # All empty frozenset subclass instances should have different ids
700 self.assertEqual(len(set(map(id, efs))), len(efs))
701
Raymond Hettingera690a992003-11-16 16:17:49 +0000702# Tests taken from test_sets.py =============================================
703
704empty_set = set()
705
706#==============================================================================
707
708class TestBasicOps(unittest.TestCase):
709
710 def test_repr(self):
711 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000712 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000713
Raymond Hettingereae05de2004-07-09 04:51:24 +0000714 def test_print(self):
715 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000716 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000717 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000718 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000719 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000720 self.assertEqual(fo.read(), repr(self.set))
721 finally:
722 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000723 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000724
Raymond Hettingera690a992003-11-16 16:17:49 +0000725 def test_length(self):
726 self.assertEqual(len(self.set), self.length)
727
728 def test_self_equality(self):
729 self.assertEqual(self.set, self.set)
730
731 def test_equivalent_equality(self):
732 self.assertEqual(self.set, self.dup)
733
734 def test_copy(self):
735 self.assertEqual(self.set.copy(), self.dup)
736
737 def test_self_union(self):
738 result = self.set | self.set
739 self.assertEqual(result, self.dup)
740
741 def test_empty_union(self):
742 result = self.set | empty_set
743 self.assertEqual(result, self.dup)
744
745 def test_union_empty(self):
746 result = empty_set | self.set
747 self.assertEqual(result, self.dup)
748
749 def test_self_intersection(self):
750 result = self.set & self.set
751 self.assertEqual(result, self.dup)
752
753 def test_empty_intersection(self):
754 result = self.set & empty_set
755 self.assertEqual(result, empty_set)
756
757 def test_intersection_empty(self):
758 result = empty_set & self.set
759 self.assertEqual(result, empty_set)
760
Guido van Rossum58da9312007-11-10 23:39:45 +0000761 def test_self_isdisjoint(self):
762 result = self.set.isdisjoint(self.set)
763 self.assertEqual(result, not self.set)
764
765 def test_empty_isdisjoint(self):
766 result = self.set.isdisjoint(empty_set)
767 self.assertEqual(result, True)
768
769 def test_isdisjoint_empty(self):
770 result = empty_set.isdisjoint(self.set)
771 self.assertEqual(result, True)
772
Raymond Hettingera690a992003-11-16 16:17:49 +0000773 def test_self_symmetric_difference(self):
774 result = self.set ^ self.set
775 self.assertEqual(result, empty_set)
776
777 def checkempty_symmetric_difference(self):
778 result = self.set ^ empty_set
779 self.assertEqual(result, self.set)
780
781 def test_self_difference(self):
782 result = self.set - self.set
783 self.assertEqual(result, empty_set)
784
785 def test_empty_difference(self):
786 result = self.set - empty_set
787 self.assertEqual(result, self.dup)
788
789 def test_empty_difference_rev(self):
790 result = empty_set - self.set
791 self.assertEqual(result, empty_set)
792
793 def test_iteration(self):
794 for v in self.set:
795 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000796 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000797 # note: __length_hint__ is an internal undocumented API,
798 # don't rely on it in your own programs
799 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000800
801 def test_pickling(self):
802 p = pickle.dumps(self.set)
803 copy = pickle.loads(p)
804 self.assertEqual(self.set, copy,
805 "%s != %s" % (self.set, copy))
806
807#------------------------------------------------------------------------------
808
809class TestBasicOpsEmpty(TestBasicOps):
810 def setUp(self):
811 self.case = "empty set"
812 self.values = []
813 self.set = set(self.values)
814 self.dup = set(self.values)
815 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000816 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000817
818#------------------------------------------------------------------------------
819
820class TestBasicOpsSingleton(TestBasicOps):
821 def setUp(self):
822 self.case = "unit set (number)"
823 self.values = [3]
824 self.set = set(self.values)
825 self.dup = set(self.values)
826 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000827 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000828
829 def test_in(self):
830 self.failUnless(3 in self.set)
831
832 def test_not_in(self):
833 self.failUnless(2 not in self.set)
834
835#------------------------------------------------------------------------------
836
837class TestBasicOpsTuple(TestBasicOps):
838 def setUp(self):
839 self.case = "unit set (tuple)"
840 self.values = [(0, "zero")]
841 self.set = set(self.values)
842 self.dup = set(self.values)
843 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000844 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000845
846 def test_in(self):
847 self.failUnless((0, "zero") in self.set)
848
849 def test_not_in(self):
850 self.failUnless(9 not in self.set)
851
852#------------------------------------------------------------------------------
853
854class TestBasicOpsTriple(TestBasicOps):
855 def setUp(self):
856 self.case = "triple set"
857 self.values = [0, "zero", operator.add]
858 self.set = set(self.values)
859 self.dup = set(self.values)
860 self.length = 3
861 self.repr = None
862
Christian Heimes0ded5b52007-12-10 15:50:56 +0000863#------------------------------------------------------------------------------
864
865class TestBasicOpsString(TestBasicOps):
866 def setUp(self):
867 self.case = "string set"
868 self.values = ["a", "b", "c"]
869 self.set = set(self.values)
870 self.dup = set(self.values)
871 self.length = 3
872 self.repr = "{'a', 'c', 'b'}"
873
874#------------------------------------------------------------------------------
875
876class TestBasicOpsBytes(TestBasicOps):
877 def setUp(self):
878 self.case = "string set"
879 self.values = [b"a", b"b", b"c"]
880 self.set = set(self.values)
881 self.dup = set(self.values)
882 self.length = 3
883 self.repr = "{b'a', b'c', b'b'}"
884
885#------------------------------------------------------------------------------
886
887class TestBasicOpsMixedStringBytes(TestBasicOps):
888 def setUp(self):
889 self.warning_filters = warnings.filters[:]
890 warnings.simplefilter('ignore', BytesWarning)
891 self.case = "string and bytes set"
892 self.values = ["a", "b", b"a", b"b"]
893 self.set = set(self.values)
894 self.dup = set(self.values)
895 self.length = 4
896 self.repr = "{'a', b'a', 'b', b'b'}"
897
898 def tearDown(self):
899 warnings.filters = self.warning_filters
900
Raymond Hettingera690a992003-11-16 16:17:49 +0000901#==============================================================================
902
903def baditer():
904 raise TypeError
905 yield True
906
907def gooditer():
908 yield True
909
910class TestExceptionPropagation(unittest.TestCase):
911 """SF 628246: Set constructor should not trap iterator TypeErrors"""
912
913 def test_instanceWithException(self):
914 self.assertRaises(TypeError, set, baditer())
915
916 def test_instancesWithoutException(self):
917 # All of these iterables should load without exception.
918 set([1,2,3])
919 set((1,2,3))
920 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000921 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000922 set('abc')
923 set(gooditer())
924
Neal Norwitzfcf44352005-11-27 20:37:43 +0000925 def test_changingSizeWhileIterating(self):
926 s = set([1,2,3])
927 try:
928 for i in s:
929 s.update([4])
930 except RuntimeError:
931 pass
932 else:
933 self.fail("no exception when changing size during iteration")
934
Raymond Hettingera690a992003-11-16 16:17:49 +0000935#==============================================================================
936
937class TestSetOfSets(unittest.TestCase):
938 def test_constructor(self):
939 inner = frozenset([1])
940 outer = set([inner])
941 element = outer.pop()
942 self.assertEqual(type(element), frozenset)
943 outer.add(inner) # Rebuild set of sets with .add method
944 outer.remove(inner)
945 self.assertEqual(outer, set()) # Verify that remove worked
946 outer.discard(inner) # Absence of KeyError indicates working fine
947
948#==============================================================================
949
950class TestBinaryOps(unittest.TestCase):
951 def setUp(self):
952 self.set = set((2, 4, 6))
953
954 def test_eq(self): # SF bug 643115
955 self.assertEqual(self.set, set({2:1,4:3,6:5}))
956
957 def test_union_subset(self):
958 result = self.set | set([2])
959 self.assertEqual(result, set((2, 4, 6)))
960
961 def test_union_superset(self):
962 result = self.set | set([2, 4, 6, 8])
963 self.assertEqual(result, set([2, 4, 6, 8]))
964
965 def test_union_overlap(self):
966 result = self.set | set([3, 4, 5])
967 self.assertEqual(result, set([2, 3, 4, 5, 6]))
968
969 def test_union_non_overlap(self):
970 result = self.set | set([8])
971 self.assertEqual(result, set([2, 4, 6, 8]))
972
973 def test_intersection_subset(self):
974 result = self.set & set((2, 4))
975 self.assertEqual(result, set((2, 4)))
976
977 def test_intersection_superset(self):
978 result = self.set & set([2, 4, 6, 8])
979 self.assertEqual(result, set([2, 4, 6]))
980
981 def test_intersection_overlap(self):
982 result = self.set & set([3, 4, 5])
983 self.assertEqual(result, set([4]))
984
985 def test_intersection_non_overlap(self):
986 result = self.set & set([8])
987 self.assertEqual(result, empty_set)
988
Guido van Rossum58da9312007-11-10 23:39:45 +0000989 def test_isdisjoint_subset(self):
990 result = self.set.isdisjoint(set((2, 4)))
991 self.assertEqual(result, False)
992
993 def test_isdisjoint_superset(self):
994 result = self.set.isdisjoint(set([2, 4, 6, 8]))
995 self.assertEqual(result, False)
996
997 def test_isdisjoint_overlap(self):
998 result = self.set.isdisjoint(set([3, 4, 5]))
999 self.assertEqual(result, False)
1000
1001 def test_isdisjoint_non_overlap(self):
1002 result = self.set.isdisjoint(set([8]))
1003 self.assertEqual(result, True)
1004
Raymond Hettingera690a992003-11-16 16:17:49 +00001005 def test_sym_difference_subset(self):
1006 result = self.set ^ set((2, 4))
1007 self.assertEqual(result, set([6]))
1008
1009 def test_sym_difference_superset(self):
1010 result = self.set ^ set((2, 4, 6, 8))
1011 self.assertEqual(result, set([8]))
1012
1013 def test_sym_difference_overlap(self):
1014 result = self.set ^ set((3, 4, 5))
1015 self.assertEqual(result, set([2, 3, 5, 6]))
1016
1017 def test_sym_difference_non_overlap(self):
1018 result = self.set ^ set([8])
1019 self.assertEqual(result, set([2, 4, 6, 8]))
1020
1021 def test_cmp(self):
1022 a, b = set('a'), set('b')
1023 self.assertRaises(TypeError, cmp, a, b)
1024
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001025 # In py3k, this works!
1026 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +00001027
1028 self.assertRaises(TypeError, cmp, a, 12)
1029 self.assertRaises(TypeError, cmp, "abc", a)
1030
1031#==============================================================================
1032
1033class TestUpdateOps(unittest.TestCase):
1034 def setUp(self):
1035 self.set = set((2, 4, 6))
1036
1037 def test_union_subset(self):
1038 self.set |= set([2])
1039 self.assertEqual(self.set, set((2, 4, 6)))
1040
1041 def test_union_superset(self):
1042 self.set |= set([2, 4, 6, 8])
1043 self.assertEqual(self.set, set([2, 4, 6, 8]))
1044
1045 def test_union_overlap(self):
1046 self.set |= set([3, 4, 5])
1047 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1048
1049 def test_union_non_overlap(self):
1050 self.set |= set([8])
1051 self.assertEqual(self.set, set([2, 4, 6, 8]))
1052
1053 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001054 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001055 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1056
1057 def test_intersection_subset(self):
1058 self.set &= set((2, 4))
1059 self.assertEqual(self.set, set((2, 4)))
1060
1061 def test_intersection_superset(self):
1062 self.set &= set([2, 4, 6, 8])
1063 self.assertEqual(self.set, set([2, 4, 6]))
1064
1065 def test_intersection_overlap(self):
1066 self.set &= set([3, 4, 5])
1067 self.assertEqual(self.set, set([4]))
1068
1069 def test_intersection_non_overlap(self):
1070 self.set &= set([8])
1071 self.assertEqual(self.set, empty_set)
1072
1073 def test_intersection_method_call(self):
1074 self.set.intersection_update(set([3, 4, 5]))
1075 self.assertEqual(self.set, set([4]))
1076
1077 def test_sym_difference_subset(self):
1078 self.set ^= set((2, 4))
1079 self.assertEqual(self.set, set([6]))
1080
1081 def test_sym_difference_superset(self):
1082 self.set ^= set((2, 4, 6, 8))
1083 self.assertEqual(self.set, set([8]))
1084
1085 def test_sym_difference_overlap(self):
1086 self.set ^= set((3, 4, 5))
1087 self.assertEqual(self.set, set([2, 3, 5, 6]))
1088
1089 def test_sym_difference_non_overlap(self):
1090 self.set ^= set([8])
1091 self.assertEqual(self.set, set([2, 4, 6, 8]))
1092
1093 def test_sym_difference_method_call(self):
1094 self.set.symmetric_difference_update(set([3, 4, 5]))
1095 self.assertEqual(self.set, set([2, 3, 5, 6]))
1096
1097 def test_difference_subset(self):
1098 self.set -= set((2, 4))
1099 self.assertEqual(self.set, set([6]))
1100
1101 def test_difference_superset(self):
1102 self.set -= set((2, 4, 6, 8))
1103 self.assertEqual(self.set, set([]))
1104
1105 def test_difference_overlap(self):
1106 self.set -= set((3, 4, 5))
1107 self.assertEqual(self.set, set([2, 6]))
1108
1109 def test_difference_non_overlap(self):
1110 self.set -= set([8])
1111 self.assertEqual(self.set, set([2, 4, 6]))
1112
1113 def test_difference_method_call(self):
1114 self.set.difference_update(set([3, 4, 5]))
1115 self.assertEqual(self.set, set([2, 6]))
1116
1117#==============================================================================
1118
1119class TestMutate(unittest.TestCase):
1120 def setUp(self):
1121 self.values = ["a", "b", "c"]
1122 self.set = set(self.values)
1123
1124 def test_add_present(self):
1125 self.set.add("c")
1126 self.assertEqual(self.set, set("abc"))
1127
1128 def test_add_absent(self):
1129 self.set.add("d")
1130 self.assertEqual(self.set, set("abcd"))
1131
1132 def test_add_until_full(self):
1133 tmp = set()
1134 expected_len = 0
1135 for v in self.values:
1136 tmp.add(v)
1137 expected_len += 1
1138 self.assertEqual(len(tmp), expected_len)
1139 self.assertEqual(tmp, self.set)
1140
1141 def test_remove_present(self):
1142 self.set.remove("b")
1143 self.assertEqual(self.set, set("ac"))
1144
1145 def test_remove_absent(self):
1146 try:
1147 self.set.remove("d")
1148 self.fail("Removing missing element should have raised LookupError")
1149 except LookupError:
1150 pass
1151
1152 def test_remove_until_empty(self):
1153 expected_len = len(self.set)
1154 for v in self.values:
1155 self.set.remove(v)
1156 expected_len -= 1
1157 self.assertEqual(len(self.set), expected_len)
1158
1159 def test_discard_present(self):
1160 self.set.discard("c")
1161 self.assertEqual(self.set, set("ab"))
1162
1163 def test_discard_absent(self):
1164 self.set.discard("d")
1165 self.assertEqual(self.set, set("abc"))
1166
1167 def test_clear(self):
1168 self.set.clear()
1169 self.assertEqual(len(self.set), 0)
1170
1171 def test_pop(self):
1172 popped = {}
1173 while self.set:
1174 popped[self.set.pop()] = None
1175 self.assertEqual(len(popped), len(self.values))
1176 for v in self.values:
1177 self.failUnless(v in popped)
1178
1179 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001180 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001181 self.assertEqual(self.set, set(self.values))
1182
1183 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001184 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001185 self.assertEqual(self.set, set(self.values))
1186
1187 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001188 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001189 self.assertEqual(self.set, set(self.values + ["z"]))
1190
1191#==============================================================================
1192
1193class TestSubsets(unittest.TestCase):
1194
1195 case2method = {"<=": "issubset",
1196 ">=": "issuperset",
1197 }
1198
1199 reverse = {"==": "==",
1200 "!=": "!=",
1201 "<": ">",
1202 ">": "<",
1203 "<=": ">=",
1204 ">=": "<=",
1205 }
1206
1207 def test_issubset(self):
1208 x = self.left
1209 y = self.right
1210 for case in "!=", "==", "<", "<=", ">", ">=":
1211 expected = case in self.cases
1212 # Test the binary infix spelling.
1213 result = eval("x" + case + "y", locals())
1214 self.assertEqual(result, expected)
1215 # Test the "friendly" method-name spelling, if one exists.
1216 if case in TestSubsets.case2method:
1217 method = getattr(x, TestSubsets.case2method[case])
1218 result = method(y)
1219 self.assertEqual(result, expected)
1220
1221 # Now do the same for the operands reversed.
1222 rcase = TestSubsets.reverse[case]
1223 result = eval("y" + rcase + "x", locals())
1224 self.assertEqual(result, expected)
1225 if rcase in TestSubsets.case2method:
1226 method = getattr(y, TestSubsets.case2method[rcase])
1227 result = method(x)
1228 self.assertEqual(result, expected)
1229#------------------------------------------------------------------------------
1230
1231class TestSubsetEqualEmpty(TestSubsets):
1232 left = set()
1233 right = set()
1234 name = "both empty"
1235 cases = "==", "<=", ">="
1236
1237#------------------------------------------------------------------------------
1238
1239class TestSubsetEqualNonEmpty(TestSubsets):
1240 left = set([1, 2])
1241 right = set([1, 2])
1242 name = "equal pair"
1243 cases = "==", "<=", ">="
1244
1245#------------------------------------------------------------------------------
1246
1247class TestSubsetEmptyNonEmpty(TestSubsets):
1248 left = set()
1249 right = set([1, 2])
1250 name = "one empty, one non-empty"
1251 cases = "!=", "<", "<="
1252
1253#------------------------------------------------------------------------------
1254
1255class TestSubsetPartial(TestSubsets):
1256 left = set([1])
1257 right = set([1, 2])
1258 name = "one a non-empty proper subset of other"
1259 cases = "!=", "<", "<="
1260
1261#------------------------------------------------------------------------------
1262
1263class TestSubsetNonOverlap(TestSubsets):
1264 left = set([1])
1265 right = set([2])
1266 name = "neither empty, neither contains"
1267 cases = "!="
1268
1269#==============================================================================
1270
1271class TestOnlySetsInBinaryOps(unittest.TestCase):
1272
1273 def test_eq_ne(self):
1274 # Unlike the others, this is testing that == and != *are* allowed.
1275 self.assertEqual(self.other == self.set, False)
1276 self.assertEqual(self.set == self.other, False)
1277 self.assertEqual(self.other != self.set, True)
1278 self.assertEqual(self.set != self.other, True)
1279
1280 def test_ge_gt_le_lt(self):
1281 self.assertRaises(TypeError, lambda: self.set < self.other)
1282 self.assertRaises(TypeError, lambda: self.set <= self.other)
1283 self.assertRaises(TypeError, lambda: self.set > self.other)
1284 self.assertRaises(TypeError, lambda: self.set >= self.other)
1285
1286 self.assertRaises(TypeError, lambda: self.other < self.set)
1287 self.assertRaises(TypeError, lambda: self.other <= self.set)
1288 self.assertRaises(TypeError, lambda: self.other > self.set)
1289 self.assertRaises(TypeError, lambda: self.other >= self.set)
1290
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001291 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001292 try:
1293 self.set |= self.other
1294 except TypeError:
1295 pass
1296 else:
1297 self.fail("expected TypeError")
1298
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001299 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001300 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001301 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001302 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001303 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001304
1305 def test_union(self):
1306 self.assertRaises(TypeError, lambda: self.set | self.other)
1307 self.assertRaises(TypeError, lambda: self.other | self.set)
1308 if self.otherIsIterable:
1309 self.set.union(self.other)
1310 else:
1311 self.assertRaises(TypeError, self.set.union, self.other)
1312
1313 def test_intersection_update_operator(self):
1314 try:
1315 self.set &= self.other
1316 except TypeError:
1317 pass
1318 else:
1319 self.fail("expected TypeError")
1320
1321 def test_intersection_update(self):
1322 if self.otherIsIterable:
1323 self.set.intersection_update(self.other)
1324 else:
1325 self.assertRaises(TypeError,
1326 self.set.intersection_update,
1327 self.other)
1328
1329 def test_intersection(self):
1330 self.assertRaises(TypeError, lambda: self.set & self.other)
1331 self.assertRaises(TypeError, lambda: self.other & self.set)
1332 if self.otherIsIterable:
1333 self.set.intersection(self.other)
1334 else:
1335 self.assertRaises(TypeError, self.set.intersection, self.other)
1336
1337 def test_sym_difference_update_operator(self):
1338 try:
1339 self.set ^= self.other
1340 except TypeError:
1341 pass
1342 else:
1343 self.fail("expected TypeError")
1344
1345 def test_sym_difference_update(self):
1346 if self.otherIsIterable:
1347 self.set.symmetric_difference_update(self.other)
1348 else:
1349 self.assertRaises(TypeError,
1350 self.set.symmetric_difference_update,
1351 self.other)
1352
1353 def test_sym_difference(self):
1354 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1355 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1356 if self.otherIsIterable:
1357 self.set.symmetric_difference(self.other)
1358 else:
1359 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1360
1361 def test_difference_update_operator(self):
1362 try:
1363 self.set -= self.other
1364 except TypeError:
1365 pass
1366 else:
1367 self.fail("expected TypeError")
1368
1369 def test_difference_update(self):
1370 if self.otherIsIterable:
1371 self.set.difference_update(self.other)
1372 else:
1373 self.assertRaises(TypeError,
1374 self.set.difference_update,
1375 self.other)
1376
1377 def test_difference(self):
1378 self.assertRaises(TypeError, lambda: self.set - self.other)
1379 self.assertRaises(TypeError, lambda: self.other - self.set)
1380 if self.otherIsIterable:
1381 self.set.difference(self.other)
1382 else:
1383 self.assertRaises(TypeError, self.set.difference, self.other)
1384
1385#------------------------------------------------------------------------------
1386
1387class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1388 def setUp(self):
1389 self.set = set((1, 2, 3))
1390 self.other = 19
1391 self.otherIsIterable = False
1392
1393#------------------------------------------------------------------------------
1394
1395class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1396 def setUp(self):
1397 self.set = set((1, 2, 3))
1398 self.other = {1:2, 3:4}
1399 self.otherIsIterable = True
1400
1401#------------------------------------------------------------------------------
1402
1403class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1404 def setUp(self):
1405 self.set = set((1, 2, 3))
1406 self.other = operator.add
1407 self.otherIsIterable = False
1408
1409#------------------------------------------------------------------------------
1410
1411class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1412 def setUp(self):
1413 self.set = set((1, 2, 3))
1414 self.other = (2, 4, 6)
1415 self.otherIsIterable = True
1416
1417#------------------------------------------------------------------------------
1418
1419class TestOnlySetsString(TestOnlySetsInBinaryOps):
1420 def setUp(self):
1421 self.set = set((1, 2, 3))
1422 self.other = 'abc'
1423 self.otherIsIterable = True
1424
1425#------------------------------------------------------------------------------
1426
1427class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1428 def setUp(self):
1429 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001430 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001431 yield i
1432 self.set = set((1, 2, 3))
1433 self.other = gen()
1434 self.otherIsIterable = True
1435
1436#==============================================================================
1437
1438class TestCopying(unittest.TestCase):
1439
1440 def test_copy(self):
1441 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001442 dup_list = sorted(dup, key=repr)
1443 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001444 self.assertEqual(len(dup_list), len(set_list))
1445 for i in range(len(dup_list)):
1446 self.failUnless(dup_list[i] is set_list[i])
1447
1448 def test_deep_copy(self):
1449 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001450 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001451 dup_list = sorted(dup, key=repr)
1452 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001453 self.assertEqual(len(dup_list), len(set_list))
1454 for i in range(len(dup_list)):
1455 self.assertEqual(dup_list[i], set_list[i])
1456
1457#------------------------------------------------------------------------------
1458
1459class TestCopyingEmpty(TestCopying):
1460 def setUp(self):
1461 self.set = set()
1462
1463#------------------------------------------------------------------------------
1464
1465class TestCopyingSingleton(TestCopying):
1466 def setUp(self):
1467 self.set = set(["hello"])
1468
1469#------------------------------------------------------------------------------
1470
1471class TestCopyingTriple(TestCopying):
1472 def setUp(self):
1473 self.set = set(["zero", 0, None])
1474
1475#------------------------------------------------------------------------------
1476
1477class TestCopyingTuple(TestCopying):
1478 def setUp(self):
1479 self.set = set([(1, 2)])
1480
1481#------------------------------------------------------------------------------
1482
1483class TestCopyingNested(TestCopying):
1484 def setUp(self):
1485 self.set = set([((1, 2), (3, 4))])
1486
1487#==============================================================================
1488
1489class TestIdentities(unittest.TestCase):
1490 def setUp(self):
1491 self.a = set('abracadabra')
1492 self.b = set('alacazam')
1493
1494 def test_binopsVsSubsets(self):
1495 a, b = self.a, self.b
1496 self.assert_(a - b < a)
1497 self.assert_(b - a < b)
1498 self.assert_(a & b < a)
1499 self.assert_(a & b < b)
1500 self.assert_(a | b > a)
1501 self.assert_(a | b > b)
1502 self.assert_(a ^ b < a | b)
1503
1504 def test_commutativity(self):
1505 a, b = self.a, self.b
1506 self.assertEqual(a&b, b&a)
1507 self.assertEqual(a|b, b|a)
1508 self.assertEqual(a^b, b^a)
1509 if a != b:
1510 self.assertNotEqual(a-b, b-a)
1511
1512 def test_summations(self):
1513 # check that sums of parts equal the whole
1514 a, b = self.a, self.b
1515 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1516 self.assertEqual((a&b)|(a^b), a|b)
1517 self.assertEqual(a|(b-a), a|b)
1518 self.assertEqual((a-b)|b, a|b)
1519 self.assertEqual((a-b)|(a&b), a)
1520 self.assertEqual((b-a)|(a&b), b)
1521 self.assertEqual((a-b)|(b-a), a^b)
1522
1523 def test_exclusion(self):
1524 # check that inverse operations show non-overlap
1525 a, b, zero = self.a, self.b, set()
1526 self.assertEqual((a-b)&b, zero)
1527 self.assertEqual((b-a)&a, zero)
1528 self.assertEqual((a&b)&(a^b), zero)
1529
1530# Tests derived from test_itertools.py =======================================
1531
1532def R(seqn):
1533 'Regular generator'
1534 for i in seqn:
1535 yield i
1536
1537class G:
1538 'Sequence using __getitem__'
1539 def __init__(self, seqn):
1540 self.seqn = seqn
1541 def __getitem__(self, i):
1542 return self.seqn[i]
1543
1544class I:
1545 'Sequence using iterator protocol'
1546 def __init__(self, seqn):
1547 self.seqn = seqn
1548 self.i = 0
1549 def __iter__(self):
1550 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001551 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001552 if self.i >= len(self.seqn): raise StopIteration
1553 v = self.seqn[self.i]
1554 self.i += 1
1555 return v
1556
1557class Ig:
1558 'Sequence using iterator protocol defined with a generator'
1559 def __init__(self, seqn):
1560 self.seqn = seqn
1561 self.i = 0
1562 def __iter__(self):
1563 for val in self.seqn:
1564 yield val
1565
1566class X:
1567 'Missing __getitem__ and __iter__'
1568 def __init__(self, seqn):
1569 self.seqn = seqn
1570 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001571 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001572 if self.i >= len(self.seqn): raise StopIteration
1573 v = self.seqn[self.i]
1574 self.i += 1
1575 return v
1576
1577class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001578 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001579 def __init__(self, seqn):
1580 self.seqn = seqn
1581 self.i = 0
1582 def __iter__(self):
1583 return self
1584
1585class E:
1586 'Test propagation of exceptions'
1587 def __init__(self, seqn):
1588 self.seqn = seqn
1589 self.i = 0
1590 def __iter__(self):
1591 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001592 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001593 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001594
1595class S:
1596 'Test immediate stop'
1597 def __init__(self, seqn):
1598 pass
1599 def __iter__(self):
1600 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001601 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001602 raise StopIteration
1603
Raymond Hettingera6c60372008-03-13 01:26:19 +00001604from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001605def L(seqn):
1606 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001607 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001608
1609class TestVariousIteratorArgs(unittest.TestCase):
1610
1611 def test_constructor(self):
1612 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001613 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001614 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001615 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001616 self.assertRaises(TypeError, cons , X(s))
1617 self.assertRaises(TypeError, cons , N(s))
1618 self.assertRaises(ZeroDivisionError, cons , E(s))
1619
1620 def test_inline_methods(self):
1621 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001622 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001623 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001624 for g in (G, I, Ig, L, R):
1625 expected = meth(data)
1626 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001627 if isinstance(expected, bool):
1628 self.assertEqual(actual, expected)
1629 else:
1630 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001631 self.assertRaises(TypeError, meth, X(s))
1632 self.assertRaises(TypeError, meth, N(s))
1633 self.assertRaises(ZeroDivisionError, meth, E(s))
1634
1635 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001636 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001637 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001638 'difference_update', 'symmetric_difference_update'):
1639 for g in (G, I, Ig, S, L, R):
1640 s = set('january')
1641 t = s.copy()
1642 getattr(s, methname)(list(g(data)))
1643 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001644 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001645
1646 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1647 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1648 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1649
Christian Heimes969fe572008-01-25 11:23:10 +00001650# Application tests (based on David Eppstein's graph recipes ====================================
1651
1652def powerset(U):
1653 """Generates all subsets of a set or sequence U."""
1654 U = iter(U)
1655 try:
1656 x = frozenset([next(U)])
1657 for S in powerset(U):
1658 yield S
1659 yield S | x
1660 except StopIteration:
1661 yield frozenset()
1662
1663def cube(n):
1664 """Graph of n-dimensional hypercube."""
1665 singletons = [frozenset([x]) for x in range(n)]
1666 return dict([(x, frozenset([x^s for s in singletons]))
1667 for x in powerset(range(n))])
1668
1669def linegraph(G):
1670 """Graph, the vertices of which are edges of G,
1671 with two vertices being adjacent iff the corresponding
1672 edges share a vertex."""
1673 L = {}
1674 for x in G:
1675 for y in G[x]:
1676 nx = [frozenset([x,z]) for z in G[x] if z != y]
1677 ny = [frozenset([y,z]) for z in G[y] if z != x]
1678 L[frozenset([x,y])] = frozenset(nx+ny)
1679 return L
1680
1681def faces(G):
1682 'Return a set of faces in G. Where a face is a set of vertices on that face'
1683 # currently limited to triangles,squares, and pentagons
1684 f = set()
1685 for v1, edges in G.items():
1686 for v2 in edges:
1687 for v3 in G[v2]:
1688 if v1 == v3:
1689 continue
1690 if v1 in G[v3]:
1691 f.add(frozenset([v1, v2, v3]))
1692 else:
1693 for v4 in G[v3]:
1694 if v4 == v2:
1695 continue
1696 if v1 in G[v4]:
1697 f.add(frozenset([v1, v2, v3, v4]))
1698 else:
1699 for v5 in G[v4]:
1700 if v5 == v3 or v5 == v2:
1701 continue
1702 if v1 in G[v5]:
1703 f.add(frozenset([v1, v2, v3, v4, v5]))
1704 return f
1705
1706
1707class TestGraphs(unittest.TestCase):
1708
1709 def test_cube(self):
1710
1711 g = cube(3) # vert --> {v1, v2, v3}
1712 vertices1 = set(g)
1713 self.assertEqual(len(vertices1), 8) # eight vertices
1714 for edge in g.values():
1715 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1716 vertices2 = set(v for edges in g.values() for v in edges)
1717 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1718
1719 cubefaces = faces(g)
1720 self.assertEqual(len(cubefaces), 6) # six faces
1721 for face in cubefaces:
1722 self.assertEqual(len(face), 4) # each face is a square
1723
1724 def test_cuboctahedron(self):
1725
1726 # http://en.wikipedia.org/wiki/Cuboctahedron
1727 # 8 triangular faces and 6 square faces
1728 # 12 indentical vertices each connecting a triangle and square
1729
1730 g = cube(3)
1731 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1732 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1733
1734 vertices = set(cuboctahedron)
1735 for edges in cuboctahedron.values():
1736 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1737 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1738 self.assertEqual(vertices, othervertices) # edge vertices in original set
1739
1740 cubofaces = faces(cuboctahedron)
1741 facesizes = collections.defaultdict(int)
1742 for face in cubofaces:
1743 facesizes[len(face)] += 1
1744 self.assertEqual(facesizes[3], 8) # eight triangular faces
1745 self.assertEqual(facesizes[4], 6) # six square faces
1746
1747 for vertex in cuboctahedron:
1748 edge = vertex # Cuboctahedron vertices are edges in Cube
1749 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1750 for cubevert in edge:
1751 self.assert_(cubevert in g)
1752
1753
Raymond Hettingera690a992003-11-16 16:17:49 +00001754#==============================================================================
1755
1756def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001757 test_classes = (
1758 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001759 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001760 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001761 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001762 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001763 TestSetOfSets,
1764 TestExceptionPropagation,
1765 TestBasicOpsEmpty,
1766 TestBasicOpsSingleton,
1767 TestBasicOpsTuple,
1768 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001769 TestBasicOpsString,
1770 TestBasicOpsBytes,
1771 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001772 TestBinaryOps,
1773 TestUpdateOps,
1774 TestMutate,
1775 TestSubsetEqualEmpty,
1776 TestSubsetEqualNonEmpty,
1777 TestSubsetEmptyNonEmpty,
1778 TestSubsetPartial,
1779 TestSubsetNonOverlap,
1780 TestOnlySetsNumeric,
1781 TestOnlySetsDict,
1782 TestOnlySetsOperator,
1783 TestOnlySetsTuple,
1784 TestOnlySetsString,
1785 TestOnlySetsGenerator,
1786 TestCopyingEmpty,
1787 TestCopyingSingleton,
1788 TestCopyingTriple,
1789 TestCopyingTuple,
1790 TestCopyingNested,
1791 TestIdentities,
1792 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001793 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001794 )
1795
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001796 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001797
1798 # verify reference counting
1799 if verbose and hasattr(sys, "gettotalrefcount"):
1800 import gc
1801 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001802 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001803 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001804 gc.collect()
1805 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001806 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001807
1808if __name__ == "__main__":
1809 test_main(verbose=True)