blob: 0effd65c83cc589a089225ce44a152f6bcf394a1 [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
Thomas Heller0d755b42008-07-15 17:14:09 +0000300 fo = open(support.TESTFN, "w")
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000301 try:
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
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000394 def test_remove_keyerror_set(self):
395 key = self.thetype([3, 4])
396 try:
397 self.s.remove(key)
398 except KeyError as e:
399 self.assert_(e.args[0] is key,
400 "KeyError should be {0}, not {1}".format(key,
401 e.args[0]))
402 else:
403 self.fail()
404
Raymond Hettingera690a992003-11-16 16:17:49 +0000405 def test_discard(self):
406 self.s.discard('a')
407 self.assert_('a' not in self.s)
408 self.s.discard('Q')
409 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000410 s = self.thetype([frozenset(self.word)])
411 self.assert_(self.thetype(self.word) in s)
412 s.discard(self.thetype(self.word))
413 self.assert_(self.thetype(self.word) not in s)
414 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000415
416 def test_pop(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000417 for i in range(len(self.s)):
Raymond Hettingera690a992003-11-16 16:17:49 +0000418 elem = self.s.pop()
419 self.assert_(elem not in self.s)
420 self.assertRaises(KeyError, self.s.pop)
421
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000422 def test_update(self):
423 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000424 self.assertEqual(retval, None)
425 for c in (self.word + self.otherword):
426 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000427 self.assertRaises(PassThru, self.s.update, check_pass_thru())
428 self.assertRaises(TypeError, self.s.update, [[]])
429 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000430 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000431 s = self.thetype('abcba')
432 self.assertEqual(s.update(C(p)), None)
433 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000434 for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
435 q = 'ahi'
436 for C in set, frozenset, dict.fromkeys, str, list, tuple:
437 s = self.thetype('abcba')
438 self.assertEqual(s.update(C(p), C(q)), None)
439 self.assertEqual(s, set(s) | set(p) | set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000440
441 def test_ior(self):
442 self.s |= set(self.otherword)
443 for c in (self.word + self.otherword):
444 self.assert_(c in self.s)
445
446 def test_intersection_update(self):
447 retval = self.s.intersection_update(self.otherword)
448 self.assertEqual(retval, None)
449 for c in (self.word + self.otherword):
450 if c in self.otherword and c in self.word:
451 self.assert_(c in self.s)
452 else:
453 self.assert_(c not in self.s)
454 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
455 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000456 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000457 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000458 s = self.thetype('abcba')
459 self.assertEqual(s.intersection_update(C(p)), None)
460 self.assertEqual(s, set(q))
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000461 ss = 'abcba'
462 s = self.thetype(ss)
463 t = 'cbc'
464 self.assertEqual(s.intersection_update(C(p), C(t)), None)
465 self.assertEqual(s, set('abcba')&set(p)&set(t))
Raymond Hettingera690a992003-11-16 16:17:49 +0000466
467 def test_iand(self):
468 self.s &= set(self.otherword)
469 for c in (self.word + self.otherword):
470 if c in self.otherword and c in self.word:
471 self.assert_(c in self.s)
472 else:
473 self.assert_(c not in self.s)
474
475 def test_difference_update(self):
476 retval = self.s.difference_update(self.otherword)
477 self.assertEqual(retval, None)
478 for c in (self.word + self.otherword):
479 if c in self.word and c not in self.otherword:
480 self.assert_(c in self.s)
481 else:
482 self.assert_(c not in self.s)
483 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
484 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000485 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
486 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000487 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000488 s = self.thetype('abcba')
489 self.assertEqual(s.difference_update(C(p)), None)
490 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000491
Amaury Forgeot d'Arcfdfe62d2008-06-17 20:36:03 +0000492 s = self.thetype('abcdefghih')
493 s.difference_update()
494 self.assertEqual(s, self.thetype('abcdefghih'))
495
496 s = self.thetype('abcdefghih')
497 s.difference_update(C('aba'))
498 self.assertEqual(s, self.thetype('cdefghih'))
499
500 s = self.thetype('abcdefghih')
501 s.difference_update(C('cdc'), C('aba'))
502 self.assertEqual(s, self.thetype('efghih'))
503
Raymond Hettingera690a992003-11-16 16:17:49 +0000504 def test_isub(self):
505 self.s -= set(self.otherword)
506 for c in (self.word + self.otherword):
507 if c in self.word and c not in self.otherword:
508 self.assert_(c in self.s)
509 else:
510 self.assert_(c not in self.s)
511
512 def test_symmetric_difference_update(self):
513 retval = self.s.symmetric_difference_update(self.otherword)
514 self.assertEqual(retval, None)
515 for c in (self.word + self.otherword):
516 if (c in self.word) ^ (c in self.otherword):
517 self.assert_(c in self.s)
518 else:
519 self.assert_(c not in self.s)
520 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
521 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000522 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
Guido van Rossum75a902d2007-10-19 22:06:24 +0000523 for C in set, frozenset, dict.fromkeys, str, list, tuple:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000524 s = self.thetype('abcba')
525 self.assertEqual(s.symmetric_difference_update(C(p)), None)
526 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000527
528 def test_ixor(self):
529 self.s ^= set(self.otherword)
530 for c in (self.word + self.otherword):
531 if (c in self.word) ^ (c in self.otherword):
532 self.assert_(c in self.s)
533 else:
534 self.assert_(c not in self.s)
535
Raymond Hettingerc991db22005-08-11 07:58:45 +0000536 def test_inplace_on_self(self):
537 t = self.s.copy()
538 t |= t
539 self.assertEqual(t, self.s)
540 t &= t
541 self.assertEqual(t, self.s)
542 t -= t
543 self.assertEqual(t, self.thetype())
544 t = self.s.copy()
545 t ^= t
546 self.assertEqual(t, self.thetype())
547
Raymond Hettinger691d8052004-05-30 07:26:47 +0000548 def test_weakref(self):
549 s = self.thetype('gallahad')
550 p = proxy(s)
551 self.assertEqual(str(p), str(s))
552 s = None
553 self.assertRaises(ReferenceError, str, p)
554
Guido van Rossum10ab4ae2007-08-23 23:57:24 +0000555 def test_rich_compare(self):
556 class TestRichSetCompare:
557 def __gt__(self, some_set):
558 self.gt_called = True
559 return False
560 def __lt__(self, some_set):
561 self.lt_called = True
562 return False
563 def __ge__(self, some_set):
564 self.ge_called = True
565 return False
566 def __le__(self, some_set):
567 self.le_called = True
568 return False
569
570 # This first tries the bulitin rich set comparison, which doesn't know
571 # how to handle the custom object. Upon returning NotImplemented, the
572 # corresponding comparison on the right object is invoked.
573 myset = {1, 2, 3}
574
575 myobj = TestRichSetCompare()
576 myset < myobj
577 self.assert_(myobj.gt_called)
578
579 myobj = TestRichSetCompare()
580 myset > myobj
581 self.assert_(myobj.lt_called)
582
583 myobj = TestRichSetCompare()
584 myset <= myobj
585 self.assert_(myobj.ge_called)
586
587 myobj = TestRichSetCompare()
588 myset >= myobj
589 self.assert_(myobj.le_called)
590
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000591 # C API test only available in a debug build
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000592 if hasattr(set, "test_c_api"):
Raymond Hettingerc47e01d2005-08-16 10:44:15 +0000593 def test_c_api(self):
594 self.assertEqual(set('abc').test_c_api(), True)
595
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000596class SetSubclass(set):
597 pass
598
599class TestSetSubclass(TestSet):
600 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000601
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000602class SetSubclassWithKeywordArgs(set):
603 def __init__(self, iterable=[], newarg=None):
604 set.__init__(self, iterable)
605
606class TestSetSubclassWithKeywordArgs(TestSet):
Thomas Wouters9fe394c2007-02-05 01:24:16 +0000607
Thomas Woutersfc7bb8c2007-01-15 15:49:28 +0000608 def test_keywords_in_subclass(self):
609 'SF bug #1486663 -- this used to erroneously raise a TypeError'
610 SetSubclassWithKeywordArgs(newarg=1)
611
Raymond Hettingera690a992003-11-16 16:17:49 +0000612class TestFrozenSet(TestJointOps):
613 thetype = frozenset
614
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000615 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000616 s = self.thetype(self.word)
617 s.__init__(self.otherword)
618 self.assertEqual(s, set(self.word))
619
Raymond Hettingerd7946662005-08-01 21:39:29 +0000620 def test_singleton_empty_frozenset(self):
621 f = frozenset()
622 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
623 frozenset(), frozenset([]), frozenset(()), frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000624 frozenset(range(0)), frozenset(frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000625 frozenset(f), f]
626 # All of the empty frozensets should have just one id()
627 self.assertEqual(len(set(map(id, efs))), 1)
628
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000629 def test_constructor_identity(self):
630 s = self.thetype(range(3))
631 t = self.thetype(s)
632 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000633
Raymond Hettingera690a992003-11-16 16:17:49 +0000634 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000635 self.assertEqual(hash(self.thetype('abcdeb')),
636 hash(self.thetype('ebecda')))
637
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000638 # make sure that all permutations give the same hash value
639 n = 100
Guido van Rossum805365e2007-05-07 22:24:25 +0000640 seq = [randrange(n) for i in range(n)]
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000641 results = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000642 for i in range(200):
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000643 shuffle(seq)
644 results.add(hash(self.thetype(seq)))
645 self.assertEqual(len(results), 1)
646
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000647 def test_copy(self):
648 dup = self.s.copy()
649 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000650
651 def test_frozen_as_dictkey(self):
Guido van Rossum805365e2007-05-07 22:24:25 +0000652 seq = list(range(10)) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000653 key1 = self.thetype(seq)
654 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000655 self.assertEqual(key1, key2)
656 self.assertNotEqual(id(key1), id(key2))
657 d = {}
658 d[key1] = 42
659 self.assertEqual(d[key2], 42)
660
661 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000662 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000663 self.assertEqual(hash(f), hash(f))
664
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000665 def test_hash_effectiveness(self):
666 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000667 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000668 addhashvalue = hashvalues.add
669 elemmasks = [(i+1, 1<<i) for i in range(n)]
Guido van Rossum805365e2007-05-07 22:24:25 +0000670 for i in range(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000671 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
672 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000673
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000674class FrozenSetSubclass(frozenset):
675 pass
676
677class TestFrozenSetSubclass(TestFrozenSet):
678 thetype = FrozenSetSubclass
679
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000680 def test_constructor_identity(self):
681 s = self.thetype(range(3))
682 t = self.thetype(s)
683 self.assertNotEqual(id(s), id(t))
684
685 def test_copy(self):
686 dup = self.s.copy()
687 self.assertNotEqual(id(self.s), id(dup))
688
689 def test_nested_empty_constructor(self):
690 s = self.thetype()
691 t = self.thetype(s)
692 self.assertEqual(s, t)
693
Raymond Hettingerd7946662005-08-01 21:39:29 +0000694 def test_singleton_empty_frozenset(self):
695 Frozenset = self.thetype
696 f = frozenset()
697 F = Frozenset()
698 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
699 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
Guido van Rossum805365e2007-05-07 22:24:25 +0000700 Frozenset(range(0)), Frozenset(Frozenset()),
Raymond Hettingerd7946662005-08-01 21:39:29 +0000701 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
702 # All empty frozenset subclass instances should have different ids
703 self.assertEqual(len(set(map(id, efs))), len(efs))
704
Raymond Hettingera690a992003-11-16 16:17:49 +0000705# Tests taken from test_sets.py =============================================
706
707empty_set = set()
708
709#==============================================================================
710
711class TestBasicOps(unittest.TestCase):
712
713 def test_repr(self):
714 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000715 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000716
Raymond Hettingereae05de2004-07-09 04:51:24 +0000717 def test_print(self):
718 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000719 fo = open(support.TESTFN, "w")
Guido van Rossumd8c19672007-02-09 21:54:58 +0000720 fo.write(str(self.set))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000721 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000722 fo = open(support.TESTFN, "r")
Raymond Hettingereae05de2004-07-09 04:51:24 +0000723 self.assertEqual(fo.read(), repr(self.set))
724 finally:
725 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000726 support.unlink(support.TESTFN)
Raymond Hettingereae05de2004-07-09 04:51:24 +0000727
Raymond Hettingera690a992003-11-16 16:17:49 +0000728 def test_length(self):
729 self.assertEqual(len(self.set), self.length)
730
731 def test_self_equality(self):
732 self.assertEqual(self.set, self.set)
733
734 def test_equivalent_equality(self):
735 self.assertEqual(self.set, self.dup)
736
737 def test_copy(self):
738 self.assertEqual(self.set.copy(), self.dup)
739
740 def test_self_union(self):
741 result = self.set | self.set
742 self.assertEqual(result, self.dup)
743
744 def test_empty_union(self):
745 result = self.set | empty_set
746 self.assertEqual(result, self.dup)
747
748 def test_union_empty(self):
749 result = empty_set | self.set
750 self.assertEqual(result, self.dup)
751
752 def test_self_intersection(self):
753 result = self.set & self.set
754 self.assertEqual(result, self.dup)
755
756 def test_empty_intersection(self):
757 result = self.set & empty_set
758 self.assertEqual(result, empty_set)
759
760 def test_intersection_empty(self):
761 result = empty_set & self.set
762 self.assertEqual(result, empty_set)
763
Guido van Rossum58da9312007-11-10 23:39:45 +0000764 def test_self_isdisjoint(self):
765 result = self.set.isdisjoint(self.set)
766 self.assertEqual(result, not self.set)
767
768 def test_empty_isdisjoint(self):
769 result = self.set.isdisjoint(empty_set)
770 self.assertEqual(result, True)
771
772 def test_isdisjoint_empty(self):
773 result = empty_set.isdisjoint(self.set)
774 self.assertEqual(result, True)
775
Raymond Hettingera690a992003-11-16 16:17:49 +0000776 def test_self_symmetric_difference(self):
777 result = self.set ^ self.set
778 self.assertEqual(result, empty_set)
779
780 def checkempty_symmetric_difference(self):
781 result = self.set ^ empty_set
782 self.assertEqual(result, self.set)
783
784 def test_self_difference(self):
785 result = self.set - self.set
786 self.assertEqual(result, empty_set)
787
788 def test_empty_difference(self):
789 result = self.set - empty_set
790 self.assertEqual(result, self.dup)
791
792 def test_empty_difference_rev(self):
793 result = empty_set - self.set
794 self.assertEqual(result, empty_set)
795
796 def test_iteration(self):
797 for v in self.set:
798 self.assert_(v in self.values)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000799 setiter = iter(self.set)
Armin Rigof5b3e362006-02-11 21:32:43 +0000800 # note: __length_hint__ is an internal undocumented API,
801 # don't rely on it in your own programs
802 self.assertEqual(setiter.__length_hint__(), len(self.set))
Raymond Hettingera690a992003-11-16 16:17:49 +0000803
804 def test_pickling(self):
805 p = pickle.dumps(self.set)
806 copy = pickle.loads(p)
807 self.assertEqual(self.set, copy,
808 "%s != %s" % (self.set, copy))
809
810#------------------------------------------------------------------------------
811
812class TestBasicOpsEmpty(TestBasicOps):
813 def setUp(self):
814 self.case = "empty set"
815 self.values = []
816 self.set = set(self.values)
817 self.dup = set(self.values)
818 self.length = 0
Georg Brandlc4996ba2006-08-28 19:37:11 +0000819 self.repr = "set()"
Raymond Hettingera690a992003-11-16 16:17:49 +0000820
821#------------------------------------------------------------------------------
822
823class TestBasicOpsSingleton(TestBasicOps):
824 def setUp(self):
825 self.case = "unit set (number)"
826 self.values = [3]
827 self.set = set(self.values)
828 self.dup = set(self.values)
829 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000830 self.repr = "{3}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000831
832 def test_in(self):
833 self.failUnless(3 in self.set)
834
835 def test_not_in(self):
836 self.failUnless(2 not in self.set)
837
838#------------------------------------------------------------------------------
839
840class TestBasicOpsTuple(TestBasicOps):
841 def setUp(self):
842 self.case = "unit set (tuple)"
843 self.values = [(0, "zero")]
844 self.set = set(self.values)
845 self.dup = set(self.values)
846 self.length = 1
Guido van Rossum86e58e22006-08-28 15:27:34 +0000847 self.repr = "{(0, 'zero')}"
Raymond Hettingera690a992003-11-16 16:17:49 +0000848
849 def test_in(self):
850 self.failUnless((0, "zero") in self.set)
851
852 def test_not_in(self):
853 self.failUnless(9 not in self.set)
854
855#------------------------------------------------------------------------------
856
857class TestBasicOpsTriple(TestBasicOps):
858 def setUp(self):
859 self.case = "triple set"
860 self.values = [0, "zero", operator.add]
861 self.set = set(self.values)
862 self.dup = set(self.values)
863 self.length = 3
864 self.repr = None
865
Christian Heimes0ded5b52007-12-10 15:50:56 +0000866#------------------------------------------------------------------------------
867
868class TestBasicOpsString(TestBasicOps):
869 def setUp(self):
870 self.case = "string set"
871 self.values = ["a", "b", "c"]
872 self.set = set(self.values)
873 self.dup = set(self.values)
874 self.length = 3
875 self.repr = "{'a', 'c', 'b'}"
876
877#------------------------------------------------------------------------------
878
879class TestBasicOpsBytes(TestBasicOps):
880 def setUp(self):
881 self.case = "string set"
882 self.values = [b"a", b"b", b"c"]
883 self.set = set(self.values)
884 self.dup = set(self.values)
885 self.length = 3
886 self.repr = "{b'a', b'c', b'b'}"
887
888#------------------------------------------------------------------------------
889
890class TestBasicOpsMixedStringBytes(TestBasicOps):
891 def setUp(self):
892 self.warning_filters = warnings.filters[:]
893 warnings.simplefilter('ignore', BytesWarning)
894 self.case = "string and bytes set"
895 self.values = ["a", "b", b"a", b"b"]
896 self.set = set(self.values)
897 self.dup = set(self.values)
898 self.length = 4
899 self.repr = "{'a', b'a', 'b', b'b'}"
900
901 def tearDown(self):
902 warnings.filters = self.warning_filters
903
Raymond Hettingera690a992003-11-16 16:17:49 +0000904#==============================================================================
905
906def baditer():
907 raise TypeError
908 yield True
909
910def gooditer():
911 yield True
912
913class TestExceptionPropagation(unittest.TestCase):
914 """SF 628246: Set constructor should not trap iterator TypeErrors"""
915
916 def test_instanceWithException(self):
917 self.assertRaises(TypeError, set, baditer())
918
919 def test_instancesWithoutException(self):
920 # All of these iterables should load without exception.
921 set([1,2,3])
922 set((1,2,3))
923 set({'one':1, 'two':2, 'three':3})
Guido van Rossum805365e2007-05-07 22:24:25 +0000924 set(range(3))
Raymond Hettingera690a992003-11-16 16:17:49 +0000925 set('abc')
926 set(gooditer())
927
Neal Norwitzfcf44352005-11-27 20:37:43 +0000928 def test_changingSizeWhileIterating(self):
929 s = set([1,2,3])
930 try:
931 for i in s:
932 s.update([4])
933 except RuntimeError:
934 pass
935 else:
936 self.fail("no exception when changing size during iteration")
937
Raymond Hettingera690a992003-11-16 16:17:49 +0000938#==============================================================================
939
940class TestSetOfSets(unittest.TestCase):
941 def test_constructor(self):
942 inner = frozenset([1])
943 outer = set([inner])
944 element = outer.pop()
945 self.assertEqual(type(element), frozenset)
946 outer.add(inner) # Rebuild set of sets with .add method
947 outer.remove(inner)
948 self.assertEqual(outer, set()) # Verify that remove worked
949 outer.discard(inner) # Absence of KeyError indicates working fine
950
951#==============================================================================
952
953class TestBinaryOps(unittest.TestCase):
954 def setUp(self):
955 self.set = set((2, 4, 6))
956
957 def test_eq(self): # SF bug 643115
958 self.assertEqual(self.set, set({2:1,4:3,6:5}))
959
960 def test_union_subset(self):
961 result = self.set | set([2])
962 self.assertEqual(result, set((2, 4, 6)))
963
964 def test_union_superset(self):
965 result = self.set | set([2, 4, 6, 8])
966 self.assertEqual(result, set([2, 4, 6, 8]))
967
968 def test_union_overlap(self):
969 result = self.set | set([3, 4, 5])
970 self.assertEqual(result, set([2, 3, 4, 5, 6]))
971
972 def test_union_non_overlap(self):
973 result = self.set | set([8])
974 self.assertEqual(result, set([2, 4, 6, 8]))
975
976 def test_intersection_subset(self):
977 result = self.set & set((2, 4))
978 self.assertEqual(result, set((2, 4)))
979
980 def test_intersection_superset(self):
981 result = self.set & set([2, 4, 6, 8])
982 self.assertEqual(result, set([2, 4, 6]))
983
984 def test_intersection_overlap(self):
985 result = self.set & set([3, 4, 5])
986 self.assertEqual(result, set([4]))
987
988 def test_intersection_non_overlap(self):
989 result = self.set & set([8])
990 self.assertEqual(result, empty_set)
991
Guido van Rossum58da9312007-11-10 23:39:45 +0000992 def test_isdisjoint_subset(self):
993 result = self.set.isdisjoint(set((2, 4)))
994 self.assertEqual(result, False)
995
996 def test_isdisjoint_superset(self):
997 result = self.set.isdisjoint(set([2, 4, 6, 8]))
998 self.assertEqual(result, False)
999
1000 def test_isdisjoint_overlap(self):
1001 result = self.set.isdisjoint(set([3, 4, 5]))
1002 self.assertEqual(result, False)
1003
1004 def test_isdisjoint_non_overlap(self):
1005 result = self.set.isdisjoint(set([8]))
1006 self.assertEqual(result, True)
1007
Raymond Hettingera690a992003-11-16 16:17:49 +00001008 def test_sym_difference_subset(self):
1009 result = self.set ^ set((2, 4))
1010 self.assertEqual(result, set([6]))
1011
1012 def test_sym_difference_superset(self):
1013 result = self.set ^ set((2, 4, 6, 8))
1014 self.assertEqual(result, set([8]))
1015
1016 def test_sym_difference_overlap(self):
1017 result = self.set ^ set((3, 4, 5))
1018 self.assertEqual(result, set([2, 3, 5, 6]))
1019
1020 def test_sym_difference_non_overlap(self):
1021 result = self.set ^ set([8])
1022 self.assertEqual(result, set([2, 4, 6, 8]))
1023
1024 def test_cmp(self):
1025 a, b = set('a'), set('b')
1026 self.assertRaises(TypeError, cmp, a, b)
1027
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001028 # In py3k, this works!
1029 self.assertRaises(TypeError, cmp, a, a)
Raymond Hettingera690a992003-11-16 16:17:49 +00001030
1031 self.assertRaises(TypeError, cmp, a, 12)
1032 self.assertRaises(TypeError, cmp, "abc", a)
1033
1034#==============================================================================
1035
1036class TestUpdateOps(unittest.TestCase):
1037 def setUp(self):
1038 self.set = set((2, 4, 6))
1039
1040 def test_union_subset(self):
1041 self.set |= set([2])
1042 self.assertEqual(self.set, set((2, 4, 6)))
1043
1044 def test_union_superset(self):
1045 self.set |= set([2, 4, 6, 8])
1046 self.assertEqual(self.set, set([2, 4, 6, 8]))
1047
1048 def test_union_overlap(self):
1049 self.set |= set([3, 4, 5])
1050 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1051
1052 def test_union_non_overlap(self):
1053 self.set |= set([8])
1054 self.assertEqual(self.set, set([2, 4, 6, 8]))
1055
1056 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001057 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +00001058 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1059
1060 def test_intersection_subset(self):
1061 self.set &= set((2, 4))
1062 self.assertEqual(self.set, set((2, 4)))
1063
1064 def test_intersection_superset(self):
1065 self.set &= set([2, 4, 6, 8])
1066 self.assertEqual(self.set, set([2, 4, 6]))
1067
1068 def test_intersection_overlap(self):
1069 self.set &= set([3, 4, 5])
1070 self.assertEqual(self.set, set([4]))
1071
1072 def test_intersection_non_overlap(self):
1073 self.set &= set([8])
1074 self.assertEqual(self.set, empty_set)
1075
1076 def test_intersection_method_call(self):
1077 self.set.intersection_update(set([3, 4, 5]))
1078 self.assertEqual(self.set, set([4]))
1079
1080 def test_sym_difference_subset(self):
1081 self.set ^= set((2, 4))
1082 self.assertEqual(self.set, set([6]))
1083
1084 def test_sym_difference_superset(self):
1085 self.set ^= set((2, 4, 6, 8))
1086 self.assertEqual(self.set, set([8]))
1087
1088 def test_sym_difference_overlap(self):
1089 self.set ^= set((3, 4, 5))
1090 self.assertEqual(self.set, set([2, 3, 5, 6]))
1091
1092 def test_sym_difference_non_overlap(self):
1093 self.set ^= set([8])
1094 self.assertEqual(self.set, set([2, 4, 6, 8]))
1095
1096 def test_sym_difference_method_call(self):
1097 self.set.symmetric_difference_update(set([3, 4, 5]))
1098 self.assertEqual(self.set, set([2, 3, 5, 6]))
1099
1100 def test_difference_subset(self):
1101 self.set -= set((2, 4))
1102 self.assertEqual(self.set, set([6]))
1103
1104 def test_difference_superset(self):
1105 self.set -= set((2, 4, 6, 8))
1106 self.assertEqual(self.set, set([]))
1107
1108 def test_difference_overlap(self):
1109 self.set -= set((3, 4, 5))
1110 self.assertEqual(self.set, set([2, 6]))
1111
1112 def test_difference_non_overlap(self):
1113 self.set -= set([8])
1114 self.assertEqual(self.set, set([2, 4, 6]))
1115
1116 def test_difference_method_call(self):
1117 self.set.difference_update(set([3, 4, 5]))
1118 self.assertEqual(self.set, set([2, 6]))
1119
1120#==============================================================================
1121
1122class TestMutate(unittest.TestCase):
1123 def setUp(self):
1124 self.values = ["a", "b", "c"]
1125 self.set = set(self.values)
1126
1127 def test_add_present(self):
1128 self.set.add("c")
1129 self.assertEqual(self.set, set("abc"))
1130
1131 def test_add_absent(self):
1132 self.set.add("d")
1133 self.assertEqual(self.set, set("abcd"))
1134
1135 def test_add_until_full(self):
1136 tmp = set()
1137 expected_len = 0
1138 for v in self.values:
1139 tmp.add(v)
1140 expected_len += 1
1141 self.assertEqual(len(tmp), expected_len)
1142 self.assertEqual(tmp, self.set)
1143
1144 def test_remove_present(self):
1145 self.set.remove("b")
1146 self.assertEqual(self.set, set("ac"))
1147
1148 def test_remove_absent(self):
1149 try:
1150 self.set.remove("d")
1151 self.fail("Removing missing element should have raised LookupError")
1152 except LookupError:
1153 pass
1154
1155 def test_remove_until_empty(self):
1156 expected_len = len(self.set)
1157 for v in self.values:
1158 self.set.remove(v)
1159 expected_len -= 1
1160 self.assertEqual(len(self.set), expected_len)
1161
1162 def test_discard_present(self):
1163 self.set.discard("c")
1164 self.assertEqual(self.set, set("ab"))
1165
1166 def test_discard_absent(self):
1167 self.set.discard("d")
1168 self.assertEqual(self.set, set("abc"))
1169
1170 def test_clear(self):
1171 self.set.clear()
1172 self.assertEqual(len(self.set), 0)
1173
1174 def test_pop(self):
1175 popped = {}
1176 while self.set:
1177 popped[self.set.pop()] = None
1178 self.assertEqual(len(popped), len(self.values))
1179 for v in self.values:
1180 self.failUnless(v in popped)
1181
1182 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001183 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +00001184 self.assertEqual(self.set, set(self.values))
1185
1186 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001187 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +00001188 self.assertEqual(self.set, set(self.values))
1189
1190 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001191 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +00001192 self.assertEqual(self.set, set(self.values + ["z"]))
1193
1194#==============================================================================
1195
1196class TestSubsets(unittest.TestCase):
1197
1198 case2method = {"<=": "issubset",
1199 ">=": "issuperset",
1200 }
1201
1202 reverse = {"==": "==",
1203 "!=": "!=",
1204 "<": ">",
1205 ">": "<",
1206 "<=": ">=",
1207 ">=": "<=",
1208 }
1209
1210 def test_issubset(self):
1211 x = self.left
1212 y = self.right
1213 for case in "!=", "==", "<", "<=", ">", ">=":
1214 expected = case in self.cases
1215 # Test the binary infix spelling.
1216 result = eval("x" + case + "y", locals())
1217 self.assertEqual(result, expected)
1218 # Test the "friendly" method-name spelling, if one exists.
1219 if case in TestSubsets.case2method:
1220 method = getattr(x, TestSubsets.case2method[case])
1221 result = method(y)
1222 self.assertEqual(result, expected)
1223
1224 # Now do the same for the operands reversed.
1225 rcase = TestSubsets.reverse[case]
1226 result = eval("y" + rcase + "x", locals())
1227 self.assertEqual(result, expected)
1228 if rcase in TestSubsets.case2method:
1229 method = getattr(y, TestSubsets.case2method[rcase])
1230 result = method(x)
1231 self.assertEqual(result, expected)
1232#------------------------------------------------------------------------------
1233
1234class TestSubsetEqualEmpty(TestSubsets):
1235 left = set()
1236 right = set()
1237 name = "both empty"
1238 cases = "==", "<=", ">="
1239
1240#------------------------------------------------------------------------------
1241
1242class TestSubsetEqualNonEmpty(TestSubsets):
1243 left = set([1, 2])
1244 right = set([1, 2])
1245 name = "equal pair"
1246 cases = "==", "<=", ">="
1247
1248#------------------------------------------------------------------------------
1249
1250class TestSubsetEmptyNonEmpty(TestSubsets):
1251 left = set()
1252 right = set([1, 2])
1253 name = "one empty, one non-empty"
1254 cases = "!=", "<", "<="
1255
1256#------------------------------------------------------------------------------
1257
1258class TestSubsetPartial(TestSubsets):
1259 left = set([1])
1260 right = set([1, 2])
1261 name = "one a non-empty proper subset of other"
1262 cases = "!=", "<", "<="
1263
1264#------------------------------------------------------------------------------
1265
1266class TestSubsetNonOverlap(TestSubsets):
1267 left = set([1])
1268 right = set([2])
1269 name = "neither empty, neither contains"
1270 cases = "!="
1271
1272#==============================================================================
1273
1274class TestOnlySetsInBinaryOps(unittest.TestCase):
1275
1276 def test_eq_ne(self):
1277 # Unlike the others, this is testing that == and != *are* allowed.
1278 self.assertEqual(self.other == self.set, False)
1279 self.assertEqual(self.set == self.other, False)
1280 self.assertEqual(self.other != self.set, True)
1281 self.assertEqual(self.set != self.other, True)
1282
1283 def test_ge_gt_le_lt(self):
1284 self.assertRaises(TypeError, lambda: self.set < self.other)
1285 self.assertRaises(TypeError, lambda: self.set <= self.other)
1286 self.assertRaises(TypeError, lambda: self.set > self.other)
1287 self.assertRaises(TypeError, lambda: self.set >= self.other)
1288
1289 self.assertRaises(TypeError, lambda: self.other < self.set)
1290 self.assertRaises(TypeError, lambda: self.other <= self.set)
1291 self.assertRaises(TypeError, lambda: self.other > self.set)
1292 self.assertRaises(TypeError, lambda: self.other >= self.set)
1293
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001294 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001295 try:
1296 self.set |= self.other
1297 except TypeError:
1298 pass
1299 else:
1300 self.fail("expected TypeError")
1301
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001302 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001303 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001304 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001305 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001306 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001307
1308 def test_union(self):
1309 self.assertRaises(TypeError, lambda: self.set | self.other)
1310 self.assertRaises(TypeError, lambda: self.other | self.set)
1311 if self.otherIsIterable:
1312 self.set.union(self.other)
1313 else:
1314 self.assertRaises(TypeError, self.set.union, self.other)
1315
1316 def test_intersection_update_operator(self):
1317 try:
1318 self.set &= self.other
1319 except TypeError:
1320 pass
1321 else:
1322 self.fail("expected TypeError")
1323
1324 def test_intersection_update(self):
1325 if self.otherIsIterable:
1326 self.set.intersection_update(self.other)
1327 else:
1328 self.assertRaises(TypeError,
1329 self.set.intersection_update,
1330 self.other)
1331
1332 def test_intersection(self):
1333 self.assertRaises(TypeError, lambda: self.set & self.other)
1334 self.assertRaises(TypeError, lambda: self.other & self.set)
1335 if self.otherIsIterable:
1336 self.set.intersection(self.other)
1337 else:
1338 self.assertRaises(TypeError, self.set.intersection, self.other)
1339
1340 def test_sym_difference_update_operator(self):
1341 try:
1342 self.set ^= self.other
1343 except TypeError:
1344 pass
1345 else:
1346 self.fail("expected TypeError")
1347
1348 def test_sym_difference_update(self):
1349 if self.otherIsIterable:
1350 self.set.symmetric_difference_update(self.other)
1351 else:
1352 self.assertRaises(TypeError,
1353 self.set.symmetric_difference_update,
1354 self.other)
1355
1356 def test_sym_difference(self):
1357 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1358 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1359 if self.otherIsIterable:
1360 self.set.symmetric_difference(self.other)
1361 else:
1362 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1363
1364 def test_difference_update_operator(self):
1365 try:
1366 self.set -= self.other
1367 except TypeError:
1368 pass
1369 else:
1370 self.fail("expected TypeError")
1371
1372 def test_difference_update(self):
1373 if self.otherIsIterable:
1374 self.set.difference_update(self.other)
1375 else:
1376 self.assertRaises(TypeError,
1377 self.set.difference_update,
1378 self.other)
1379
1380 def test_difference(self):
1381 self.assertRaises(TypeError, lambda: self.set - self.other)
1382 self.assertRaises(TypeError, lambda: self.other - self.set)
1383 if self.otherIsIterable:
1384 self.set.difference(self.other)
1385 else:
1386 self.assertRaises(TypeError, self.set.difference, self.other)
1387
1388#------------------------------------------------------------------------------
1389
1390class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1391 def setUp(self):
1392 self.set = set((1, 2, 3))
1393 self.other = 19
1394 self.otherIsIterable = False
1395
1396#------------------------------------------------------------------------------
1397
1398class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1399 def setUp(self):
1400 self.set = set((1, 2, 3))
1401 self.other = {1:2, 3:4}
1402 self.otherIsIterable = True
1403
1404#------------------------------------------------------------------------------
1405
1406class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1407 def setUp(self):
1408 self.set = set((1, 2, 3))
1409 self.other = operator.add
1410 self.otherIsIterable = False
1411
1412#------------------------------------------------------------------------------
1413
1414class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1415 def setUp(self):
1416 self.set = set((1, 2, 3))
1417 self.other = (2, 4, 6)
1418 self.otherIsIterable = True
1419
1420#------------------------------------------------------------------------------
1421
1422class TestOnlySetsString(TestOnlySetsInBinaryOps):
1423 def setUp(self):
1424 self.set = set((1, 2, 3))
1425 self.other = 'abc'
1426 self.otherIsIterable = True
1427
1428#------------------------------------------------------------------------------
1429
1430class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1431 def setUp(self):
1432 def gen():
Guido van Rossum805365e2007-05-07 22:24:25 +00001433 for i in range(0, 10, 2):
Raymond Hettingera690a992003-11-16 16:17:49 +00001434 yield i
1435 self.set = set((1, 2, 3))
1436 self.other = gen()
1437 self.otherIsIterable = True
1438
1439#==============================================================================
1440
1441class TestCopying(unittest.TestCase):
1442
1443 def test_copy(self):
1444 dup = self.set.copy()
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001445 dup_list = sorted(dup, key=repr)
1446 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001447 self.assertEqual(len(dup_list), len(set_list))
1448 for i in range(len(dup_list)):
1449 self.failUnless(dup_list[i] is set_list[i])
1450
1451 def test_deep_copy(self):
1452 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001453 ##print type(dup), repr(dup)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001454 dup_list = sorted(dup, key=repr)
1455 set_list = sorted(self.set, key=repr)
Raymond Hettingera690a992003-11-16 16:17:49 +00001456 self.assertEqual(len(dup_list), len(set_list))
1457 for i in range(len(dup_list)):
1458 self.assertEqual(dup_list[i], set_list[i])
1459
1460#------------------------------------------------------------------------------
1461
1462class TestCopyingEmpty(TestCopying):
1463 def setUp(self):
1464 self.set = set()
1465
1466#------------------------------------------------------------------------------
1467
1468class TestCopyingSingleton(TestCopying):
1469 def setUp(self):
1470 self.set = set(["hello"])
1471
1472#------------------------------------------------------------------------------
1473
1474class TestCopyingTriple(TestCopying):
1475 def setUp(self):
1476 self.set = set(["zero", 0, None])
1477
1478#------------------------------------------------------------------------------
1479
1480class TestCopyingTuple(TestCopying):
1481 def setUp(self):
1482 self.set = set([(1, 2)])
1483
1484#------------------------------------------------------------------------------
1485
1486class TestCopyingNested(TestCopying):
1487 def setUp(self):
1488 self.set = set([((1, 2), (3, 4))])
1489
1490#==============================================================================
1491
1492class TestIdentities(unittest.TestCase):
1493 def setUp(self):
1494 self.a = set('abracadabra')
1495 self.b = set('alacazam')
1496
1497 def test_binopsVsSubsets(self):
1498 a, b = self.a, self.b
1499 self.assert_(a - b < a)
1500 self.assert_(b - a < b)
1501 self.assert_(a & b < a)
1502 self.assert_(a & b < b)
1503 self.assert_(a | b > a)
1504 self.assert_(a | b > b)
1505 self.assert_(a ^ b < a | b)
1506
1507 def test_commutativity(self):
1508 a, b = self.a, self.b
1509 self.assertEqual(a&b, b&a)
1510 self.assertEqual(a|b, b|a)
1511 self.assertEqual(a^b, b^a)
1512 if a != b:
1513 self.assertNotEqual(a-b, b-a)
1514
1515 def test_summations(self):
1516 # check that sums of parts equal the whole
1517 a, b = self.a, self.b
1518 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1519 self.assertEqual((a&b)|(a^b), a|b)
1520 self.assertEqual(a|(b-a), a|b)
1521 self.assertEqual((a-b)|b, a|b)
1522 self.assertEqual((a-b)|(a&b), a)
1523 self.assertEqual((b-a)|(a&b), b)
1524 self.assertEqual((a-b)|(b-a), a^b)
1525
1526 def test_exclusion(self):
1527 # check that inverse operations show non-overlap
1528 a, b, zero = self.a, self.b, set()
1529 self.assertEqual((a-b)&b, zero)
1530 self.assertEqual((b-a)&a, zero)
1531 self.assertEqual((a&b)&(a^b), zero)
1532
1533# Tests derived from test_itertools.py =======================================
1534
1535def R(seqn):
1536 'Regular generator'
1537 for i in seqn:
1538 yield i
1539
1540class G:
1541 'Sequence using __getitem__'
1542 def __init__(self, seqn):
1543 self.seqn = seqn
1544 def __getitem__(self, i):
1545 return self.seqn[i]
1546
1547class I:
1548 'Sequence using iterator protocol'
1549 def __init__(self, seqn):
1550 self.seqn = seqn
1551 self.i = 0
1552 def __iter__(self):
1553 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001554 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001555 if self.i >= len(self.seqn): raise StopIteration
1556 v = self.seqn[self.i]
1557 self.i += 1
1558 return v
1559
1560class Ig:
1561 'Sequence using iterator protocol defined with a generator'
1562 def __init__(self, seqn):
1563 self.seqn = seqn
1564 self.i = 0
1565 def __iter__(self):
1566 for val in self.seqn:
1567 yield val
1568
1569class X:
1570 'Missing __getitem__ and __iter__'
1571 def __init__(self, seqn):
1572 self.seqn = seqn
1573 self.i = 0
Georg Brandla18af4e2007-04-21 15:47:16 +00001574 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001575 if self.i >= len(self.seqn): raise StopIteration
1576 v = self.seqn[self.i]
1577 self.i += 1
1578 return v
1579
1580class N:
Georg Brandla18af4e2007-04-21 15:47:16 +00001581 'Iterator missing __next__()'
Raymond Hettingera690a992003-11-16 16:17:49 +00001582 def __init__(self, seqn):
1583 self.seqn = seqn
1584 self.i = 0
1585 def __iter__(self):
1586 return self
1587
1588class E:
1589 'Test propagation of exceptions'
1590 def __init__(self, seqn):
1591 self.seqn = seqn
1592 self.i = 0
1593 def __iter__(self):
1594 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001595 def __next__(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001596 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001597
1598class S:
1599 'Test immediate stop'
1600 def __init__(self, seqn):
1601 pass
1602 def __iter__(self):
1603 return self
Georg Brandla18af4e2007-04-21 15:47:16 +00001604 def __next__(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001605 raise StopIteration
1606
Raymond Hettingera6c60372008-03-13 01:26:19 +00001607from itertools import chain
Raymond Hettingera690a992003-11-16 16:17:49 +00001608def L(seqn):
1609 'Test multiple tiers of iterators'
Raymond Hettingera6c60372008-03-13 01:26:19 +00001610 return chain(map(lambda x:x, R(Ig(G(seqn)))))
Raymond Hettingera690a992003-11-16 16:17:49 +00001611
1612class TestVariousIteratorArgs(unittest.TestCase):
1613
1614 def test_constructor(self):
1615 for cons in (set, frozenset):
Guido van Rossum805365e2007-05-07 22:24:25 +00001616 for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
Raymond Hettingera690a992003-11-16 16:17:49 +00001617 for g in (G, I, Ig, S, L, R):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001618 self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001619 self.assertRaises(TypeError, cons , X(s))
1620 self.assertRaises(TypeError, cons , N(s))
1621 self.assertRaises(ZeroDivisionError, cons , E(s))
1622
1623 def test_inline_methods(self):
1624 s = set('november')
Guido van Rossum805365e2007-05-07 22:24:25 +00001625 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Guido van Rossum58da9312007-11-10 23:39:45 +00001626 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
Raymond Hettingera690a992003-11-16 16:17:49 +00001627 for g in (G, I, Ig, L, R):
1628 expected = meth(data)
1629 actual = meth(G(data))
Guido van Rossum58da9312007-11-10 23:39:45 +00001630 if isinstance(expected, bool):
1631 self.assertEqual(actual, expected)
1632 else:
1633 self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001634 self.assertRaises(TypeError, meth, X(s))
1635 self.assertRaises(TypeError, meth, N(s))
1636 self.assertRaises(ZeroDivisionError, meth, E(s))
1637
1638 def test_inplace_methods(self):
Guido van Rossum805365e2007-05-07 22:24:25 +00001639 for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001640 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001641 'difference_update', 'symmetric_difference_update'):
1642 for g in (G, I, Ig, S, L, R):
1643 s = set('january')
1644 t = s.copy()
1645 getattr(s, methname)(list(g(data)))
1646 getattr(t, methname)(g(data))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001647 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
Raymond Hettingera690a992003-11-16 16:17:49 +00001648
1649 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1650 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1651 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1652
Christian Heimes969fe572008-01-25 11:23:10 +00001653# Application tests (based on David Eppstein's graph recipes ====================================
1654
1655def powerset(U):
1656 """Generates all subsets of a set or sequence U."""
1657 U = iter(U)
1658 try:
1659 x = frozenset([next(U)])
1660 for S in powerset(U):
1661 yield S
1662 yield S | x
1663 except StopIteration:
1664 yield frozenset()
1665
1666def cube(n):
1667 """Graph of n-dimensional hypercube."""
1668 singletons = [frozenset([x]) for x in range(n)]
1669 return dict([(x, frozenset([x^s for s in singletons]))
1670 for x in powerset(range(n))])
1671
1672def linegraph(G):
1673 """Graph, the vertices of which are edges of G,
1674 with two vertices being adjacent iff the corresponding
1675 edges share a vertex."""
1676 L = {}
1677 for x in G:
1678 for y in G[x]:
1679 nx = [frozenset([x,z]) for z in G[x] if z != y]
1680 ny = [frozenset([y,z]) for z in G[y] if z != x]
1681 L[frozenset([x,y])] = frozenset(nx+ny)
1682 return L
1683
1684def faces(G):
1685 'Return a set of faces in G. Where a face is a set of vertices on that face'
1686 # currently limited to triangles,squares, and pentagons
1687 f = set()
1688 for v1, edges in G.items():
1689 for v2 in edges:
1690 for v3 in G[v2]:
1691 if v1 == v3:
1692 continue
1693 if v1 in G[v3]:
1694 f.add(frozenset([v1, v2, v3]))
1695 else:
1696 for v4 in G[v3]:
1697 if v4 == v2:
1698 continue
1699 if v1 in G[v4]:
1700 f.add(frozenset([v1, v2, v3, v4]))
1701 else:
1702 for v5 in G[v4]:
1703 if v5 == v3 or v5 == v2:
1704 continue
1705 if v1 in G[v5]:
1706 f.add(frozenset([v1, v2, v3, v4, v5]))
1707 return f
1708
1709
1710class TestGraphs(unittest.TestCase):
1711
1712 def test_cube(self):
1713
1714 g = cube(3) # vert --> {v1, v2, v3}
1715 vertices1 = set(g)
1716 self.assertEqual(len(vertices1), 8) # eight vertices
1717 for edge in g.values():
1718 self.assertEqual(len(edge), 3) # each vertex connects to three edges
1719 vertices2 = set(v for edges in g.values() for v in edges)
1720 self.assertEqual(vertices1, vertices2) # edge vertices in original set
1721
1722 cubefaces = faces(g)
1723 self.assertEqual(len(cubefaces), 6) # six faces
1724 for face in cubefaces:
1725 self.assertEqual(len(face), 4) # each face is a square
1726
1727 def test_cuboctahedron(self):
1728
1729 # http://en.wikipedia.org/wiki/Cuboctahedron
1730 # 8 triangular faces and 6 square faces
1731 # 12 indentical vertices each connecting a triangle and square
1732
1733 g = cube(3)
1734 cuboctahedron = linegraph(g) # V( --> {V1, V2, V3, V4}
1735 self.assertEqual(len(cuboctahedron), 12)# twelve vertices
1736
1737 vertices = set(cuboctahedron)
1738 for edges in cuboctahedron.values():
1739 self.assertEqual(len(edges), 4) # each vertex connects to four other vertices
1740 othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
1741 self.assertEqual(vertices, othervertices) # edge vertices in original set
1742
1743 cubofaces = faces(cuboctahedron)
1744 facesizes = collections.defaultdict(int)
1745 for face in cubofaces:
1746 facesizes[len(face)] += 1
1747 self.assertEqual(facesizes[3], 8) # eight triangular faces
1748 self.assertEqual(facesizes[4], 6) # six square faces
1749
1750 for vertex in cuboctahedron:
1751 edge = vertex # Cuboctahedron vertices are edges in Cube
1752 self.assertEqual(len(edge), 2) # Two cube vertices define an edge
1753 for cubevert in edge:
1754 self.assert_(cubevert in g)
1755
1756
Raymond Hettingera690a992003-11-16 16:17:49 +00001757#==============================================================================
1758
1759def test_main(verbose=None):
Raymond Hettingera690a992003-11-16 16:17:49 +00001760 test_classes = (
1761 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001762 TestSetSubclass,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001763 TestSetSubclassWithKeywordArgs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001764 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001765 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001766 TestSetOfSets,
1767 TestExceptionPropagation,
1768 TestBasicOpsEmpty,
1769 TestBasicOpsSingleton,
1770 TestBasicOpsTuple,
1771 TestBasicOpsTriple,
Christian Heimes0ded5b52007-12-10 15:50:56 +00001772 TestBasicOpsString,
1773 TestBasicOpsBytes,
1774 TestBasicOpsMixedStringBytes,
Raymond Hettingera690a992003-11-16 16:17:49 +00001775 TestBinaryOps,
1776 TestUpdateOps,
1777 TestMutate,
1778 TestSubsetEqualEmpty,
1779 TestSubsetEqualNonEmpty,
1780 TestSubsetEmptyNonEmpty,
1781 TestSubsetPartial,
1782 TestSubsetNonOverlap,
1783 TestOnlySetsNumeric,
1784 TestOnlySetsDict,
1785 TestOnlySetsOperator,
1786 TestOnlySetsTuple,
1787 TestOnlySetsString,
1788 TestOnlySetsGenerator,
1789 TestCopyingEmpty,
1790 TestCopyingSingleton,
1791 TestCopyingTriple,
1792 TestCopyingTuple,
1793 TestCopyingNested,
1794 TestIdentities,
1795 TestVariousIteratorArgs,
Christian Heimes969fe572008-01-25 11:23:10 +00001796 TestGraphs,
Raymond Hettingera690a992003-11-16 16:17:49 +00001797 )
1798
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001799 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001800
1801 # verify reference counting
1802 if verbose and hasattr(sys, "gettotalrefcount"):
1803 import gc
1804 counts = [None] * 5
Guido van Rossum805365e2007-05-07 22:24:25 +00001805 for i in range(len(counts)):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001806 support.run_unittest(*test_classes)
Raymond Hettingera690a992003-11-16 16:17:49 +00001807 gc.collect()
1808 counts[i] = sys.gettotalrefcount()
Guido van Rossumd8c19672007-02-09 21:54:58 +00001809 print(counts)
Raymond Hettingera690a992003-11-16 16:17:49 +00001810
1811if __name__ == "__main__":
1812 test_main(verbose=True)