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