1""" 2Tests if NSSet conforms to the interface of the python type set() 3 4This is a port of the set tests from the Python stdlib for 3.2 5""" 6from PyObjCTools.TestSupport import * 7 8import objc 9import operator 10NSSet = objc.lookUpClass('NSSet') 11NSMutableSet = objc.lookUpClass('NSMutableSet') 12 13import test.test_set 14from test.test_set import PassThru, check_pass_thru 15test.test_set.empty_set = NSMutableSet() 16 17 18 19 20class TestSet (test.test_set.TestJointOps, TestCase): 21 thetype = NSSet 22 basetype = NSSet 23 24 def test_cyclical_print(self): pass 25 def test_cyclical_repr(self): pass 26 def test_pickling(self): pass 27 def test_do_not_rehash_dict_keys(self): pass 28 def test_badcmp(self): pass 29 def test_subclass_with_custom_hash(self): pass 30 31 def test_deepcopy(self): 32 # XXX: is it possible to get this to work? 33 pass 34 35 def test_union(self): 36 # Same test as inherrited in python 2.7, but without 37 # type equality tests 38 u = self.s.union(self.otherword) 39 for c in self.letters: 40 self.assertEqual(c in u, c in self.d or c in self.otherword) 41 42 self.assertEqual(self.s, self.thetype(self.word)) 43 #self.assertEqual(type(u), self.thetype) 44 self.assertIsInstance(u, self.thetype) 45 self.assertRaises(PassThru, self.s.union, check_pass_thru()) 46 self.assertRaises(TypeError, self.s.union, [[]]) 47 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple: 48 self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd')) 49 self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg')) 50 self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc')) 51 self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef')) 52 self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg')) 53 54 # Issue #6573 55 x = self.thetype() 56 self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2])) 57 58 def test_symmetric_difference(self): 59 i = self.s.symmetric_difference(self.otherword) 60 for c in self.letters: 61 self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword)) 62 self.assertEqual(self.s, self.thetype(self.word)) 63 #self.assertEqual(type(i), self.thetype) 64 self.assertIsInstance(i, self.thetype) 65 self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru()) 66 self.assertRaises(TypeError, self.s.symmetric_difference, [[]]) 67 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple: 68 self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd')) 69 self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg')) 70 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a')) 71 self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef')) 72 73 def test_difference(self): 74 i = self.s.difference(self.otherword) 75 for c in self.letters: 76 self.assertEqual(c in i, c in self.d and c not in self.otherword) 77 self.assertEqual(self.s, self.thetype(self.word)) 78 #self.assertEqual(type(i), self.thetype) 79 self.assertIsInstance(i, self.thetype) 80 self.assertRaises(PassThru, self.s.difference, check_pass_thru()) 81 self.assertRaises(TypeError, self.s.difference, [[]]) 82 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple: 83 self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab')) 84 self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc')) 85 self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a')) 86 self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc')) 87 self.assertEqual(self.thetype('abcba').difference(), set('abc')) 88 self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c')) 89 90 def test_intersection(self): 91 i = self.s.intersection(self.otherword) 92 for c in self.letters: 93 self.assertEqual(c in i, c in self.d and c in self.otherword) 94 self.assertEqual(self.s, self.thetype(self.word)) 95 #self.assertEqual(type(i), self.thetype) 96 self.assertIsInstance(i, self.thetype) 97 self.assertRaises(PassThru, self.s.intersection, check_pass_thru()) 98 for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple: 99 self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc')) 100 self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set('')) 101 self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc')) 102 self.assertEqual(self.thetype('abcba').intersection(C('ef')), set('')) 103 self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b')) 104 s = self.thetype('abcba') 105 z = s.intersection() 106 if self.thetype == frozenset(): 107 self.assertEqual(id(s), id(z)) 108 else: 109 self.assertNotEqual(id(s), id(z)) 110 111 112 def test_copy(self): 113 dup = self.s.copy() 114 self.assertEqual(id(self.s), id(dup)) 115 116class TestMutableSet (TestSet, test.test_set.TestSet): 117 thetype = NSMutableSet 118 basetype = NSMutableSet 119 120 def test_copy(self): 121 dup = self.s.copy() 122 self.assertEqual(self.s, dup) 123 self.assertNotEqual(id(self.s), id(dup)) 124 #self.assertEqual(type(dup), self.basetype) 125 self.assertIsInstance(dup, self.basetype) 126 127 # Tests from 'TestSet' 128 def test_init(self): pass 129 def test_hash(self): pass 130 def test_weakref(self): pass 131 132class TestBasicOpsEmpty (test.test_set.TestBasicOps): 133 def setUp(self): 134 self.case = "empty set" 135 self.values = [] 136 self.set = NSMutableSet(self.values) 137 self.dup = NSMutableSet(self.values) 138 self.length = 0 139 self.repr = "{(\n)}" 140 141 def test_pickling(self): pass 142 143class TestBasicOpsSingleton (test.test_set.TestBasicOps): 144 def setUp(self): 145 self.case = "unit set (number)" 146 self.values = [3] 147 self.set = NSMutableSet(self.values) 148 self.dup = NSMutableSet(self.values) 149 self.length = 1 150 self.repr = "{(\n 3\n)}" 151 test.test_set.set = NSMutableSet 152 153 def tearDown(self): 154 del test.test_set.set 155 156 def test_pickling(self): pass 157 158class TestBasicOpsTuple (test.test_set.TestBasicOps): 159 def setUp(self): 160 self.case = "unit set (tuple)" 161 self.values = [(0, "zero")] 162 self.set = NSMutableSet(self.values) 163 self.dup = NSMutableSet(self.values) 164 self.length = 1 165 self.repr = "{(\n (\n 0,\n zero\n )\n)}" 166 test.test_set.set = NSMutableSet 167 168 def tearDown(self): 169 del test.test_set.set 170 171 def test_pickling(self): pass 172 173class TestBasicOpsTriple (test.test_set.TestBasicOps): 174 def setUp(self): 175 self.case = "triple set" 176 self.values = [0, "zero", operator.add] 177 self.set = NSMutableSet(self.values) 178 self.dup = NSMutableSet(self.values) 179 self.length = 3 180 self.repr = None 181 182 test.test_set.set = NSMutableSet 183 184 def tearDown(self): 185 del test.test_set.set 186 187 188 def test_pickling(self): pass 189 190class TestBinaryOps (test.test_set.TestBinaryOps): 191 def setUp(self): 192 self.set = NSMutableSet((2, 4, 6)) 193 194class TestUpdateOps (test.test_set.TestUpdateOps): 195 def setUp(self): 196 self.set = NSMutableSet((2, 4, 6)) 197 198class TestMutate (test.test_set.TestMutate): 199 def setUp(self): 200 self.values = ["a", "b", "c"] 201 self.set = NSMutableSet(self.values) 202 203 test.test_set.set = NSMutableSet 204 205 def tearDown(self): 206 del test.test_set.set 207 208class TestSubsetEqualEmpty (test.test_set.TestSubsetEqualEmpty): 209 left = NSMutableSet() 210 right = NSMutableSet() 211 212 213class TestSubsetEqualNonEmpty (test.test_set.TestSubsetEqualNonEmpty): 214 left = NSMutableSet([1, 2]) 215 right = NSMutableSet([1, 2]) 216 217 218class TestSubsetPartial (test.test_set.TestSubsetPartial): 219 left = NSMutableSet([1]) 220 right = NSMutableSet([1, 2]) 221 222class TestOnlySetsNumeric (test.test_set.TestOnlySetsNumeric): 223 def setUp(self): 224 self.set = NSMutableSet((1, 2, 3)) 225 self.other = 19 226 self.otherIsIterable = False 227 228class TestOnlySetsOperator (test.test_set.TestOnlySetsOperator): 229 def setUp(self): 230 self.set = NSMutableSet((1, 2, 3)) 231 self.other = operator.add 232 self.otherIsIterable = False 233 234 235class TestOnlySetsTuple (test.test_set.TestOnlySetsTuple): 236 def setUp(self): 237 self.set = NSMutableSet((1, 2, 3)) 238 self.other = (2, 4, 6) 239 self.otherIsIterable = True 240 241class TestOnlySetsString (test.test_set.TestOnlySetsString): 242 def setUp(self): 243 def gen(): 244 for i in xrange(0, 10, 2): 245 yield i 246 self.set = NSMutableSet((1, 2, 3)) 247 self.other = gen() 248 self.otherIsIterable = True 249 250class TestIdentities (test.test_set.TestIdentities): 251 def setUp(self): 252 self.a = NSMutableSet('abracadabra') 253 self.b = NSMutableSet('alacazam') 254 255 256class TestVariousIteratorArgs (test.test_set.TestVariousIteratorArgs): 257 def setUp(self): 258 test.test_set.set = NSMutableSet 259 260 def tearDown(self): 261 del test.test_set.set 262 263 def test_inplace_methods(self): 264 for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'): 265 for methname in ('update', 'intersection_update', 'difference_update', 'symmetric_difference_update'): 266 for g in (test.test_set.G, test.test_set.I, test.test_set.Ig, test.test_set.S, test.test_set.L, test.test_set.R): 267 #s = set('january') 268 s = NSMutableSet('january') 269 #t = s.copy() 270 t = s.mutableCopy() 271 getattr(s, methname)(list(g(data))) 272 getattr(t, methname)(g(data)) 273 self.assertEqual(sorted(s, key=repr), sorted(t, key=repr)) 274 275 self.assertRaises(TypeError, getattr(set('january'), methname), test.test_set.X(data)) 276 self.assertRaises(TypeError, getattr(set('january'), methname), test.test_set.N(data)) 277 self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), test.test_set.E(data)) 278 279 280 281 282 283 284class TestGraphs (test.test_set.TestGraphs): 285 def setUp(self): 286 test.test_set.set = NSMutableSet 287 288 def tearDown(self): 289 del test.test_set.set 290 291 292 293 294 295 296 297 298 299if __name__ == "__main__": 300 main() 301