1from PyObjCTools.TestSupport import *
2from CoreFoundation import *
3import datetime
4
5try:
6    long
7except NameError:
8    long = int
9
10
11class TestCFCalendarVariadic (TestCase):
12    def testTypes(self):
13        self.assertIsCFType(CFCalendarRef)
14
15    def testCFCalendarComposeAbsoluteTime(self):
16        calendar = CFCalendarCreateWithIdentifier(
17                None, kCFGregorianCalendar)
18        self.assertIsInstance(calendar, CFCalendarRef)
19
20        success, at = CFCalendarComposeAbsoluteTime(
21                calendar, None, b"")
22        self.assertEqual(success, True)
23        self.assert_(isinstance(at, float))
24
25        success, at = CFCalendarComposeAbsoluteTime(
26                calendar, None, b"yMdHms", 1965, 1, 6, 14, 10, 0)
27        self.assertEqual(success, True)
28        self.assert_(isinstance(at, float))
29
30    def testCFCalendarAddComponents(self):
31        calendar = CFCalendarCreateWithIdentifier(
32                None, kCFGregorianCalendar)
33        self.assertIsInstance(calendar, CFCalendarRef)
34
35        success, at = CFCalendarComposeAbsoluteTime(
36                calendar, None, b"yMdHms", 1965, 1, 6, 14, 10, 0)
37        self.assertEqual(success, True)
38        self.assert_(isinstance(at, float))
39
40        success, at2 = CFCalendarAddComponents(
41                calendar, at, 0, b"yH", 2, 3)
42        self.assertEqual(success, True)
43        self.assert_(isinstance(at2, float))
44
45        success, y, H = CFCalendarGetComponentDifference(
46                calendar, at, at2, 0, b"yH")
47        self.assertEqual(success, True)
48        self.assertEqual(y, 2)
49        self.assertEqual(H, 3)
50
51    def testCFCalendarDecomposeAbsoluteTime(self):
52        calendar = CFCalendarCreateWithIdentifier(
53                None, kCFGregorianCalendar)
54        self.assert_(calendar is not None)
55
56        success, at = CFCalendarComposeAbsoluteTime(
57                calendar, None, b"yMdHms", 1965, 1, 6, 14, 10, 0)
58        self.assertEqual(success, True)
59        self.assert_(isinstance(at, float))
60
61        success, y, M, d, H, m, s = CFCalendarDecomposeAbsoluteTime(
62                calendar, at, b"yMdHms")
63        self.assertEqual(y, 1965)
64        self.assertEqual(M, 1)
65        self.assertEqual(d, 6)
66        self.assertEqual(H, 14)
67        self.assertEqual(m, 10)
68        self.assertEqual(s, 0)
69
70    def testCFCalendarGetComponentDifference(self):
71        calendar = CFCalendarCreateWithIdentifier(
72                None, kCFGregorianCalendar)
73        self.assert_(calendar is not None)
74
75        success, at1 = CFCalendarComposeAbsoluteTime(
76                calendar, None, b"yMdHms", 1965, 1, 6, 14, 10, 0)
77        self.assertEqual(success, True)
78        self.assert_(isinstance(at1, float))
79
80        success, at2 = CFCalendarComposeAbsoluteTime(
81                calendar, None, b"yMdHms", 1967, 2, 6, 14, 10, 0)
82        self.assertEqual(success, True)
83        self.assert_(isinstance(at2, float))
84
85        success, y, M = CFCalendarGetComponentDifference(
86                calendar, at1, at2, 0, b"yM")
87        self.assertEqual(success, True)
88        self.assertEqual(y, 2)
89        self.assertEqual(M, 1)
90
91    def testTypeID(self):
92        v = CFCalendarGetTypeID()
93        self.assertIsInstance(v, (int, long))
94
95    def testCreation(self):
96        cal = CFCalendarCopyCurrent()
97        self.assertIsInstance(cal, CFCalendarRef)
98        cal = CFCalendarCreateWithIdentifier(None, kCFBuddhistCalendar)
99        self.assertIsInstance(cal, CFCalendarRef)
100
101    def testInspection(self):
102        cal = CFCalendarCreateWithIdentifier(None, kCFGregorianCalendar)
103        self.assertIsInstance(cal, CFCalendarRef)
104        name = CFCalendarGetIdentifier(cal)
105        self.assertEqual(name , kCFGregorianCalendar)
106        locale = CFCalendarCopyLocale(cal)
107        self.assertIsInstance(locale, CFLocaleRef)
108        timezone = CFCalendarCopyTimeZone(cal)
109        self.assertIsInstance(timezone, CFTimeZoneRef)
110        weekday = CFCalendarGetFirstWeekday(cal)
111        self.assertLessEqual(0 <= weekday , 7)
112        num = CFCalendarGetMinimumDaysInFirstWeek(cal)
113        self.assertLessEqual(0 <= num , 7)
114        rng = CFCalendarGetMinimumRangeOfUnit(cal, kCFCalendarUnitEra)
115        self.assertIsInstance(rng, CFRange)
116        rng = CFCalendarGetMaximumRangeOfUnit(cal, kCFCalendarUnitEra)
117        self.assertIsInstance(rng, CFRange)
118        m = datetime.date.today()
119        if m.month in (1,3,5,7,8,10,12):
120            monthLength=31
121        elif m.month in (4, 6, 9, 11):
122            monthLength=30
123        else:
124            if m.year % 4 == 0:
125                # Yes this is wrong, but the next time this fails in
126                # in 2100.
127                monthLength = 29
128            else:
129                monthLength = 28
130        rng = CFCalendarGetRangeOfUnit(cal, kCFCalendarUnitDay, kCFCalendarUnitMonth, CFAbsoluteTimeGetCurrent())
131        self.assertIsInstance(rng, CFRange)
132        self.assertEqual(rng.location, 1)
133        self.assertEqual(rng.length, monthLength)
134
135        v = CFCalendarGetOrdinalityOfUnit(cal, kCFCalendarUnitDay, kCFCalendarUnitYear, CFAbsoluteTimeGetCurrent())
136        self.assertIsInstance(v, (int, long))
137        ok, startp, tip = CFCalendarGetTimeRangeOfUnit(cal, kCFCalendarUnitDay, CFAbsoluteTimeGetCurrent(), None, None)
138        self.assertIs(ok, True)
139        self.assertIsInstance(startp, float)
140        self.assertIsInstance(tip, float)
141        self.assertEqual(tip , 86400.0)
142
143    def testMutation(self):
144        cal = CFCalendarCreateWithIdentifier(None, kCFBuddhistCalendar)
145
146        loc = CFLocaleCreate(None, b"mr_IN".decode('latin1'))
147        self.assertIsInstance(loc, CFLocaleRef)
148        id1 = CFLocaleGetIdentifier(loc)
149
150        orig_loc = CFCalendarCopyLocale(cal)
151        self.assertIsInstance(orig_loc, CFLocaleRef)
152        orig_id = CFLocaleGetIdentifier(orig_loc)
153        CFCalendarSetLocale(cal, loc)
154        new_loc = CFCalendarCopyLocale(cal)
155        self.assertIsInstance(new_loc, CFLocaleRef)
156        new_id = CFLocaleGetIdentifier(new_loc)
157
158        self.assertEqual(new_id , id1)
159        self.assertNotEqual(orig_id , id1)
160        tz = CFTimeZoneCreateWithName(None, b"Pacific/Wallis".decode('latin1'), True)
161        self.assertIsInstance(tz, CFTimeZoneRef)
162        orig_zone = CFCalendarCopyTimeZone(cal)
163        self.assertIsInstance(orig_zone, CFTimeZoneRef)
164        CFCalendarSetTimeZone(cal, tz)
165        new_zone = CFCalendarCopyTimeZone(cal)
166        self.assertIsInstance(new_zone, CFTimeZoneRef)
167        self.assertEqual(CFTimeZoneGetName(new_zone) , b'Pacific/Wallis'.decode('latin1') )
168        weekday = CFCalendarGetFirstWeekday(cal)
169        weekday = weekday + 2 % 7
170        CFCalendarSetFirstWeekday(cal, weekday)
171        new = CFCalendarGetFirstWeekday(cal)
172        self.assertEqual(new , weekday)
173        num = CFCalendarGetMinimumDaysInFirstWeek(cal)
174        if num == 1:
175            num = 2
176        else:
177            num = 1
178
179        CFCalendarSetMinimumDaysInFirstWeek(cal, num)
180        num2 = CFCalendarGetMinimumDaysInFirstWeek(cal)
181        self.assertEqual(num2 , num)
182
183    def testConstants(self):
184        self.assertEqual(kCFCalendarUnitEra , (1 << 1) )
185        self.assertEqual(kCFCalendarUnitYear , (1 << 2) )
186        self.assertEqual(kCFCalendarUnitMonth , (1 << 3) )
187        self.assertEqual(kCFCalendarUnitDay , (1 << 4) )
188        self.assertEqual(kCFCalendarUnitHour , (1 << 5) )
189        self.assertEqual(kCFCalendarUnitMinute , (1 << 6) )
190        self.assertEqual(kCFCalendarUnitSecond , (1 << 7) )
191        self.assertEqual(kCFCalendarUnitWeek , (1 << 8) )
192        self.assertEqual(kCFCalendarUnitWeekday , (1 << 9) )
193        self.assertEqual(kCFCalendarUnitWeekdayOrdinal , (1 << 10) )
194        self.assertEqual(kCFCalendarComponentsWrap , (1 << 0) )
195
196    @min_os_level('10.6')
197    def testConstants10_6(self):
198        self.assertEqual(kCFCalendarUnitQuarter, 1<<11)
199
200    @min_os_level('10.7')
201    def testConstants10_7(self):
202        self.assertEqual(kCFCalendarUnitWeekOfMonth, 1<<12)
203        self.assertEqual(kCFCalendarUnitWeekOfYear, 1<<13)
204        self.assertEqual(kCFCalendarUnitYearForWeekOfYear, 1<<14)
205
206
207if __name__ == "__main__":
208    main()
209