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