1from PyObjCTools.TestSupport import *
2import time
3from CoreFoundation import *
4from Foundation import NSDictionary, NSString, NSMutableDictionary
5import sys
6
7try:
8    unicode
9except NameError:
10    unicode = str
11
12
13try:
14    long
15except NameError:
16    long = int
17
18
19class TestTimeZone (TestCase):
20    def testTypes(self):
21        self.assertIsCFType(CFTimeZoneRef)
22
23    def testTypeID(self):
24        id = CFTimeZoneGetTypeID()
25        self.assertIsInstance(id, (int, long))
26
27    def testSystemZone(self):
28        zone = CFTimeZoneCopySystem()
29        self.assertIsInstance(zone, CFTimeZoneRef)
30
31    def testResetSystem(self):
32        v = CFTimeZoneResetSystem()
33        self.assertIs(v, None )
34
35    def testCopyDefault(self):
36        zone = CFTimeZoneCopyDefault()
37        self.assertIsInstance(zone, CFTimeZoneRef)
38
39    def testNames(self):
40        self.assertResultIsCFRetained(CFTimeZoneCopyKnownNames)
41        array = CFTimeZoneCopyKnownNames()
42        self.assertIsInstance(array, CFArrayRef)
43        self.assertNotEqual(len(array) , 0 )
44        for nm in array:
45            self.assertIsInstance(nm, unicode)
46
47    def testAbbreviationDict(self):
48        map = CFTimeZoneCopyAbbreviationDictionary()
49        self.assertIsInstance(map, CFDictionaryRef)
50        for key, value in map.items():
51            self.assertIsInstance(key, unicode)
52            self.assertIsInstance(value, unicode)
53
54    @min_os_level('10.6')
55    def testAbbrievationDictSetting(self):
56        # Setting the dictionary is technically also possible
57        # on 10.5, but the code below causes a crash, even when
58        # rewritten als plan Objective-C.
59        map = CFTimeZoneCopyAbbreviationDictionary()
60        newmap = map.mutableCopy()
61        newmap[b'AAA'.decode('ascii')] = b'Europe/Amsterdam'.decode('ascii')
62
63        v = CFTimeZoneSetAbbreviationDictionary(newmap)
64        self.assertIs(v, None)
65        try:
66            map2 = CFTimeZoneCopyAbbreviationDictionary()
67            self.assertIsInstance(map2, CFDictionaryRef)
68            self.assertEqual(map2[b'AAA'.decode('ascii')] , b'Europe/Amsterdam'.decode('ascii') )
69        finally:
70            CFTimeZoneSetAbbreviationDictionary(map)
71
72    def testZoneObject(self):
73        with open('/usr/share/zoneinfo/posixrules', 'rb') as fp:
74            data = fp.read()
75        if sys.version_info[0] == 2:
76            data = buffer(data)
77        zone = CFTimeZoneCreate(None, b"Europe/Amsterdam".decode('ascii'), data)
78        self.assertIsInstance(zone, CFTimeZoneRef)
79        self.assertResultIsCFRetained(CFTimeZoneCreateWithTimeIntervalFromGMT)
80        zone = CFTimeZoneCreateWithTimeIntervalFromGMT(None, 3600)
81        self.assertIsInstance(zone, CFTimeZoneRef)
82        offset = CFTimeZoneGetSecondsFromGMT(zone, time.time())
83        self.assertEqual(offset, 3600)
84
85        zone = CFTimeZoneCreateWithName(None, "Europe/Amsterdam", True)
86        self.assertIsInstance(zone, CFTimeZoneRef)
87        name = CFTimeZoneGetName(zone)
88        self.assertEqual(name, b"Europe/Amsterdam".decode('ascii'))
89
90        data = CFTimeZoneGetData(zone)
91        self.assertIsInstance(data, CFDataRef)
92        abbrev = CFTimeZoneCopyAbbreviation(zone, time.time())
93        self.assertIsInstance(abbrev, unicode)
94        dt = CFGregorianDate(
95                year = 2008,
96                month = 7,
97                day = 1,
98                hour = 12,
99                minute = 0,
100                second = 0)
101
102        r = CFTimeZoneIsDaylightSavingTime(zone,
103                CFGregorianDateGetAbsoluteTime(dt, zone))
104        self.assertIs(r, True)
105        dt = CFGregorianDate(
106                year = 2008,
107                month = 11,
108                day = 1,
109                hour = 12,
110                minute = 0,
111                second = 0)
112
113        r = CFTimeZoneIsDaylightSavingTime(zone,
114                CFGregorianDateGetAbsoluteTime(dt, zone))
115        self.assertIn(r, (False, True))
116        offset = CFTimeZoneGetDaylightSavingTimeOffset(zone,
117                CFGregorianDateGetAbsoluteTime(dt, zone))
118        self.assertIsInstance(offset, float)
119        dt = CFTimeZoneGetNextDaylightSavingTimeTransition(
120                zone, CFGregorianDateGetAbsoluteTime(dt, zone))
121        self.assertIsInstance(dt, float)
122        nm = CFTimeZoneCopyLocalizedName(zone,
123                kCFTimeZoneNameStyleShortStandard, CFLocaleCopyCurrent())
124        self.assertIsInstance(nm, unicode)
125
126    def testConstants(self):
127        self.assertEqual(kCFTimeZoneNameStyleStandard , 0 )
128        self.assertEqual(kCFTimeZoneNameStyleShortStandard , 1 )
129        self.assertEqual(kCFTimeZoneNameStyleDaylightSaving , 2 )
130        self.assertEqual(kCFTimeZoneNameStyleShortDaylightSaving , 3 )
131        self.assertIsInstance(kCFTimeZoneSystemTimeZoneDidChangeNotification, unicode)
132        self.assertEqual(kCFTimeZoneNameStyleGeneric, 4)
133        self.assertEqual(kCFTimeZoneNameStyleShortGeneric, 5)
134
135
136if __name__ == "__main__":
137    main()
138