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