test_set.py revision c47e01d02021253dd9f8fd4ced6eb663436431bb
1a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport unittest
2a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerfrom test import test_support
3691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettingerfrom weakref import proxy
4a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport operator
5a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport copy
6a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport pickle
7eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettingerimport os
882cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettingerfrom random import randrange, shuffle
9c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettingerimport sys
10a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
11a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass PassThru(Exception):
12a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    pass
13a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
14a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef check_pass_thru():
15a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    raise PassThru
16a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield 1
17a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
18a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestJointOps(unittest.TestCase):
19a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    # Tests common to both set and frozenset
20a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
21a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
22a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.word = word = 'simsalabim'
23a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherword = 'madagascar'
24a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
25a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s = self.thetype(word)
26a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.d = dict.fromkeys(word)
27a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
286429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger    def test_new_or_init(self):
296429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger        self.assertRaises(TypeError, self.thetype, [], 2)
306429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger
31a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_uniquification(self):
3264958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger        actual = sorted(self.s)
3364958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger        expected = sorted(self.d)
34a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(actual, expected)
35a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.thetype, check_pass_thru())
36a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.thetype, [[]])
37a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
38a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_len(self):
39a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.s), len(self.d))
40a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
41a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_contains(self):
42a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
43a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in self.s, c in self.d)
44a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.__contains__, [[]])
4519c2d77842290af9b5f470c1eea2a71d1f77c9feRaymond Hettinger        s = self.thetype([frozenset(self.letters)])
4619c2d77842290af9b5f470c1eea2a71d1f77c9feRaymond Hettinger        self.assert_(self.thetype(self.letters) in s)
47a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
48a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union(self):
49a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        u = self.s.union(self.otherword)
50a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
51a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in u, c in self.d or c in self.otherword)
5249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
53a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(u), self.thetype)
54a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.union, check_pass_thru())
55a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.union, [[]])
56f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
57f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
58f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
59f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
60f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
61a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
62a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_or(self):
63a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.union(self.otherword)
64a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s | set(self.otherword), i)
65a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s | frozenset(self.otherword), i)
66a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
67a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s | self.otherword
68a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
69a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
70a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
71a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s|t did not screen-out general iterables")
72a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
73a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection(self):
74a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.intersection(self.otherword)
75a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
76a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, c in self.d and c in self.otherword)
7749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
78a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
79a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
80f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
81f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
82f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
83f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
84f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
85a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
86a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_and(self):
87a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.intersection(self.otherword)
88a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s & set(self.otherword), i)
89a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s & frozenset(self.otherword), i)
90a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
91a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s & self.otherword
92a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
93a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
94a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
95a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s&t did not screen-out general iterables")
96a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
97a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference(self):
98a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.difference(self.otherword)
99a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
100a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, c in self.d and c not in self.otherword)
10149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
102a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
103a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.difference, check_pass_thru())
104a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.difference, [[]])
105f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
106f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
107f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
108f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
109f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
110a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
111a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sub(self):
112a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.difference(self.otherword)
113a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s - set(self.otherword), i)
114a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s - frozenset(self.otherword), i)
115a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
116a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s - self.otherword
117a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
118a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
119a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
120a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s-t did not screen-out general iterables")
121a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
122a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_symmetric_difference(self):
123a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.symmetric_difference(self.otherword)
124a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
125a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
12649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
127a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
128a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
129a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
130f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
131f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
132f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
133f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
134f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
135a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
136a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_xor(self):
137a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.symmetric_difference(self.otherword)
138a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s ^ set(self.otherword), i)
139a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s ^ frozenset(self.otherword), i)
140a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
141a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s ^ self.otherword
142a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
143a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
144a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
145a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s^t did not screen-out general iterables")
146a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
147a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_equality(self):
148a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s, set(self.word))
149a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s, frozenset(self.word))
150a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s == self.word, False)
151a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(self.s, set(self.otherword))
152a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(self.s, frozenset(self.otherword))
153a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s != self.word, True)
154a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
155a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_setOfFrozensets(self):
156a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
157a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        s = self.thetype(t)
158a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(s), 3)
159a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
160a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_compare(self):
161a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.__cmp__, self.s)
162a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
163a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sub_and_super(self):
164a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
165a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(p < q)
166a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(p <= q)
167a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(q <= q)
168a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(q > p)
169a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(q >= p)
170a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failIf(q < r)
171a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failIf(q <= r)
172a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failIf(q > r)
173a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failIf(q >= r)
1743fbec701cae361de6beca55bc926e0540635f165Raymond Hettinger        self.assert_(set('a').issubset('abc'))
1753fbec701cae361de6beca55bc926e0540635f165Raymond Hettinger        self.assert_(set('abc').issuperset('a'))
1763fbec701cae361de6beca55bc926e0540635f165Raymond Hettinger        self.failIf(set('a').issubset('cbs'))
1773fbec701cae361de6beca55bc926e0540635f165Raymond Hettinger        self.failIf(set('cbs').issuperset('a'))
178a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
179a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pickling(self):
18015056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger        for i in (0, 1, 2):
18115056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            p = pickle.dumps(self.s, i)
18215056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            dup = pickle.loads(p)
18315056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
18415056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            if type(self.s) not in (set, frozenset):
18515056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                self.s.x = 10
18615056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                p = pickle.dumps(self.s)
18715056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                dup = pickle.loads(p)
18815056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                self.assertEqual(self.s.x, dup.x)
189a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
19049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_deepcopy(self):
19149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        class Tracer:
19249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __init__(self, value):
19349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                self.value = value
19449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __hash__(self):
19558eb11cf62dd04ccc2c364b62fd51b4265e2e203Tim Peters                return self.value
19649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __deepcopy__(self, memo=None):
19749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                return Tracer(self.value + 1)
19849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = Tracer(10)
19949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype([t])
20049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = copy.deepcopy(s)
20149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(dup))
20249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        for elem in dup:
20349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            newt = elem
20449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(t), id(newt))
20549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(t.value + 1, newt.value)
20649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
207bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger    def test_gc(self):
208bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        # Create a nest of cycles to exercise overall ref count check
209bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        class A:
210bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            pass
211bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        s = set(A() for i in xrange(1000))
212bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        for elem in s:
213bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.cycle = s
214bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.sub = elem
215bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.set = set([elem])
216bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger
21797979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger    def test_subclass_with_custom_hash(self):
21897979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        # Bug #1257731
21997979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        class H(self.thetype):
22097979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger            def __hash__(self):
22197979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger                return id(self)
22297979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        s=H()
22397979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f=set()
22497979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.add(s)
22597979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        self.assert_(s in f)
22697979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.remove(s)
22797979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.add(s)
22897979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.discard(s)
22997979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger
230a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSet(TestJointOps):
231a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    thetype = set
232a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
23350a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    def test_init(self):
23449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype()
23550a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        s.__init__(self.word)
23650a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        self.assertEqual(s, set(self.word))
23750a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        s.__init__(self.otherword)
23850a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        self.assertEqual(s, set(self.otherword))
239eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        self.assertRaises(TypeError, s.__init__, s, 2);
240eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        self.assertRaises(TypeError, s.__init__, 1);
24150a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
24249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
24349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
24449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
24549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(t))
24649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
247a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash(self):
248a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, hash, self.s)
249a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
250a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_clear(self):
251a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.clear()
252f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(self.s, set())
253f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(len(self.s), 0)
254a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
25549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
25649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
25749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, dup)
25849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(self.s), id(dup))
25949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
260a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add(self):
261a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.add('Q')
262a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_('Q' in self.s)
263f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        dup = self.s.copy()
264f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.s.add('Q')
265f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(self.s, dup)
266a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.add, [])
267a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
268a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove(self):
269a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.remove('a')
270a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_('a' not in self.s)
271a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(KeyError, self.s.remove, 'Q')
272a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.remove, [])
273bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s = self.thetype([frozenset(self.word)])
274bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assert_(self.thetype(self.word) in s)
275bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.remove(self.thetype(self.word))
276bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assert_(self.thetype(self.word) not in s)
277bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
278a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
279a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard(self):
280a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.discard('a')
281a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_('a' not in self.s)
282a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.discard('Q')
283a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.discard, [])
284bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s = self.thetype([frozenset(self.word)])
285bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assert_(self.thetype(self.word) in s)
286bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.discard(self.thetype(self.word))
287bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assert_(self.thetype(self.word) not in s)
288bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.discard(self.thetype(self.word))
289a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
290a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pop(self):
291a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in xrange(len(self.s)):
292a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            elem = self.s.pop()
293a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assert_(elem not in self.s)
294a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(KeyError, self.s.pop)
295a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
296f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update(self):
297f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        retval = self.s.update(self.otherword)
298a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
299a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
300a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assert_(c in self.s)
301f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(PassThru, self.s.update, check_pass_thru())
302f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(TypeError, self.s.update, [[]])
303f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
304f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
305f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
306f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.update(C(p)), None)
307f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
308a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
309a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_ior(self):
310a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s |= set(self.otherword)
311a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
312a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assert_(c in self.s)
313a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
314a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update(self):
315a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.intersection_update(self.otherword)
316a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
317a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
318a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.otherword and c in self.word:
319a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
320a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
321a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
322a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
323a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.intersection_update, [[]])
324f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
325f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
326f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
327f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.intersection_update(C(p)), None)
328f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
329a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
330a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_iand(self):
331a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s &= set(self.otherword)
332a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
333a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.otherword and c in self.word:
334a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
335a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
336a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
337a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
338a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update(self):
339a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.difference_update(self.otherword)
340a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
341a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
342a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.word and c not in self.otherword:
343a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
344a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
345a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
346a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
347a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.difference_update, [[]])
348f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
349f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
350f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
351f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
352f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.difference_update(C(p)), None)
353f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
354a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
355a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_isub(self):
356a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s -= set(self.otherword)
357a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
358a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.word and c not in self.otherword:
359a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
360a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
361a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
362a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
363a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_symmetric_difference_update(self):
364a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.symmetric_difference_update(self.otherword)
365a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
366a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
367a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if (c in self.word) ^ (c in self.otherword):
368a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
369a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
370a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
371a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
372a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
373f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
374f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
375f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
376f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.symmetric_difference_update(C(p)), None)
377f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
378a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
379a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_ixor(self):
380a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s ^= set(self.otherword)
381a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
382a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if (c in self.word) ^ (c in self.otherword):
383a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c in self.s)
384a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
385a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assert_(c not in self.s)
386a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
387c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger    def test_inplace_on_self(self):
388c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t = self.s.copy()
389c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t |= t
390c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.s)
391c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t &= t
392c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.s)
393c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t -= t
394c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.thetype())
395c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t = self.s.copy()
396c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t ^= t
397c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.thetype())
398c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger
399691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger    def test_weakref(self):
400691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        s = self.thetype('gallahad')
401691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        p = proxy(s)
402691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        self.assertEqual(str(p), str(s))
403691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        s = None
404691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        self.assertRaises(ReferenceError, str, p)
405691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger
406c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger    # C API test only available in a debug build
407c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger    if hasattr(sys, "gettotalrefcount"):
408c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger        def test_c_api(self):
409c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger            self.assertEqual(set('abc').test_c_api(), True)
410c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger
41150a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass SetSubclass(set):
41250a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    pass
41350a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
41450a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass TestSetSubclass(TestSet):
41550a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    thetype = SetSubclass
416a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
417a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestFrozenSet(TestJointOps):
418a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    thetype = frozenset
419a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
42050a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    def test_init(self):
42149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(self.word)
42249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s.__init__(self.otherword)
42349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(s, set(self.word))
42449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
425d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger    def test_singleton_empty_frozenset(self):
426d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        f = frozenset()
427d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
428d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(), frozenset([]), frozenset(()), frozenset(''),
429d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(xrange(0)), frozenset(frozenset()),
430d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(f), f]
431d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        # All of the empty frozensets should have just one id()
432d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        self.assertEqual(len(set(map(id, efs))), 1)
433d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger
43449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
43549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
43649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
43749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(id(s), id(t))
43850a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
439a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash(self):
44049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(hash(self.thetype('abcdeb')),
44149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                         hash(self.thetype('ebecda')))
44249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
44382cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        # make sure that all permutations give the same hash value
44482cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        n = 100
44582cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        seq = [randrange(n) for i in xrange(n)]
44682cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        results = set()
44782cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        for i in xrange(200):
44882cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger            shuffle(seq)
44982cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger            results.add(hash(self.thetype(seq)))
45082cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        self.assertEqual(len(results), 1)
45182cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger
45249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
45349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
45449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(id(self.s), id(dup))
455a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
456a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_frozen_as_dictkey(self):
457a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        seq = range(10) + list('abcdefg') + ['apple']
45849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        key1 = self.thetype(seq)
45949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        key2 = self.thetype(reversed(seq))
460a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(key1, key2)
461a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(id(key1), id(key2))
462a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        d = {}
463a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        d[key1] = 42
464a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(d[key2], 42)
465a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
466a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash_caching(self):
46749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        f = self.thetype('abcdcda')
468a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(hash(f), hash(f))
469a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
47049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_hash_effectiveness(self):
47149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        n = 13
47249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        hashvalues = set()
4736e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        addhashvalue = hashvalues.add
4746e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        elemmasks = [(i+1, 1<<i) for i in range(n)]
47549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        for i in xrange(2**n):
4766e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger            addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
4776e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        self.assertEqual(len(hashvalues), 2**n)
47849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
47950a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass FrozenSetSubclass(frozenset):
48050a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    pass
48150a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
48250a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass TestFrozenSetSubclass(TestFrozenSet):
48350a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    thetype = FrozenSetSubclass
48450a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
48549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
48649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
48749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
48849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(t))
48949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
49049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
49149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
49249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(self.s), id(dup))
49349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
49449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_nested_empty_constructor(self):
49549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype()
49649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
49749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(s, t)
49849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
499d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger    def test_singleton_empty_frozenset(self):
500d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        Frozenset = self.thetype
501d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        f = frozenset()
502d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        F = Frozenset()
503d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
504d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
505d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(xrange(0)), Frozenset(Frozenset()),
506d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
507d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        # All empty frozenset subclass instances should have different ids
508d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        self.assertEqual(len(set(map(id, efs))), len(efs))
509d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger
510a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger# Tests taken from test_sets.py =============================================
511a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
512a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerempty_set = set()
513a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
514a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
515a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
516a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOps(unittest.TestCase):
517a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
518a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_repr(self):
519a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.repr is not None:
52070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald            self.assertEqual(repr(self.set), self.repr)
521a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
522eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger    def test_print(self):
523eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        try:
524eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo = open(test_support.TESTFN, "wb")
525eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            print >> fo, self.set,
526eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo.close()
527eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo = open(test_support.TESTFN, "rb")
528eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            self.assertEqual(fo.read(), repr(self.set))
529eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        finally:
530eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo.close()
531eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            os.remove(test_support.TESTFN)
532eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger
533a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_length(self):
534a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.set), self.length)
535a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
536a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_equality(self):
537a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, self.set)
538a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
539a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_equivalent_equality(self):
540a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, self.dup)
541a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
542a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_copy(self):
543a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set.copy(), self.dup)
544a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
545a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_union(self):
546a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | self.set
547a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
548a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
549a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_union(self):
550a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | empty_set
551a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
552a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
553a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_empty(self):
554a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set | self.set
555a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
556a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
557a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_intersection(self):
558a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & self.set
559a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
560a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
561a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_intersection(self):
562a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & empty_set
563a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
564a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
565a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_empty(self):
566a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set & self.set
567a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
568a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
569a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_symmetric_difference(self):
570a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ self.set
571a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
572a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
573a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def checkempty_symmetric_difference(self):
574a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ empty_set
575a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.set)
576a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
577a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_difference(self):
578a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set - self.set
579a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
580a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
581a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_difference(self):
582a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set - empty_set
583a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
584a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
585a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_difference_rev(self):
586a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set - self.set
587a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
588a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
589a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_iteration(self):
590a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.set:
591a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assert_(v in self.values)
592a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
593a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pickling(self):
594a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        p = pickle.dumps(self.set)
595a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        copy = pickle.loads(p)
596a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, copy,
597a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                         "%s != %s" % (self.set, copy))
598a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
599a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
600a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
601a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsEmpty(TestBasicOps):
602a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
603a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "empty set"
604a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = []
605a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
606a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
607a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 0
608a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([])"
609a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
610a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
611a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
612a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsSingleton(TestBasicOps):
613a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
614a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "unit set (number)"
615a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [3]
616a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
617a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
618a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 1
619a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([3])"
620a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
621a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_in(self):
622a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failUnless(3 in self.set)
623a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
624a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_not_in(self):
625a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failUnless(2 not in self.set)
626a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
627a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
628a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
629a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsTuple(TestBasicOps):
630a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
631a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "unit set (tuple)"
632a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [(0, "zero")]
633a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
634a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
635a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 1
636a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([(0, 'zero')])"
637a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
638a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_in(self):
639a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failUnless((0, "zero") in self.set)
640a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
641a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_not_in(self):
642a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.failUnless(9 not in self.set)
643a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
644a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
645a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
646a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsTriple(TestBasicOps):
647a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
648a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "triple set"
649a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [0, "zero", operator.add]
650a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
651a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
652a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 3
653a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = None
654a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
655a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
656a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
657a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef baditer():
658a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    raise TypeError
659a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield True
660a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
661a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef gooditer():
662a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield True
663a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
664a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestExceptionPropagation(unittest.TestCase):
665a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    """SF 628246:  Set constructor should not trap iterator TypeErrors"""
666a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
667a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_instanceWithException(self):
668a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, set, baditer())
669a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
670a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_instancesWithoutException(self):
671a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # All of these iterables should load without exception.
672a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set([1,2,3])
673a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set((1,2,3))
674a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set({'one':1, 'two':2, 'three':3})
675a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set(xrange(3))
676a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set('abc')
677a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set(gooditer())
678a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
679a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
680a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
681a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSetOfSets(unittest.TestCase):
682a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_constructor(self):
683a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        inner = frozenset([1])
684a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer = set([inner])
685a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        element = outer.pop()
686a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(element), frozenset)
687a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.add(inner)        # Rebuild set of sets with .add method
688a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.remove(inner)
689a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(outer, set())   # Verify that remove worked
690a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.discard(inner)    # Absence of KeyError indicates working fine
691a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
692a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
693a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
694a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBinaryOps(unittest.TestCase):
695a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
696a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set((2, 4, 6))
697a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
698a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_eq(self):              # SF bug 643115
699a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set({2:1,4:3,6:5}))
700a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
701a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_subset(self):
702a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([2])
703a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set((2, 4, 6)))
704a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
705a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_superset(self):
706a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([2, 4, 6, 8])
707a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
708a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
709a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_overlap(self):
710a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([3, 4, 5])
711a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 3, 4, 5, 6]))
712a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
713a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_non_overlap(self):
714a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([8])
715a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
716a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
717a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_subset(self):
718a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set((2, 4))
719a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set((2, 4)))
720a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
721a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_superset(self):
722a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([2, 4, 6, 8])
723a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6]))
724a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
725a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_overlap(self):
726a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([3, 4, 5])
727a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([4]))
728a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
729a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_non_overlap(self):
730a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([8])
731a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
732a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
733a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_subset(self):
734a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((2, 4))
735a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([6]))
736a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
737a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_superset(self):
738a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((2, 4, 6, 8))
739a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([8]))
740a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
741a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_overlap(self):
742a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((3, 4, 5))
743a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 3, 5, 6]))
744a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
745a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_non_overlap(self):
746a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set([8])
747a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
748a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
749a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_cmp(self):
750a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = set('a'), set('b')
751a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, cmp, a, b)
752a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
753a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # You can view this as a buglet:  cmp(a, a) does not raise TypeError,
754a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
755a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # which Python thinks is good enough to synthesize a cmp() result
756a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # without calling __cmp__.
757a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(cmp(a, a), 0)
758a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
759a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, cmp, a, 12)
760a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, cmp, "abc", a)
761a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
762a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
763a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
764a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestUpdateOps(unittest.TestCase):
765a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
766a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set((2, 4, 6))
767a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
768a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_subset(self):
769a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([2])
770a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set((2, 4, 6)))
771a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
772a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_superset(self):
773a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([2, 4, 6, 8])
774a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
775a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
776a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_overlap(self):
777a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([3, 4, 5])
778a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
779a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
780a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_non_overlap(self):
781a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([8])
782a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
783a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
784a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_method_call(self):
785f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(set([3, 4, 5]))
786a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
787a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
788a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_subset(self):
789a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set((2, 4))
790a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set((2, 4)))
791a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
792a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_superset(self):
793a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([2, 4, 6, 8])
794a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6]))
795a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
796a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_overlap(self):
797a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([3, 4, 5])
798a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([4]))
799a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
800a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_non_overlap(self):
801a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([8])
802a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, empty_set)
803a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
804a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_method_call(self):
805a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.intersection_update(set([3, 4, 5]))
806a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([4]))
807a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
808a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_subset(self):
809a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((2, 4))
810a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([6]))
811a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
812a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_superset(self):
813a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((2, 4, 6, 8))
814a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([8]))
815a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
816a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_overlap(self):
817a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((3, 4, 5))
818a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 5, 6]))
819a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
820a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_non_overlap(self):
821a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set([8])
822a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
823a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
824a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_method_call(self):
825a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.symmetric_difference_update(set([3, 4, 5]))
826a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 5, 6]))
827a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
828a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_subset(self):
829a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((2, 4))
830a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([6]))
831a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
832a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_superset(self):
833a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((2, 4, 6, 8))
834a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([]))
835a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
836a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_overlap(self):
837a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((3, 4, 5))
838a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 6]))
839a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
840a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_non_overlap(self):
841a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set([8])
842a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6]))
843a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
844a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_method_call(self):
845a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.difference_update(set([3, 4, 5]))
846a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 6]))
847a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
848a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
849a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
850a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestMutate(unittest.TestCase):
851a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
852a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = ["a", "b", "c"]
853a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(self.values)
854a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
855a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_present(self):
856a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.add("c")
857a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abc"))
858a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
859a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_absent(self):
860a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.add("d")
861a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abcd"))
862a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
863a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_until_full(self):
864a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        tmp = set()
865a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        expected_len = 0
866a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
867a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            tmp.add(v)
868a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected_len += 1
869a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(len(tmp), expected_len)
870a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(tmp, self.set)
871a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
872a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_present(self):
873a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.remove("b")
874a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("ac"))
875a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
876a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_absent(self):
877a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
878a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.remove("d")
879a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("Removing missing element should have raised LookupError")
880a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except LookupError:
881a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
882a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
883a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_until_empty(self):
884a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        expected_len = len(self.set)
885a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
886a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.remove(v)
887a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected_len -= 1
888a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(len(self.set), expected_len)
889a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
890a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard_present(self):
891a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.discard("c")
892a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("ab"))
893a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
894a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard_absent(self):
895a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.discard("d")
896a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abc"))
897a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
898a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_clear(self):
899a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.clear()
900a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.set), 0)
901a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
902a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pop(self):
903a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        popped = {}
904a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        while self.set:
905a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            popped[self.set.pop()] = None
906a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(popped), len(self.values))
907a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
908a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.failUnless(v in popped)
909a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
910a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_empty_tuple(self):
911f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(())
912a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values))
913a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
914a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_unit_tuple_overlap(self):
915f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(("a",))
916a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values))
917a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
918a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_unit_tuple_non_overlap(self):
919f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(("a", "z"))
920a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values + ["z"]))
921a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
922a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
923a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
924a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsets(unittest.TestCase):
925a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
926a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    case2method = {"<=": "issubset",
927a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                   ">=": "issuperset",
928a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                  }
929a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
930a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    reverse = {"==": "==",
931a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "!=": "!=",
932a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "<":  ">",
933a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               ">":  "<",
934a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "<=": ">=",
935a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               ">=": "<=",
936a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger              }
937a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
938a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_issubset(self):
939a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        x = self.left
940a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        y = self.right
941a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for case in "!=", "==", "<", "<=", ">", ">=":
942a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected = case in self.cases
943a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Test the binary infix spelling.
944a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            result = eval("x" + case + "y", locals())
945a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(result, expected)
946a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Test the "friendly" method-name spelling, if one exists.
947a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if case in TestSubsets.case2method:
948a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                method = getattr(x, TestSubsets.case2method[case])
949a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                result = method(y)
950a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertEqual(result, expected)
951a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
952a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Now do the same for the operands reversed.
953a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            rcase = TestSubsets.reverse[case]
954a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            result = eval("y" + rcase + "x", locals())
955a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(result, expected)
956a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if rcase in TestSubsets.case2method:
957a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                method = getattr(y, TestSubsets.case2method[rcase])
958a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                result = method(x)
959a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertEqual(result, expected)
960a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
961a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
962a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEqualEmpty(TestSubsets):
963a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set()
964a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set()
965a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "both empty"
966a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "==", "<=", ">="
967a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
968a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
969a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
970a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEqualNonEmpty(TestSubsets):
971a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1, 2])
972a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
973a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "equal pair"
974a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "==", "<=", ">="
975a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
976a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
977a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
978a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEmptyNonEmpty(TestSubsets):
979a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set()
980a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
981a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "one empty, one non-empty"
982a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!=", "<", "<="
983a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
984a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
985a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
986a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetPartial(TestSubsets):
987a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1])
988a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
989a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "one a non-empty proper subset of other"
990a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!=", "<", "<="
991a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
992a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
993a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
994a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetNonOverlap(TestSubsets):
995a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1])
996a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([2])
997a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "neither empty, neither contains"
998a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!="
999a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1000a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1001a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1002a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsInBinaryOps(unittest.TestCase):
1003a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1004a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_eq_ne(self):
1005a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # Unlike the others, this is testing that == and != *are* allowed.
1006a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.other == self.set, False)
1007a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set == self.other, False)
1008a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.other != self.set, True)
1009a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set != self.other, True)
1010a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1011a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_ge_gt_le_lt(self):
1012a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set < self.other)
1013a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set <= self.other)
1014a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set > self.other)
1015a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set >= self.other)
1016a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1017a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other < self.set)
1018a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other <= self.set)
1019a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other > self.set)
1020a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other >= self.set)
1021a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1022f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update_operator(self):
1023a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1024a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set |= self.other
1025a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1026a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1027a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1028a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1029a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1030f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update(self):
1031a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1032f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.set.update(self.other)
1033a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1034f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertRaises(TypeError, self.set.update, self.other)
1035a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1036a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union(self):
1037a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set | self.other)
1038a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other | self.set)
1039a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1040a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.union(self.other)
1041a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1042a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.union, self.other)
1043a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1044a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update_operator(self):
1045a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1046a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set &= self.other
1047a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1048a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1049a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1050a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1051a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1052a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update(self):
1053a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1054a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.intersection_update(self.other)
1055a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1056a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1057a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.intersection_update,
1058a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1059a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1060a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection(self):
1061a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set & self.other)
1062a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other & self.set)
1063a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1064a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.intersection(self.other)
1065a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1066a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.intersection, self.other)
1067a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1068a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_update_operator(self):
1069a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1070a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set ^= self.other
1071a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1072a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1073a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1074a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1075a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1076a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_update(self):
1077a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1078a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.symmetric_difference_update(self.other)
1079a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1080a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1081a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.symmetric_difference_update,
1082a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1083a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1084a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference(self):
1085a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set ^ self.other)
1086a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other ^ self.set)
1087a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1088a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.symmetric_difference(self.other)
1089a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1090a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1091a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1092a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update_operator(self):
1093a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1094a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set -= self.other
1095a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1096a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1097a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1098a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1099a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1100a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update(self):
1101a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1102a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.difference_update(self.other)
1103a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1104a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1105a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.difference_update,
1106a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1107a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1108a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference(self):
1109a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set - self.other)
1110a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other - self.set)
1111a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1112a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.difference(self.other)
1113a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1114a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.difference, self.other)
1115a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1116a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1117a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1118a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1119a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1120a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1121a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = 19
1122a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = False
1123a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1124a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1125a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1126a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsDict(TestOnlySetsInBinaryOps):
1127a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1128a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1129a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = {1:2, 3:4}
1130a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1131a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1132a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1133a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1134a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsOperator(TestOnlySetsInBinaryOps):
1135a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1136a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1137a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = operator.add
1138a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = False
1139a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1140a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1141a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1142a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1143a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1144a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1145a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = (2, 4, 6)
1146a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1147a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1148a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1149a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1150a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsString(TestOnlySetsInBinaryOps):
1151a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1152a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1153a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = 'abc'
1154a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1155a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1156a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1157a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1158a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1159a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1160a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        def gen():
1161a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            for i in xrange(0, 10, 2):
1162a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                yield i
1163a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1164a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = gen()
1165a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1166a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1167a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1168a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1169a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopying(unittest.TestCase):
1170a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1171a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_copy(self):
1172a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        dup = self.set.copy()
1173a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        dup_list = list(dup); dup_list.sort()
1174a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set_list = list(self.set); set_list.sort()
1175a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(dup_list), len(set_list))
1176a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in range(len(dup_list)):
1177a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.failUnless(dup_list[i] is set_list[i])
1178a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1179a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_deep_copy(self):
1180a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        dup = copy.deepcopy(self.set)
118170a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        ##print type(dup), repr(dup)
1182a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        dup_list = list(dup); dup_list.sort()
1183a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set_list = list(self.set); set_list.sort()
1184a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(dup_list), len(set_list))
1185a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in range(len(dup_list)):
1186a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(dup_list[i], set_list[i])
1187a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1188a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1189a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1190a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingEmpty(TestCopying):
1191a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1192a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set()
1193a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1194a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1195a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1196a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingSingleton(TestCopying):
1197a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1198a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(["hello"])
1199a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1200a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1201a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1202a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingTriple(TestCopying):
1203a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1204a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(["zero", 0, None])
1205a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1206a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1207a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1208a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingTuple(TestCopying):
1209a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1210a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set([(1, 2)])
1211a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1212a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1213a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1214a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingNested(TestCopying):
1215a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1216a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set([((1, 2), (3, 4))])
1217a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1218a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1219a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1220a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestIdentities(unittest.TestCase):
1221a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1222a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.a = set('abracadabra')
1223a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.b = set('alacazam')
1224a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1225a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_binopsVsSubsets(self):
1226a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
1227a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a - b < a)
1228a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(b - a < b)
1229a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a & b < a)
1230a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a & b < b)
1231a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a | b > a)
1232a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a | b > b)
1233a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assert_(a ^ b < a | b)
1234a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1235a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_commutativity(self):
1236a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
1237a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a&b, b&a)
1238a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a|b, b|a)
1239a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a^b, b^a)
1240a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if a != b:
1241a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertNotEqual(a-b, b-a)
1242a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1243a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_summations(self):
1244a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # check that sums of parts equal the whole
1245a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
1246a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1247a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a&b)|(a^b), a|b)
1248a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a|(b-a), a|b)
1249a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|b, a|b)
1250a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(a&b), a)
1251a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((b-a)|(a&b), b)
1252a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(b-a), a^b)
1253a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1254a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_exclusion(self):
1255a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # check that inverse operations show non-overlap
1256a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b, zero = self.a, self.b, set()
1257a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)&b, zero)
1258a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((b-a)&a, zero)
1259a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a&b)&(a^b), zero)
1260a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1261a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger# Tests derived from test_itertools.py =======================================
1262a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1263a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef R(seqn):
1264a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Regular generator'
1265a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    for i in seqn:
1266a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        yield i
1267a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1268a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass G:
1269a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using __getitem__'
1270a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1271a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1272a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __getitem__(self, i):
1273a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self.seqn[i]
1274a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1275a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass I:
1276a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using iterator protocol'
1277a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1278a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1279a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1280a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1281a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1282a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1283a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.i >= len(self.seqn): raise StopIteration
1284a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        v = self.seqn[self.i]
1285a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i += 1
1286a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return v
1287a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1288a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass Ig:
1289a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using iterator protocol defined with a generator'
1290a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1291a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1292a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1293a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1294a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for val in self.seqn:
1295a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            yield val
1296a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1297a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass X:
1298a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Missing __getitem__ and __iter__'
1299a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1300a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1301a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1302a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1303a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.i >= len(self.seqn): raise StopIteration
1304a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        v = self.seqn[self.i]
1305a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i += 1
1306a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return v
1307a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1308a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass N:
1309a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Iterator missing next()'
1310a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1311a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1312a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1313a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1314a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1315a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1316a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass E:
1317a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test propagation of exceptions'
1318a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1319a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1320a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1321a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1322a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1323a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1324ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger        3 // 0
1325a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1326a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass S:
1327a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test immediate stop'
1328a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1329a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        pass
1330a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1331a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1332a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1333a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        raise StopIteration
1334a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1335a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerfrom itertools import chain, imap
1336a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef L(seqn):
1337a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test multiple tiers of iterators'
1338a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1339a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1340a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestVariousIteratorArgs(unittest.TestCase):
1341a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1342a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_constructor(self):
1343a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for cons in (set, frozenset):
1344a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1345a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, S, L, R):
134664958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger                    self.assertEqual(sorted(cons(g(s))), sorted(g(s)))
1347a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, cons , X(s))
1348a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, cons , N(s))
1349a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, cons , E(s))
1350a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1351a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_inline_methods(self):
1352a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        s = set('november')
1353a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1354a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
1355a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, L, R):
1356a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    expected = meth(data)
1357a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    actual = meth(G(data))
135864958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger                    self.assertEqual(sorted(actual), sorted(expected))
1359a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, meth, X(s))
1360a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, meth, N(s))
1361a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, meth, E(s))
1362a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1363a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_inplace_methods(self):
1364a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1365f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for methname in ('update', 'intersection_update',
1366a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                             'difference_update', 'symmetric_difference_update'):
1367a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, S, L, R):
1368a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    s = set('january')
1369a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    t = s.copy()
1370a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    getattr(s, methname)(list(g(data)))
1371a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    getattr(t, methname)(g(data))
137264958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger                    self.assertEqual(sorted(s), sorted(t))
1373a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1374a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1375a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1376a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1377a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1378a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1379a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1380a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef test_main(verbose=None):
1381a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    from test import test_sets
1382a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_classes = (
1383a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSet,
138450a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        TestSetSubclass,
1385a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestFrozenSet,
138650a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        TestFrozenSetSubclass,
1387a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSetOfSets,
1388a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestExceptionPropagation,
1389a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsEmpty,
1390a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsSingleton,
1391a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsTuple,
1392a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsTriple,
1393a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBinaryOps,
1394a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestUpdateOps,
1395a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestMutate,
1396a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEqualEmpty,
1397a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEqualNonEmpty,
1398a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEmptyNonEmpty,
1399a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetPartial,
1400a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetNonOverlap,
1401a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsNumeric,
1402a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsDict,
1403a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsOperator,
1404a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsTuple,
1405a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsString,
1406a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsGenerator,
1407a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingEmpty,
1408a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingSingleton,
1409a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingTriple,
1410a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingTuple,
1411a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingNested,
1412a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestIdentities,
1413a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestVariousIteratorArgs,
1414a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        )
1415a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1416a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_support.run_unittest(*test_classes)
1417a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1418a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    # verify reference counting
1419a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    if verbose and hasattr(sys, "gettotalrefcount"):
1420a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        import gc
1421a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        counts = [None] * 5
1422a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in xrange(len(counts)):
1423a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            test_support.run_unittest(*test_classes)
1424a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            gc.collect()
1425a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            counts[i] = sys.gettotalrefcount()
1426a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        print counts
1427a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1428a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerif __name__ == "__main__":
1429a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_main(verbose=True)
1430