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