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