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