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