blob: f263a7dba32790d8126411f1c1574e4b62e0cb0b [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
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):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000225 for i in (0, 1, 2):
226 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
Guido van Rossum805365e2007-05-07 22:24:25 +0000256 s = set(A() for i in range(1000))
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000257 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):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000286 def test_cyclical_repr(self):
287 w = ReprWrapper()
288 s = self.thetype([w])
289 w.value = s
290 if self.thetype == set:
291 self.assertEqual(repr(s), '{set(...)}')
292 else:
293 name = repr(s).partition('(')[0] # strip class name
Guido van Rossumbdba5cf2007-08-07 22:44:20 +0000294 self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000295
296 def test_cyclical_print(self):
297 w = ReprWrapper()
298 s = self.thetype([w])
299 w.value = s
300 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000301 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000302 fo.write(str(s))
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000303 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000304 fo = open(support.TESTFN, "r")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000305 self.assertEqual(fo.read(), repr(s))
306 finally:
307 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000308 support.unlink(support.TESTFN)
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000309
Thomas Wouterscf297e42007-02-23 15:07:44 +0000310 def test_do_not_rehash_dict_keys(self):
311 n = 10
Guido van Rossum805365e2007-05-07 22:24:25 +0000312 d = dict.fromkeys(map(HashCountingInt, range(n)))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000313 self.assertEqual(sum(elem.hash_count for elem in d), n)
314 s = self.thetype(d)
315 self.assertEqual(sum(elem.hash_count for elem in d), n)
316 s.difference(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000317 self.assertEqual(sum(elem.hash_count for elem in d), n)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000318 if hasattr(s, 'symmetric_difference_update'):
319 s.symmetric_difference_update(d)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000320 self.assertEqual(sum(elem.hash_count for elem in d), n)
321 d2 = dict.fromkeys(set(d))
322 self.assertEqual(sum(elem.hash_count for elem in d), n)
323 d3 = dict.fromkeys(frozenset(d))
324 self.assertEqual(sum(elem.hash_count for elem in d), n)
325 d3 = dict.fromkeys(frozenset(d), 123)
326 self.assertEqual(sum(elem.hash_count for elem in d), n)
327 self.assertEqual(d3, dict.fromkeys(d, 123))
Thomas Wouterscf297e42007-02-23 15:07:44 +0000328
Raymond Hettingera690a992003-11-16 16:17:49 +0000329class TestSet(TestJointOps):
330 thetype = set
331
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000332 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000333 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000334 s.__init__(self.word)
335 self.assertEqual(s, set(self.word))
336 s.__init__(self.otherword)
337 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000338 self.assertRaises(TypeError, s.__init__, s, 2);
339 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000340
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000341 def test_constructor_identity(self):
342 s = self.thetype(range(3))
343 t = self.thetype(s)
344 self.assertNotEqual(id(s), id(t))
345
Guido van Rossum86e58e22006-08-28 15:27:34 +0000346 def test_set_literal(self):
347 s = set([1,2,3])
348 t = {1,2,3}
349 self.assertEqual(s, t)
350
Raymond Hettingera690a992003-11-16 16:17:49 +0000351 def test_hash(self):
352 self.assertRaises(TypeError, hash, self.s)
353
354 def test_clear(self):
355 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000356 self.assertEqual(self.s, set())
357 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000358
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000359 def test_copy(self):
360 dup = self.s.copy()
361 self.assertEqual(self.s, dup)
362 self.assertNotEqual(id(self.s), id(dup))
363
Raymond Hettingera690a992003-11-16 16:17:49 +0000364 def test_add(self):
365 self.s.add('Q')
366 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000367 dup = self.s.copy()
368 self.s.add('Q')
369 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000370 self.assertRaises(TypeError, self.s.add, [])
371
372 def test_remove(self):
373 self.s.remove('a')
374 self.assert_('a' not in self.s)
375 self.assertRaises(KeyError, self.s.remove, 'Q')
376 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000377 s = self.thetype([frozenset(self.word)])
378 self.assert_(self.thetype(self.word) in s)
379 s.remove(self.thetype(self.word))
380 self.assert_(self.thetype(self.word) not in s)
381 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000382
Thomas Wouters89f507f2006-12-13 04:49:30 +0000383 def test_remove_keyerror_unpacking(self):
384 # bug: www.python.org/sf/1576657
385 for v1 in ['Q', (1,)]:
386 try:
387 self.s.remove(v1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000388 except KeyError as e:
Thomas Wouters89f507f2006-12-13 04:49:30 +0000389 v2 = e.args[0]
390 self.assertEqual(v1, v2)
391 else:
392 self.fail()
393
Raymond Hettingera690a992003-11-16 16:17:49 +0000394 def test_discard(self):
395 self.s.discard('a')
396 self.assert_('a' not in self.s)
397 self.s.discard('Q')
398 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000399 s = self.thetype([frozenset(self.word)])
400 self.assert_(self.thetype(self.word) in s)
401 s.discard(self.thetype(self.word))
402 self.assert_(self.thetype(self.word) not in s)
403 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000404
405 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000406 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000407 elem = self.s.pop()
408 self.assert_(elem not in self.s)
409 self.assertRaises(KeyError, self.s.pop)
410
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000411 def test_update(self):
412 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000413 self.assertEqual(retval, None)
414 for c in (self.word + self.otherword):
415 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000416 self.assertRaises(PassThru, self.s.update, check_pass_thru())
417 self.assertRaises(TypeError, self.s.update, [[]])
418 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000419 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000420 s = self.thetype('abcba')
421 self.assertEqual(s.update(C(p)), None)
422 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000423 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
424 q = 'ahi'
425 for C in set, frozenset, dict.fromkeys, str, list, tuple:
426 s = self.thetype('abcba')
427 self.assertEqual(s.update(C(p), C(q)), None)
428 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000429
430 def test_ior(self):
431 self.s |= set(self.otherword)
432 for c in (self.word + self.otherword):
433 self.assert_(c in self.s)
434
435 def test_intersection_update(self):
436 retval = self.s.intersection_update(self.otherword)
437 self.assertEqual(retval, None)
438 for c in (self.word + self.otherword):
439 if c in self.otherword and c in self.word:
440 self.assert_(c in self.s)
441 else:
442 self.assert_(c not in self.s)
443 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
444 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000445 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000446 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000447 s = self.thetype('abcba')
448 self.assertEqual(s.intersection_update(C(p)), None)
449 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000450 ss = 'abcba'
451 s = self.thetype(ss)
452 t = 'cbc'
453 self.assertEqual(s.intersection_update(C(p), C(t)), None)
454 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000455
456 def test_iand(self):
457 self.s &= set(self.otherword)
458 for c in (self.word + self.otherword):
459 if c in self.otherword and c in self.word:
460 self.assert_(c in self.s)
461 else:
462 self.assert_(c not in self.s)
463
464 def test_difference_update(self):
465 retval = self.s.difference_update(self.otherword)
466 self.assertEqual(retval, None)
467 for c in (self.word + self.otherword):
468 if c in self.word and c not in self.otherword:
469 self.assert_(c in self.s)
470 else:
471 self.assert_(c not in self.s)
472 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
473 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000474 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
475 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000476 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000477 s = self.thetype('abcba')
478 self.assertEqual(s.difference_update(C(p)), None)
479 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000480
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000481 s = self.thetype('abcdefghih')
482 s.difference_update()
483 self.assertEqual(s, self.thetype('abcdefghih'))
484
485 s = self.thetype('abcdefghih')
486 s.difference_update(C('aba'))
487 self.assertEqual(s, self.thetype('cdefghih'))
488
489 s = self.thetype('abcdefghih')
490 s.difference_update(C('cdc'), C('aba'))
491 self.assertEqual(s, self.thetype('efghih'))
492
Raymond Hettingera690a992003-11-16 16:17:49 +0000493 def test_isub(self):
494 self.s -= set(self.otherword)
495 for c in (self.word + self.otherword):
496 if c in self.word and c not in self.otherword:
497 self.assert_(c in self.s)
498 else:
499 self.assert_(c not in self.s)
500
501 def test_symmetric_difference_update(self):
502 retval = self.s.symmetric_difference_update(self.otherword)
503 self.assertEqual(retval, None)
504 for c in (self.word + self.otherword):
505 if (c in self.word) ^ (c in self.otherword):
506 self.assert_(c in self.s)
507 else:
508 self.assert_(c not in self.s)
509 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
510 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000511 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000512 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000513 s = self.thetype('abcba')
514 self.assertEqual(s.symmetric_difference_update(C(p)), None)
515 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000516
517 def test_ixor(self):
518 self.s ^= set(self.otherword)
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
Raymond Hettingerc991db22005-08-11 07:58:45 +0000525 def test_inplace_on_self(self):
526 t = self.s.copy()
527 t |= t
528 self.assertEqual(t, self.s)
529 t &= t
530 self.assertEqual(t, self.s)
531 t -= t
532 self.assertEqual(t, self.thetype())
533 t = self.s.copy()
534 t ^= t
535 self.assertEqual(t, self.thetype())
536
Raymond Hettinger691d8052004-05-30 07:26:47 +0000537 def test_weakref(self):
538 s = self.thetype('gallahad')
539 p = proxy(s)
540 self.assertEqual(str(p), str(s))
541 s = None
542 self.assertRaises(ReferenceError, str, p)
543
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000544 def test_rich_compare(self):
545 class TestRichSetCompare:
546 def __gt__(self, some_set):
547 self.gt_called = True
548 return False
549 def __lt__(self, some_set):
550 self.lt_called = True
551 return False
552 def __ge__(self, some_set):
553 self.ge_called = True
554 return False
555 def __le__(self, some_set):
556 self.le_called = True
557 return False
558
559 # This first tries the bulitin rich set comparison, which doesn't know
560 # how to handle the custom object. Upon returning NotImplemented, the
561 # corresponding comparison on the right object is invoked.
562 myset = {1, 2, 3}
563
564 myobj = TestRichSetCompare()
565 myset < myobj
566 self.assert_(myobj.gt_called)
567
568 myobj = TestRichSetCompare()
569 myset > myobj
570 self.assert_(myobj.lt_called)
571
572 myobj = TestRichSetCompare()
573 myset <= myobj
574 self.assert_(myobj.ge_called)
575
576 myobj = TestRichSetCompare()
577 myset >= myobj
578 self.assert_(myobj.le_called)
579
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000580 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000581 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000582 def test_c_api(self):
583 self.assertEqual(set('abc').test_c_api(), True)
584
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000585class SetSubclass(set):
586 pass
587
588class TestSetSubclass(TestSet):
589 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000590
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000591class SetSubclassWithKeywordArgs(set):
592 def __init__(self, iterable=[], newarg=None):
593 set.__init__(self, iterable)
594
595class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000596
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000597 def test_keywords_in_subclass(self):
598 'SF bug #1486663 -- this used to erroneously raise a TypeError'
599 SetSubclassWithKeywordArgs(newarg=1)
600
Raymond Hettingera690a992003-11-16 16:17:49 +0000601class TestFrozenSet(TestJointOps):
602 thetype = frozenset
603
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000604 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000605 s = self.thetype(self.word)
606 s.__init__(self.otherword)
607 self.assertEqual(s, set(self.word))
608
Raymond Hettingerd7946662005-08-01 21:39:29 +0000609 def test_singleton_empty_frozenset(self):
610 f = frozenset()
611 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
612 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000613 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000614 frozenset(f), f]
615 # All of the empty frozensets should have just one id()
616 self.assertEqual(len(set(map(id, efs))), 1)
617
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000618 def test_constructor_identity(self):
619 s = self.thetype(range(3))
620 t = self.thetype(s)
621 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000622
Raymond Hettingera690a992003-11-16 16:17:49 +0000623 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000624 self.assertEqual(hash(self.thetype('abcdeb')),
625 hash(self.thetype('ebecda')))
626
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000627 # make sure that all permutations give the same hash value
628 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000629 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000630 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000631 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000632 shuffle(seq)
633 results.add(hash(self.thetype(seq)))
634 self.assertEqual(len(results), 1)
635
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000636 def test_copy(self):
637 dup = self.s.copy()
638 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000639
640 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000641 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000642 key1 = self.thetype(seq)
643 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000644 self.assertEqual(key1, key2)
645 self.assertNotEqual(id(key1), id(key2))
646 d = {}
647 d[key1] = 42
648 self.assertEqual(d[key2], 42)
649
650 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000651 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000652 self.assertEqual(hash(f), hash(f))
653
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000654 def test_hash_effectiveness(self):
655 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000656 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000657 addhashvalue = hashvalues.add
658 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000659 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000660 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
661 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000662
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000663class FrozenSetSubclass(frozenset):
664 pass
665
666class TestFrozenSetSubclass(TestFrozenSet):
667 thetype = FrozenSetSubclass
668
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000669 def test_constructor_identity(self):
670 s = self.thetype(range(3))
671 t = self.thetype(s)
672 self.assertNotEqual(id(s), id(t))
673
674 def test_copy(self):
675 dup = self.s.copy()
676 self.assertNotEqual(id(self.s), id(dup))
677
678 def test_nested_empty_constructor(self):
679 s = self.thetype()
680 t = self.thetype(s)
681 self.assertEqual(s, t)
682
Raymond Hettingerd7946662005-08-01 21:39:29 +0000683 def test_singleton_empty_frozenset(self):
684 Frozenset = self.thetype
685 f = frozenset()
686 F = Frozenset()
687 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
688 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000689 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000690 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
691 # All empty frozenset subclass instances should have different ids
692 self.assertEqual(len(set(map(id, efs))), len(efs))
693
Raymond Hettingera690a992003-11-16 16:17:49 +0000694# Tests taken from test_sets.py =============================================
695
696empty_set = set()
697
698#==============================================================================
699
700class TestBasicOps(unittest.TestCase):
701
702 def test_repr(self):
703 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000704 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000705
Raymond Hettingereae05de2004-07-09 04:51:24 +0000706 def test_print(self):
707 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000708 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000709 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000710 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000711 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000712 self.assertEqual(fo.read(), repr(self.set))
713 finally:
714 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000715 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000716
Raymond Hettingera690a992003-11-16 16:17:49 +0000717 def test_length(self):
718 self.assertEqual(len(self.set), self.length)
719
720 def test_self_equality(self):
721 self.assertEqual(self.set, self.set)
722
723 def test_equivalent_equality(self):
724 self.assertEqual(self.set, self.dup)
725
726 def test_copy(self):
727 self.assertEqual(self.set.copy(), self.dup)
728
729 def test_self_union(self):
730 result = self.set | self.set
731 self.assertEqual(result, self.dup)
732
733 def test_empty_union(self):
734 result = self.set | empty_set
735 self.assertEqual(result, self.dup)
736
737 def test_union_empty(self):
738 result = empty_set | self.set
739 self.assertEqual(result, self.dup)
740
741 def test_self_intersection(self):
742 result = self.set & self.set
743 self.assertEqual(result, self.dup)
744
745 def test_empty_intersection(self):
746 result = self.set & empty_set
747 self.assertEqual(result, empty_set)
748
749 def test_intersection_empty(self):
750 result = empty_set & self.set
751 self.assertEqual(result, empty_set)
752
Guido van Rossum58da9312007-11-10 23:39:45 +0000753 def test_self_isdisjoint(self):
754 result = self.set.isdisjoint(self.set)
755 self.assertEqual(result, not self.set)
756
757 def test_empty_isdisjoint(self):
758 result = self.set.isdisjoint(empty_set)
759 self.assertEqual(result, True)
760
761 def test_isdisjoint_empty(self):
762 result = empty_set.isdisjoint(self.set)
763 self.assertEqual(result, True)
764
Raymond Hettingera690a992003-11-16 16:17:49 +0000765 def test_self_symmetric_difference(self):
766 result = self.set ^ self.set
767 self.assertEqual(result, empty_set)
768
769 def checkempty_symmetric_difference(self):
770 result = self.set ^ empty_set
771 self.assertEqual(result, self.set)
772
773 def test_self_difference(self):
774 result = self.set - self.set
775 self.assertEqual(result, empty_set)
776
777 def test_empty_difference(self):
778 result = self.set - empty_set
779 self.assertEqual(result, self.dup)
780
781 def test_empty_difference_rev(self):
782 result = empty_set - self.set
783 self.assertEqual(result, empty_set)
784
785 def test_iteration(self):
786 for v in self.set:
787 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000788 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000789 # note: __length_hint__ is an internal undocumented API,
790 # don't rely on it in your own programs
791 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000792
793 def test_pickling(self):
794 p = pickle.dumps(self.set)
795 copy = pickle.loads(p)
796 self.assertEqual(self.set, copy,
797 "%s != %s" % (self.set, copy))
798
799#------------------------------------------------------------------------------
800
801class TestBasicOpsEmpty(TestBasicOps):
802 def setUp(self):
803 self.case = "empty set"
804 self.values = []
805 self.set = set(self.values)
806 self.dup = set(self.values)
807 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000808 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000809
810#------------------------------------------------------------------------------
811
812class TestBasicOpsSingleton(TestBasicOps):
813 def setUp(self):
814 self.case = "unit set (number)"
815 self.values = [3]
816 self.set = set(self.values)
817 self.dup = set(self.values)
818 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000819 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000820
821 def test_in(self):
822 self.failUnless(3 in self.set)
823
824 def test_not_in(self):
825 self.failUnless(2 not in self.set)
826
827#------------------------------------------------------------------------------
828
829class TestBasicOpsTuple(TestBasicOps):
830 def setUp(self):
831 self.case = "unit set (tuple)"
832 self.values = [(0, "zero")]
833 self.set = set(self.values)
834 self.dup = set(self.values)
835 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000836 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000837
838 def test_in(self):
839 self.failUnless((0, "zero") in self.set)
840
841 def test_not_in(self):
842 self.failUnless(9 not in self.set)
843
844#------------------------------------------------------------------------------
845
846class TestBasicOpsTriple(TestBasicOps):
847 def setUp(self):
848 self.case = "triple set"
849 self.values = [0, "zero", operator.add]
850 self.set = set(self.values)
851 self.dup = set(self.values)
852 self.length = 3
853 self.repr = None
854
Christian Heimes0ded5b52007-12-10 15:50:56 +0000855#------------------------------------------------------------------------------
856
857class TestBasicOpsString(TestBasicOps):
858 def setUp(self):
859 self.case = "string set"
860 self.values = ["a", "b", "c"]
861 self.set = set(self.values)
862 self.dup = set(self.values)
863 self.length = 3
864 self.repr = "{'a', 'c', 'b'}"
865
866#------------------------------------------------------------------------------
867
868class TestBasicOpsBytes(TestBasicOps):
869 def setUp(self):
870 self.case = "string set"
871 self.values = [b"a", b"b", b"c"]
872 self.set = set(self.values)
873 self.dup = set(self.values)
874 self.length = 3
875 self.repr = "{b'a', b'c', b'b'}"
876
877#------------------------------------------------------------------------------
878
879class TestBasicOpsMixedStringBytes(TestBasicOps):
880 def setUp(self):
881 self.warning_filters = warnings.filters[:]
882 warnings.simplefilter('ignore', BytesWarning)
883 self.case = "string and bytes set"
884 self.values = ["a", "b", b"a", b"b"]
885 self.set = set(self.values)
886 self.dup = set(self.values)
887 self.length = 4
888 self.repr = "{'a', b'a', 'b', b'b'}"
889
890 def tearDown(self):
891 warnings.filters = self.warning_filters
892
Raymond Hettingera690a992003-11-16 16:17:49 +0000893#==============================================================================
894
895def baditer():
896 raise TypeError
897 yield True
898
899def gooditer():
900 yield True
901
902class TestExceptionPropagation(unittest.TestCase):
903 """SF 628246: Set constructor should not trap iterator TypeErrors"""
904
905 def test_instanceWithException(self):
906 self.assertRaises(TypeError, set, baditer())
907
908 def test_instancesWithoutException(self):
909 # All of these iterables should load without exception.
910 set([1,2,3])
911 set((1,2,3))
912 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000913 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000914 set('abc')
915 set(gooditer())
916
Neal Norwitzfcf44352005-11-27 20:37:43 +0000917 def test_changingSizeWhileIterating(self):
918 s = set([1,2,3])
919 try:
920 for i in s:
921 s.update([4])
922 except RuntimeError:
923 pass
924 else:
925 self.fail("no exception when changing size during iteration")
926
Raymond Hettingera690a992003-11-16 16:17:49 +0000927#==============================================================================
928
929class TestSetOfSets(unittest.TestCase):
930 def test_constructor(self):
931 inner = frozenset([1])
932 outer = set([inner])
933 element = outer.pop()
934 self.assertEqual(type(element), frozenset)
935 outer.add(inner) # Rebuild set of sets with .add method
936 outer.remove(inner)
937 self.assertEqual(outer, set()) # Verify that remove worked
938 outer.discard(inner) # Absence of KeyError indicates working fine
939
940#==============================================================================
941
942class TestBinaryOps(unittest.TestCase):
943 def setUp(self):
944 self.set = set((2, 4, 6))
945
946 def test_eq(self): # SF bug 643115
947 self.assertEqual(self.set, set({2:1,4:3,6:5}))
948
949 def test_union_subset(self):
950 result = self.set | set([2])
951 self.assertEqual(result, set((2, 4, 6)))
952
953 def test_union_superset(self):
954 result = self.set | set([2, 4, 6, 8])
955 self.assertEqual(result, set([2, 4, 6, 8]))
956
957 def test_union_overlap(self):
958 result = self.set | set([3, 4, 5])
959 self.assertEqual(result, set([2, 3, 4, 5, 6]))
960
961 def test_union_non_overlap(self):
962 result = self.set | set([8])
963 self.assertEqual(result, set([2, 4, 6, 8]))
964
965 def test_intersection_subset(self):
966 result = self.set & set((2, 4))
967 self.assertEqual(result, set((2, 4)))
968
969 def test_intersection_superset(self):
970 result = self.set & set([2, 4, 6, 8])
971 self.assertEqual(result, set([2, 4, 6]))
972
973 def test_intersection_overlap(self):
974 result = self.set & set([3, 4, 5])
975 self.assertEqual(result, set([4]))
976
977 def test_intersection_non_overlap(self):
978 result = self.set & set([8])
979 self.assertEqual(result, empty_set)
980
Guido van Rossum58da9312007-11-10 23:39:45 +0000981 def test_isdisjoint_subset(self):
982 result = self.set.isdisjoint(set((2, 4)))
983 self.assertEqual(result, False)
984
985 def test_isdisjoint_superset(self):
986 result = self.set.isdisjoint(set([2, 4, 6, 8]))
987 self.assertEqual(result, False)
988
989 def test_isdisjoint_overlap(self):
990 result = self.set.isdisjoint(set([3, 4, 5]))
991 self.assertEqual(result, False)
992
993 def test_isdisjoint_non_overlap(self):
994 result = self.set.isdisjoint(set([8]))
995 self.assertEqual(result, True)
996
Raymond Hettingera690a992003-11-16 16:17:49 +0000997 def test_sym_difference_subset(self):
998 result = self.set ^ set((2, 4))
999 self.assertEqual(result, set([6]))
1000
1001 def test_sym_difference_superset(self):
1002 result = self.set ^ set((2, 4, 6, 8))
1003 self.assertEqual(result, set([8]))
1004
1005 def test_sym_difference_overlap(self):
1006 result = self.set ^ set((3, 4, 5))
1007 self.assertEqual(result, set([2, 3, 5, 6]))
1008
1009 def test_sym_difference_non_overlap(self):
1010 result = self.set ^ set([8])
1011 self.assertEqual(result, set([2, 4, 6, 8]))
1012
1013 def test_cmp(self):
1014 a, b = set('a'), set('b')
1015 self.assertRaises(TypeError, cmp, a, b)
1016
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001017 # In py3k, this works!
1018 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +00001019
1020 self.assertRaises(TypeError, cmp, a, 12)
1021 self.assertRaises(TypeError, cmp, "abc", a)
1022
1023#==============================================================================
1024
1025class TestUpdateOps(unittest.TestCase):
1026 def setUp(self):
1027 self.set = set((2, 4, 6))
1028
1029 def test_union_subset(self):
1030 self.set |= set([2])
1031 self.assertEqual(self.set, set((2, 4, 6)))
1032
1033 def test_union_superset(self):
1034 self.set |= set([2, 4, 6, 8])
1035 self.assertEqual(self.set, set([2, 4, 6, 8]))
1036
1037 def test_union_overlap(self):
1038 self.set |= set([3, 4, 5])
1039 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1040
1041 def test_union_non_overlap(self):
1042 self.set |= set([8])
1043 self.assertEqual(self.set, set([2, 4, 6, 8]))
1044
1045 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001046 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001047 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1048
1049 def test_intersection_subset(self):
1050 self.set &= set((2, 4))
1051 self.assertEqual(self.set, set((2, 4)))
1052
1053 def test_intersection_superset(self):
1054 self.set &= set([2, 4, 6, 8])
1055 self.assertEqual(self.set, set([2, 4, 6]))
1056
1057 def test_intersection_overlap(self):
1058 self.set &= set([3, 4, 5])
1059 self.assertEqual(self.set, set([4]))
1060
1061 def test_intersection_non_overlap(self):
1062 self.set &= set([8])
1063 self.assertEqual(self.set, empty_set)
1064
1065 def test_intersection_method_call(self):
1066 self.set.intersection_update(set([3, 4, 5]))
1067 self.assertEqual(self.set, set([4]))
1068
1069 def test_sym_difference_subset(self):
1070 self.set ^= set((2, 4))
1071 self.assertEqual(self.set, set([6]))
1072
1073 def test_sym_difference_superset(self):
1074 self.set ^= set((2, 4, 6, 8))
1075 self.assertEqual(self.set, set([8]))
1076
1077 def test_sym_difference_overlap(self):
1078 self.set ^= set((3, 4, 5))
1079 self.assertEqual(self.set, set([2, 3, 5, 6]))
1080
1081 def test_sym_difference_non_overlap(self):
1082 self.set ^= set([8])
1083 self.assertEqual(self.set, set([2, 4, 6, 8]))
1084
1085 def test_sym_difference_method_call(self):
1086 self.set.symmetric_difference_update(set([3, 4, 5]))
1087 self.assertEqual(self.set, set([2, 3, 5, 6]))
1088
1089 def test_difference_subset(self):
1090 self.set -= set((2, 4))
1091 self.assertEqual(self.set, set([6]))
1092
1093 def test_difference_superset(self):
1094 self.set -= set((2, 4, 6, 8))
1095 self.assertEqual(self.set, set([]))
1096
1097 def test_difference_overlap(self):
1098 self.set -= set((3, 4, 5))
1099 self.assertEqual(self.set, set([2, 6]))
1100
1101 def test_difference_non_overlap(self):
1102 self.set -= set([8])
1103 self.assertEqual(self.set, set([2, 4, 6]))
1104
1105 def test_difference_method_call(self):
1106 self.set.difference_update(set([3, 4, 5]))
1107 self.assertEqual(self.set, set([2, 6]))
1108
1109#==============================================================================
1110
1111class TestMutate(unittest.TestCase):
1112 def setUp(self):
1113 self.values = ["a", "b", "c"]
1114 self.set = set(self.values)
1115
1116 def test_add_present(self):
1117 self.set.add("c")
1118 self.assertEqual(self.set, set("abc"))
1119
1120 def test_add_absent(self):
1121 self.set.add("d")
1122 self.assertEqual(self.set, set("abcd"))
1123
1124 def test_add_until_full(self):
1125 tmp = set()
1126 expected_len = 0
1127 for v in self.values:
1128 tmp.add(v)
1129 expected_len += 1
1130 self.assertEqual(len(tmp), expected_len)
1131 self.assertEqual(tmp, self.set)
1132
1133 def test_remove_present(self):
1134 self.set.remove("b")
1135 self.assertEqual(self.set, set("ac"))
1136
1137 def test_remove_absent(self):
1138 try:
1139 self.set.remove("d")
1140 self.fail("Removing missing element should have raised LookupError")
1141 except LookupError:
1142 pass
1143
1144 def test_remove_until_empty(self):
1145 expected_len = len(self.set)
1146 for v in self.values:
1147 self.set.remove(v)
1148 expected_len -= 1
1149 self.assertEqual(len(self.set), expected_len)
1150
1151 def test_discard_present(self):
1152 self.set.discard("c")
1153 self.assertEqual(self.set, set("ab"))
1154
1155 def test_discard_absent(self):
1156 self.set.discard("d")
1157 self.assertEqual(self.set, set("abc"))
1158
1159 def test_clear(self):
1160 self.set.clear()
1161 self.assertEqual(len(self.set), 0)
1162
1163 def test_pop(self):
1164 popped = {}
1165 while self.set:
1166 popped[self.set.pop()] = None
1167 self.assertEqual(len(popped), len(self.values))
1168 for v in self.values:
1169 self.failUnless(v in popped)
1170
1171 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001172 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001173 self.assertEqual(self.set, set(self.values))
1174
1175 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001176 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001177 self.assertEqual(self.set, set(self.values))
1178
1179 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001180 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001181 self.assertEqual(self.set, set(self.values + ["z"]))
1182
1183#==============================================================================
1184
1185class TestSubsets(unittest.TestCase):
1186
1187 case2method = {"<=": "issubset",
1188 ">=": "issuperset",
1189 }
1190
1191 reverse = {"==": "==",
1192 "!=": "!=",
1193 "<": ">",
1194 ">": "<",
1195 "<=": ">=",
1196 ">=": "<=",
1197 }
1198
1199 def test_issubset(self):
1200 x = self.left
1201 y = self.right
1202 for case in "!=", "==", "<", "<=", ">", ">=":
1203 expected = case in self.cases
1204 # Test the binary infix spelling.
1205 result = eval("x" + case + "y", locals())
1206 self.assertEqual(result, expected)
1207 # Test the "friendly" method-name spelling, if one exists.
1208 if case in TestSubsets.case2method:
1209 method = getattr(x, TestSubsets.case2method[case])
1210 result = method(y)
1211 self.assertEqual(result, expected)
1212
1213 # Now do the same for the operands reversed.
1214 rcase = TestSubsets.reverse[case]
1215 result = eval("y" + rcase + "x", locals())
1216 self.assertEqual(result, expected)
1217 if rcase in TestSubsets.case2method:
1218 method = getattr(y, TestSubsets.case2method[rcase])
1219 result = method(x)
1220 self.assertEqual(result, expected)
1221#------------------------------------------------------------------------------
1222
1223class TestSubsetEqualEmpty(TestSubsets):
1224 left = set()
1225 right = set()
1226 name = "both empty"
1227 cases = "==", "<=", ">="
1228
1229#------------------------------------------------------------------------------
1230
1231class TestSubsetEqualNonEmpty(TestSubsets):
1232 left = set([1, 2])
1233 right = set([1, 2])
1234 name = "equal pair"
1235 cases = "==", "<=", ">="
1236
1237#------------------------------------------------------------------------------
1238
1239class TestSubsetEmptyNonEmpty(TestSubsets):
1240 left = set()
1241 right = set([1, 2])
1242 name = "one empty, one non-empty"
1243 cases = "!=", "<", "<="
1244
1245#------------------------------------------------------------------------------
1246
1247class TestSubsetPartial(TestSubsets):
1248 left = set([1])
1249 right = set([1, 2])
1250 name = "one a non-empty proper subset of other"
1251 cases = "!=", "<", "<="
1252
1253#------------------------------------------------------------------------------
1254
1255class TestSubsetNonOverlap(TestSubsets):
1256 left = set([1])
1257 right = set([2])
1258 name = "neither empty, neither contains"
1259 cases = "!="
1260
1261#==============================================================================
1262
1263class TestOnlySetsInBinaryOps(unittest.TestCase):
1264
1265 def test_eq_ne(self):
1266 # Unlike the others, this is testing that == and != *are* allowed.
1267 self.assertEqual(self.other == self.set, False)
1268 self.assertEqual(self.set == self.other, False)
1269 self.assertEqual(self.other != self.set, True)
1270 self.assertEqual(self.set != self.other, True)
1271
1272 def test_ge_gt_le_lt(self):
1273 self.assertRaises(TypeError, lambda: self.set < self.other)
1274 self.assertRaises(TypeError, lambda: self.set <= self.other)
1275 self.assertRaises(TypeError, lambda: self.set > self.other)
1276 self.assertRaises(TypeError, lambda: self.set >= self.other)
1277
1278 self.assertRaises(TypeError, lambda: self.other < self.set)
1279 self.assertRaises(TypeError, lambda: self.other <= self.set)
1280 self.assertRaises(TypeError, lambda: self.other > self.set)
1281 self.assertRaises(TypeError, lambda: self.other >= self.set)
1282
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001283 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001284 try:
1285 self.set |= self.other
1286 except TypeError:
1287 pass
1288 else:
1289 self.fail("expected TypeError")
1290
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001291 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001292 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001293 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001294 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001295 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001296
1297 def test_union(self):
1298 self.assertRaises(TypeError, lambda: self.set | self.other)
1299 self.assertRaises(TypeError, lambda: self.other | self.set)
1300 if self.otherIsIterable:
1301 self.set.union(self.other)
1302 else:
1303 self.assertRaises(TypeError, self.set.union, self.other)
1304
1305 def test_intersection_update_operator(self):
1306 try:
1307 self.set &= self.other
1308 except TypeError:
1309 pass
1310 else:
1311 self.fail("expected TypeError")
1312
1313 def test_intersection_update(self):
1314 if self.otherIsIterable:
1315 self.set.intersection_update(self.other)
1316 else:
1317 self.assertRaises(TypeError,
1318 self.set.intersection_update,
1319 self.other)
1320
1321 def test_intersection(self):
1322 self.assertRaises(TypeError, lambda: self.set & self.other)
1323 self.assertRaises(TypeError, lambda: self.other & self.set)
1324 if self.otherIsIterable:
1325 self.set.intersection(self.other)
1326 else:
1327 self.assertRaises(TypeError, self.set.intersection, self.other)
1328
1329 def test_sym_difference_update_operator(self):
1330 try:
1331 self.set ^= self.other
1332 except TypeError:
1333 pass
1334 else:
1335 self.fail("expected TypeError")
1336
1337 def test_sym_difference_update(self):
1338 if self.otherIsIterable:
1339 self.set.symmetric_difference_update(self.other)
1340 else:
1341 self.assertRaises(TypeError,
1342 self.set.symmetric_difference_update,
1343 self.other)
1344
1345 def test_sym_difference(self):
1346 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1347 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1348 if self.otherIsIterable:
1349 self.set.symmetric_difference(self.other)
1350 else:
1351 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1352
1353 def test_difference_update_operator(self):
1354 try:
1355 self.set -= self.other
1356 except TypeError:
1357 pass
1358 else:
1359 self.fail("expected TypeError")
1360
1361 def test_difference_update(self):
1362 if self.otherIsIterable:
1363 self.set.difference_update(self.other)
1364 else:
1365 self.assertRaises(TypeError,
1366 self.set.difference_update,
1367 self.other)
1368
1369 def test_difference(self):
1370 self.assertRaises(TypeError, lambda: self.set - self.other)
1371 self.assertRaises(TypeError, lambda: self.other - self.set)
1372 if self.otherIsIterable:
1373 self.set.difference(self.other)
1374 else:
1375 self.assertRaises(TypeError, self.set.difference, self.other)
1376
1377#------------------------------------------------------------------------------
1378
1379class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1380 def setUp(self):
1381 self.set = set((1, 2, 3))
1382 self.other = 19
1383 self.otherIsIterable = False
1384
1385#------------------------------------------------------------------------------
1386
1387class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1388 def setUp(self):
1389 self.set = set((1, 2, 3))
1390 self.other = {1:2, 3:4}
1391 self.otherIsIterable = True
1392
1393#------------------------------------------------------------------------------
1394
1395class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1396 def setUp(self):
1397 self.set = set((1, 2, 3))
1398 self.other = operator.add
1399 self.otherIsIterable = False
1400
1401#------------------------------------------------------------------------------
1402
1403class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1404 def setUp(self):
1405 self.set = set((1, 2, 3))
1406 self.other = (2, 4, 6)
1407 self.otherIsIterable = True
1408
1409#------------------------------------------------------------------------------
1410
1411class TestOnlySetsString(TestOnlySetsInBinaryOps):
1412 def setUp(self):
1413 self.set = set((1, 2, 3))
1414 self.other = 'abc'
1415 self.otherIsIterable = True
1416
1417#------------------------------------------------------------------------------
1418
1419class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1420 def setUp(self):
1421 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001422 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001423 yield i
1424 self.set = set((1, 2, 3))
1425 self.other = gen()
1426 self.otherIsIterable = True
1427
1428#==============================================================================
1429
1430class TestCopying(unittest.TestCase):
1431
1432 def test_copy(self):
1433 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001434 dup_list = sorted(dup, key=repr)
1435 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001436 self.assertEqual(len(dup_list), len(set_list))
1437 for i in range(len(dup_list)):
1438 self.failUnless(dup_list[i] is set_list[i])
1439
1440 def test_deep_copy(self):
1441 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001442 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001443 dup_list = sorted(dup, key=repr)
1444 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001445 self.assertEqual(len(dup_list), len(set_list))
1446 for i in range(len(dup_list)):
1447 self.assertEqual(dup_list[i], set_list[i])
1448
1449#------------------------------------------------------------------------------
1450
1451class TestCopyingEmpty(TestCopying):
1452 def setUp(self):
1453 self.set = set()
1454
1455#------------------------------------------------------------------------------
1456
1457class TestCopyingSingleton(TestCopying):
1458 def setUp(self):
1459 self.set = set(["hello"])
1460
1461#------------------------------------------------------------------------------
1462
1463class TestCopyingTriple(TestCopying):
1464 def setUp(self):
1465 self.set = set(["zero", 0, None])
1466
1467#------------------------------------------------------------------------------
1468
1469class TestCopyingTuple(TestCopying):
1470 def setUp(self):
1471 self.set = set([(1, 2)])
1472
1473#------------------------------------------------------------------------------
1474
1475class TestCopyingNested(TestCopying):
1476 def setUp(self):
1477 self.set = set([((1, 2), (3, 4))])
1478
1479#==============================================================================
1480
1481class TestIdentities(unittest.TestCase):
1482 def setUp(self):
1483 self.a = set('abracadabra')
1484 self.b = set('alacazam')
1485
1486 def test_binopsVsSubsets(self):
1487 a, b = self.a, self.b
1488 self.assert_(a - b < a)
1489 self.assert_(b - a < b)
1490 self.assert_(a & b < a)
1491 self.assert_(a & b < b)
1492 self.assert_(a | b > a)
1493 self.assert_(a | b > b)
1494 self.assert_(a ^ b < a | b)
1495
1496 def test_commutativity(self):
1497 a, b = self.a, self.b
1498 self.assertEqual(a&b, b&a)
1499 self.assertEqual(a|b, b|a)
1500 self.assertEqual(a^b, b^a)
1501 if a != b:
1502 self.assertNotEqual(a-b, b-a)
1503
1504 def test_summations(self):
1505 # check that sums of parts equal the whole
1506 a, b = self.a, self.b
1507 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1508 self.assertEqual((a&b)|(a^b), a|b)
1509 self.assertEqual(a|(b-a), a|b)
1510 self.assertEqual((a-b)|b, a|b)
1511 self.assertEqual((a-b)|(a&b), a)
1512 self.assertEqual((b-a)|(a&b), b)
1513 self.assertEqual((a-b)|(b-a), a^b)
1514
1515 def test_exclusion(self):
1516 # check that inverse operations show non-overlap
1517 a, b, zero = self.a, self.b, set()
1518 self.assertEqual((a-b)&b, zero)
1519 self.assertEqual((b-a)&a, zero)
1520 self.assertEqual((a&b)&(a^b), zero)
1521
1522# Tests derived from test_itertools.py =======================================
1523
1524def R(seqn):
1525 'Regular generator'
1526 for i in seqn:
1527 yield i
1528
1529class G:
1530 'Sequence using __getitem__'
1531 def __init__(self, seqn):
1532 self.seqn = seqn
1533 def __getitem__(self, i):
1534 return self.seqn[i]
1535
1536class I:
1537 'Sequence using iterator protocol'
1538 def __init__(self, seqn):
1539 self.seqn = seqn
1540 self.i = 0
1541 def __iter__(self):
1542 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001543 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001544 if self.i >= len(self.seqn): raise StopIteration
1545 v = self.seqn[self.i]
1546 self.i += 1
1547 return v
1548
1549class Ig:
1550 'Sequence using iterator protocol defined with a generator'
1551 def __init__(self, seqn):
1552 self.seqn = seqn
1553 self.i = 0
1554 def __iter__(self):
1555 for val in self.seqn:
1556 yield val
1557
1558class X:
1559 'Missing __getitem__ and __iter__'
1560 def __init__(self, seqn):
1561 self.seqn = seqn
1562 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001563 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001564 if self.i >= len(self.seqn): raise StopIteration
1565 v = self.seqn[self.i]
1566 self.i += 1
1567 return v
1568
1569class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001570 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001571 def __init__(self, seqn):
1572 self.seqn = seqn
1573 self.i = 0
1574 def __iter__(self):
1575 return self
1576
1577class E:
1578 'Test propagation of exceptions'
1579 def __init__(self, seqn):
1580 self.seqn = seqn
1581 self.i = 0
1582 def __iter__(self):
1583 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001584 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001585 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001586
1587class S:
1588 'Test immediate stop'
1589 def __init__(self, seqn):
1590 pass
1591 def __iter__(self):
1592 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001593 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001594 raise StopIteration
1595
Raymond Hettingera6c60372008-03-13 01:26:19 +00001596from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001597def L(seqn):
1598 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001599 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001600
1601class TestVariousIteratorArgs(unittest.TestCase):
1602
1603 def test_constructor(self):
1604 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001605 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001606 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001607 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001608 self.assertRaises(TypeError, cons , X(s))
1609 self.assertRaises(TypeError, cons , N(s))
1610 self.assertRaises(ZeroDivisionError, cons , E(s))
1611
1612 def test_inline_methods(self):
1613 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001614 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001615 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001616 for g in (G, I, Ig, L, R):
1617 expected = meth(data)
1618 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001619 if isinstance(expected, bool):
1620 self.assertEqual(actual, expected)
1621 else:
1622 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001623 self.assertRaises(TypeError, meth, X(s))
1624 self.assertRaises(TypeError, meth, N(s))
1625 self.assertRaises(ZeroDivisionError, meth, E(s))
1626
1627 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001628 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001629 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001630 'difference_update', 'symmetric_difference_update'):
1631 for g in (G, I, Ig, S, L, R):
1632 s = set('january')
1633 t = s.copy()
1634 getattr(s, methname)(list(g(data)))
1635 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001636 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001637
1638 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1639 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1640 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1641
Christian Heimes969fe572008-01-25 11:23:10 +00001642# Application tests (based on David Eppstein's graph recipes ====================================
1643
1644def powerset(U):
1645 """Generates all subsets of a set or sequence U."""
1646 U = iter(U)
1647 try:
1648 x = frozenset([next(U)])
1649 for S in powerset(U):
1650 yield S
1651 yield S | x
1652 except StopIteration:
1653 yield frozenset()
1654
1655def cube(n):
1656 """Graph of n-dimensional hypercube."""
1657 singletons = [frozenset([x]) for x in range(n)]
1658 return dict([(x, frozenset([x^s for s in singletons]))
1659 for x in powerset(range(n))])
1660
1661def linegraph(G):
1662 """Graph, the vertices of which are edges of G,
1663 with two vertices being adjacent iff the corresponding
1664 edges share a vertex."""
1665 L = {}
1666 for x in G:
1667 for y in G[x]:
1668 nx = [frozenset([x,z]) for z in G[x] if z != y]
1669 ny = [frozenset([y,z]) for z in G[y] if z != x]
1670 L[frozenset([x,y])] = frozenset(nx+ny)
1671 return L
1672
1673def faces(G):
1674 'Return a set of faces in G. Where a face is a set of vertices on that face'
1675 # currently limited to triangles,squares, and pentagons
1676 f = set()
1677 for v1, edges in G.items():
1678 for v2 in edges:
1679 for v3 in G[v2]:
1680 if v1 == v3:
1681 continue
1682 if v1 in G[v3]:
1683 f.add(frozenset([v1, v2, v3]))
1684 else:
1685 for v4 in G[v3]:
1686 if v4 == v2:
1687 continue
1688 if v1 in G[v4]:
1689 f.add(frozenset([v1, v2, v3, v4]))
1690 else:
1691 for v5 in G[v4]:
1692 if v5 == v3 or v5 == v2:
1693 continue
1694 if v1 in G[v5]:
1695 f.add(frozenset([v1, v2, v3, v4, v5]))
1696 return f
1697
1698
1699class TestGraphs(unittest.TestCase):
1700
1701 def test_cube(self):
1702
1703 g = cube(3) # vert --> {v1, v2, v3}
1704 vertices1 = set(g)
1705 self.assertEqual(len(vertices1), 8) # eight vertices
1706 for edge in g.values():
1707 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1708 vertices2 = set(v for edges in g.values() for v in edges)
1709 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1710
1711 cubefaces = faces(g)
1712 self.assertEqual(len(cubefaces), 6) # six faces
1713 for face in cubefaces:
1714 self.assertEqual(len(face), 4) # each face is a square
1715
1716 def test_cuboctahedron(self):
1717
1718 # http://en.wikipedia.org/wiki/Cuboctahedron
1719 # 8 triangular faces and 6 square faces
1720 # 12 indentical vertices each connecting a triangle and square
1721
1722 g = cube(3)
1723 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1724 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1725
1726 vertices = set(cuboctahedron)
1727 for edges in cuboctahedron.values():
1728 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1729 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1730 self.assertEqual(vertices, othervertices) # edge vertices in original set
1731
1732 cubofaces = faces(cuboctahedron)
1733 facesizes = collections.defaultdict(int)
1734 for face in cubofaces:
1735 facesizes[len(face)] += 1
1736 self.assertEqual(facesizes[3], 8) # eight triangular faces
1737 self.assertEqual(facesizes[4], 6) # six square faces
1738
1739 for vertex in cuboctahedron:
1740 edge = vertex # Cuboctahedron vertices are edges in Cube
1741 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1742 for cubevert in edge:
1743 self.assert_(cubevert in g)
1744
1745
Raymond Hettingera690a992003-11-16 16:17:49 +00001746#==============================================================================
1747
1748def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001749 test_classes = (
1750 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001751 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001752 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001753 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001754 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001755 TestSetOfSets,
1756 TestExceptionPropagation,
1757 TestBasicOpsEmpty,
1758 TestBasicOpsSingleton,
1759 TestBasicOpsTuple,
1760 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001761 TestBasicOpsString,
1762 TestBasicOpsBytes,
1763 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001764 TestBinaryOps,
1765 TestUpdateOps,
1766 TestMutate,
1767 TestSubsetEqualEmpty,
1768 TestSubsetEqualNonEmpty,
1769 TestSubsetEmptyNonEmpty,
1770 TestSubsetPartial,
1771 TestSubsetNonOverlap,
1772 TestOnlySetsNumeric,
1773 TestOnlySetsDict,
1774 TestOnlySetsOperator,
1775 TestOnlySetsTuple,
1776 TestOnlySetsString,
1777 TestOnlySetsGenerator,
1778 TestCopyingEmpty,
1779 TestCopyingSingleton,
1780 TestCopyingTriple,
1781 TestCopyingTuple,
1782 TestCopyingNested,
1783 TestIdentities,
1784 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001785 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001786 )
1787
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001788 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001789
1790 # verify reference counting
1791 if verbose and hasattr(sys, "gettotalrefcount"):
1792 import gc
1793 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001794 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001795 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001796 gc.collect()
1797 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001798 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001799
1800if __name__ == "__main__":
1801 test_main(verbose=True)