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