blob: 26e38abb21fa7193dd533ff52ed2e2e9474aa6b2 [file] [log] [blame]
Raymond Hettingera690a992003-11-16 16:17:49 +00001import unittest
2from test import test_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 Hettingera690a992003-11-16 16:17:49 +00008
9class PassThru(Exception):
10 pass
11
12def check_pass_thru():
13 raise PassThru
14 yield 1
15
16class TestJointOps(unittest.TestCase):
17 # Tests common to both set and frozenset
18
19 def setUp(self):
20 self.word = word = 'simsalabim'
21 self.otherword = 'madagascar'
22 self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
23 self.s = self.thetype(word)
24 self.d = dict.fromkeys(word)
25
Raymond Hettinger6429a472004-09-28 01:51:35 +000026 def test_new_or_init(self):
27 self.assertRaises(TypeError, self.thetype, [], 2)
28
Raymond Hettingera690a992003-11-16 16:17:49 +000029 def test_uniquification(self):
Raymond Hettinger64958a12003-12-17 20:43:33 +000030 actual = sorted(self.s)
31 expected = sorted(self.d)
Raymond Hettingera690a992003-11-16 16:17:49 +000032 self.assertEqual(actual, expected)
33 self.assertRaises(PassThru, self.thetype, check_pass_thru())
34 self.assertRaises(TypeError, self.thetype, [[]])
35
36 def test_len(self):
37 self.assertEqual(len(self.s), len(self.d))
38
39 def test_contains(self):
40 for c in self.letters:
41 self.assertEqual(c in self.s, c in self.d)
42 self.assertRaises(TypeError, self.s.__contains__, [[]])
Raymond Hettinger19c2d772003-11-21 18:36:54 +000043 s = self.thetype([frozenset(self.letters)])
44 self.assert_(self.thetype(self.letters) in s)
Raymond Hettingera690a992003-11-16 16:17:49 +000045
Raymond Hettingera690a992003-11-16 16:17:49 +000046 def test_union(self):
47 u = self.s.union(self.otherword)
48 for c in self.letters:
49 self.assertEqual(c in u, c in self.d or c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000050 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000051 self.assertEqual(type(u), self.thetype)
52 self.assertRaises(PassThru, self.s.union, check_pass_thru())
53 self.assertRaises(TypeError, self.s.union, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000054 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
55 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
56 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
57 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
58 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +000059
60 def test_or(self):
61 i = self.s.union(self.otherword)
62 self.assertEqual(self.s | set(self.otherword), i)
63 self.assertEqual(self.s | frozenset(self.otherword), i)
64 try:
65 self.s | self.otherword
66 except TypeError:
67 pass
68 else:
69 self.fail("s|t did not screen-out general iterables")
70
71 def test_intersection(self):
72 i = self.s.intersection(self.otherword)
73 for c in self.letters:
74 self.assertEqual(c in i, c in self.d and c in self.otherword)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +000075 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +000076 self.assertEqual(type(i), self.thetype)
77 self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +000078 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
79 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
80 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
81 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
82 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
Raymond Hettingera690a992003-11-16 16:17:49 +000083
84 def test_and(self):
85 i = self.s.intersection(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_difference(self):
96 i = self.s.difference(self.otherword)
97 for c in self.letters:
98 self.assertEqual(c in i, c in self.d and c not 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.difference, check_pass_thru())
102 self.assertRaises(TypeError, self.s.difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000103 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
104 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
105 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
106 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
107 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000108
109 def test_sub(self):
110 i = self.s.difference(self.otherword)
111 self.assertEqual(self.s - set(self.otherword), i)
112 self.assertEqual(self.s - frozenset(self.otherword), i)
113 try:
114 self.s - self.otherword
115 except TypeError:
116 pass
117 else:
118 self.fail("s-t did not screen-out general iterables")
119
120 def test_symmetric_difference(self):
121 i = self.s.symmetric_difference(self.otherword)
122 for c in self.letters:
123 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000124 self.assertEqual(self.s, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000125 self.assertEqual(type(i), self.thetype)
126 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
127 self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000128 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
129 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
130 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
131 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
132 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000133
134 def test_xor(self):
135 i = self.s.symmetric_difference(self.otherword)
136 self.assertEqual(self.s ^ set(self.otherword), i)
137 self.assertEqual(self.s ^ frozenset(self.otherword), i)
138 try:
139 self.s ^ self.otherword
140 except TypeError:
141 pass
142 else:
143 self.fail("s^t did not screen-out general iterables")
144
145 def test_equality(self):
146 self.assertEqual(self.s, set(self.word))
147 self.assertEqual(self.s, frozenset(self.word))
148 self.assertEqual(self.s == self.word, False)
149 self.assertNotEqual(self.s, set(self.otherword))
150 self.assertNotEqual(self.s, frozenset(self.otherword))
151 self.assertEqual(self.s != self.word, True)
152
153 def test_setOfFrozensets(self):
154 t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
155 s = self.thetype(t)
156 self.assertEqual(len(s), 3)
157
158 def test_compare(self):
159 self.assertRaises(TypeError, self.s.__cmp__, self.s)
160
161 def test_sub_and_super(self):
162 p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
163 self.assert_(p < q)
164 self.assert_(p <= q)
165 self.assert_(q <= q)
166 self.assert_(q > p)
167 self.assert_(q >= p)
168 self.failIf(q < r)
169 self.failIf(q <= r)
170 self.failIf(q > r)
171 self.failIf(q >= r)
Raymond Hettinger3fbec702003-11-21 07:56:36 +0000172 self.assert_(set('a').issubset('abc'))
173 self.assert_(set('abc').issuperset('a'))
174 self.failIf(set('a').issubset('cbs'))
175 self.failIf(set('cbs').issuperset('a'))
Raymond Hettingera690a992003-11-16 16:17:49 +0000176
177 def test_pickling(self):
Raymond Hettinger15056a52004-11-09 07:25:31 +0000178 for i in (0, 1, 2):
179 p = pickle.dumps(self.s, i)
180 dup = pickle.loads(p)
181 self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
182 if type(self.s) not in (set, frozenset):
183 self.s.x = 10
184 p = pickle.dumps(self.s)
185 dup = pickle.loads(p)
186 self.assertEqual(self.s.x, dup.x)
Raymond Hettingera690a992003-11-16 16:17:49 +0000187
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000188 def test_deepcopy(self):
189 class Tracer:
190 def __init__(self, value):
191 self.value = value
192 def __hash__(self):
Tim Peters58eb11c2004-01-18 20:29:55 +0000193 return self.value
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000194 def __deepcopy__(self, memo=None):
195 return Tracer(self.value + 1)
196 t = Tracer(10)
197 s = self.thetype([t])
198 dup = copy.deepcopy(s)
199 self.assertNotEqual(id(s), id(dup))
200 for elem in dup:
201 newt = elem
202 self.assertNotEqual(id(t), id(newt))
203 self.assertEqual(t.value + 1, newt.value)
204
Raymond Hettingerbb999b52005-06-18 21:00:26 +0000205 def test_gc(self):
206 # Create a nest of cycles to exercise overall ref count check
207 class A:
208 pass
209 s = set(A() for i in xrange(1000))
210 for elem in s:
211 elem.cycle = s
212 elem.sub = elem
213 elem.set = set([elem])
214
Raymond Hettingera690a992003-11-16 16:17:49 +0000215class TestSet(TestJointOps):
216 thetype = set
217
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000218 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000219 s = self.thetype()
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000220 s.__init__(self.word)
221 self.assertEqual(s, set(self.word))
222 s.__init__(self.otherword)
223 self.assertEqual(s, set(self.otherword))
Raymond Hettingereae05de2004-07-09 04:51:24 +0000224 self.assertRaises(TypeError, s.__init__, s, 2);
225 self.assertRaises(TypeError, s.__init__, 1);
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000226
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000227 def test_constructor_identity(self):
228 s = self.thetype(range(3))
229 t = self.thetype(s)
230 self.assertNotEqual(id(s), id(t))
231
Raymond Hettingera690a992003-11-16 16:17:49 +0000232 def test_hash(self):
233 self.assertRaises(TypeError, hash, self.s)
234
235 def test_clear(self):
236 self.s.clear()
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000237 self.assertEqual(self.s, set())
238 self.assertEqual(len(self.s), 0)
Raymond Hettingera690a992003-11-16 16:17:49 +0000239
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000240 def test_copy(self):
241 dup = self.s.copy()
242 self.assertEqual(self.s, dup)
243 self.assertNotEqual(id(self.s), id(dup))
244
Raymond Hettingera690a992003-11-16 16:17:49 +0000245 def test_add(self):
246 self.s.add('Q')
247 self.assert_('Q' in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000248 dup = self.s.copy()
249 self.s.add('Q')
250 self.assertEqual(self.s, dup)
Raymond Hettingera690a992003-11-16 16:17:49 +0000251 self.assertRaises(TypeError, self.s.add, [])
252
253 def test_remove(self):
254 self.s.remove('a')
255 self.assert_('a' not in self.s)
256 self.assertRaises(KeyError, self.s.remove, 'Q')
257 self.assertRaises(TypeError, self.s.remove, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000258 s = self.thetype([frozenset(self.word)])
259 self.assert_(self.thetype(self.word) in s)
260 s.remove(self.thetype(self.word))
261 self.assert_(self.thetype(self.word) not in s)
262 self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000263
264 def test_discard(self):
265 self.s.discard('a')
266 self.assert_('a' not in self.s)
267 self.s.discard('Q')
268 self.assertRaises(TypeError, self.s.discard, [])
Raymond Hettingerbfd334a2003-11-22 03:55:23 +0000269 s = self.thetype([frozenset(self.word)])
270 self.assert_(self.thetype(self.word) in s)
271 s.discard(self.thetype(self.word))
272 self.assert_(self.thetype(self.word) not in s)
273 s.discard(self.thetype(self.word))
Raymond Hettingera690a992003-11-16 16:17:49 +0000274
275 def test_pop(self):
276 for i in xrange(len(self.s)):
277 elem = self.s.pop()
278 self.assert_(elem not in self.s)
279 self.assertRaises(KeyError, self.s.pop)
280
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000281 def test_update(self):
282 retval = self.s.update(self.otherword)
Raymond Hettingera690a992003-11-16 16:17:49 +0000283 self.assertEqual(retval, None)
284 for c in (self.word + self.otherword):
285 self.assert_(c in self.s)
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000286 self.assertRaises(PassThru, self.s.update, check_pass_thru())
287 self.assertRaises(TypeError, self.s.update, [[]])
288 for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
289 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
290 s = self.thetype('abcba')
291 self.assertEqual(s.update(C(p)), None)
292 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000293
294 def test_ior(self):
295 self.s |= set(self.otherword)
296 for c in (self.word + self.otherword):
297 self.assert_(c in self.s)
298
299 def test_intersection_update(self):
300 retval = self.s.intersection_update(self.otherword)
301 self.assertEqual(retval, None)
302 for c in (self.word + self.otherword):
303 if c in self.otherword and c in self.word:
304 self.assert_(c in self.s)
305 else:
306 self.assert_(c not in self.s)
307 self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
308 self.assertRaises(TypeError, self.s.intersection_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000309 for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
310 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
311 s = self.thetype('abcba')
312 self.assertEqual(s.intersection_update(C(p)), None)
313 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000314
315 def test_iand(self):
316 self.s &= set(self.otherword)
317 for c in (self.word + self.otherword):
318 if c in self.otherword and c in self.word:
319 self.assert_(c in self.s)
320 else:
321 self.assert_(c not in self.s)
322
323 def test_difference_update(self):
324 retval = self.s.difference_update(self.otherword)
325 self.assertEqual(retval, None)
326 for c in (self.word + self.otherword):
327 if c in self.word and c not in self.otherword:
328 self.assert_(c in self.s)
329 else:
330 self.assert_(c not in self.s)
331 self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
332 self.assertRaises(TypeError, self.s.difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000333 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
334 for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
335 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
336 s = self.thetype('abcba')
337 self.assertEqual(s.difference_update(C(p)), None)
338 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000339
340 def test_isub(self):
341 self.s -= set(self.otherword)
342 for c in (self.word + self.otherword):
343 if c in self.word and c not in self.otherword:
344 self.assert_(c in self.s)
345 else:
346 self.assert_(c not in self.s)
347
348 def test_symmetric_difference_update(self):
349 retval = self.s.symmetric_difference_update(self.otherword)
350 self.assertEqual(retval, None)
351 for c in (self.word + self.otherword):
352 if (c in self.word) ^ (c in self.otherword):
353 self.assert_(c in self.s)
354 else:
355 self.assert_(c not in self.s)
356 self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
357 self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000358 for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
359 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
360 s = self.thetype('abcba')
361 self.assertEqual(s.symmetric_difference_update(C(p)), None)
362 self.assertEqual(s, set(q))
Raymond Hettingera690a992003-11-16 16:17:49 +0000363
364 def test_ixor(self):
365 self.s ^= set(self.otherword)
366 for c in (self.word + self.otherword):
367 if (c in self.word) ^ (c in self.otherword):
368 self.assert_(c in self.s)
369 else:
370 self.assert_(c not in self.s)
371
Raymond Hettinger691d8052004-05-30 07:26:47 +0000372 def test_weakref(self):
373 s = self.thetype('gallahad')
374 p = proxy(s)
375 self.assertEqual(str(p), str(s))
376 s = None
377 self.assertRaises(ReferenceError, str, p)
378
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000379class SetSubclass(set):
380 pass
381
382class TestSetSubclass(TestSet):
383 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000384
385class TestFrozenSet(TestJointOps):
386 thetype = frozenset
387
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000388 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000389 s = self.thetype(self.word)
390 s.__init__(self.otherword)
391 self.assertEqual(s, set(self.word))
392
393 def test_constructor_identity(self):
394 s = self.thetype(range(3))
395 t = self.thetype(s)
396 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000397
Raymond Hettingera690a992003-11-16 16:17:49 +0000398 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000399 self.assertEqual(hash(self.thetype('abcdeb')),
400 hash(self.thetype('ebecda')))
401
402 def test_copy(self):
403 dup = self.s.copy()
404 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000405
406 def test_frozen_as_dictkey(self):
407 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000408 key1 = self.thetype(seq)
409 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000410 self.assertEqual(key1, key2)
411 self.assertNotEqual(id(key1), id(key2))
412 d = {}
413 d[key1] = 42
414 self.assertEqual(d[key2], 42)
415
416 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000417 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000418 self.assertEqual(hash(f), hash(f))
419
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000420 def test_hash_effectiveness(self):
421 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000422 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000423 addhashvalue = hashvalues.add
424 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000425 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000426 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
427 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000428
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000429class FrozenSetSubclass(frozenset):
430 pass
431
432class TestFrozenSetSubclass(TestFrozenSet):
433 thetype = FrozenSetSubclass
434
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000435 def test_constructor_identity(self):
436 s = self.thetype(range(3))
437 t = self.thetype(s)
438 self.assertNotEqual(id(s), id(t))
439
440 def test_copy(self):
441 dup = self.s.copy()
442 self.assertNotEqual(id(self.s), id(dup))
443
444 def test_nested_empty_constructor(self):
445 s = self.thetype()
446 t = self.thetype(s)
447 self.assertEqual(s, t)
448
Raymond Hettingera690a992003-11-16 16:17:49 +0000449# Tests taken from test_sets.py =============================================
450
451empty_set = set()
452
453#==============================================================================
454
455class TestBasicOps(unittest.TestCase):
456
457 def test_repr(self):
458 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000459 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000460
Raymond Hettingereae05de2004-07-09 04:51:24 +0000461 def test_print(self):
462 try:
463 fo = open(test_support.TESTFN, "wb")
464 print >> fo, self.set,
465 fo.close()
466 fo = open(test_support.TESTFN, "rb")
467 self.assertEqual(fo.read(), repr(self.set))
468 finally:
469 fo.close()
470 os.remove(test_support.TESTFN)
471
Raymond Hettingera690a992003-11-16 16:17:49 +0000472 def test_length(self):
473 self.assertEqual(len(self.set), self.length)
474
475 def test_self_equality(self):
476 self.assertEqual(self.set, self.set)
477
478 def test_equivalent_equality(self):
479 self.assertEqual(self.set, self.dup)
480
481 def test_copy(self):
482 self.assertEqual(self.set.copy(), self.dup)
483
484 def test_self_union(self):
485 result = self.set | self.set
486 self.assertEqual(result, self.dup)
487
488 def test_empty_union(self):
489 result = self.set | empty_set
490 self.assertEqual(result, self.dup)
491
492 def test_union_empty(self):
493 result = empty_set | self.set
494 self.assertEqual(result, self.dup)
495
496 def test_self_intersection(self):
497 result = self.set & self.set
498 self.assertEqual(result, self.dup)
499
500 def test_empty_intersection(self):
501 result = self.set & empty_set
502 self.assertEqual(result, empty_set)
503
504 def test_intersection_empty(self):
505 result = empty_set & self.set
506 self.assertEqual(result, empty_set)
507
508 def test_self_symmetric_difference(self):
509 result = self.set ^ self.set
510 self.assertEqual(result, empty_set)
511
512 def checkempty_symmetric_difference(self):
513 result = self.set ^ empty_set
514 self.assertEqual(result, self.set)
515
516 def test_self_difference(self):
517 result = self.set - self.set
518 self.assertEqual(result, empty_set)
519
520 def test_empty_difference(self):
521 result = self.set - empty_set
522 self.assertEqual(result, self.dup)
523
524 def test_empty_difference_rev(self):
525 result = empty_set - self.set
526 self.assertEqual(result, empty_set)
527
528 def test_iteration(self):
529 for v in self.set:
530 self.assert_(v in self.values)
531
532 def test_pickling(self):
533 p = pickle.dumps(self.set)
534 copy = pickle.loads(p)
535 self.assertEqual(self.set, copy,
536 "%s != %s" % (self.set, copy))
537
538#------------------------------------------------------------------------------
539
540class TestBasicOpsEmpty(TestBasicOps):
541 def setUp(self):
542 self.case = "empty set"
543 self.values = []
544 self.set = set(self.values)
545 self.dup = set(self.values)
546 self.length = 0
547 self.repr = "set([])"
548
549#------------------------------------------------------------------------------
550
551class TestBasicOpsSingleton(TestBasicOps):
552 def setUp(self):
553 self.case = "unit set (number)"
554 self.values = [3]
555 self.set = set(self.values)
556 self.dup = set(self.values)
557 self.length = 1
558 self.repr = "set([3])"
559
560 def test_in(self):
561 self.failUnless(3 in self.set)
562
563 def test_not_in(self):
564 self.failUnless(2 not in self.set)
565
566#------------------------------------------------------------------------------
567
568class TestBasicOpsTuple(TestBasicOps):
569 def setUp(self):
570 self.case = "unit set (tuple)"
571 self.values = [(0, "zero")]
572 self.set = set(self.values)
573 self.dup = set(self.values)
574 self.length = 1
575 self.repr = "set([(0, 'zero')])"
576
577 def test_in(self):
578 self.failUnless((0, "zero") in self.set)
579
580 def test_not_in(self):
581 self.failUnless(9 not in self.set)
582
583#------------------------------------------------------------------------------
584
585class TestBasicOpsTriple(TestBasicOps):
586 def setUp(self):
587 self.case = "triple set"
588 self.values = [0, "zero", operator.add]
589 self.set = set(self.values)
590 self.dup = set(self.values)
591 self.length = 3
592 self.repr = None
593
594#==============================================================================
595
596def baditer():
597 raise TypeError
598 yield True
599
600def gooditer():
601 yield True
602
603class TestExceptionPropagation(unittest.TestCase):
604 """SF 628246: Set constructor should not trap iterator TypeErrors"""
605
606 def test_instanceWithException(self):
607 self.assertRaises(TypeError, set, baditer())
608
609 def test_instancesWithoutException(self):
610 # All of these iterables should load without exception.
611 set([1,2,3])
612 set((1,2,3))
613 set({'one':1, 'two':2, 'three':3})
614 set(xrange(3))
615 set('abc')
616 set(gooditer())
617
618#==============================================================================
619
620class TestSetOfSets(unittest.TestCase):
621 def test_constructor(self):
622 inner = frozenset([1])
623 outer = set([inner])
624 element = outer.pop()
625 self.assertEqual(type(element), frozenset)
626 outer.add(inner) # Rebuild set of sets with .add method
627 outer.remove(inner)
628 self.assertEqual(outer, set()) # Verify that remove worked
629 outer.discard(inner) # Absence of KeyError indicates working fine
630
631#==============================================================================
632
633class TestBinaryOps(unittest.TestCase):
634 def setUp(self):
635 self.set = set((2, 4, 6))
636
637 def test_eq(self): # SF bug 643115
638 self.assertEqual(self.set, set({2:1,4:3,6:5}))
639
640 def test_union_subset(self):
641 result = self.set | set([2])
642 self.assertEqual(result, set((2, 4, 6)))
643
644 def test_union_superset(self):
645 result = self.set | set([2, 4, 6, 8])
646 self.assertEqual(result, set([2, 4, 6, 8]))
647
648 def test_union_overlap(self):
649 result = self.set | set([3, 4, 5])
650 self.assertEqual(result, set([2, 3, 4, 5, 6]))
651
652 def test_union_non_overlap(self):
653 result = self.set | set([8])
654 self.assertEqual(result, set([2, 4, 6, 8]))
655
656 def test_intersection_subset(self):
657 result = self.set & set((2, 4))
658 self.assertEqual(result, set((2, 4)))
659
660 def test_intersection_superset(self):
661 result = self.set & set([2, 4, 6, 8])
662 self.assertEqual(result, set([2, 4, 6]))
663
664 def test_intersection_overlap(self):
665 result = self.set & set([3, 4, 5])
666 self.assertEqual(result, set([4]))
667
668 def test_intersection_non_overlap(self):
669 result = self.set & set([8])
670 self.assertEqual(result, empty_set)
671
672 def test_sym_difference_subset(self):
673 result = self.set ^ set((2, 4))
674 self.assertEqual(result, set([6]))
675
676 def test_sym_difference_superset(self):
677 result = self.set ^ set((2, 4, 6, 8))
678 self.assertEqual(result, set([8]))
679
680 def test_sym_difference_overlap(self):
681 result = self.set ^ set((3, 4, 5))
682 self.assertEqual(result, set([2, 3, 5, 6]))
683
684 def test_sym_difference_non_overlap(self):
685 result = self.set ^ set([8])
686 self.assertEqual(result, set([2, 4, 6, 8]))
687
688 def test_cmp(self):
689 a, b = set('a'), set('b')
690 self.assertRaises(TypeError, cmp, a, b)
691
692 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
693 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
694 # which Python thinks is good enough to synthesize a cmp() result
695 # without calling __cmp__.
696 self.assertEqual(cmp(a, a), 0)
697
698 self.assertRaises(TypeError, cmp, a, 12)
699 self.assertRaises(TypeError, cmp, "abc", a)
700
701#==============================================================================
702
703class TestUpdateOps(unittest.TestCase):
704 def setUp(self):
705 self.set = set((2, 4, 6))
706
707 def test_union_subset(self):
708 self.set |= set([2])
709 self.assertEqual(self.set, set((2, 4, 6)))
710
711 def test_union_superset(self):
712 self.set |= set([2, 4, 6, 8])
713 self.assertEqual(self.set, set([2, 4, 6, 8]))
714
715 def test_union_overlap(self):
716 self.set |= set([3, 4, 5])
717 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
718
719 def test_union_non_overlap(self):
720 self.set |= set([8])
721 self.assertEqual(self.set, set([2, 4, 6, 8]))
722
723 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000724 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000725 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
726
727 def test_intersection_subset(self):
728 self.set &= set((2, 4))
729 self.assertEqual(self.set, set((2, 4)))
730
731 def test_intersection_superset(self):
732 self.set &= set([2, 4, 6, 8])
733 self.assertEqual(self.set, set([2, 4, 6]))
734
735 def test_intersection_overlap(self):
736 self.set &= set([3, 4, 5])
737 self.assertEqual(self.set, set([4]))
738
739 def test_intersection_non_overlap(self):
740 self.set &= set([8])
741 self.assertEqual(self.set, empty_set)
742
743 def test_intersection_method_call(self):
744 self.set.intersection_update(set([3, 4, 5]))
745 self.assertEqual(self.set, set([4]))
746
747 def test_sym_difference_subset(self):
748 self.set ^= set((2, 4))
749 self.assertEqual(self.set, set([6]))
750
751 def test_sym_difference_superset(self):
752 self.set ^= set((2, 4, 6, 8))
753 self.assertEqual(self.set, set([8]))
754
755 def test_sym_difference_overlap(self):
756 self.set ^= set((3, 4, 5))
757 self.assertEqual(self.set, set([2, 3, 5, 6]))
758
759 def test_sym_difference_non_overlap(self):
760 self.set ^= set([8])
761 self.assertEqual(self.set, set([2, 4, 6, 8]))
762
763 def test_sym_difference_method_call(self):
764 self.set.symmetric_difference_update(set([3, 4, 5]))
765 self.assertEqual(self.set, set([2, 3, 5, 6]))
766
767 def test_difference_subset(self):
768 self.set -= set((2, 4))
769 self.assertEqual(self.set, set([6]))
770
771 def test_difference_superset(self):
772 self.set -= set((2, 4, 6, 8))
773 self.assertEqual(self.set, set([]))
774
775 def test_difference_overlap(self):
776 self.set -= set((3, 4, 5))
777 self.assertEqual(self.set, set([2, 6]))
778
779 def test_difference_non_overlap(self):
780 self.set -= set([8])
781 self.assertEqual(self.set, set([2, 4, 6]))
782
783 def test_difference_method_call(self):
784 self.set.difference_update(set([3, 4, 5]))
785 self.assertEqual(self.set, set([2, 6]))
786
787#==============================================================================
788
789class TestMutate(unittest.TestCase):
790 def setUp(self):
791 self.values = ["a", "b", "c"]
792 self.set = set(self.values)
793
794 def test_add_present(self):
795 self.set.add("c")
796 self.assertEqual(self.set, set("abc"))
797
798 def test_add_absent(self):
799 self.set.add("d")
800 self.assertEqual(self.set, set("abcd"))
801
802 def test_add_until_full(self):
803 tmp = set()
804 expected_len = 0
805 for v in self.values:
806 tmp.add(v)
807 expected_len += 1
808 self.assertEqual(len(tmp), expected_len)
809 self.assertEqual(tmp, self.set)
810
811 def test_remove_present(self):
812 self.set.remove("b")
813 self.assertEqual(self.set, set("ac"))
814
815 def test_remove_absent(self):
816 try:
817 self.set.remove("d")
818 self.fail("Removing missing element should have raised LookupError")
819 except LookupError:
820 pass
821
822 def test_remove_until_empty(self):
823 expected_len = len(self.set)
824 for v in self.values:
825 self.set.remove(v)
826 expected_len -= 1
827 self.assertEqual(len(self.set), expected_len)
828
829 def test_discard_present(self):
830 self.set.discard("c")
831 self.assertEqual(self.set, set("ab"))
832
833 def test_discard_absent(self):
834 self.set.discard("d")
835 self.assertEqual(self.set, set("abc"))
836
837 def test_clear(self):
838 self.set.clear()
839 self.assertEqual(len(self.set), 0)
840
841 def test_pop(self):
842 popped = {}
843 while self.set:
844 popped[self.set.pop()] = None
845 self.assertEqual(len(popped), len(self.values))
846 for v in self.values:
847 self.failUnless(v in popped)
848
849 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000850 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000851 self.assertEqual(self.set, set(self.values))
852
853 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000854 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000855 self.assertEqual(self.set, set(self.values))
856
857 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000858 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000859 self.assertEqual(self.set, set(self.values + ["z"]))
860
861#==============================================================================
862
863class TestSubsets(unittest.TestCase):
864
865 case2method = {"<=": "issubset",
866 ">=": "issuperset",
867 }
868
869 reverse = {"==": "==",
870 "!=": "!=",
871 "<": ">",
872 ">": "<",
873 "<=": ">=",
874 ">=": "<=",
875 }
876
877 def test_issubset(self):
878 x = self.left
879 y = self.right
880 for case in "!=", "==", "<", "<=", ">", ">=":
881 expected = case in self.cases
882 # Test the binary infix spelling.
883 result = eval("x" + case + "y", locals())
884 self.assertEqual(result, expected)
885 # Test the "friendly" method-name spelling, if one exists.
886 if case in TestSubsets.case2method:
887 method = getattr(x, TestSubsets.case2method[case])
888 result = method(y)
889 self.assertEqual(result, expected)
890
891 # Now do the same for the operands reversed.
892 rcase = TestSubsets.reverse[case]
893 result = eval("y" + rcase + "x", locals())
894 self.assertEqual(result, expected)
895 if rcase in TestSubsets.case2method:
896 method = getattr(y, TestSubsets.case2method[rcase])
897 result = method(x)
898 self.assertEqual(result, expected)
899#------------------------------------------------------------------------------
900
901class TestSubsetEqualEmpty(TestSubsets):
902 left = set()
903 right = set()
904 name = "both empty"
905 cases = "==", "<=", ">="
906
907#------------------------------------------------------------------------------
908
909class TestSubsetEqualNonEmpty(TestSubsets):
910 left = set([1, 2])
911 right = set([1, 2])
912 name = "equal pair"
913 cases = "==", "<=", ">="
914
915#------------------------------------------------------------------------------
916
917class TestSubsetEmptyNonEmpty(TestSubsets):
918 left = set()
919 right = set([1, 2])
920 name = "one empty, one non-empty"
921 cases = "!=", "<", "<="
922
923#------------------------------------------------------------------------------
924
925class TestSubsetPartial(TestSubsets):
926 left = set([1])
927 right = set([1, 2])
928 name = "one a non-empty proper subset of other"
929 cases = "!=", "<", "<="
930
931#------------------------------------------------------------------------------
932
933class TestSubsetNonOverlap(TestSubsets):
934 left = set([1])
935 right = set([2])
936 name = "neither empty, neither contains"
937 cases = "!="
938
939#==============================================================================
940
941class TestOnlySetsInBinaryOps(unittest.TestCase):
942
943 def test_eq_ne(self):
944 # Unlike the others, this is testing that == and != *are* allowed.
945 self.assertEqual(self.other == self.set, False)
946 self.assertEqual(self.set == self.other, False)
947 self.assertEqual(self.other != self.set, True)
948 self.assertEqual(self.set != self.other, True)
949
950 def test_ge_gt_le_lt(self):
951 self.assertRaises(TypeError, lambda: self.set < self.other)
952 self.assertRaises(TypeError, lambda: self.set <= self.other)
953 self.assertRaises(TypeError, lambda: self.set > self.other)
954 self.assertRaises(TypeError, lambda: self.set >= self.other)
955
956 self.assertRaises(TypeError, lambda: self.other < self.set)
957 self.assertRaises(TypeError, lambda: self.other <= self.set)
958 self.assertRaises(TypeError, lambda: self.other > self.set)
959 self.assertRaises(TypeError, lambda: self.other >= self.set)
960
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000961 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000962 try:
963 self.set |= self.other
964 except TypeError:
965 pass
966 else:
967 self.fail("expected TypeError")
968
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000969 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +0000970 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000971 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000972 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000973 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +0000974
975 def test_union(self):
976 self.assertRaises(TypeError, lambda: self.set | self.other)
977 self.assertRaises(TypeError, lambda: self.other | self.set)
978 if self.otherIsIterable:
979 self.set.union(self.other)
980 else:
981 self.assertRaises(TypeError, self.set.union, self.other)
982
983 def test_intersection_update_operator(self):
984 try:
985 self.set &= self.other
986 except TypeError:
987 pass
988 else:
989 self.fail("expected TypeError")
990
991 def test_intersection_update(self):
992 if self.otherIsIterable:
993 self.set.intersection_update(self.other)
994 else:
995 self.assertRaises(TypeError,
996 self.set.intersection_update,
997 self.other)
998
999 def test_intersection(self):
1000 self.assertRaises(TypeError, lambda: self.set & self.other)
1001 self.assertRaises(TypeError, lambda: self.other & self.set)
1002 if self.otherIsIterable:
1003 self.set.intersection(self.other)
1004 else:
1005 self.assertRaises(TypeError, self.set.intersection, self.other)
1006
1007 def test_sym_difference_update_operator(self):
1008 try:
1009 self.set ^= self.other
1010 except TypeError:
1011 pass
1012 else:
1013 self.fail("expected TypeError")
1014
1015 def test_sym_difference_update(self):
1016 if self.otherIsIterable:
1017 self.set.symmetric_difference_update(self.other)
1018 else:
1019 self.assertRaises(TypeError,
1020 self.set.symmetric_difference_update,
1021 self.other)
1022
1023 def test_sym_difference(self):
1024 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1025 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1026 if self.otherIsIterable:
1027 self.set.symmetric_difference(self.other)
1028 else:
1029 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1030
1031 def test_difference_update_operator(self):
1032 try:
1033 self.set -= self.other
1034 except TypeError:
1035 pass
1036 else:
1037 self.fail("expected TypeError")
1038
1039 def test_difference_update(self):
1040 if self.otherIsIterable:
1041 self.set.difference_update(self.other)
1042 else:
1043 self.assertRaises(TypeError,
1044 self.set.difference_update,
1045 self.other)
1046
1047 def test_difference(self):
1048 self.assertRaises(TypeError, lambda: self.set - self.other)
1049 self.assertRaises(TypeError, lambda: self.other - self.set)
1050 if self.otherIsIterable:
1051 self.set.difference(self.other)
1052 else:
1053 self.assertRaises(TypeError, self.set.difference, self.other)
1054
1055#------------------------------------------------------------------------------
1056
1057class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1058 def setUp(self):
1059 self.set = set((1, 2, 3))
1060 self.other = 19
1061 self.otherIsIterable = False
1062
1063#------------------------------------------------------------------------------
1064
1065class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1066 def setUp(self):
1067 self.set = set((1, 2, 3))
1068 self.other = {1:2, 3:4}
1069 self.otherIsIterable = True
1070
1071#------------------------------------------------------------------------------
1072
1073class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1074 def setUp(self):
1075 self.set = set((1, 2, 3))
1076 self.other = operator.add
1077 self.otherIsIterable = False
1078
1079#------------------------------------------------------------------------------
1080
1081class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1082 def setUp(self):
1083 self.set = set((1, 2, 3))
1084 self.other = (2, 4, 6)
1085 self.otherIsIterable = True
1086
1087#------------------------------------------------------------------------------
1088
1089class TestOnlySetsString(TestOnlySetsInBinaryOps):
1090 def setUp(self):
1091 self.set = set((1, 2, 3))
1092 self.other = 'abc'
1093 self.otherIsIterable = True
1094
1095#------------------------------------------------------------------------------
1096
1097class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1098 def setUp(self):
1099 def gen():
1100 for i in xrange(0, 10, 2):
1101 yield i
1102 self.set = set((1, 2, 3))
1103 self.other = gen()
1104 self.otherIsIterable = True
1105
1106#==============================================================================
1107
1108class TestCopying(unittest.TestCase):
1109
1110 def test_copy(self):
1111 dup = self.set.copy()
1112 dup_list = list(dup); dup_list.sort()
1113 set_list = list(self.set); set_list.sort()
1114 self.assertEqual(len(dup_list), len(set_list))
1115 for i in range(len(dup_list)):
1116 self.failUnless(dup_list[i] is set_list[i])
1117
1118 def test_deep_copy(self):
1119 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001120 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001121 dup_list = list(dup); dup_list.sort()
1122 set_list = list(self.set); set_list.sort()
1123 self.assertEqual(len(dup_list), len(set_list))
1124 for i in range(len(dup_list)):
1125 self.assertEqual(dup_list[i], set_list[i])
1126
1127#------------------------------------------------------------------------------
1128
1129class TestCopyingEmpty(TestCopying):
1130 def setUp(self):
1131 self.set = set()
1132
1133#------------------------------------------------------------------------------
1134
1135class TestCopyingSingleton(TestCopying):
1136 def setUp(self):
1137 self.set = set(["hello"])
1138
1139#------------------------------------------------------------------------------
1140
1141class TestCopyingTriple(TestCopying):
1142 def setUp(self):
1143 self.set = set(["zero", 0, None])
1144
1145#------------------------------------------------------------------------------
1146
1147class TestCopyingTuple(TestCopying):
1148 def setUp(self):
1149 self.set = set([(1, 2)])
1150
1151#------------------------------------------------------------------------------
1152
1153class TestCopyingNested(TestCopying):
1154 def setUp(self):
1155 self.set = set([((1, 2), (3, 4))])
1156
1157#==============================================================================
1158
1159class TestIdentities(unittest.TestCase):
1160 def setUp(self):
1161 self.a = set('abracadabra')
1162 self.b = set('alacazam')
1163
1164 def test_binopsVsSubsets(self):
1165 a, b = self.a, self.b
1166 self.assert_(a - b < a)
1167 self.assert_(b - a < b)
1168 self.assert_(a & b < a)
1169 self.assert_(a & b < b)
1170 self.assert_(a | b > a)
1171 self.assert_(a | b > b)
1172 self.assert_(a ^ b < a | b)
1173
1174 def test_commutativity(self):
1175 a, b = self.a, self.b
1176 self.assertEqual(a&b, b&a)
1177 self.assertEqual(a|b, b|a)
1178 self.assertEqual(a^b, b^a)
1179 if a != b:
1180 self.assertNotEqual(a-b, b-a)
1181
1182 def test_summations(self):
1183 # check that sums of parts equal the whole
1184 a, b = self.a, self.b
1185 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1186 self.assertEqual((a&b)|(a^b), a|b)
1187 self.assertEqual(a|(b-a), a|b)
1188 self.assertEqual((a-b)|b, a|b)
1189 self.assertEqual((a-b)|(a&b), a)
1190 self.assertEqual((b-a)|(a&b), b)
1191 self.assertEqual((a-b)|(b-a), a^b)
1192
1193 def test_exclusion(self):
1194 # check that inverse operations show non-overlap
1195 a, b, zero = self.a, self.b, set()
1196 self.assertEqual((a-b)&b, zero)
1197 self.assertEqual((b-a)&a, zero)
1198 self.assertEqual((a&b)&(a^b), zero)
1199
1200# Tests derived from test_itertools.py =======================================
1201
1202def R(seqn):
1203 'Regular generator'
1204 for i in seqn:
1205 yield i
1206
1207class G:
1208 'Sequence using __getitem__'
1209 def __init__(self, seqn):
1210 self.seqn = seqn
1211 def __getitem__(self, i):
1212 return self.seqn[i]
1213
1214class I:
1215 'Sequence using iterator protocol'
1216 def __init__(self, seqn):
1217 self.seqn = seqn
1218 self.i = 0
1219 def __iter__(self):
1220 return self
1221 def next(self):
1222 if self.i >= len(self.seqn): raise StopIteration
1223 v = self.seqn[self.i]
1224 self.i += 1
1225 return v
1226
1227class Ig:
1228 'Sequence using iterator protocol defined with a generator'
1229 def __init__(self, seqn):
1230 self.seqn = seqn
1231 self.i = 0
1232 def __iter__(self):
1233 for val in self.seqn:
1234 yield val
1235
1236class X:
1237 'Missing __getitem__ and __iter__'
1238 def __init__(self, seqn):
1239 self.seqn = seqn
1240 self.i = 0
1241 def next(self):
1242 if self.i >= len(self.seqn): raise StopIteration
1243 v = self.seqn[self.i]
1244 self.i += 1
1245 return v
1246
1247class N:
1248 'Iterator missing next()'
1249 def __init__(self, seqn):
1250 self.seqn = seqn
1251 self.i = 0
1252 def __iter__(self):
1253 return self
1254
1255class E:
1256 'Test propagation of exceptions'
1257 def __init__(self, seqn):
1258 self.seqn = seqn
1259 self.i = 0
1260 def __iter__(self):
1261 return self
1262 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001263 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001264
1265class S:
1266 'Test immediate stop'
1267 def __init__(self, seqn):
1268 pass
1269 def __iter__(self):
1270 return self
1271 def next(self):
1272 raise StopIteration
1273
1274from itertools import chain, imap
1275def L(seqn):
1276 'Test multiple tiers of iterators'
1277 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1278
1279class TestVariousIteratorArgs(unittest.TestCase):
1280
1281 def test_constructor(self):
1282 for cons in (set, frozenset):
1283 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1284 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001285 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001286 self.assertRaises(TypeError, cons , X(s))
1287 self.assertRaises(TypeError, cons , N(s))
1288 self.assertRaises(ZeroDivisionError, cons , E(s))
1289
1290 def test_inline_methods(self):
1291 s = set('november')
1292 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1293 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1294 for g in (G, I, Ig, L, R):
1295 expected = meth(data)
1296 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001297 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001298 self.assertRaises(TypeError, meth, X(s))
1299 self.assertRaises(TypeError, meth, N(s))
1300 self.assertRaises(ZeroDivisionError, meth, E(s))
1301
1302 def test_inplace_methods(self):
1303 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001304 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001305 'difference_update', 'symmetric_difference_update'):
1306 for g in (G, I, Ig, S, L, R):
1307 s = set('january')
1308 t = s.copy()
1309 getattr(s, methname)(list(g(data)))
1310 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001311 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001312
1313 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1314 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1315 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1316
1317#==============================================================================
1318
1319def test_main(verbose=None):
1320 import sys
1321 from test import test_sets
1322 test_classes = (
1323 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001324 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001325 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001326 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001327 TestSetOfSets,
1328 TestExceptionPropagation,
1329 TestBasicOpsEmpty,
1330 TestBasicOpsSingleton,
1331 TestBasicOpsTuple,
1332 TestBasicOpsTriple,
1333 TestBinaryOps,
1334 TestUpdateOps,
1335 TestMutate,
1336 TestSubsetEqualEmpty,
1337 TestSubsetEqualNonEmpty,
1338 TestSubsetEmptyNonEmpty,
1339 TestSubsetPartial,
1340 TestSubsetNonOverlap,
1341 TestOnlySetsNumeric,
1342 TestOnlySetsDict,
1343 TestOnlySetsOperator,
1344 TestOnlySetsTuple,
1345 TestOnlySetsString,
1346 TestOnlySetsGenerator,
1347 TestCopyingEmpty,
1348 TestCopyingSingleton,
1349 TestCopyingTriple,
1350 TestCopyingTuple,
1351 TestCopyingNested,
1352 TestIdentities,
1353 TestVariousIteratorArgs,
1354 )
1355
1356 test_support.run_unittest(*test_classes)
1357
1358 # verify reference counting
1359 if verbose and hasattr(sys, "gettotalrefcount"):
1360 import gc
1361 counts = [None] * 5
1362 for i in xrange(len(counts)):
1363 test_support.run_unittest(*test_classes)
1364 gc.collect()
1365 counts[i] = sys.gettotalrefcount()
1366 print counts
1367
1368if __name__ == "__main__":
1369 test_main(verbose=True)