1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3
4
5try:
6    long
7except NameError:
8    long = int
9
10
11class TestPropertyList (TestCase):
12    def testFunctions(self):
13        dta = CFPropertyListCreateXMLData(None, {b"key".decode('ascii'): 42, b"key2".decode('ascii'): 1})
14        self.assertIsInstance(dta, CFDataRef)
15        self.assertArgIsOut(CFPropertyListCreateFromXMLData, 3)
16        v, err = CFPropertyListCreateFromXMLData(None, dta, 0, None)
17        self.assertIs(err, None)
18        self.assertIsInstance(v, CFDictionaryRef)
19        self.assertIn('key', v)
20        self.assertIn('key2', v)
21        self.assertEqual(v['key'] , 42)
22        self.assertEqual(v['key2'] , True)
23        v = CFPropertyListCreateDeepCopy(None, {b"key".decode('ascii'): 42, b"key2".decode('ascii'): True}, 0)
24        self.assertIsInstance(v, CFDictionaryRef)
25        self.assertIn('key', v)
26        self.assertIn('key2', v)
27        self.assertEqual(v['key'] , 42)
28        self.assertEqual(v['key2'] , True)
29        valid = CFPropertyListIsValid({b"key".decode('ascii'): 42, b"key2".decode('ascii'): True}, kCFPropertyListBinaryFormat_v1_0)
30        self.assertIs(valid, True)
31
32    def testStreams(self):
33        stream = CFWriteStreamCreateWithAllocatedBuffers(kCFAllocatorDefault, kCFAllocatorDefault)
34        r = CFWriteStreamOpen(stream)
35        self.assertTrue(r)
36
37        value = {b'key1'.decode('ascii'): 42, b'key2'.decode('ascii'): 1}
38
39        self.assertArgIsOut(CFPropertyListWriteToStream, 3)
40        rval, errorString = CFPropertyListWriteToStream(value, stream,
41                kCFPropertyListXMLFormat_v1_0, None)
42        self.assertIsInstance(rval, (int, long))
43        self.assertTrue(rval)
44        self.assertIs(errorString, None)
45        buf = CFWriteStreamCopyProperty(stream, kCFStreamPropertyDataWritten)
46        self.assertIsInstance(buf, CFDataRef)
47        buf = CFDataGetBytes(buf, (0, CFDataGetLength(buf)), None)
48        self.assertIsInstance(buf, bytes)
49        self.assertIn(b'<key>key1</key>', buf)
50        self.assertIn(b'<integer>42</integer>', buf)
51        self.assertIn(b'<key>key2</key>', buf)
52        self.assertIn(b'<integer>1</integer>', buf)
53        stream = CFReadStreamCreateWithBytesNoCopy(None, buf, len(buf), kCFAllocatorNull)
54        r = CFReadStreamOpen(stream)
55        self.assertTrue(r)
56
57        self.assertArgIsOut(CFPropertyListCreateFromStream, 4)
58        self.assertArgIsOut(CFPropertyListCreateFromStream, 5)
59        res, format, errorString = CFPropertyListCreateFromStream(None, stream, 0, 0, None, None)
60        self.assertEqual(format, kCFPropertyListXMLFormat_v1_0)
61        self.assertIs(errorString, None)
62        self.assertEqual(res, value)
63
64    def testConstants(self):
65        self.assertEqual(kCFPropertyListImmutable , 0)
66        self.assertEqual(kCFPropertyListMutableContainers , 1)
67        self.assertEqual(kCFPropertyListMutableContainersAndLeaves , 2)
68
69        self.assertEqual(kCFPropertyListOpenStepFormat , 1)
70        self.assertEqual(kCFPropertyListXMLFormat_v1_0 , 100)
71        self.assertEqual(kCFPropertyListBinaryFormat_v1_0 , 200)
72
73    @min_os_level('10.6')
74    def testConstants10_6(self):
75        self.assertEqual(kCFPropertyListReadCorruptError, 3840)
76        self.assertEqual(kCFPropertyListReadUnknownVersionError, 3841)
77        self.assertEqual(kCFPropertyListReadStreamError, 3842)
78        self.assertEqual(kCFPropertyListWriteStreamError, 3851)
79
80    @min_os_level('10.6')
81    def testFunctions10_6(self):
82        dta = CFPropertyListCreateXMLData(None, {b"key".decode('ascii'): 42, b"key2".decode('ascii'): 1})
83        self.assertIsInstance(dta, CFDataRef)
84        bytes = CFDataGetBytes(dta, (0, CFDataGetLength(dta)), None)
85        self.assertIsNot(bytes, None)
86        self.assertResultIsCFRetained(CFPropertyListCreateWithData)
87        self.assertArgIsOut(CFPropertyListCreateWithData, 3)
88        self.assertArgIsOut(CFPropertyListCreateWithData, 4)
89        v, fmt, err = CFPropertyListCreateWithData(None, dta, 0, None, None)
90        self.assertIsNot(v, None)
91        self.assertIsInstance(fmt, (int, long))
92        self.assertIs(err, None)
93        stream = CFReadStreamCreateWithBytesNoCopy(None, bytes, len(bytes), kCFAllocatorNull)
94        CFReadStreamOpen(stream)
95
96        self.assertResultIsCFRetained(CFPropertyListCreateWithStream)
97        self.assertArgIsOut(CFPropertyListCreateWithStream, 4)
98        self.assertArgIsOut(CFPropertyListCreateWithStream, 5)
99        v, fmt, err = CFPropertyListCreateWithStream(None, stream, len(bytes), 0, None, None)
100        self.assertIsNot(v, None)
101        self.assertIsInstance(fmt, (int, long))
102        self.assertIs(err, None)
103        import array
104        buf = array.array('b', b' '*1024)
105
106        stream = CFWriteStreamCreateWithBuffer(None, buf, 1024)
107        CFWriteStreamOpen(stream)
108
109        self.assertArgIsOut(CFPropertyListWrite, 4)
110        cnt, err = CFPropertyListWrite({'key':42}, stream, kCFPropertyListBinaryFormat_v1_0, 0, None)
111        self.assertNotEqual(cnt, 0)
112        self.assertEqual(err, None)
113
114        self.assertResultIsCFRetained(CFPropertyListCreateData)
115        self.assertArgIsOut(CFPropertyListCreateData, 4)
116        dta, err = CFPropertyListCreateData(None, {'key':'value'}, kCFPropertyListBinaryFormat_v1_0, 0, None)
117        self.assertIsInstance(dta, CFDataRef)
118        self.assertEqual(err, None)
119
120if __name__ == "__main__":
121    main()
122