1from PyObjCTools.TestSupport import *
2import re
3from CoreFoundation import *
4
5
6class TestCFUUIDAPI (TestCase):
7    def testTypes(self):
8        self.failUnlessIsCFType(CFUUIDRef)
9
10    def testTypeID(self):
11        v = CFUUIDGetTypeID()
12        self.failUnless(isinstance(v, (int, long)))
13
14    def testCreate(self):
15
16        self.failUnlessResultIsCFRetained(CFUUIDCreate)
17        uuid = CFUUIDCreate(None)
18        self.failIf(uuid is None)
19        self.failUnless(isinstance(uuid, CFUUIDRef))
20
21        text = CFUUIDCreateString(None, uuid)
22        self.failUnless(isinstance(text, unicode))
23        m = re.match('^[0-9A-Z]{8}(-[0-9A-Z]{4}){3}-[0-9A-Z]{12}$', text)
24        self.failIf( m is None )
25
26    def testCreateWithBytes(self):
27        self.failUnlessResultIsCFRetained(CFUUIDCreateWithBytes)
28        uuid = CFUUIDCreateWithBytes(None, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
29        self.failIf(uuid is None)
30        self.failUnless(isinstance(uuid, CFUUIDRef))
31
32        self.failUnlessResultIsCFRetained(CFUUIDCreateString)
33        text = CFUUIDCreateString(None, uuid)
34        self.failUnless(text == u'01020304-0506-0708-090A-0B0C0D0E0F10')
35
36        self.assertRaises(ValueError, CFUUIDCreateWithBytes, None, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 300)
37        self.assertRaises(ValueError, CFUUIDCreateWithBytes, None, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 300, 16)
38
39    def testCreateFromString(self):
40        self.failUnlessResultIsCFRetained(CFUUIDCreateFromString)
41        uuid1 = CFUUIDCreateFromString(None, u'01020304-0506-0708-090A-0B0C0D0E0F10')
42        self.failIf(uuid1 is None)
43        self.failUnless(isinstance(uuid1, CFUUIDRef))
44
45        text = CFUUIDCreateString(None, uuid1)
46        self.failUnless(text == u'01020304-0506-0708-090A-0B0C0D0E0F10')
47
48        uuid2 = CFUUIDCreateFromString(None, u'01020304-0506-0708-090A-0B0C0D0E0F10')
49        text = CFUUIDCreateString(None, uuid2)
50        self.failUnless(text == u'01020304-0506-0708-090A-0B0C0D0E0F10')
51
52        # CFUUID interns values
53        self.failUnless(uuid1 is uuid2)
54
55    def testGetBytes(self):
56        uuid = CFUUIDCreateWithBytes(None, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
57        self.failIf(uuid is None)
58        self.failUnless(isinstance(uuid, CFUUIDRef))
59
60        bytes = CFUUIDGetUUIDBytes(uuid)
61        self.failUnless( isinstance(bytes, CFUUIDBytes) )
62        self.failUnless(bytes.byte0 == 1)
63        self.failUnless(bytes.byte1 == 2)
64        self.failUnless(bytes.byte2 == 3)
65        self.failUnless(bytes.byte3 == 4)
66        self.failUnless(bytes.byte4 == 5)
67        self.failUnless(bytes.byte5 == 6)
68        self.failUnless(bytes.byte6 == 7)
69        self.failUnless(bytes.byte7 == 8)
70        self.failUnless(bytes.byte8 == 9)
71        self.failUnless(bytes.byte9 == 10)
72        self.failUnless(bytes.byte10 == 11)
73        self.failUnless(bytes.byte11 == 12)
74        self.failUnless(bytes.byte12 == 13)
75        self.failUnless(bytes.byte13 == 14)
76        self.failUnless(bytes.byte14 == 15)
77        self.failUnless(bytes.byte15 == 16)
78
79    def testConstant(self):
80        # This is an interesting one, the result of
81        # CFUUIDGetConstantUUIDWithBytes should not be released.
82
83        uuid = CFUUIDGetConstantUUIDWithBytes(None, *range(16))
84        CFRetain(CFUUIDGetConstantUUIDWithBytes) # Ensure the value won't be released.
85        self.failIf(uuid is None)
86        self.failUnless(isinstance(uuid, CFUUIDRef))
87
88        s = CFUUIDCreateString(None, uuid)
89
90        uuid = None
91        del uuid
92
93        uuid = CFUUIDGetConstantUUIDWithBytes(None, *range(16))
94        self.failIf(uuid is None)
95        self.failUnless(isinstance(uuid, CFUUIDRef))
96
97        t = CFUUIDCreateString(None, uuid)
98
99        self.failUnless(s == t)
100
101    def testCreateFromUUIDBytes(self):
102        bytes = CFUUIDBytes(*range(16, 32))
103        uuid = CFUUIDCreateFromUUIDBytes(None, bytes)
104
105        self.failIf(uuid is None)
106        self.failUnless(isinstance(uuid, CFUUIDRef))
107
108        text = CFUUIDCreateString(None, uuid)
109        self.failUnless( text == u'10111213-1415-1617-1819-1A1B1C1D1E1F' )
110
111    def testStructs(self):
112        o = CFUUIDBytes()
113        self.failUnless( hasattr(o, 'byte0') )
114        self.failUnless( hasattr(o, 'byte1') )
115        self.failUnless( hasattr(o, 'byte2') )
116        self.failUnless( hasattr(o, 'byte3') )
117        self.failUnless( hasattr(o, 'byte4') )
118        self.failUnless( hasattr(o, 'byte5') )
119        self.failUnless( hasattr(o, 'byte6') )
120        self.failUnless( hasattr(o, 'byte7') )
121        self.failUnless( hasattr(o, 'byte8') )
122        self.failUnless( hasattr(o, 'byte9') )
123        self.failUnless( hasattr(o, 'byte10') )
124        self.failUnless( hasattr(o, 'byte11') )
125        self.failUnless( hasattr(o, 'byte12') )
126        self.failUnless( hasattr(o, 'byte13') )
127        self.failUnless( hasattr(o, 'byte14') )
128        self.failUnless( hasattr(o, 'byte15') )
129
130if __name__ == "__main__":
131    main()
132