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