135b76027f94b12911cc97f960ebbb3c137d10d2bRaymond Hettinger
2a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport unittest
3a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerfrom test import test_support
4aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrouimport gc
5aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrouimport weakref
6a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport operator
7a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport copy
8a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerimport pickle
982cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettingerfrom random import randrange, shuffle
10c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettingerimport sys
116170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerimport collections
12a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
13a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass PassThru(Exception):
14a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    pass
15a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
16a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef check_pass_thru():
17a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    raise PassThru
18a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield 1
19a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
209bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettingerclass BadCmp:
219bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger    def __hash__(self):
229bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        return 1
239bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger    def __cmp__(self, other):
249bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        raise RuntimeError
259bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger
265399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettingerclass ReprWrapper:
275399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger    'Used to test self-referential repr() calls'
285399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger    def __repr__(self):
295399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        return repr(self.value)
305399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger
31d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettingerclass HashCountingInt(int):
32d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger    'int-like object that counts the number of times __hash__ is called'
33d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger    def __init__(self, *args):
34d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        self.hash_count = 0
35d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger    def __hash__(self):
36d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        self.hash_count += 1
37d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        return int.__hash__(self)
38d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger
39a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestJointOps(unittest.TestCase):
40a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    # Tests common to both set and frozenset
41a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
42a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
43a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.word = word = 'simsalabim'
44a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherword = 'madagascar'
45a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
46a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s = self.thetype(word)
47a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.d = dict.fromkeys(word)
48a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
496429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger    def test_new_or_init(self):
506429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger        self.assertRaises(TypeError, self.thetype, [], 2)
5135b76027f94b12911cc97f960ebbb3c137d10d2bRaymond Hettinger        self.assertRaises(TypeError, set().__init__, a=1)
526429a4727e4bb8bcb0d3deefaefe195e63e6bb6eRaymond Hettinger
53a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_uniquification(self):
5464958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger        actual = sorted(self.s)
5564958a15d7c03efdc3d2eddf247666e18d1fd910Raymond Hettinger        expected = sorted(self.d)
56a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(actual, expected)
57a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.thetype, check_pass_thru())
58a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.thetype, [[]])
59a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
60a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_len(self):
61a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.s), len(self.d))
62a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
63a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_contains(self):
64a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
65a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in self.s, c in self.d)
66a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.__contains__, [[]])
6719c2d77842290af9b5f470c1eea2a71d1f77c9feRaymond Hettinger        s = self.thetype([frozenset(self.letters)])
68aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(self.thetype(self.letters), s)
69a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
70a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union(self):
71a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        u = self.s.union(self.otherword)
72a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
73a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in u, c in self.d or c in self.otherword)
7449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
75a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(u), self.thetype)
76a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.union, check_pass_thru())
77a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.union, [[]])
78f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
79f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
80f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
81f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
82f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
83ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger            self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
84a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
85c2b9e1a134bef289445d0779d26b6ccf36d03077Raymond Hettinger        # Issue #6573
86c2b9e1a134bef289445d0779d26b6ccf36d03077Raymond Hettinger        x = self.thetype()
87c2b9e1a134bef289445d0779d26b6ccf36d03077Raymond Hettinger        self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
88c2b9e1a134bef289445d0779d26b6ccf36d03077Raymond Hettinger
89a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_or(self):
90a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.union(self.otherword)
91a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s | set(self.otherword), i)
92a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s | frozenset(self.otherword), i)
93a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
94a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s | self.otherword
95a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
96a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
97a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
98a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s|t did not screen-out general iterables")
99a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
100a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection(self):
101a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.intersection(self.otherword)
102a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
103a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, c in self.d and c in self.otherword)
10449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
105a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
106a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
107f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
108f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
109f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
110f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
111f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
1125c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger            self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
113610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger        s = self.thetype('abcba')
114610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger        z = s.intersection()
115610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger        if self.thetype == frozenset():
116610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger            self.assertEqual(id(s), id(z))
117610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger        else:
118610a93ea2623ff324c99c52147d78838335ae900Raymond Hettinger            self.assertNotEqual(id(s), id(z))
119a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1201760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint(self):
1211760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        def f(s1, s2):
1221760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger            'Pure python equivalent of isdisjoint()'
1231760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger            return not set(s1).intersection(s2)
1241760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
1251760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger            s1 = self.thetype(larg)
1261760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger            for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
1271760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
1281760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    s2 = C(rarg)
1291760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    actual = s1.isdisjoint(s2)
1301760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    expected = f(s1, s2)
1311760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    self.assertEqual(actual, expected)
1325c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson                    self.assertTrue(actual is True or actual is False)
1331760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
134a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_and(self):
135a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.intersection(self.otherword)
136a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s & set(self.otherword), i)
137a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s & frozenset(self.otherword), i)
138a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
139a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s & self.otherword
140a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
141a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
142a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
143a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s&t did not screen-out general iterables")
144a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
145a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference(self):
146a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.difference(self.otherword)
147a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
148a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, c in self.d and c not in self.otherword)
14949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
150a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
151a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.difference, check_pass_thru())
152a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.difference, [[]])
153f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
154f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
155f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
156f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
157f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
1584267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(), set('abc'))
1594267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger            self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
160a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
161a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sub(self):
162a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.difference(self.otherword)
163a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s - set(self.otherword), i)
164a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s - frozenset(self.otherword), i)
165a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
166a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s - self.otherword
167a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
168a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
169a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
170a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s-t did not screen-out general iterables")
171a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
172a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_symmetric_difference(self):
173a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.symmetric_difference(self.otherword)
174a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in self.letters:
175a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
17649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, self.thetype(self.word))
177a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(i), self.thetype)
178a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
179a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
180f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
181f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
182f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
183f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
184f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
185a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
186a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_xor(self):
187a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        i = self.s.symmetric_difference(self.otherword)
188a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s ^ set(self.otherword), i)
189a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s ^ frozenset(self.otherword), i)
190a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
191a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.s ^ self.otherword
192a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
193a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
194a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
195a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("s^t did not screen-out general iterables")
196a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
197a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_equality(self):
198a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s, set(self.word))
199a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s, frozenset(self.word))
200a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s == self.word, False)
201a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(self.s, set(self.otherword))
202a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(self.s, frozenset(self.otherword))
203a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.s != self.word, True)
204a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
205a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_setOfFrozensets(self):
206a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
207a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        s = self.thetype(t)
208a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(s), 3)
209a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
210a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_compare(self):
211a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.__cmp__, self.s)
212a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
213a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sub_and_super(self):
214a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
2155c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(p < q)
2165c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(p <= q)
2175c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(q <= q)
2185c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(q > p)
2195c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(q >= p)
2205c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(q < r)
2215c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(q <= r)
2225c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(q > r)
2235c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(q >= r)
2245c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(set('a').issubset('abc'))
2255c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(set('abc').issuperset('a'))
2265c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(set('a').issubset('cbs'))
2275c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertFalse(set('cbs').issuperset('a'))
228a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
229a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pickling(self):
2300fc074758670e56bcc61123a641a345cbe1988e3Hirokazu Yamamoto        for i in range(pickle.HIGHEST_PROTOCOL + 1):
23115056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            p = pickle.dumps(self.s, i)
23215056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            dup = pickle.loads(p)
23315056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
23415056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger            if type(self.s) not in (set, frozenset):
23515056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                self.s.x = 10
236655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka                p = pickle.dumps(self.s, i)
23715056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                dup = pickle.loads(p)
23815056a5202c89846d75006d66541d5a634ac79b5Raymond Hettinger                self.assertEqual(self.s.x, dup.x)
239a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
24049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_deepcopy(self):
24149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        class Tracer:
24249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __init__(self, value):
24349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                self.value = value
24449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __hash__(self):
24558eb11cf62dd04ccc2c364b62fd51b4265e2e203Tim Peters                return self.value
24649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            def __deepcopy__(self, memo=None):
24749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                return Tracer(self.value + 1)
24849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = Tracer(10)
24949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype([t])
25049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = copy.deepcopy(s)
25149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(dup))
25249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        for elem in dup:
25349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger            newt = elem
25449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(t), id(newt))
25549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(t.value + 1, newt.value)
25649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
257bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger    def test_gc(self):
258bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        # Create a nest of cycles to exercise overall ref count check
259bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        class A:
260bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            pass
261bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        s = set(A() for i in xrange(1000))
262bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger        for elem in s:
263bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.cycle = s
264bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.sub = elem
265bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger            elem.set = set([elem])
266bb999b5925ae65d19282c3781cdbb678f92c410fRaymond Hettinger
26797979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger    def test_subclass_with_custom_hash(self):
26897979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        # Bug #1257731
26997979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        class H(self.thetype):
27097979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger            def __hash__(self):
2716902b44406ba2940dd7f34b7ec77e2ea13ff2e66Tim Peters                return int(id(self) & 0x7fffffff)
27297979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        s=H()
27397979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f=set()
27497979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.add(s)
275aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(s, f)
27697979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.remove(s)
27797979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.add(s)
27897979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger        f.discard(s)
27997979ddc141b88cfd81bdf02404d0337a603f7cfRaymond Hettinger
2809bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger    def test_badcmp(self):
2819bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        s = self.thetype([BadCmp()])
2829bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        # Detect comparison errors during insertion and lookup
2839bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
2849bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        self.assertRaises(RuntimeError, s.__contains__, BadCmp())
2859bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        # Detect errors during mutating operations
2869bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger        if hasattr(s, 'add'):
2879bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger            self.assertRaises(RuntimeError, s.add, BadCmp())
2889bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger            self.assertRaises(RuntimeError, s.discard, BadCmp())
2899bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger            self.assertRaises(RuntimeError, s.remove, BadCmp())
2909bda1d6f645bd0f3e76c14f27bbbac919814cd38Raymond Hettinger
2915399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger    def test_cyclical_repr(self):
2925399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        w = ReprWrapper()
2935399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        s = self.thetype([w])
2945399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        w.value = s
2955399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        name = repr(s).partition('(')[0]    # strip class name from repr string
2965399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        self.assertEqual(repr(s), '%s([%s(...)])' % (name, name))
2975399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger
2985399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger    def test_cyclical_print(self):
2995399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        w = ReprWrapper()
3005399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        s = self.thetype([w])
3015399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        w.value = s
302be9160b035449b00ff4aee1837c510ec518b08bcNeal Norwitz        fo = open(test_support.TESTFN, "wb")
3035399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        try:
3045399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger            print >> fo, s,
3055399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger            fo.close()
3065399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger            fo = open(test_support.TESTFN, "rb")
3075399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger            self.assertEqual(fo.read(), repr(s))
3085399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger        finally:
3095399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger            fo.close()
310be9160b035449b00ff4aee1837c510ec518b08bcNeal Norwitz            test_support.unlink(test_support.TESTFN)
3115399910eba1ef3580aebf49482b1367f14fa6c48Raymond Hettinger
312d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger    def test_do_not_rehash_dict_keys(self):
313d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        n = 10
314d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        d = dict.fromkeys(map(HashCountingInt, xrange(n)))
315d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        self.assertEqual(sum(elem.hash_count for elem in d), n)
316d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        s = self.thetype(d)
317d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        self.assertEqual(sum(elem.hash_count for elem in d), n)
318d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        s.difference(d)
319ea5962f86e8550978446724dadcacd60e03feef2Tim Peters        self.assertEqual(sum(elem.hash_count for elem in d), n)
320d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger        if hasattr(s, 'symmetric_difference_update'):
321d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger            s.symmetric_difference_update(d)
3220d4c06e06e5ee1f3bb1fa8068114bd700d74864aNeal Norwitz        self.assertEqual(sum(elem.hash_count for elem in d), n)
3230bbbfc4c0b0cf84a23d2644080d09fb8af5324d2Raymond Hettinger        d2 = dict.fromkeys(set(d))
3240bbbfc4c0b0cf84a23d2644080d09fb8af5324d2Raymond Hettinger        self.assertEqual(sum(elem.hash_count for elem in d), n)
3250bbbfc4c0b0cf84a23d2644080d09fb8af5324d2Raymond Hettinger        d3 = dict.fromkeys(frozenset(d))
326ea5962f86e8550978446724dadcacd60e03feef2Tim Peters        self.assertEqual(sum(elem.hash_count for elem in d), n)
327e3146f5aa3cbb8d28a6a429b5ccc07002e339ff2Raymond Hettinger        d3 = dict.fromkeys(frozenset(d), 123)
328e3146f5aa3cbb8d28a6a429b5ccc07002e339ff2Raymond Hettinger        self.assertEqual(sum(elem.hash_count for elem in d), n)
329e3146f5aa3cbb8d28a6a429b5ccc07002e339ff2Raymond Hettinger        self.assertEqual(d3, dict.fromkeys(d, 123))
330d6fc72a5ae27048dae56c773896ccbd6152d9b9bRaymond Hettinger
331aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou    def test_container_iterator(self):
332733dc74442a89972278d1fdf8a64b5739cdbad67Antoine Pitrou        # Bug #3680: tp_traverse was not implemented for set iterator object
333aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        class C(object):
334aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou            pass
335aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        obj = C()
336aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        ref = weakref.ref(obj)
337aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        container = set([obj, 1])
338aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        obj.x = iter(container)
339aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        del obj, container
340aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        gc.collect()
3415c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(ref() is None, "Cycle was not collected")
342aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou
34314a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka    def test_free_after_iterating(self):
34414a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka        test_support.check_free_after_iterating(self, iter, self.thetype)
34514a7d6389fb453cca18d61bbe39deff7062bc66fSerhiy Storchaka
346a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSet(TestJointOps):
347a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    thetype = set
348a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
34950a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    def test_init(self):
35049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype()
35150a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        s.__init__(self.word)
35250a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        self.assertEqual(s, set(self.word))
35350a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        s.__init__(self.otherword)
35450a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        self.assertEqual(s, set(self.otherword))
355eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        self.assertRaises(TypeError, s.__init__, s, 2);
356eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        self.assertRaises(TypeError, s.__init__, 1);
35750a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
35849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
35949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
36049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
36149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(t))
36249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
363e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger    def test_set_literal_insertion_order(self):
364e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        # SF Issue #26020 -- Expect left to right insertion
365e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        s = {1, 1.0, True}
366e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        self.assertEqual(len(s), 1)
367e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        stored_value = s.pop()
368e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        self.assertEqual(type(stored_value), int)
369e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger
370e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger    def test_set_literal_evaluation_order(self):
371e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        # Expect left to right expression evaluation
372e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        events = []
373e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        def record(obj):
374e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger            events.append(obj)
375e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        s = {record(1), record(2), record(3)}
376e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger        self.assertEqual(events, [1, 2, 3])
377e62a694fee53ba7fc16d6afbaa53b373c878f300Raymond Hettinger
378a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash(self):
379a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, hash, self.s)
380a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
381a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_clear(self):
382a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.clear()
383f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(self.s, set())
384f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(len(self.s), 0)
385a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
38649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
38749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
38849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(self.s, dup)
38949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(self.s), id(dup))
39049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
391a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add(self):
392a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.add('Q')
393aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn('Q', self.s)
394f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        dup = self.s.copy()
395f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.s.add('Q')
396f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertEqual(self.s, dup)
397a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.add, [])
398a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
399a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove(self):
400a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.remove('a')
401aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn('a', self.s)
402a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(KeyError, self.s.remove, 'Q')
403a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.remove, [])
404bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s = self.thetype([frozenset(self.word)])
405aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(self.thetype(self.word), s)
406bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.remove(self.thetype(self.word))
407aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(self.thetype(self.word), s)
408bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
409a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
410c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger    def test_remove_keyerror_unpacking(self):
411c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger        # bug:  www.python.org/sf/1576657
412c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger        for v1 in ['Q', (1,)]:
413c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger            try:
414c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger                self.s.remove(v1)
415c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger            except KeyError, e:
416c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger                v2 = e.args[0]
417c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger                self.assertEqual(v1, v2)
418c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger            else:
419c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger                self.fail()
420c789f341bb3d1a7689110238669360fc8f379c44Raymond Hettinger
421d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc    def test_remove_keyerror_set(self):
422d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc        key = self.thetype([3, 4])
423d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc        try:
424d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc            self.s.remove(key)
425d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc        except KeyError as e:
4265c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson            self.assertTrue(e.args[0] is key,
427d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc                         "KeyError should be {0}, not {1}".format(key,
428d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc                                                                  e.args[0]))
429d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc        else:
430d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc            self.fail()
431d78b9dcbc3356d15bd0d0dd9f821452b4f5ba282Amaury Forgeot d'Arc
432a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard(self):
433a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.discard('a')
434aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn('a', self.s)
435a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s.discard('Q')
436a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.discard, [])
437bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s = self.thetype([frozenset(self.word)])
438aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(self.thetype(self.word), s)
439bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.discard(self.thetype(self.word))
440aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(self.thetype(self.word), s)
441bfd334a42d35e58369e3a53e16733234e2741975Raymond Hettinger        s.discard(self.thetype(self.word))
442a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
443a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pop(self):
444a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in xrange(len(self.s)):
445a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            elem = self.s.pop()
446aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertNotIn(elem, self.s)
447a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(KeyError, self.s.pop)
448a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
449f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update(self):
450f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        retval = self.s.update(self.otherword)
451a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
452a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
453aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(c, self.s)
454f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(PassThru, self.s.update, check_pass_thru())
455f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(TypeError, self.s.update, [[]])
456f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
457f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
458f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
459f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.update(C(p)), None)
460f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
461ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger        for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
462ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger            q = 'ahi'
463ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
464ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger                s = self.thetype('abcba')
465ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger                self.assertEqual(s.update(C(p), C(q)), None)
466ee4bcad68ec383c0140d0a21f4ac296073c0f938Raymond Hettinger                self.assertEqual(s, set(s) | set(p) | set(q))
467a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
468a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_ior(self):
469a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s |= set(self.otherword)
470a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
471aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(c, self.s)
472a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
473a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update(self):
474a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.intersection_update(self.otherword)
475a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
476a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
477a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.otherword and c in self.word:
478aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
479a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
480aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
481a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
482a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.intersection_update, [[]])
483f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
484f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
485f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
486f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.intersection_update(C(p)), None)
487f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
4885c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger                ss = 'abcba'
4895c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger                s = self.thetype(ss)
4905c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger                t = 'cbc'
4915c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger                self.assertEqual(s.intersection_update(C(p), C(t)), None)
4925c4d3d0e4c6b533dbfbab36ad8034010fe90cf69Raymond Hettinger                self.assertEqual(s, set('abcba')&set(p)&set(t))
493a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
494a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_iand(self):
495a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s &= set(self.otherword)
496a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
497a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.otherword and c in self.word:
498aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
499a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
500aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
501a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
502a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update(self):
503a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.difference_update(self.otherword)
504a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
505a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
506a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.word and c not in self.otherword:
507aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
508a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
509aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
510a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
511a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.difference_update, [[]])
512f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
513f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
514f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
515f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
516f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.difference_update(C(p)), None)
517f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
518a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
5194267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s = self.thetype('abcdefghih')
5204267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s.difference_update()
5214267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                self.assertEqual(s, self.thetype('abcdefghih'))
5224267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger
5234267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s = self.thetype('abcdefghih')
5244267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s.difference_update(C('aba'))
5254267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                self.assertEqual(s, self.thetype('cdefghih'))
5264267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger
5274267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s = self.thetype('abcdefghih')
5284267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                s.difference_update(C('cdc'), C('aba'))
5294267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger                self.assertEqual(s, self.thetype('efghih'))
5304267be6478d38445b8632e678e3cf459490bed6bRaymond Hettinger
531a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_isub(self):
532a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s -= set(self.otherword)
533a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
534a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if c in self.word and c not in self.otherword:
535aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
536a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
537aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
538a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
539a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_symmetric_difference_update(self):
540a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        retval = self.s.symmetric_difference_update(self.otherword)
541a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(retval, None)
542a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
543a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if (c in self.word) ^ (c in self.otherword):
544aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
545a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
546aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
547a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
548a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
549f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
550f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
551f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                s = self.thetype('abcba')
552f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s.symmetric_difference_update(C(p)), None)
553f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger                self.assertEqual(s, set(q))
554a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
555a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_ixor(self):
556a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.s ^= set(self.otherword)
557a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for c in (self.word + self.otherword):
558a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if (c in self.word) ^ (c in self.otherword):
559aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(c, self.s)
560a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            else:
561aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertNotIn(c, self.s)
562a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
563c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger    def test_inplace_on_self(self):
564c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t = self.s.copy()
565c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t |= t
566c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.s)
567c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t &= t
568c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.s)
569c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t -= t
570c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.thetype())
571c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t = self.s.copy()
572c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        t ^= t
573c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger        self.assertEqual(t, self.thetype())
574c991db240ca8ea838c6acb0c8dc5300dca23c39eRaymond Hettinger
575691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger    def test_weakref(self):
576691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        s = self.thetype('gallahad')
577aa687902f21dc32a72f578a992cc9e44444ced44Antoine Pitrou        p = weakref.proxy(s)
578691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        self.assertEqual(str(p), str(s))
579691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        s = None
580691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger        self.assertRaises(ReferenceError, str, p)
581691d80532b0a0204e92de35ecba1472d87af6e94Raymond Hettinger
58232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka    @unittest.skipUnless(hasattr(set, "test_c_api"),
58332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka                         'C API test only available in a debug build')
58432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka    def test_c_api(self):
58532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka        self.assertEqual(set().test_c_api(), True)
586c47e01d02021253dd9f8fd4ced6eb663436431bbRaymond Hettinger
58750a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass SetSubclass(set):
58850a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    pass
58950a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
59050a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass TestSetSubclass(TestSet):
59150a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    thetype = SetSubclass
592a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
5939fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettingerclass SetSubclassWithKeywordArgs(set):
5949fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger    def __init__(self, iterable=[], newarg=None):
5959fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger        set.__init__(self, iterable)
5969fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger
5979fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettingerclass TestSetSubclassWithKeywordArgs(TestSet):
598f733abb7831d6566cb0fccd0550d58ec3b7f05a4Tim Peters
5999fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger    def test_keywords_in_subclass(self):
6009fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger        'SF bug #1486663 -- this used to erroneously raise a TypeError'
6019fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger        SetSubclassWithKeywordArgs(newarg=1)
6029fdfadb06ee3c6d182af084afaa97bc6bf4652bcRaymond Hettinger
603a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestFrozenSet(TestJointOps):
604a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    thetype = frozenset
605a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
60650a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    def test_init(self):
60749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(self.word)
60849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s.__init__(self.otherword)
60949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(s, set(self.word))
61049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
611d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger    def test_singleton_empty_frozenset(self):
612d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        f = frozenset()
613d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''),
614d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(), frozenset([]), frozenset(()), frozenset(''),
615d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(xrange(0)), frozenset(frozenset()),
616d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               frozenset(f), f]
617d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        # All of the empty frozensets should have just one id()
618d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        self.assertEqual(len(set(map(id, efs))), 1)
619d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger
62049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
62149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
62249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
62349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(id(s), id(t))
62450a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
625a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash(self):
62649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(hash(self.thetype('abcdeb')),
62749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger                         hash(self.thetype('ebecda')))
62849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
62982cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        # make sure that all permutations give the same hash value
63082cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        n = 100
63182cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        seq = [randrange(n) for i in xrange(n)]
63282cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        results = set()
63382cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        for i in xrange(200):
63482cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger            shuffle(seq)
63582cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger            results.add(hash(self.thetype(seq)))
63682cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger        self.assertEqual(len(results), 1)
63782cb9a235de45074d578d46bbf6680e726b13efdRaymond Hettinger
63849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
63949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
64049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(id(self.s), id(dup))
641a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
642a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_frozen_as_dictkey(self):
643a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        seq = range(10) + list('abcdefg') + ['apple']
64449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        key1 = self.thetype(seq)
64549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        key2 = self.thetype(reversed(seq))
646a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(key1, key2)
647a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertNotEqual(id(key1), id(key2))
648a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        d = {}
649a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        d[key1] = 42
650a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(d[key2], 42)
651a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
652a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_hash_caching(self):
65349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        f = self.thetype('abcdcda')
654a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(hash(f), hash(f))
655a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
65649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_hash_effectiveness(self):
65749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        n = 13
65849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        hashvalues = set()
6596e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        addhashvalue = hashvalues.add
6606e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        elemmasks = [(i+1, 1<<i) for i in range(n)]
66149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        for i in xrange(2**n):
6626e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger            addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
6636e70accaffc61a5af7d78be1b365d1cab804751bRaymond Hettinger        self.assertEqual(len(hashvalues), 2**n)
66449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
66550a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass FrozenSetSubclass(frozenset):
66650a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    pass
66750a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
66850a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettingerclass TestFrozenSetSubclass(TestFrozenSet):
66950a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger    thetype = FrozenSetSubclass
67050a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger
67149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_constructor_identity(self):
67249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype(range(3))
67349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
67449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(s), id(t))
67549ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
67649ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_copy(self):
67749ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        dup = self.s.copy()
67849ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertNotEqual(id(self.s), id(dup))
67949ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
68049ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger    def test_nested_empty_constructor(self):
68149ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        s = self.thetype()
68249ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        t = self.thetype(s)
68349ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger        self.assertEqual(s, t)
68449ba4c39c49ff6b1db666e6c90365fc1361c4a64Raymond Hettinger
685d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger    def test_singleton_empty_frozenset(self):
686d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        Frozenset = self.thetype
687d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        f = frozenset()
688d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        F = Frozenset()
689d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
690d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
691d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(xrange(0)), Frozenset(Frozenset()),
692d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger               Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
693d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        # All empty frozenset subclass instances should have different ids
694d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger        self.assertEqual(len(set(map(id, efs))), len(efs))
695d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger
696a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger# Tests taken from test_sets.py =============================================
697a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
698a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerempty_set = set()
699a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
700a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
701a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
702a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOps(unittest.TestCase):
703a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
704a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_repr(self):
705a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.repr is not None:
70670a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald            self.assertEqual(repr(self.set), self.repr)
707a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
7081e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def check_repr_against_values(self):
7091e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        text = repr(self.set)
7101e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.assertTrue(text.startswith('{'))
7111e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.assertTrue(text.endswith('}'))
7121e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
7131e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        result = text[1:-1].split(', ')
7141e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        result.sort()
7151e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        sorted_repr_values = [repr(value) for value in self.values]
7161e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        sorted_repr_values.sort()
7171e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.assertEqual(result, sorted_repr_values)
7181e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
719eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger    def test_print(self):
720be9160b035449b00ff4aee1837c510ec518b08bcNeal Norwitz        fo = open(test_support.TESTFN, "wb")
721eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        try:
722eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            print >> fo, self.set,
723eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo.close()
724eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo = open(test_support.TESTFN, "rb")
725eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            self.assertEqual(fo.read(), repr(self.set))
726eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger        finally:
727eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger            fo.close()
728be9160b035449b00ff4aee1837c510ec518b08bcNeal Norwitz            test_support.unlink(test_support.TESTFN)
729eae05de91be776d141e531a11cb169dd30a8241dRaymond Hettinger
730a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_length(self):
731a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.set), self.length)
732a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
733a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_equality(self):
734a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, self.set)
735a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
736a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_equivalent_equality(self):
737a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, self.dup)
738a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
739a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_copy(self):
740a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set.copy(), self.dup)
741a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
742a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_union(self):
743a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | self.set
744a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
745a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
746a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_union(self):
747a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | empty_set
748a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
749a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
750a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_empty(self):
751a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set | self.set
752a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
753a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
754a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_intersection(self):
755a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & self.set
756a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
757a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
758a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_intersection(self):
759a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & empty_set
760a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
761a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
762a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_empty(self):
763a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set & self.set
764a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
765a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
7661760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_self_isdisjoint(self):
7671760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(self.set)
7681760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, not self.set)
7691760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
7701760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_empty_isdisjoint(self):
7711760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(empty_set)
7721760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, True)
7731760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
7741760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint_empty(self):
7751760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = empty_set.isdisjoint(self.set)
7761760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, True)
7771760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
778a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_symmetric_difference(self):
779a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ self.set
780a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
781a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
7820347c71c5f520d1c60f9e3006a0124203a31ec73Georg Brandl    def test_empty_symmetric_difference(self):
783a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ empty_set
784a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.set)
785a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
786a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_self_difference(self):
787a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set - self.set
788a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
789a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
790a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_difference(self):
791a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set - empty_set
792a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, self.dup)
793a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
794a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_empty_difference_rev(self):
795a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = empty_set - self.set
796a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
797a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
798a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_iteration(self):
799a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.set:
800aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(v, self.values)
801fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz        setiter = iter(self.set)
802f5b3e36493da275334e29afdbd238863697dca35Armin Rigo        # note: __length_hint__ is an internal undocumented API,
803f5b3e36493da275334e29afdbd238863697dca35Armin Rigo        # don't rely on it in your own programs
804f5b3e36493da275334e29afdbd238863697dca35Armin Rigo        self.assertEqual(setiter.__length_hint__(), len(self.set))
805a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
806a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pickling(self):
807655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
808655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            p = pickle.dumps(self.set, proto)
809655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            copy = pickle.loads(p)
810655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka            self.assertEqual(self.set, copy,
811655720e2758a15c85effb340ff65f4b93e7cc7a7Serhiy Storchaka                             "%s != %s" % (self.set, copy))
812a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
813a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
814a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
815a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsEmpty(TestBasicOps):
816a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
817a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "empty set"
818a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = []
819a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
820a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
821a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 0
822a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([])"
823a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
824a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
825a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
826a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsSingleton(TestBasicOps):
827a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
828a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "unit set (number)"
829a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [3]
830a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
831a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
832a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 1
833a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([3])"
834a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
835a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_in(self):
836aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn(3, self.set)
837a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
838a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_not_in(self):
839aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(2, self.set)
840a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
841a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
842a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
843a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsTuple(TestBasicOps):
844a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
845a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "unit set (tuple)"
846a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [(0, "zero")]
847a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
848a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
849a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 1
850a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = "set([(0, 'zero')])"
851a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
852a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_in(self):
853aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertIn((0, "zero"), self.set)
854a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
855a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_not_in(self):
856aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti        self.assertNotIn(9, self.set)
857a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
858a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
859a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
860a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBasicOpsTriple(TestBasicOps):
861a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
862a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.case   = "triple set"
863a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = [0, "zero", operator.add]
864a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set    = set(self.values)
865a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.dup    = set(self.values)
866a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.length = 3
867a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.repr   = None
868a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
8691e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw#------------------------------------------------------------------------------
8701e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8711e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsawclass TestBasicOpsString(TestBasicOps):
8721e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def setUp(self):
8731e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.case   = "string set"
8741e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.values = ["a", "b", "c"]
8751e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.set    = set(self.values)
8761e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.dup    = set(self.values)
8771e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.length = 3
8781e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8791e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def test_repr(self):
8801e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.check_repr_against_values()
8811e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8821e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw#------------------------------------------------------------------------------
8831e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8841e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsawclass TestBasicOpsUnicode(TestBasicOps):
8851e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def setUp(self):
8861e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.case   = "unicode set"
8871e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.values = [u"a", u"b", u"c"]
8881e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.set    = set(self.values)
8891e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.dup    = set(self.values)
8901e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.length = 3
8911e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8921e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def test_repr(self):
8931e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.check_repr_against_values()
8941e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8951e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw#------------------------------------------------------------------------------
8961e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
8971e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsawclass TestBasicOpsMixedStringUnicode(TestBasicOps):
8981e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def setUp(self):
8991e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.case   = "string and bytes set"
9001e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.values = ["a", "b", u"a", u"b"]
9011e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.set    = set(self.values)
9021e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.dup    = set(self.values)
9031e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        self.length = 4
9041e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
9051e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw    def test_repr(self):
9061e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw        with test_support.check_warnings():
9071e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw            self.check_repr_against_values()
9081e13eb084f72d5993cbb726e45b36bdb69c83a24Barry Warsaw
909a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
910a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
911a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef baditer():
912a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    raise TypeError
913a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield True
914a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
915a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef gooditer():
916a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    yield True
917a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
918a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestExceptionPropagation(unittest.TestCase):
919a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    """SF 628246:  Set constructor should not trap iterator TypeErrors"""
920a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
921a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_instanceWithException(self):
922a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, set, baditer())
923a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
924a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_instancesWithoutException(self):
925a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # All of these iterables should load without exception.
926a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set([1,2,3])
927a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set((1,2,3))
928a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set({'one':1, 'two':2, 'three':3})
929a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set(xrange(3))
930a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set('abc')
931a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        set(gooditer())
932a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
933fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz    def test_changingSizeWhileIterating(self):
934fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz        s = set([1,2,3])
935fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz        try:
936fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz            for i in s:
937fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz                s.update([4])
938fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz        except RuntimeError:
939fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz            pass
940fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz        else:
941fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz            self.fail("no exception when changing size during iteration")
942fcf4435ae02c3962a8ad71a9539877060c694468Neal Norwitz
943a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
944a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
945a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSetOfSets(unittest.TestCase):
946a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_constructor(self):
947a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        inner = frozenset([1])
948a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer = set([inner])
949a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        element = outer.pop()
950a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(type(element), frozenset)
951a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.add(inner)        # Rebuild set of sets with .add method
952a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.remove(inner)
953a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(outer, set())   # Verify that remove worked
954a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        outer.discard(inner)    # Absence of KeyError indicates working fine
955a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
956a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
957a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
958a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestBinaryOps(unittest.TestCase):
959a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
960a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set((2, 4, 6))
961a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
962a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_eq(self):              # SF bug 643115
963a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set({2:1,4:3,6:5}))
964a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
965a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_subset(self):
966a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([2])
967a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set((2, 4, 6)))
968a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
969a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_superset(self):
970a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([2, 4, 6, 8])
971a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
972a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
973a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_overlap(self):
974a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([3, 4, 5])
975a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 3, 4, 5, 6]))
976a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
977a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_non_overlap(self):
978a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set | set([8])
979a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
980a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
981a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_subset(self):
982a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set((2, 4))
983a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set((2, 4)))
984a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
985a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_superset(self):
986a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([2, 4, 6, 8])
987a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6]))
988a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
989a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_overlap(self):
990a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([3, 4, 5])
991a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([4]))
992a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
993a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_non_overlap(self):
994a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set & set([8])
995a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, empty_set)
996a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
9971760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint_subset(self):
9981760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(set((2, 4)))
9991760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, False)
10001760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
10011760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint_superset(self):
10021760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(set([2, 4, 6, 8]))
10031760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, False)
10041760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
10051760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint_overlap(self):
10061760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(set([3, 4, 5]))
10071760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, False)
10081760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
10091760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger    def test_isdisjoint_non_overlap(self):
10101760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        result = self.set.isdisjoint(set([8]))
10111760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger        self.assertEqual(result, True)
10121760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger
1013a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_subset(self):
1014a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((2, 4))
1015a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([6]))
1016a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1017a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_superset(self):
1018a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((2, 4, 6, 8))
1019a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([8]))
1020a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1021a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_overlap(self):
1022a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set((3, 4, 5))
1023a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 3, 5, 6]))
1024a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1025a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_non_overlap(self):
1026a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        result = self.set ^ set([8])
1027a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(result, set([2, 4, 6, 8]))
1028a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1029a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_cmp(self):
1030a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = set('a'), set('b')
1031a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, cmp, a, b)
1032a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1033a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # You can view this as a buglet:  cmp(a, a) does not raise TypeError,
1034a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
1035a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # which Python thinks is good enough to synthesize a cmp() result
1036a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # without calling __cmp__.
1037a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(cmp(a, a), 0)
1038a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1039a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1040a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1041a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1042a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestUpdateOps(unittest.TestCase):
1043a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1044a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set((2, 4, 6))
1045a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1046a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_subset(self):
1047a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([2])
1048a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set((2, 4, 6)))
1049a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1050a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_superset(self):
1051a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([2, 4, 6, 8])
1052a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
1053a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1054a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_overlap(self):
1055a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([3, 4, 5])
1056a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1057a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1058a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_non_overlap(self):
1059a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set |= set([8])
1060a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
1061a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1062a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union_method_call(self):
1063f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(set([3, 4, 5]))
1064a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
1065a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1066a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_subset(self):
1067a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set((2, 4))
1068a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set((2, 4)))
1069a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1070a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_superset(self):
1071a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([2, 4, 6, 8])
1072a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6]))
1073a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1074a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_overlap(self):
1075a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([3, 4, 5])
1076a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([4]))
1077a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1078a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_non_overlap(self):
1079a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set &= set([8])
1080a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, empty_set)
1081a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1082a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_method_call(self):
1083a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.intersection_update(set([3, 4, 5]))
1084a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([4]))
1085a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1086a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_subset(self):
1087a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((2, 4))
1088a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([6]))
1089a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1090a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_superset(self):
1091a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((2, 4, 6, 8))
1092a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([8]))
1093a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1094a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_overlap(self):
1095a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set((3, 4, 5))
1096a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 5, 6]))
1097a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1098a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_non_overlap(self):
1099a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set ^= set([8])
1100a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6, 8]))
1101a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1102a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_method_call(self):
1103a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.symmetric_difference_update(set([3, 4, 5]))
1104a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 3, 5, 6]))
1105a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1106a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_subset(self):
1107a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((2, 4))
1108a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([6]))
1109a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1110a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_superset(self):
1111a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((2, 4, 6, 8))
1112a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([]))
1113a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1114a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_overlap(self):
1115a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set((3, 4, 5))
1116a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 6]))
1117a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1118a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_non_overlap(self):
1119a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set -= set([8])
1120a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 4, 6]))
1121a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1122a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_method_call(self):
1123a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.difference_update(set([3, 4, 5]))
1124a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set([2, 6]))
1125a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1126a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1127a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1128a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestMutate(unittest.TestCase):
1129a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1130a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.values = ["a", "b", "c"]
1131a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(self.values)
1132a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1133a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_present(self):
1134a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.add("c")
1135a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abc"))
1136a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1137a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_absent(self):
1138a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.add("d")
1139a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abcd"))
1140a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1141a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_add_until_full(self):
1142a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        tmp = set()
1143a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        expected_len = 0
1144a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
1145a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            tmp.add(v)
1146a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected_len += 1
1147a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(len(tmp), expected_len)
1148a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(tmp, self.set)
1149a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1150a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_present(self):
1151a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.remove("b")
1152a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("ac"))
1153a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1154a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_absent(self):
1155a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1156a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.remove("d")
1157a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("Removing missing element should have raised LookupError")
1158a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except LookupError:
1159a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1160a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1161a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_remove_until_empty(self):
1162a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        expected_len = len(self.set)
1163a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
1164a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.remove(v)
1165a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected_len -= 1
1166a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(len(self.set), expected_len)
1167a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1168a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard_present(self):
1169a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.discard("c")
1170a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("ab"))
1171a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1172a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_discard_absent(self):
1173a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.discard("d")
1174a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set("abc"))
1175a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1176a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_clear(self):
1177a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set.clear()
1178a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(self.set), 0)
1179a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1180a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_pop(self):
1181a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        popped = {}
1182a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        while self.set:
1183a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            popped[self.set.pop()] = None
1184a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(len(popped), len(self.values))
1185a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for v in self.values:
1186aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti            self.assertIn(v, popped)
1187a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1188a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_empty_tuple(self):
1189f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(())
1190a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values))
1191a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1192a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_unit_tuple_overlap(self):
1193f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(("a",))
1194a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values))
1195a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1196a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_update_unit_tuple_non_overlap(self):
1197f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger        self.set.update(("a", "z"))
1198a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set, set(self.values + ["z"]))
1199a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1200a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1201a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1202a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsets(unittest.TestCase):
1203a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1204a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    case2method = {"<=": "issubset",
1205a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                   ">=": "issuperset",
1206a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                  }
1207a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1208a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    reverse = {"==": "==",
1209a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "!=": "!=",
1210a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "<":  ">",
1211a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               ">":  "<",
1212a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               "<=": ">=",
1213a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger               ">=": "<=",
1214a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger              }
1215a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1216a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_issubset(self):
1217a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        x = self.left
1218a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        y = self.right
1219a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for case in "!=", "==", "<", "<=", ">", ">=":
1220a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            expected = case in self.cases
1221a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Test the binary infix spelling.
1222a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            result = eval("x" + case + "y", locals())
1223a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(result, expected)
1224a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Test the "friendly" method-name spelling, if one exists.
1225a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if case in TestSubsets.case2method:
1226a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                method = getattr(x, TestSubsets.case2method[case])
1227a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                result = method(y)
1228a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertEqual(result, expected)
1229a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1230a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            # Now do the same for the operands reversed.
1231a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            rcase = TestSubsets.reverse[case]
1232a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            result = eval("y" + rcase + "x", locals())
1233a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertEqual(result, expected)
1234a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            if rcase in TestSubsets.case2method:
1235a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                method = getattr(y, TestSubsets.case2method[rcase])
1236a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                result = method(x)
1237a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertEqual(result, expected)
1238a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1239a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1240a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEqualEmpty(TestSubsets):
1241a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set()
1242a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set()
1243a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "both empty"
1244a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "==", "<=", ">="
1245a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1246a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1247a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1248a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEqualNonEmpty(TestSubsets):
1249a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1, 2])
1250a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
1251a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "equal pair"
1252a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "==", "<=", ">="
1253a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1254a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1255a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1256a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetEmptyNonEmpty(TestSubsets):
1257a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set()
1258a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
1259a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "one empty, one non-empty"
1260a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!=", "<", "<="
1261a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1262a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1263a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1264a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetPartial(TestSubsets):
1265a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1])
1266a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([1, 2])
1267a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "one a non-empty proper subset of other"
1268a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!=", "<", "<="
1269a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1270a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1271a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1272a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestSubsetNonOverlap(TestSubsets):
1273a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    left  = set([1])
1274a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    right = set([2])
1275a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    name  = "neither empty, neither contains"
1276a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    cases = "!="
1277a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1278a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1279a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1280a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsInBinaryOps(unittest.TestCase):
1281a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1282a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_eq_ne(self):
1283a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # Unlike the others, this is testing that == and != *are* allowed.
1284a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.other == self.set, False)
1285a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set == self.other, False)
1286a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.other != self.set, True)
1287a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(self.set != self.other, True)
1288a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1289f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update_operator(self):
1290a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1291a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set |= self.other
1292a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1293a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1294a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1295a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1296a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1297f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger    def test_update(self):
1298a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1299f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.set.update(self.other)
1300a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1301f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            self.assertRaises(TypeError, self.set.update, self.other)
1302a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1303a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_union(self):
1304a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set | self.other)
1305a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other | self.set)
1306a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1307a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.union(self.other)
1308a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1309a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.union, self.other)
1310a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1311a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update_operator(self):
1312a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1313a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set &= self.other
1314a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1315a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1316a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1317a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1318a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1319a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection_update(self):
1320a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1321a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.intersection_update(self.other)
1322a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1323a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1324a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.intersection_update,
1325a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1326a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1327a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_intersection(self):
1328a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set & self.other)
1329a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other & self.set)
1330a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1331a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.intersection(self.other)
1332a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1333a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.intersection, self.other)
1334a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1335a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_update_operator(self):
1336a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1337a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set ^= self.other
1338a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1339a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1340a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1341a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1342a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1343a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference_update(self):
1344a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1345a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.symmetric_difference_update(self.other)
1346a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1347a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1348a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.symmetric_difference_update,
1349a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1350a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1351a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_sym_difference(self):
1352a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set ^ self.other)
1353a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other ^ self.set)
1354a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1355a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.symmetric_difference(self.other)
1356a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1357a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
1358a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1359a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update_operator(self):
1360a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        try:
1361a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set -= self.other
1362a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        except TypeError:
1363a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            pass
1364a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1365a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.fail("expected TypeError")
1366a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1367a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference_update(self):
1368a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1369a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.difference_update(self.other)
1370a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1371a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError,
1372a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.set.difference_update,
1373a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                              self.other)
1374a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1375a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_difference(self):
1376a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.set - self.other)
1377a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertRaises(TypeError, lambda: self.other - self.set)
1378a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.otherIsIterable:
1379a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.set.difference(self.other)
1380a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        else:
1381a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertRaises(TypeError, self.set.difference, self.other)
1382a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1383a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1384a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1385a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
1386a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1387a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1388a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = 19
1389a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = False
1390a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1391a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1392a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1393a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsDict(TestOnlySetsInBinaryOps):
1394a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1395a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1396a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = {1:2, 3:4}
1397a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1398a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1399a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1400a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1401a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsTuple(TestOnlySetsInBinaryOps):
1402a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1403a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1404a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = (2, 4, 6)
1405a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1406a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1407a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1408a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1409a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsString(TestOnlySetsInBinaryOps):
1410a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1411a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1412a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = 'abc'
1413a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1414a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1415a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1416a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1417a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
1418a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1419a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        def gen():
1420a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            for i in xrange(0, 10, 2):
1421a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                yield i
1422a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set   = set((1, 2, 3))
1423a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.other = gen()
1424a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.otherIsIterable = True
1425a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1426a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1427a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1428a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopying(unittest.TestCase):
1429a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1430a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_copy(self):
1431d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        dup = list(self.set.copy())
1432d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        self.assertEqual(len(dup), len(self.set))
1433d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        for el in self.set:
1434d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti            self.assertIn(el, dup)
1435d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti            pos = dup.index(el)
1436d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti            self.assertIs(el, dup.pop(pos))
1437d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        self.assertFalse(dup)
1438a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1439a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_deep_copy(self):
1440a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        dup = copy.deepcopy(self.set)
1441d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti        self.assertSetEqual(dup, self.set)
1442a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1443a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1444a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1445a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingEmpty(TestCopying):
1446a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1447a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set()
1448a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1449a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1450a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1451a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingSingleton(TestCopying):
1452a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1453a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(["hello"])
1454a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1455a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1456a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1457a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingTriple(TestCopying):
1458a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1459a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set(["zero", 0, None])
1460a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1461a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1462a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1463a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingTuple(TestCopying):
1464a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1465a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set([(1, 2)])
1466a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1467a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#------------------------------------------------------------------------------
1468a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1469a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestCopyingNested(TestCopying):
1470a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1471a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.set = set([((1, 2), (3, 4))])
1472a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1473a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1474a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1475a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestIdentities(unittest.TestCase):
1476a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def setUp(self):
1477a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.a = set('abracadabra')
1478a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.b = set('alacazam')
1479a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1480a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_binopsVsSubsets(self):
1481a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
14825c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a - b < a)
14835c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(b - a < b)
14845c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a & b < a)
14855c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a & b < b)
14865c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a | b > a)
14875c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a | b > b)
14885c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson        self.assertTrue(a ^ b < a | b)
1489a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1490a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_commutativity(self):
1491a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
1492a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a&b, b&a)
1493a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a|b, b|a)
1494a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a^b, b^a)
1495a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if a != b:
1496a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            self.assertNotEqual(a-b, b-a)
1497a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1498a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_summations(self):
1499a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # check that sums of parts equal the whole
1500a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b = self.a, self.b
1501a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(a&b)|(b-a), a|b)
1502a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a&b)|(a^b), a|b)
1503a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual(a|(b-a), a|b)
1504a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|b, a|b)
1505a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(a&b), a)
1506a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((b-a)|(a&b), b)
1507a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)|(b-a), a^b)
1508a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1509a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_exclusion(self):
1510a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        # check that inverse operations show non-overlap
1511a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        a, b, zero = self.a, self.b, set()
1512a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a-b)&b, zero)
1513a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((b-a)&a, zero)
1514a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.assertEqual((a&b)&(a^b), zero)
1515a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1516a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger# Tests derived from test_itertools.py =======================================
1517a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1518a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef R(seqn):
1519a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Regular generator'
1520a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    for i in seqn:
1521a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        yield i
1522a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1523a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass G:
1524a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using __getitem__'
1525a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1526a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1527a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __getitem__(self, i):
1528a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self.seqn[i]
1529a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1530a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass I:
1531a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using iterator protocol'
1532a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1533a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1534a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1535a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1536a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1537a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1538a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.i >= len(self.seqn): raise StopIteration
1539a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        v = self.seqn[self.i]
1540a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i += 1
1541a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return v
1542a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1543a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass Ig:
1544a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Sequence using iterator protocol defined with a generator'
1545a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1546a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1547a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1548a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1549a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for val in self.seqn:
1550a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            yield val
1551a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1552a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass X:
1553a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Missing __getitem__ and __iter__'
1554a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1555a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1556a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1557a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1558a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        if self.i >= len(self.seqn): raise StopIteration
1559a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        v = self.seqn[self.i]
1560a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i += 1
1561a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return v
1562a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1563a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass N:
1564a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Iterator missing next()'
1565a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1566a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1567a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1568a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1569a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1570a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1571a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass E:
1572a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test propagation of exceptions'
1573a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1574a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.seqn = seqn
1575a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        self.i = 0
1576a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1577a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1578a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1579ffdb8bb99c4017152a9dca70669f9d6b9831d454Raymond Hettinger        3 // 0
1580a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1581a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass S:
1582a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test immediate stop'
1583a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __init__(self, seqn):
1584a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        pass
1585a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def __iter__(self):
1586a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        return self
1587a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def next(self):
1588a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        raise StopIteration
1589a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1590a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerfrom itertools import chain, imap
1591a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef L(seqn):
1592a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    'Test multiple tiers of iterators'
1593a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    return chain(imap(lambda x:x, R(Ig(G(seqn)))))
1594a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1595a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerclass TestVariousIteratorArgs(unittest.TestCase):
1596a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1597a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_constructor(self):
1598a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for cons in (set, frozenset):
1599a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
1600a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, S, L, R):
1601d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti                    self.assertSetEqual(cons(g(s)), set(g(s)))
1602a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, cons , X(s))
1603a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, cons , N(s))
1604a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, cons , E(s))
1605a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1606a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_inline_methods(self):
1607a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        s = set('november')
1608a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
16091760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger            for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
1610a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, L, R):
1611a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    expected = meth(data)
1612807c9da951e8596e9b9c90e4406b7087a2cdef04Terry Jan Reedy                    actual = meth(g(data))
16131760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    if isinstance(expected, bool):
16141760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                        self.assertEqual(actual, expected)
16151760c8a017ca87dc3b21d383542a23bca4370b34Raymond Hettinger                    else:
1616d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti                        self.assertSetEqual(actual, expected)
1617a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, meth, X(s))
1618a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, meth, N(s))
1619a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, meth, E(s))
1620a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1621a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    def test_inplace_methods(self):
1622a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
1623f5f41bf087c28500df9399335e7452da3a06caaeRaymond Hettinger            for methname in ('update', 'intersection_update',
1624a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                             'difference_update', 'symmetric_difference_update'):
1625a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                for g in (G, I, Ig, S, L, R):
1626a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    s = set('january')
1627a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    t = s.copy()
1628a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    getattr(s, methname)(list(g(data)))
1629a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                    getattr(t, methname)(g(data))
1630d80b4bfd0b291d543c682d7dac0841de0192a238Ezio Melotti                    self.assertSetEqual(s, t)
1631a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1632a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
1633a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
1634a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger                self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
1635a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1636f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujoclass bad_eq:
1637f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo    def __eq__(self, other):
1638f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        if be_bad:
1639f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo            set2.clear()
1640f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo            raise ZeroDivisionError
1641f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        return self is other
1642f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo    def __hash__(self):
1643f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        return 0
1644f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo
1645f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujoclass bad_dict_clear:
1646f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo    def __eq__(self, other):
1647f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        if be_bad:
1648f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo            dict2.clear()
1649f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        return self is other
1650f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo    def __hash__(self):
1651f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        return 0
1652f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo
1653f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujoclass TestWeirdBugs(unittest.TestCase):
1654f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo    def test_8420_set_merge(self):
1655f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        # This used to segfault
1656f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        global be_bad, set2, dict2
1657f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        be_bad = False
1658f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        set1 = {bad_eq()}
1659f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        set2 = {bad_eq() for i in range(75)}
1660f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        be_bad = True
1661f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        self.assertRaises(ZeroDivisionError, set1.update, set2)
1662f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo
1663f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        be_bad = False
1664f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        set1 = {bad_dict_clear()}
1665f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        dict2 = {bad_dict_clear(): None}
1666f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        be_bad = True
1667f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        set1.symmetric_difference_update(dict2)
1668f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo
1669a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka    def test_iter_and_mutate(self):
1670a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        # Issue #24581
1671a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        s = set(range(100))
1672a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        s.clear()
1673a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        s.update(range(100))
1674a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        si = iter(s)
1675a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        s.clear()
1676a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        a = list(range(100))
1677a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        s.update(range(100))
1678a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka        list(si)
1679a1b1e5f7b827084142d9ea23aee42e883a32c0adSerhiy Storchaka
16806170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger# Application tests (based on David Eppstein's graph recipes ====================================
16816170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
16826170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerdef powerset(U):
16836170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    """Generates all subsets of a set or sequence U."""
16846170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    U = iter(U)
16856170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    try:
16866170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        x = frozenset([U.next()])
16876170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for S in powerset(U):
16886170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            yield S
16896170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            yield S | x
16906170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    except StopIteration:
16916170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        yield frozenset()
16926170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
16936170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerdef cube(n):
16946170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    """Graph of n-dimensional hypercube."""
16956170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    singletons = [frozenset([x]) for x in range(n)]
16966170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    return dict([(x, frozenset([x^s for s in singletons]))
16976170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                 for x in powerset(range(n))])
16986170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
16996170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerdef linegraph(G):
17006170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    """Graph, the vertices of which are edges of G,
17016170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    with two vertices being adjacent iff the corresponding
17026170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    edges share a vertex."""
17036170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    L = {}
17046170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    for x in G:
17056170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for y in G[x]:
17066170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            nx = [frozenset([x,z]) for z in G[x] if z != y]
17076170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            ny = [frozenset([y,z]) for z in G[y] if z != x]
17086170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            L[frozenset([x,y])] = frozenset(nx+ny)
17096170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    return L
17106170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17116170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerdef faces(G):
17126170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    'Return a set of faces in G.  Where a face is a set of vertices on that face'
17136170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    # currently limited to triangles,squares, and pentagons
17146170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    f = set()
17156170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    for v1, edges in G.items():
17166170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for v2 in edges:
17176170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            for v3 in G[v2]:
17186170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                if v1 == v3:
17196170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                    continue
17206170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                if v1 in G[v3]:
17216170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                    f.add(frozenset([v1, v2, v3]))
17226170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                else:
17236170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                    for v4 in G[v3]:
17246170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                        if v4 == v2:
17256170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                            continue
17266170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                        if v1 in G[v4]:
17276170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                            f.add(frozenset([v1, v2, v3, v4]))
17286170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                        else:
17296170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                            for v5 in G[v4]:
17306170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                                if v5 == v3 or v5 == v2:
17316170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                                    continue
17326170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                                if v1 in G[v5]:
17336170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger                                    f.add(frozenset([v1, v2, v3, v4, v5]))
17346170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    return f
17356170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17366170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17376170874f9c16b45a60851821c599898f51ba02d2Raymond Hettingerclass TestGraphs(unittest.TestCase):
17386170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17396170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    def test_cube(self):
17406170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17416170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        g = cube(3)                             # vert --> {v1, v2, v3}
17426170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        vertices1 = set(g)
17436170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(len(vertices1), 8)     # eight vertices
17446170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for edge in g.values():
17456170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            self.assertEqual(len(edge), 3)      # each vertex connects to three edges
17466170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        vertices2 = set(v for edges in g.values() for v in edges)
17476170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(vertices1, vertices2)  # edge vertices in original set
17486170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17496170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        cubefaces = faces(g)
17506170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(len(cubefaces), 6)     # six faces
17516170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for face in cubefaces:
17526170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            self.assertEqual(len(face), 4)      # each face is a square
17536170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17546170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger    def test_cuboctahedron(self):
17556170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17566170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        # http://en.wikipedia.org/wiki/Cuboctahedron
17576170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        # 8 triangular faces and 6 square faces
1758b1d867f14965e2369d31a3fcdab5bca34b4d81b4Martin Panter        # 12 identical vertices each connecting a triangle and square
17596170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17606170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        g = cube(3)
17616170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        cuboctahedron = linegraph(g)            # V( --> {V1, V2, V3, V4}
17626170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(len(cuboctahedron), 12)# twelve vertices
17636170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17646170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        vertices = set(cuboctahedron)
17656170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for edges in cuboctahedron.values():
17666170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            self.assertEqual(len(edges), 4)     # each vertex connects to four other vertices
17676170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
17686170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(vertices, othervertices)   # edge vertices in original set
17696170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17706170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        cubofaces = faces(cuboctahedron)
17716170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        facesizes = collections.defaultdict(int)
17726170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for face in cubofaces:
17736170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            facesizes[len(face)] += 1
17746170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(facesizes[3], 8)       # eight triangular faces
17756170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        self.assertEqual(facesizes[4], 6)       # six square faces
17766170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17776170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        for vertex in cuboctahedron:
17786170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            edge = vertex                       # Cuboctahedron vertices are edges in Cube
17796170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            self.assertEqual(len(edge), 2)      # Two cube vertices define an edge
17806170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger            for cubevert in edge:
1781aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti                self.assertIn(cubevert, g)
17826170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
17836170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger
1784a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger#==============================================================================
1785a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1786a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerdef test_main(verbose=None):
1787a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_classes = (
1788a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSet,
178950a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        TestSetSubclass,
1790f733abb7831d6566cb0fccd0550d58ec3b7f05a4Tim Peters        TestSetSubclassWithKeywordArgs,
1791a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestFrozenSet,
179250a4bb325c29e7ac2e4727787cb5a40f995ea204Raymond Hettinger        TestFrozenSetSubclass,
1793a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSetOfSets,
1794a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestExceptionPropagation,
1795a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsEmpty,
1796a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsSingleton,
1797a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsTuple,
1798a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBasicOpsTriple,
1799a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestBinaryOps,
1800a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestUpdateOps,
1801a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestMutate,
1802a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEqualEmpty,
1803a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEqualNonEmpty,
1804a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetEmptyNonEmpty,
1805a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetPartial,
1806a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestSubsetNonOverlap,
1807a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsNumeric,
1808a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsDict,
1809a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsTuple,
1810a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsString,
1811a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestOnlySetsGenerator,
1812a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingEmpty,
1813a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingSingleton,
1814a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingTriple,
1815a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingTuple,
1816a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestCopyingNested,
1817a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestIdentities,
1818a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        TestVariousIteratorArgs,
18196170874f9c16b45a60851821c599898f51ba02d2Raymond Hettinger        TestGraphs,
1820f079c9bfbf8a1ce5eb9336a1723065d55c130ec6Éric Araujo        TestWeirdBugs,
1821a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        )
1822a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1823a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_support.run_unittest(*test_classes)
1824a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1825a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    # verify reference counting
1826a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    if verbose and hasattr(sys, "gettotalrefcount"):
1827a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        import gc
1828a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        counts = [None] * 5
1829a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        for i in xrange(len(counts)):
1830a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            test_support.run_unittest(*test_classes)
1831a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            gc.collect()
1832a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger            counts[i] = sys.gettotalrefcount()
1833a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger        print counts
1834a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger
1835a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettingerif __name__ == "__main__":
1836a690a9967e715663b7a421c9ebdad91381cdf1e4Raymond Hettinger    test_main(verbose=True)
1837