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