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