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