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