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