blob: a21d53c726454f2526cc08319499e5d61b7eaea7 [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 Hettingerc991db22005-08-11 07:58:45 +0000373 def test_inplace_on_self(self):
374 t = self.s.copy()
375 t |= t
376 self.assertEqual(t, self.s)
377 t &= t
378 self.assertEqual(t, self.s)
379 t -= t
380 self.assertEqual(t, self.thetype())
381 t = self.s.copy()
382 t ^= t
383 self.assertEqual(t, self.thetype())
384
Raymond Hettinger691d8052004-05-30 07:26:47 +0000385 def test_weakref(self):
386 s = self.thetype('gallahad')
387 p = proxy(s)
388 self.assertEqual(str(p), str(s))
389 s = None
390 self.assertRaises(ReferenceError, str, p)
391
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000392class SetSubclass(set):
393 pass
394
395class TestSetSubclass(TestSet):
396 thetype = SetSubclass
Raymond Hettingera690a992003-11-16 16:17:49 +0000397
398class TestFrozenSet(TestJointOps):
399 thetype = frozenset
400
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000401 def test_init(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000402 s = self.thetype(self.word)
403 s.__init__(self.otherword)
404 self.assertEqual(s, set(self.word))
405
Raymond Hettingerd7946662005-08-01 21:39:29 +0000406 def test_singleton_empty_frozenset(self):
407 f = frozenset()
408 efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
409 frozenset(), frozenset([]), frozenset(()), frozenset(''),
410 frozenset(xrange(0)), frozenset(frozenset()),
411 frozenset(f), f]
412 # All of the empty frozensets should have just one id()
413 self.assertEqual(len(set(map(id, efs))), 1)
414
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000415 def test_constructor_identity(self):
416 s = self.thetype(range(3))
417 t = self.thetype(s)
418 self.assertEqual(id(s), id(t))
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000419
Raymond Hettingera690a992003-11-16 16:17:49 +0000420 def test_hash(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000421 self.assertEqual(hash(self.thetype('abcdeb')),
422 hash(self.thetype('ebecda')))
423
Raymond Hettinger82cb9a22005-07-05 05:34:43 +0000424 # make sure that all permutations give the same hash value
425 n = 100
426 seq = [randrange(n) for i in xrange(n)]
427 results = set()
428 for i in xrange(200):
429 shuffle(seq)
430 results.add(hash(self.thetype(seq)))
431 self.assertEqual(len(results), 1)
432
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000433 def test_copy(self):
434 dup = self.s.copy()
435 self.assertEqual(id(self.s), id(dup))
Raymond Hettingera690a992003-11-16 16:17:49 +0000436
437 def test_frozen_as_dictkey(self):
438 seq = range(10) + list('abcdefg') + ['apple']
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000439 key1 = self.thetype(seq)
440 key2 = self.thetype(reversed(seq))
Raymond Hettingera690a992003-11-16 16:17:49 +0000441 self.assertEqual(key1, key2)
442 self.assertNotEqual(id(key1), id(key2))
443 d = {}
444 d[key1] = 42
445 self.assertEqual(d[key2], 42)
446
447 def test_hash_caching(self):
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000448 f = self.thetype('abcdcda')
Raymond Hettingera690a992003-11-16 16:17:49 +0000449 self.assertEqual(hash(f), hash(f))
450
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000451 def test_hash_effectiveness(self):
452 n = 13
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000453 hashvalues = set()
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000454 addhashvalue = hashvalues.add
455 elemmasks = [(i+1, 1<<i) for i in range(n)]
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000456 for i in xrange(2**n):
Raymond Hettinger6e70acc2003-12-31 02:01:33 +0000457 addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
458 self.assertEqual(len(hashvalues), 2**n)
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000459
Raymond Hettinger50a4bb32003-11-17 16:42:33 +0000460class FrozenSetSubclass(frozenset):
461 pass
462
463class TestFrozenSetSubclass(TestFrozenSet):
464 thetype = FrozenSetSubclass
465
Raymond Hettinger49ba4c32003-11-23 02:49:05 +0000466 def test_constructor_identity(self):
467 s = self.thetype(range(3))
468 t = self.thetype(s)
469 self.assertNotEqual(id(s), id(t))
470
471 def test_copy(self):
472 dup = self.s.copy()
473 self.assertNotEqual(id(self.s), id(dup))
474
475 def test_nested_empty_constructor(self):
476 s = self.thetype()
477 t = self.thetype(s)
478 self.assertEqual(s, t)
479
Raymond Hettingerd7946662005-08-01 21:39:29 +0000480 def test_singleton_empty_frozenset(self):
481 Frozenset = self.thetype
482 f = frozenset()
483 F = Frozenset()
484 efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
485 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
486 Frozenset(xrange(0)), Frozenset(Frozenset()),
487 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
488 # All empty frozenset subclass instances should have different ids
489 self.assertEqual(len(set(map(id, efs))), len(efs))
490
Raymond Hettingera690a992003-11-16 16:17:49 +0000491# Tests taken from test_sets.py =============================================
492
493empty_set = set()
494
495#==============================================================================
496
497class TestBasicOps(unittest.TestCase):
498
499 def test_repr(self):
500 if self.repr is not None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000501 self.assertEqual(repr(self.set), self.repr)
Raymond Hettingera690a992003-11-16 16:17:49 +0000502
Raymond Hettingereae05de2004-07-09 04:51:24 +0000503 def test_print(self):
504 try:
505 fo = open(test_support.TESTFN, "wb")
506 print >> fo, self.set,
507 fo.close()
508 fo = open(test_support.TESTFN, "rb")
509 self.assertEqual(fo.read(), repr(self.set))
510 finally:
511 fo.close()
512 os.remove(test_support.TESTFN)
513
Raymond Hettingera690a992003-11-16 16:17:49 +0000514 def test_length(self):
515 self.assertEqual(len(self.set), self.length)
516
517 def test_self_equality(self):
518 self.assertEqual(self.set, self.set)
519
520 def test_equivalent_equality(self):
521 self.assertEqual(self.set, self.dup)
522
523 def test_copy(self):
524 self.assertEqual(self.set.copy(), self.dup)
525
526 def test_self_union(self):
527 result = self.set | self.set
528 self.assertEqual(result, self.dup)
529
530 def test_empty_union(self):
531 result = self.set | empty_set
532 self.assertEqual(result, self.dup)
533
534 def test_union_empty(self):
535 result = empty_set | self.set
536 self.assertEqual(result, self.dup)
537
538 def test_self_intersection(self):
539 result = self.set & self.set
540 self.assertEqual(result, self.dup)
541
542 def test_empty_intersection(self):
543 result = self.set & empty_set
544 self.assertEqual(result, empty_set)
545
546 def test_intersection_empty(self):
547 result = empty_set & self.set
548 self.assertEqual(result, empty_set)
549
550 def test_self_symmetric_difference(self):
551 result = self.set ^ self.set
552 self.assertEqual(result, empty_set)
553
554 def checkempty_symmetric_difference(self):
555 result = self.set ^ empty_set
556 self.assertEqual(result, self.set)
557
558 def test_self_difference(self):
559 result = self.set - self.set
560 self.assertEqual(result, empty_set)
561
562 def test_empty_difference(self):
563 result = self.set - empty_set
564 self.assertEqual(result, self.dup)
565
566 def test_empty_difference_rev(self):
567 result = empty_set - self.set
568 self.assertEqual(result, empty_set)
569
570 def test_iteration(self):
571 for v in self.set:
572 self.assert_(v in self.values)
573
574 def test_pickling(self):
575 p = pickle.dumps(self.set)
576 copy = pickle.loads(p)
577 self.assertEqual(self.set, copy,
578 "%s != %s" % (self.set, copy))
579
580#------------------------------------------------------------------------------
581
582class TestBasicOpsEmpty(TestBasicOps):
583 def setUp(self):
584 self.case = "empty set"
585 self.values = []
586 self.set = set(self.values)
587 self.dup = set(self.values)
588 self.length = 0
589 self.repr = "set([])"
590
591#------------------------------------------------------------------------------
592
593class TestBasicOpsSingleton(TestBasicOps):
594 def setUp(self):
595 self.case = "unit set (number)"
596 self.values = [3]
597 self.set = set(self.values)
598 self.dup = set(self.values)
599 self.length = 1
600 self.repr = "set([3])"
601
602 def test_in(self):
603 self.failUnless(3 in self.set)
604
605 def test_not_in(self):
606 self.failUnless(2 not in self.set)
607
608#------------------------------------------------------------------------------
609
610class TestBasicOpsTuple(TestBasicOps):
611 def setUp(self):
612 self.case = "unit set (tuple)"
613 self.values = [(0, "zero")]
614 self.set = set(self.values)
615 self.dup = set(self.values)
616 self.length = 1
617 self.repr = "set([(0, 'zero')])"
618
619 def test_in(self):
620 self.failUnless((0, "zero") in self.set)
621
622 def test_not_in(self):
623 self.failUnless(9 not in self.set)
624
625#------------------------------------------------------------------------------
626
627class TestBasicOpsTriple(TestBasicOps):
628 def setUp(self):
629 self.case = "triple set"
630 self.values = [0, "zero", operator.add]
631 self.set = set(self.values)
632 self.dup = set(self.values)
633 self.length = 3
634 self.repr = None
635
636#==============================================================================
637
638def baditer():
639 raise TypeError
640 yield True
641
642def gooditer():
643 yield True
644
645class TestExceptionPropagation(unittest.TestCase):
646 """SF 628246: Set constructor should not trap iterator TypeErrors"""
647
648 def test_instanceWithException(self):
649 self.assertRaises(TypeError, set, baditer())
650
651 def test_instancesWithoutException(self):
652 # All of these iterables should load without exception.
653 set([1,2,3])
654 set((1,2,3))
655 set({'one':1, 'two':2, 'three':3})
656 set(xrange(3))
657 set('abc')
658 set(gooditer())
659
660#==============================================================================
661
662class TestSetOfSets(unittest.TestCase):
663 def test_constructor(self):
664 inner = frozenset([1])
665 outer = set([inner])
666 element = outer.pop()
667 self.assertEqual(type(element), frozenset)
668 outer.add(inner) # Rebuild set of sets with .add method
669 outer.remove(inner)
670 self.assertEqual(outer, set()) # Verify that remove worked
671 outer.discard(inner) # Absence of KeyError indicates working fine
672
673#==============================================================================
674
675class TestBinaryOps(unittest.TestCase):
676 def setUp(self):
677 self.set = set((2, 4, 6))
678
679 def test_eq(self): # SF bug 643115
680 self.assertEqual(self.set, set({2:1,4:3,6:5}))
681
682 def test_union_subset(self):
683 result = self.set | set([2])
684 self.assertEqual(result, set((2, 4, 6)))
685
686 def test_union_superset(self):
687 result = self.set | set([2, 4, 6, 8])
688 self.assertEqual(result, set([2, 4, 6, 8]))
689
690 def test_union_overlap(self):
691 result = self.set | set([3, 4, 5])
692 self.assertEqual(result, set([2, 3, 4, 5, 6]))
693
694 def test_union_non_overlap(self):
695 result = self.set | set([8])
696 self.assertEqual(result, set([2, 4, 6, 8]))
697
698 def test_intersection_subset(self):
699 result = self.set & set((2, 4))
700 self.assertEqual(result, set((2, 4)))
701
702 def test_intersection_superset(self):
703 result = self.set & set([2, 4, 6, 8])
704 self.assertEqual(result, set([2, 4, 6]))
705
706 def test_intersection_overlap(self):
707 result = self.set & set([3, 4, 5])
708 self.assertEqual(result, set([4]))
709
710 def test_intersection_non_overlap(self):
711 result = self.set & set([8])
712 self.assertEqual(result, empty_set)
713
714 def test_sym_difference_subset(self):
715 result = self.set ^ set((2, 4))
716 self.assertEqual(result, set([6]))
717
718 def test_sym_difference_superset(self):
719 result = self.set ^ set((2, 4, 6, 8))
720 self.assertEqual(result, set([8]))
721
722 def test_sym_difference_overlap(self):
723 result = self.set ^ set((3, 4, 5))
724 self.assertEqual(result, set([2, 3, 5, 6]))
725
726 def test_sym_difference_non_overlap(self):
727 result = self.set ^ set([8])
728 self.assertEqual(result, set([2, 4, 6, 8]))
729
730 def test_cmp(self):
731 a, b = set('a'), set('b')
732 self.assertRaises(TypeError, cmp, a, b)
733
734 # You can view this as a buglet: cmp(a, a) does not raise TypeError,
735 # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
736 # which Python thinks is good enough to synthesize a cmp() result
737 # without calling __cmp__.
738 self.assertEqual(cmp(a, a), 0)
739
740 self.assertRaises(TypeError, cmp, a, 12)
741 self.assertRaises(TypeError, cmp, "abc", a)
742
743#==============================================================================
744
745class TestUpdateOps(unittest.TestCase):
746 def setUp(self):
747 self.set = set((2, 4, 6))
748
749 def test_union_subset(self):
750 self.set |= set([2])
751 self.assertEqual(self.set, set((2, 4, 6)))
752
753 def test_union_superset(self):
754 self.set |= set([2, 4, 6, 8])
755 self.assertEqual(self.set, set([2, 4, 6, 8]))
756
757 def test_union_overlap(self):
758 self.set |= set([3, 4, 5])
759 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
760
761 def test_union_non_overlap(self):
762 self.set |= set([8])
763 self.assertEqual(self.set, set([2, 4, 6, 8]))
764
765 def test_union_method_call(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000766 self.set.update(set([3, 4, 5]))
Raymond Hettingera690a992003-11-16 16:17:49 +0000767 self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
768
769 def test_intersection_subset(self):
770 self.set &= set((2, 4))
771 self.assertEqual(self.set, set((2, 4)))
772
773 def test_intersection_superset(self):
774 self.set &= set([2, 4, 6, 8])
775 self.assertEqual(self.set, set([2, 4, 6]))
776
777 def test_intersection_overlap(self):
778 self.set &= set([3, 4, 5])
779 self.assertEqual(self.set, set([4]))
780
781 def test_intersection_non_overlap(self):
782 self.set &= set([8])
783 self.assertEqual(self.set, empty_set)
784
785 def test_intersection_method_call(self):
786 self.set.intersection_update(set([3, 4, 5]))
787 self.assertEqual(self.set, set([4]))
788
789 def test_sym_difference_subset(self):
790 self.set ^= set((2, 4))
791 self.assertEqual(self.set, set([6]))
792
793 def test_sym_difference_superset(self):
794 self.set ^= set((2, 4, 6, 8))
795 self.assertEqual(self.set, set([8]))
796
797 def test_sym_difference_overlap(self):
798 self.set ^= set((3, 4, 5))
799 self.assertEqual(self.set, set([2, 3, 5, 6]))
800
801 def test_sym_difference_non_overlap(self):
802 self.set ^= set([8])
803 self.assertEqual(self.set, set([2, 4, 6, 8]))
804
805 def test_sym_difference_method_call(self):
806 self.set.symmetric_difference_update(set([3, 4, 5]))
807 self.assertEqual(self.set, set([2, 3, 5, 6]))
808
809 def test_difference_subset(self):
810 self.set -= set((2, 4))
811 self.assertEqual(self.set, set([6]))
812
813 def test_difference_superset(self):
814 self.set -= set((2, 4, 6, 8))
815 self.assertEqual(self.set, set([]))
816
817 def test_difference_overlap(self):
818 self.set -= set((3, 4, 5))
819 self.assertEqual(self.set, set([2, 6]))
820
821 def test_difference_non_overlap(self):
822 self.set -= set([8])
823 self.assertEqual(self.set, set([2, 4, 6]))
824
825 def test_difference_method_call(self):
826 self.set.difference_update(set([3, 4, 5]))
827 self.assertEqual(self.set, set([2, 6]))
828
829#==============================================================================
830
831class TestMutate(unittest.TestCase):
832 def setUp(self):
833 self.values = ["a", "b", "c"]
834 self.set = set(self.values)
835
836 def test_add_present(self):
837 self.set.add("c")
838 self.assertEqual(self.set, set("abc"))
839
840 def test_add_absent(self):
841 self.set.add("d")
842 self.assertEqual(self.set, set("abcd"))
843
844 def test_add_until_full(self):
845 tmp = set()
846 expected_len = 0
847 for v in self.values:
848 tmp.add(v)
849 expected_len += 1
850 self.assertEqual(len(tmp), expected_len)
851 self.assertEqual(tmp, self.set)
852
853 def test_remove_present(self):
854 self.set.remove("b")
855 self.assertEqual(self.set, set("ac"))
856
857 def test_remove_absent(self):
858 try:
859 self.set.remove("d")
860 self.fail("Removing missing element should have raised LookupError")
861 except LookupError:
862 pass
863
864 def test_remove_until_empty(self):
865 expected_len = len(self.set)
866 for v in self.values:
867 self.set.remove(v)
868 expected_len -= 1
869 self.assertEqual(len(self.set), expected_len)
870
871 def test_discard_present(self):
872 self.set.discard("c")
873 self.assertEqual(self.set, set("ab"))
874
875 def test_discard_absent(self):
876 self.set.discard("d")
877 self.assertEqual(self.set, set("abc"))
878
879 def test_clear(self):
880 self.set.clear()
881 self.assertEqual(len(self.set), 0)
882
883 def test_pop(self):
884 popped = {}
885 while self.set:
886 popped[self.set.pop()] = None
887 self.assertEqual(len(popped), len(self.values))
888 for v in self.values:
889 self.failUnless(v in popped)
890
891 def test_update_empty_tuple(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000892 self.set.update(())
Raymond Hettingera690a992003-11-16 16:17:49 +0000893 self.assertEqual(self.set, set(self.values))
894
895 def test_update_unit_tuple_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000896 self.set.update(("a",))
Raymond Hettingera690a992003-11-16 16:17:49 +0000897 self.assertEqual(self.set, set(self.values))
898
899 def test_update_unit_tuple_non_overlap(self):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +0000900 self.set.update(("a", "z"))
Raymond Hettingera690a992003-11-16 16:17:49 +0000901 self.assertEqual(self.set, set(self.values + ["z"]))
902
903#==============================================================================
904
905class TestSubsets(unittest.TestCase):
906
907 case2method = {"<=": "issubset",
908 ">=": "issuperset",
909 }
910
911 reverse = {"==": "==",
912 "!=": "!=",
913 "<": ">",
914 ">": "<",
915 "<=": ">=",
916 ">=": "<=",
917 }
918
919 def test_issubset(self):
920 x = self.left
921 y = self.right
922 for case in "!=", "==", "<", "<=", ">", ">=":
923 expected = case in self.cases
924 # Test the binary infix spelling.
925 result = eval("x" + case + "y", locals())
926 self.assertEqual(result, expected)
927 # Test the "friendly" method-name spelling, if one exists.
928 if case in TestSubsets.case2method:
929 method = getattr(x, TestSubsets.case2method[case])
930 result = method(y)
931 self.assertEqual(result, expected)
932
933 # Now do the same for the operands reversed.
934 rcase = TestSubsets.reverse[case]
935 result = eval("y" + rcase + "x", locals())
936 self.assertEqual(result, expected)
937 if rcase in TestSubsets.case2method:
938 method = getattr(y, TestSubsets.case2method[rcase])
939 result = method(x)
940 self.assertEqual(result, expected)
941#------------------------------------------------------------------------------
942
943class TestSubsetEqualEmpty(TestSubsets):
944 left = set()
945 right = set()
946 name = "both empty"
947 cases = "==", "<=", ">="
948
949#------------------------------------------------------------------------------
950
951class TestSubsetEqualNonEmpty(TestSubsets):
952 left = set([1, 2])
953 right = set([1, 2])
954 name = "equal pair"
955 cases = "==", "<=", ">="
956
957#------------------------------------------------------------------------------
958
959class TestSubsetEmptyNonEmpty(TestSubsets):
960 left = set()
961 right = set([1, 2])
962 name = "one empty, one non-empty"
963 cases = "!=", "<", "<="
964
965#------------------------------------------------------------------------------
966
967class TestSubsetPartial(TestSubsets):
968 left = set([1])
969 right = set([1, 2])
970 name = "one a non-empty proper subset of other"
971 cases = "!=", "<", "<="
972
973#------------------------------------------------------------------------------
974
975class TestSubsetNonOverlap(TestSubsets):
976 left = set([1])
977 right = set([2])
978 name = "neither empty, neither contains"
979 cases = "!="
980
981#==============================================================================
982
983class TestOnlySetsInBinaryOps(unittest.TestCase):
984
985 def test_eq_ne(self):
986 # Unlike the others, this is testing that == and != *are* allowed.
987 self.assertEqual(self.other == self.set, False)
988 self.assertEqual(self.set == self.other, False)
989 self.assertEqual(self.other != self.set, True)
990 self.assertEqual(self.set != self.other, True)
991
992 def test_ge_gt_le_lt(self):
993 self.assertRaises(TypeError, lambda: self.set < self.other)
994 self.assertRaises(TypeError, lambda: self.set <= self.other)
995 self.assertRaises(TypeError, lambda: self.set > self.other)
996 self.assertRaises(TypeError, lambda: self.set >= self.other)
997
998 self.assertRaises(TypeError, lambda: self.other < self.set)
999 self.assertRaises(TypeError, lambda: self.other <= self.set)
1000 self.assertRaises(TypeError, lambda: self.other > self.set)
1001 self.assertRaises(TypeError, lambda: self.other >= self.set)
1002
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001003 def test_update_operator(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001004 try:
1005 self.set |= self.other
1006 except TypeError:
1007 pass
1008 else:
1009 self.fail("expected TypeError")
1010
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001011 def test_update(self):
Raymond Hettingera690a992003-11-16 16:17:49 +00001012 if self.otherIsIterable:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001013 self.set.update(self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001014 else:
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001015 self.assertRaises(TypeError, self.set.update, self.other)
Raymond Hettingera690a992003-11-16 16:17:49 +00001016
1017 def test_union(self):
1018 self.assertRaises(TypeError, lambda: self.set | self.other)
1019 self.assertRaises(TypeError, lambda: self.other | self.set)
1020 if self.otherIsIterable:
1021 self.set.union(self.other)
1022 else:
1023 self.assertRaises(TypeError, self.set.union, self.other)
1024
1025 def test_intersection_update_operator(self):
1026 try:
1027 self.set &= self.other
1028 except TypeError:
1029 pass
1030 else:
1031 self.fail("expected TypeError")
1032
1033 def test_intersection_update(self):
1034 if self.otherIsIterable:
1035 self.set.intersection_update(self.other)
1036 else:
1037 self.assertRaises(TypeError,
1038 self.set.intersection_update,
1039 self.other)
1040
1041 def test_intersection(self):
1042 self.assertRaises(TypeError, lambda: self.set & self.other)
1043 self.assertRaises(TypeError, lambda: self.other & self.set)
1044 if self.otherIsIterable:
1045 self.set.intersection(self.other)
1046 else:
1047 self.assertRaises(TypeError, self.set.intersection, self.other)
1048
1049 def test_sym_difference_update_operator(self):
1050 try:
1051 self.set ^= self.other
1052 except TypeError:
1053 pass
1054 else:
1055 self.fail("expected TypeError")
1056
1057 def test_sym_difference_update(self):
1058 if self.otherIsIterable:
1059 self.set.symmetric_difference_update(self.other)
1060 else:
1061 self.assertRaises(TypeError,
1062 self.set.symmetric_difference_update,
1063 self.other)
1064
1065 def test_sym_difference(self):
1066 self.assertRaises(TypeError, lambda: self.set ^ self.other)
1067 self.assertRaises(TypeError, lambda: self.other ^ self.set)
1068 if self.otherIsIterable:
1069 self.set.symmetric_difference(self.other)
1070 else:
1071 self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1072
1073 def test_difference_update_operator(self):
1074 try:
1075 self.set -= self.other
1076 except TypeError:
1077 pass
1078 else:
1079 self.fail("expected TypeError")
1080
1081 def test_difference_update(self):
1082 if self.otherIsIterable:
1083 self.set.difference_update(self.other)
1084 else:
1085 self.assertRaises(TypeError,
1086 self.set.difference_update,
1087 self.other)
1088
1089 def test_difference(self):
1090 self.assertRaises(TypeError, lambda: self.set - self.other)
1091 self.assertRaises(TypeError, lambda: self.other - self.set)
1092 if self.otherIsIterable:
1093 self.set.difference(self.other)
1094 else:
1095 self.assertRaises(TypeError, self.set.difference, self.other)
1096
1097#------------------------------------------------------------------------------
1098
1099class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1100 def setUp(self):
1101 self.set = set((1, 2, 3))
1102 self.other = 19
1103 self.otherIsIterable = False
1104
1105#------------------------------------------------------------------------------
1106
1107class TestOnlySetsDict(TestOnlySetsInBinaryOps):
1108 def setUp(self):
1109 self.set = set((1, 2, 3))
1110 self.other = {1:2, 3:4}
1111 self.otherIsIterable = True
1112
1113#------------------------------------------------------------------------------
1114
1115class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1116 def setUp(self):
1117 self.set = set((1, 2, 3))
1118 self.other = operator.add
1119 self.otherIsIterable = False
1120
1121#------------------------------------------------------------------------------
1122
1123class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1124 def setUp(self):
1125 self.set = set((1, 2, 3))
1126 self.other = (2, 4, 6)
1127 self.otherIsIterable = True
1128
1129#------------------------------------------------------------------------------
1130
1131class TestOnlySetsString(TestOnlySetsInBinaryOps):
1132 def setUp(self):
1133 self.set = set((1, 2, 3))
1134 self.other = 'abc'
1135 self.otherIsIterable = True
1136
1137#------------------------------------------------------------------------------
1138
1139class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1140 def setUp(self):
1141 def gen():
1142 for i in xrange(0, 10, 2):
1143 yield i
1144 self.set = set((1, 2, 3))
1145 self.other = gen()
1146 self.otherIsIterable = True
1147
1148#==============================================================================
1149
1150class TestCopying(unittest.TestCase):
1151
1152 def test_copy(self):
1153 dup = self.set.copy()
1154 dup_list = list(dup); dup_list.sort()
1155 set_list = list(self.set); set_list.sort()
1156 self.assertEqual(len(dup_list), len(set_list))
1157 for i in range(len(dup_list)):
1158 self.failUnless(dup_list[i] is set_list[i])
1159
1160 def test_deep_copy(self):
1161 dup = copy.deepcopy(self.set)
Walter Dörwald70a6b492004-02-12 17:35:32 +00001162 ##print type(dup), repr(dup)
Raymond Hettingera690a992003-11-16 16:17:49 +00001163 dup_list = list(dup); dup_list.sort()
1164 set_list = list(self.set); set_list.sort()
1165 self.assertEqual(len(dup_list), len(set_list))
1166 for i in range(len(dup_list)):
1167 self.assertEqual(dup_list[i], set_list[i])
1168
1169#------------------------------------------------------------------------------
1170
1171class TestCopyingEmpty(TestCopying):
1172 def setUp(self):
1173 self.set = set()
1174
1175#------------------------------------------------------------------------------
1176
1177class TestCopyingSingleton(TestCopying):
1178 def setUp(self):
1179 self.set = set(["hello"])
1180
1181#------------------------------------------------------------------------------
1182
1183class TestCopyingTriple(TestCopying):
1184 def setUp(self):
1185 self.set = set(["zero", 0, None])
1186
1187#------------------------------------------------------------------------------
1188
1189class TestCopyingTuple(TestCopying):
1190 def setUp(self):
1191 self.set = set([(1, 2)])
1192
1193#------------------------------------------------------------------------------
1194
1195class TestCopyingNested(TestCopying):
1196 def setUp(self):
1197 self.set = set([((1, 2), (3, 4))])
1198
1199#==============================================================================
1200
1201class TestIdentities(unittest.TestCase):
1202 def setUp(self):
1203 self.a = set('abracadabra')
1204 self.b = set('alacazam')
1205
1206 def test_binopsVsSubsets(self):
1207 a, b = self.a, self.b
1208 self.assert_(a - b < a)
1209 self.assert_(b - a < b)
1210 self.assert_(a & b < a)
1211 self.assert_(a & b < b)
1212 self.assert_(a | b > a)
1213 self.assert_(a | b > b)
1214 self.assert_(a ^ b < a | b)
1215
1216 def test_commutativity(self):
1217 a, b = self.a, self.b
1218 self.assertEqual(a&b, b&a)
1219 self.assertEqual(a|b, b|a)
1220 self.assertEqual(a^b, b^a)
1221 if a != b:
1222 self.assertNotEqual(a-b, b-a)
1223
1224 def test_summations(self):
1225 # check that sums of parts equal the whole
1226 a, b = self.a, self.b
1227 self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1228 self.assertEqual((a&b)|(a^b), a|b)
1229 self.assertEqual(a|(b-a), a|b)
1230 self.assertEqual((a-b)|b, a|b)
1231 self.assertEqual((a-b)|(a&b), a)
1232 self.assertEqual((b-a)|(a&b), b)
1233 self.assertEqual((a-b)|(b-a), a^b)
1234
1235 def test_exclusion(self):
1236 # check that inverse operations show non-overlap
1237 a, b, zero = self.a, self.b, set()
1238 self.assertEqual((a-b)&b, zero)
1239 self.assertEqual((b-a)&a, zero)
1240 self.assertEqual((a&b)&(a^b), zero)
1241
1242# Tests derived from test_itertools.py =======================================
1243
1244def R(seqn):
1245 'Regular generator'
1246 for i in seqn:
1247 yield i
1248
1249class G:
1250 'Sequence using __getitem__'
1251 def __init__(self, seqn):
1252 self.seqn = seqn
1253 def __getitem__(self, i):
1254 return self.seqn[i]
1255
1256class I:
1257 'Sequence using iterator protocol'
1258 def __init__(self, seqn):
1259 self.seqn = seqn
1260 self.i = 0
1261 def __iter__(self):
1262 return self
1263 def next(self):
1264 if self.i >= len(self.seqn): raise StopIteration
1265 v = self.seqn[self.i]
1266 self.i += 1
1267 return v
1268
1269class Ig:
1270 'Sequence using iterator protocol defined with a generator'
1271 def __init__(self, seqn):
1272 self.seqn = seqn
1273 self.i = 0
1274 def __iter__(self):
1275 for val in self.seqn:
1276 yield val
1277
1278class X:
1279 'Missing __getitem__ and __iter__'
1280 def __init__(self, seqn):
1281 self.seqn = seqn
1282 self.i = 0
1283 def next(self):
1284 if self.i >= len(self.seqn): raise StopIteration
1285 v = self.seqn[self.i]
1286 self.i += 1
1287 return v
1288
1289class N:
1290 'Iterator missing next()'
1291 def __init__(self, seqn):
1292 self.seqn = seqn
1293 self.i = 0
1294 def __iter__(self):
1295 return self
1296
1297class E:
1298 'Test propagation of exceptions'
1299 def __init__(self, seqn):
1300 self.seqn = seqn
1301 self.i = 0
1302 def __iter__(self):
1303 return self
1304 def next(self):
Raymond Hettingerffdb8bb2004-09-27 15:29:05 +00001305 3 // 0
Raymond Hettingera690a992003-11-16 16:17:49 +00001306
1307class S:
1308 'Test immediate stop'
1309 def __init__(self, seqn):
1310 pass
1311 def __iter__(self):
1312 return self
1313 def next(self):
1314 raise StopIteration
1315
1316from itertools import chain, imap
1317def L(seqn):
1318 'Test multiple tiers of iterators'
1319 return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1320
1321class TestVariousIteratorArgs(unittest.TestCase):
1322
1323 def test_constructor(self):
1324 for cons in (set, frozenset):
1325 for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1326 for g in (G, I, Ig, S, L, R):
Raymond Hettinger64958a12003-12-17 20:43:33 +00001327 self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
Raymond Hettingera690a992003-11-16 16:17:49 +00001328 self.assertRaises(TypeError, cons , X(s))
1329 self.assertRaises(TypeError, cons , N(s))
1330 self.assertRaises(ZeroDivisionError, cons , E(s))
1331
1332 def test_inline_methods(self):
1333 s = set('november')
1334 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1335 for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1336 for g in (G, I, Ig, L, R):
1337 expected = meth(data)
1338 actual = meth(G(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001339 self.assertEqual(sorted(actual), sorted(expected))
Raymond Hettingera690a992003-11-16 16:17:49 +00001340 self.assertRaises(TypeError, meth, X(s))
1341 self.assertRaises(TypeError, meth, N(s))
1342 self.assertRaises(ZeroDivisionError, meth, E(s))
1343
1344 def test_inplace_methods(self):
1345 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
Raymond Hettingerf5f41bf2003-11-24 02:57:33 +00001346 for methname in ('update', 'intersection_update',
Raymond Hettingera690a992003-11-16 16:17:49 +00001347 'difference_update', 'symmetric_difference_update'):
1348 for g in (G, I, Ig, S, L, R):
1349 s = set('january')
1350 t = s.copy()
1351 getattr(s, methname)(list(g(data)))
1352 getattr(t, methname)(g(data))
Raymond Hettinger64958a12003-12-17 20:43:33 +00001353 self.assertEqual(sorted(s), sorted(t))
Raymond Hettingera690a992003-11-16 16:17:49 +00001354
1355 self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1356 self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1357 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1358
1359#==============================================================================
1360
1361def test_main(verbose=None):
1362 import sys
1363 from test import test_sets
1364 test_classes = (
1365 TestSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001366 TestSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001367 TestFrozenSet,
Raymond Hettinger50a4bb32003-11-17 16:42:33 +00001368 TestFrozenSetSubclass,
Raymond Hettingera690a992003-11-16 16:17:49 +00001369 TestSetOfSets,
1370 TestExceptionPropagation,
1371 TestBasicOpsEmpty,
1372 TestBasicOpsSingleton,
1373 TestBasicOpsTuple,
1374 TestBasicOpsTriple,
1375 TestBinaryOps,
1376 TestUpdateOps,
1377 TestMutate,
1378 TestSubsetEqualEmpty,
1379 TestSubsetEqualNonEmpty,
1380 TestSubsetEmptyNonEmpty,
1381 TestSubsetPartial,
1382 TestSubsetNonOverlap,
1383 TestOnlySetsNumeric,
1384 TestOnlySetsDict,
1385 TestOnlySetsOperator,
1386 TestOnlySetsTuple,
1387 TestOnlySetsString,
1388 TestOnlySetsGenerator,
1389 TestCopyingEmpty,
1390 TestCopyingSingleton,
1391 TestCopyingTriple,
1392 TestCopyingTuple,
1393 TestCopyingNested,
1394 TestIdentities,
1395 TestVariousIteratorArgs,
1396 )
1397
1398 test_support.run_unittest(*test_classes)
1399
1400 # verify reference counting
1401 if verbose and hasattr(sys, "gettotalrefcount"):
1402 import gc
1403 counts = [None] * 5
1404 for i in xrange(len(counts)):
1405 test_support.run_unittest(*test_classes)
1406 gc.collect()
1407 counts[i] = sys.gettotalrefcount()
1408 print counts
1409
1410if __name__ == "__main__":
1411 test_main(verbose=True)