1import unittest
2import objc
3
4from Foundation import *
5from PyObjCTools.Conversion import *
6
7samplePropertyList = u'{ "" = 1; "x" = "2"; 1 = "one";}'
8
9class TestCollections(unittest.TestCase):
10    def assertSameArrayContents(self, a1, a2):
11        self.assertEqual(len(a1), len(a2))
12
13        if isinstance(a2, NSArray):
14            for o in a1:
15                self.assert_( a2.indexOfObject_(o) != NSNotFound )
16        else:
17            for o in a1:
18                a2.index(o)
19
20        if isinstance(a1, NSArray):
21            for o in a2:
22                self.assert_( a1.indexOfObject_(o) != NSNotFound )
23        else:
24            for o in a2:
25                a1.index(o)
26
27    def assertSameDictionaryContents(self, d1, d2):
28        self.assertEqual(len(d1), len(d2))
29
30        self.assertSameArrayContents(d1.keys(), d2.keys())
31
32        for k in d1:
33            self.assert_(d1.has_key(k), "Missing key %s in %s"%(`k`, `d1`))
34            self.assert_(d2.has_key(k), "Missing key %s in %s"%(`k`, `d2`))
35            self.assertEqual(d1[k], d2[k],
36                             "assertSameDictionary() failed for key '%s'. [%s != %s]" % (k, d1[k], d2[k]))
37        for k in d2:
38            self.assert_(d1.has_key(k), "Missing key %s in %s"%(`k`, `d1`))
39            self.assert_(d2.has_key(k), "Missing key %s in %s"%(`k`, `d2`))
40            self.assertEqual(d1[k], d2[k],
41                             "assertSameDictionary() failed for key '%s'. [%s != %s]" % (k, d1[k], d2[k]))
42
43    def testConversion(self):
44        originalNSDictionary = NSString.propertyList(samplePropertyList)
45        aPythonDictionary = pythonCollectionFromPropertyList(originalNSDictionary)
46        convertedNSDictionary = propertyListFromPythonCollection(aPythonDictionary)
47
48        self.assertSameDictionaryContents(originalNSDictionary, originalNSDictionary)
49        self.assertSameDictionaryContents(aPythonDictionary, aPythonDictionary)
50        self.assertSameDictionaryContents(originalNSDictionary, aPythonDictionary)
51        self.assertSameDictionaryContents(originalNSDictionary, convertedNSDictionary)
52        self.assertSameDictionaryContents(convertedNSDictionary, aPythonDictionary)
53
54    def testIntegerConversion(self):
55        x = NSArray.arrayWithArray_([1,2,3,4])
56        y = pythonCollectionFromPropertyList(x)
57        z = propertyListFromPythonCollection(y)
58
59        self.assertSameArrayContents(x,y)
60        self.assertSameArrayContents(x,z)
61        self.assertSameArrayContents(z,y)
62
63    def testHelpers(self):
64        def conversionHelper(anObject):
65            return anObject
66
67        self.assertRaises(TypeError, propertyListFromPythonCollection, { u'1' : type([]) })
68        propertyListFromPythonCollection({u'1' : type([])}, conversionHelper)
69
70        d = NSDictionary.dictionaryWithDictionary_( {u'1' : NSObject.alloc().init() })
71        # was: NSBundle.bundleForClass_(NSObject)} )
72        # XXX: using NSBundle doesn't work on GNUstep
73
74        self.assertRaises(TypeError, pythonCollectionFromPropertyList, d)
75        pythonCollectionFromPropertyList(d, conversionHelper)
76
77
78if __name__ == '__main__':
79    try:
80        unittest.main( )
81    except SystemExit :
82        pass
83    objc.recycleAutoreleasePool()
84