1from PyObjCTools.TestSupport import *
2import time
3from CoreFoundation import *
4from Foundation import NSDate
5
6
7try:
8    long
9except NameError:
10    long = int
11
12
13class TestDate (TestCase):
14    def testTypes(self):
15        self.assertIsCFType(CFDateRef)
16        self.assertIsCFType(CFTimeZoneRef)
17
18    def testTypeID(self):
19        v = CFDateGetTypeID()
20        self.assertIsInstance(v, (int, long))
21
22    def testConstants(self):
23        self.assertIsInstance(kCFAbsoluteTimeIntervalSince1970, float)
24        self.assertIsInstance(kCFAbsoluteTimeIntervalSince1904, float)
25        self.assertEqual(kCFGregorianUnitsYears , (1 << 0))
26        self.assertEqual(kCFGregorianUnitsMonths , (1 << 1))
27        self.assertEqual(kCFGregorianUnitsDays , (1 << 2))
28        self.assertEqual(kCFGregorianUnitsHours , (1 << 3))
29        self.assertEqual(kCFGregorianUnitsMinutes , (1 << 4))
30        self.assertEqual(kCFGregorianUnitsSeconds , (1 << 5))
31        self.assertEqual(kCFGregorianAllUnits , 0x00FFFFFF)
32
33    def testStructs(self):
34        v = CFGregorianDate()
35        self.assertHasAttr(v, 'year')
36        self.assertHasAttr(v, 'month')
37        self.assertHasAttr(v, 'day')
38        self.assertHasAttr(v, 'hour')
39        self.assertHasAttr(v, 'minute')
40        self.assertHasAttr(v, 'second')
41
42        v = CFGregorianUnits()
43        self.assertHasAttr(v, 'years')
44        self.assertHasAttr(v, 'months')
45        self.assertHasAttr(v, 'days')
46        self.assertHasAttr(v, 'hours')
47        self.assertHasAttr(v, 'minutes')
48        self.assertHasAttr(v, 'seconds')
49
50    def testAbsoluteTime(self):
51        v = CFAbsoluteTimeGetCurrent()
52        self.assertIsInstance(v, float)
53        self.assertLessThan(abs(v - time.time() + kCFAbsoluteTimeIntervalSince1970) , 1.0)
54
55    def testCreation(self):
56        now = CFAbsoluteTimeGetCurrent()
57        dt = CFDateCreate(None, now)
58        self.assertIsInstance(dt, NSDate)
59
60    def testInspection(self):
61        now = CFAbsoluteTimeGetCurrent()
62        nowtm = time.localtime()
63        dt = CFDateCreate(None, now)
64        self.assertIsInstance(dt, NSDate)
65        self.assertEqual(CFDateGetAbsoluteTime(dt) , now)
66        dt2 = CFDateCreate(None, now + 1000)
67        self.assertEqual(CFDateGetTimeIntervalSinceDate(dt2, dt) , 1000)
68        cmp = CFDateCompare(dt, dt2, 0)
69        self.assertLessThan(cmp , 0)
70        dt = CFGregorianDate()
71        dt.month = 12
72        self.assertIs(CFGregorianDateIsValid(dt, kCFGregorianUnitsMonths), True)
73        dt.month = 99
74        self.assertIs(CFGregorianDateIsValid(dt, kCFGregorianUnitsMonths), False)
75        tz = CFTimeZoneCopyDefault()
76        dt.year = 2008
77        dt.day = 1
78        dt.month = 1
79        abstime = CFGregorianDateGetAbsoluteTime(dt, tz)
80        self.assertIsInstance(abstime, float)
81        dt = CFAbsoluteTimeGetGregorianDate(now, tz)
82        self.assertEqual(dt.year , nowtm.tm_year)
83        self.assertEqual(dt.month , nowtm.tm_mon)
84        self.assertEqual(dt.day , nowtm.tm_mday)
85        self.assertEqual(dt.hour , nowtm.tm_hour)
86        self.assertEqual(dt.minute , nowtm.tm_min)
87        units = CFGregorianUnits(days = 1)
88        stamp = CFAbsoluteTimeAddGregorianUnits(now, tz, units)
89        self.assertEqual(stamp - now , 24 * 3600)
90        units = CFAbsoluteTimeGetDifferenceAsGregorianUnits(stamp, now, tz, kCFGregorianAllUnits)
91        self.assertEqual(units.days , 1)
92        self.assertEqual(units.seconds , 0)
93        v = CFAbsoluteTimeGetDayOfWeek(now, tz)
94        self.assertEqual(v , nowtm.tm_wday+1)
95        v = CFAbsoluteTimeGetDayOfYear(now, tz)
96        self.assertEqual(v , nowtm.tm_yday)
97        v = CFAbsoluteTimeGetWeekOfYear(now, tz)
98        self.assertIsInstance(v, (int, long))
99
100if __name__ == "__main__":
101    main()
102