]>
Commit | Line | Data |
---|---|---|
374ca955 A |
1 | /******************************************************************** |
2 | * COPYRIGHT: | |
3 | * Copyright (c) 2003-2004, International Business Machines Corporation | |
4 | * and others. All Rights Reserved. | |
5 | ******************************************************************** | |
6 | * Calendar Case Test is a type of CalendarTest which compares the | |
7 | * behavior of a calendar to a certain set of 'test cases', involving | |
8 | * conversion between julian-day to fields and vice versa. | |
9 | ********************************************************************/ | |
10 | ||
11 | #include "calcasts.h" | |
12 | ||
13 | #if !UCONFIG_NO_FORMATTING | |
14 | // ======= 'Main' =========================== | |
15 | ||
16 | #include "hebrwcal.h" // for Eras | |
17 | #include "unicode/datefmt.h" | |
18 | ||
19 | #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break | |
20 | ||
21 | ||
22 | void CalendarCaseTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) | |
23 | { | |
24 | if (exec) logln("TestSuite CalendarCaseTest"); | |
25 | switch (index) { | |
26 | CASE(0,IslamicCivil); | |
27 | CASE(1,Hebrew); | |
28 | default: name = ""; break; | |
29 | } | |
30 | } | |
31 | ||
32 | #undef CASE | |
33 | ||
34 | // ======= Utility functions ================= | |
35 | ||
36 | void CalendarCaseTest::doTestCases(const TestCase *cases, Calendar *cal) { | |
37 | static const int32_t ONE_SECOND = 1000; | |
38 | static const int32_t ONE_MINUTE = 60*ONE_SECOND; | |
39 | static const int32_t ONE_HOUR = 60*ONE_MINUTE; | |
40 | static const double ONE_DAY = 24*ONE_HOUR; | |
41 | static const double JULIAN_EPOCH = -210866760000000.; // 1/1/4713 BC 12:00 | |
42 | int32_t i; | |
43 | UErrorCode status = U_ZERO_ERROR; | |
44 | cal->adoptTimeZone(TimeZone::getGMT()->clone()); | |
45 | for(i=0;cases[i].era>=0;i++) { | |
46 | UDate t = (JULIAN_EPOCH+(ONE_DAY*cases[i].julian)); | |
47 | ||
48 | logln("Test case %d: julianday%f -> date %f\n", i, cases[i].julian, t); | |
49 | ||
50 | // Millis -> fields | |
51 | cal->setTime(t, status); | |
52 | ||
53 | logln(calToStr(*cal)); | |
54 | ||
55 | checkField(cal, UCAL_ERA, cases[i].era, status); | |
56 | checkField(cal, UCAL_YEAR, cases[i].year,status); | |
57 | checkField(cal, UCAL_MONTH, cases[i].month - 1,status); | |
58 | checkField(cal, UCAL_DATE, cases[i].day,status); | |
59 | checkField(cal, UCAL_DAY_OF_WEEK, cases[i].dayOfWeek,status); | |
60 | checkField(cal, UCAL_HOUR, cases[i].hour,status); | |
61 | checkField(cal, UCAL_MINUTE, cases[i].min,status); | |
62 | checkField(cal, UCAL_SECOND, cases[i].sec,status); | |
63 | ||
64 | // Fields -> millis | |
65 | cal->clear(); | |
66 | ||
67 | cal->set(UCAL_ERA, cases[i].era); | |
68 | cal->set(UCAL_YEAR, cases[i].year); | |
69 | cal->set(UCAL_MONTH, cases[i].month - 1); | |
70 | cal->set(UCAL_DATE, cases[i].day); | |
71 | cal->set(UCAL_DAY_OF_WEEK, cases[i].dayOfWeek); | |
72 | cal->set(UCAL_HOUR, cases[i].hour); | |
73 | cal->set(UCAL_MINUTE, cases[i].min); | |
74 | cal->set(UCAL_SECOND, cases[i].sec); | |
75 | ||
76 | UDate t2 = cal->getTime(status); | |
77 | ||
78 | if(t != t2) { | |
79 | errln("Field->millis: Expected %.0f but got %.0f\n", t, t2); | |
80 | logln(calToStr(*cal)); | |
81 | } | |
82 | } | |
83 | } | |
84 | ||
85 | UBool CalendarCaseTest::checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status) | |
86 | { | |
87 | if(U_FAILURE(status)) return FALSE; | |
88 | int32_t res = cal->get(field, status); | |
89 | if(U_FAILURE(status)) { | |
90 | errln((UnicodeString)"Checking field " + fieldName(field) + " and got " + u_errorName(status)); | |
91 | return FALSE; | |
92 | } | |
93 | if(res != value) { | |
94 | errln((UnicodeString)"FAIL: Checking field " + fieldName(field) + " expected " + value + " and got " + res + UnicodeString("\n")); | |
95 | return FALSE; | |
96 | } else { | |
97 | logln((UnicodeString)"Checking field " + fieldName(field) + " == " + value + UnicodeString("\n")); | |
98 | } | |
99 | return TRUE; | |
100 | } | |
101 | ||
102 | // =========== Test Cases ===================== | |
103 | enum { SUN=UCAL_SUNDAY, | |
104 | MON=UCAL_MONDAY, | |
105 | TUE=UCAL_TUESDAY, | |
106 | WED=UCAL_WEDNESDAY, | |
107 | THU=UCAL_THURSDAY, | |
108 | FRI=UCAL_FRIDAY, | |
109 | SAT=UCAL_SATURDAY}; | |
110 | ||
111 | void CalendarCaseTest::IslamicCivil() | |
112 | { | |
113 | static const TestCase tests[] = { | |
114 | // | |
115 | // Most of these test cases were taken from the back of | |
116 | // "Calendrical Calculations", with some extras added to help | |
117 | // debug a few of the problems that cropped up in development. | |
118 | // | |
119 | // The months in this table are 1-based rather than 0-based, | |
120 | // because it's easier to edit that way. | |
121 | // Islamic | |
122 | // Julian Day Era Year Month Day WkDay Hour Min Sec | |
123 | { 1507231.5, 0, -1245, 12, 9, SUN, 0, 0, 0}, | |
124 | { 1660037.5, 0, -813, 2, 23, WED, 0, 0, 0}, | |
125 | { 1746893.5, 0, -568, 4, 1, WED, 0, 0, 0}, | |
126 | { 1770641.5, 0, -501, 4, 6, SUN, 0, 0, 0}, | |
127 | { 1892731.5, 0, -157, 10, 17, WED, 0, 0, 0}, | |
128 | { 1931579.5, 0, -47, 6, 3, MON, 0, 0, 0}, | |
129 | { 1974851.5, 0, 75, 7, 13, SAT, 0, 0, 0}, | |
130 | { 2091164.5, 0, 403, 10, 5, SUN, 0, 0, 0}, | |
131 | { 2121509.5, 0, 489, 5, 22, SUN, 0, 0, 0}, | |
132 | { 2155779.5, 0, 586, 2, 7, FRI, 0, 0, 0}, | |
133 | { 2174029.5, 0, 637, 8, 7, SAT, 0, 0, 0}, | |
134 | { 2191584.5, 0, 687, 2, 20, FRI, 0, 0, 0}, | |
135 | { 2195261.5, 0, 697, 7, 7, SUN, 0, 0, 0}, | |
136 | { 2229274.5, 0, 793, 7, 1, SUN, 0, 0, 0}, | |
137 | { 2245580.5, 0, 839, 7, 6, WED, 0, 0, 0}, | |
138 | { 2266100.5, 0, 897, 6, 1, SAT, 0, 0, 0}, | |
139 | { 2288542.5, 0, 960, 9, 30, SAT, 0, 0, 0}, | |
140 | { 2290901.5, 0, 967, 5, 27, SAT, 0, 0, 0}, | |
141 | { 2323140.5, 0, 1058, 5, 18, WED, 0, 0, 0}, | |
142 | { 2334848.5, 0, 1091, 6, 2, SUN, 0, 0, 0}, | |
143 | { 2348020.5, 0, 1128, 8, 4, FRI, 0, 0, 0}, | |
144 | { 2366978.5, 0, 1182, 2, 3, SUN, 0, 0, 0}, | |
145 | { 2385648.5, 0, 1234, 10, 10, MON, 0, 0, 0}, | |
146 | { 2392825.5, 0, 1255, 1, 11, WED, 0, 0, 0}, | |
147 | { 2416223.5, 0, 1321, 1, 21, SUN, 0, 0, 0}, | |
148 | { 2425848.5, 0, 1348, 3, 19, SUN, 0, 0, 0}, | |
149 | { 2430266.5, 0, 1360, 9, 8, MON, 0, 0, 0}, | |
150 | { 2430833.5, 0, 1362, 4, 13, MON, 0, 0, 0}, | |
151 | { 2431004.5, 0, 1362, 10, 7, THU, 0, 0, 0}, | |
152 | { 2448698.5, 0, 1412, 9, 13, TUE, 0, 0, 0}, | |
153 | { 2450138.5, 0, 1416, 10, 5, SUN, 0, 0, 0}, | |
154 | { 2465737.5, 0, 1460, 10, 12, WED, 0, 0, 0}, | |
155 | { 2486076.5, 0, 1518, 3, 5, SUN, 0, 0, 0}, | |
156 | { -1,-1,-1,-1,-1,-1,-1,-1,-1 } | |
157 | }; | |
158 | ||
159 | UErrorCode status = U_ZERO_ERROR; | |
160 | Calendar *c = Calendar::createInstance("ar@calendar=islamic-civil", status); | |
161 | c->setLenient(TRUE); | |
162 | doTestCases(tests, c); | |
163 | ||
164 | static const UChar expectedUChars[] = { | |
165 | 0x0627, 0x0644, 0x062e, 0x0645, 0x064a, 0x0633, 0x002c, 0x0020, 0x0662, 0x0662, | |
166 | 0x0020, 0x0634, 0x0648, 0x0627, 0x0644, 0x002c, 0x0020, 0x0661, 0x0663, 0x0668, | |
167 | 0x0669, 0 | |
168 | }; | |
169 | UnicodeString result; | |
170 | DateFormat *fmt = DateFormat::createDateInstance(DateFormat::kFull, Locale("ar_JO@calendar=islamic-civil")); | |
171 | fmt->setTimeZone(*TimeZone::getGMT()); | |
172 | fmt->format((UDate)2486076.5, result); | |
173 | if (result != expectedUChars) { | |
174 | errln((UnicodeString)"FAIL: DateFormatting failed. Got " + result + " and expected " + UnicodeString(expectedUChars) + UnicodeString("\n")); | |
175 | errln("Maybe the resource aliasing isn't working"); | |
176 | } | |
177 | delete fmt; | |
178 | delete c; | |
179 | } | |
180 | ||
181 | void CalendarCaseTest::Hebrew() { | |
182 | static const int32_t TISHRI = HebrewCalendar::TISHRI; | |
183 | //static const int32_t HESHVAN = HebrewCalendar::HESHVAN; | |
184 | //static const int32_t KISLEV = HebrewCalendar::KISLEV; | |
185 | //static const int32_t TEVET = HebrewCalendar::TEVET; | |
186 | //static const int32_t SHEVAT = HebrewCalendar::SHEVAT; | |
187 | //static const int32_t ADAR_1 = HebrewCalendar::ADAR_1; | |
188 | //static const int32_t ADAR = HebrewCalendar::ADAR; | |
189 | //static const int32_t NISAN = HebrewCalendar::NISAN; | |
190 | //static const int32_t IYAR = HebrewCalendar::IYAR; | |
191 | //static const int32_t SIVAN = HebrewCalendar::SIVAN; | |
192 | //static const int32_t TAMUZ = HebrewCalendar::TAMUZ; | |
193 | static const int32_t AV = HebrewCalendar::AV; | |
194 | static const int32_t ELUL = HebrewCalendar::ELUL; | |
195 | ||
196 | static const TestCase tests[] = { | |
197 | // | |
198 | // Most of these test cases were taken from the back of | |
199 | // "Calendrical Calculations", with some extras added to help | |
200 | // debug a few of the problems that cropped up in development. | |
201 | // | |
202 | // The months in this table are 1-based rather than 0-based, | |
203 | // because it's easier to edit that way. | |
204 | // | |
205 | // Julian Day Era Year Month Day WkDay Hour Min Sec | |
206 | {1507231.5, 0, 3174, 12, 10, SUN, 0, 0, 0}, | |
207 | {1660037.5, 0, 3593, 3, 25, WED, 0, 0, 0}, | |
208 | {1746893.5, 0, 3831, 1, 3, WED, 0, 0, 0}, | |
209 | {1770641.5, 0, 3896, 1, 9, SUN, 0, 0, 0}, | |
210 | {1892731.5, 0, 4230, 4, 18, WED, 0, 0, 0}, | |
211 | {1931579.5, 0, 4336, 10, 4, MON, 0, 0, 0}, | |
212 | {1974851.5, 0, 4455, 2, 13, SAT, 0, 0, 0}, | |
213 | {2091164.5, 0, 4773, 9, 6, SUN, 0, 0, 0}, | |
214 | {2121509.5, 0, 4856, 9, 23, SUN, 0, 0, 0}, | |
215 | {2155779.5, 0, 4950, 8, 7, FRI, 0, 0, 0}, | |
216 | {2174029.5, 0, 5000, 7, 8, SAT, 0, 0, 0}, | |
217 | {2191584.5, 0, 5048, 8, 21, FRI, 0, 0, 0}, | |
218 | {2195261.5, 0, 5058, 9, 7, SUN, 0, 0, 0}, | |
219 | {2229274.5, 0, 5151, 11, 1, SUN, 0, 0, 0}, | |
220 | {2245580.5, 0, 5196, 5, 7, WED, 0, 0, 0}, | |
221 | {2266100.5, 0, 5252, 8, 3, SAT, 0, 0, 0}, | |
222 | {2288542.5, 0, 5314, 1, 1, SAT, 0, 0, 0}, | |
223 | {2290901.5, 0, 5320, 6, 27, SAT, 0, 0, 0}, | |
224 | {2323140.5, 0, 5408, 10, 20, WED, 0, 0, 0}, | |
225 | {2334551.5, 0, 5440, 1, 1, THU, 0, 0, 0}, | |
226 | {2334581.5, 0, 5440, 2, 1, SAT, 0, 0, 0}, | |
227 | {2334610.5, 0, 5440, 3, 1, SUN, 0, 0, 0}, | |
228 | {2334639.5, 0, 5440, 4, 1, MON, 0, 0, 0}, | |
229 | {2334668.5, 0, 5440, 5, 1, TUE, 0, 0, 0}, | |
230 | {2334698.5, 0, 5440, 6, 1, THU, 0, 0, 0}, | |
231 | {2334728.5, 0, 5440, 7, 1, SAT, 0, 0, 0}, | |
232 | {2334757.5, 0, 5440, 8, 1, SUN, 0, 0, 0}, | |
233 | {2334787.5, 0, 5440, 9, 1, TUE, 0, 0, 0}, | |
234 | {2334816.5, 0, 5440, 10, 1, WED, 0, 0, 0}, | |
235 | {2334846.5, 0, 5440, 11, 1, FRI, 0, 0, 0}, | |
236 | {2334848.5, 0, 5440, 11, 3, SUN, 0, 0, 0}, | |
237 | {2334934.5, 0, 5441, 1, 1, TUE, 0, 0, 0}, | |
238 | {2348020.5, 0, 5476, 12, 5, FRI, 0, 0, 0}, | |
239 | {2366978.5, 0, 5528, 11, 4, SUN, 0, 0, 0}, | |
240 | {2385648.5, 0, 5579, 12, 11, MON, 0, 0, 0}, | |
241 | {2392825.5, 0, 5599, 8, 12, WED, 0, 0, 0}, | |
242 | {2416223.5, 0, 5663, 8, 22, SUN, 0, 0, 0}, | |
243 | {2425848.5, 0, 5689, 12, 19, SUN, 0, 0, 0}, | |
244 | {2430266.5, 0, 5702, 1, 8, MON, 0, 0, 0}, | |
245 | {2430833.5, 0, 5703, 8, 14, MON, 0, 0, 0}, | |
246 | {2431004.5, 0, 5704, 1, 8, THU, 0, 0, 0}, | |
247 | {2448698.5, 0, 5752, 7, 12, TUE, 0, 0, 0}, | |
248 | {2450138.5, 0, 5756, 7, 5, SUN, 0, 0, 0}, | |
249 | {2465737.5, 0, 5799, 2, 12, WED, 0, 0, 0}, | |
250 | {2486076.5, 0, 5854, 12, 5, SUN, 0, 0, 0}, | |
251 | ||
252 | // Test cases taken from a table of 14 "year types" in the Help file | |
253 | // of the application "Hebrew Calendar" | |
254 | {2456187.5, 0, 5773, 1, 1, MON, 0, 0, 0}, | |
255 | {2459111.5, 0, 5781, 1, 1, SAT, 0, 0, 0}, | |
256 | {2453647.5, 0, 5766, 1, 1, TUE, 0, 0, 0}, | |
257 | {2462035.5, 0, 5789, 1, 1, THU, 0, 0, 0}, | |
258 | {2458756.5, 0, 5780, 1, 1, MON, 0, 0, 0}, | |
259 | {2460586.5, 0, 5785, 1, 1, THU, 0, 0, 0}, | |
260 | {2463864.5, 0, 5794, 1, 1, SAT, 0, 0, 0}, | |
261 | {2463481.5, 0, 5793, 1, 1, MON, 0, 0, 0}, | |
262 | {2470421.5, 0, 5812, 1, 1, THU, 0, 0, 0}, | |
263 | {2460203.5, 0, 5784, 1, 1, SAT, 0, 0, 0}, | |
264 | {2459464.5, 0, 5782, 1, 1, TUE, 0, 0, 0}, | |
265 | {2467142.5, 0, 5803, 1, 1, MON, 0, 0, 0}, | |
266 | {2455448.5, 0, 5771, 1, 1, THU, 0, 0, 0}, | |
267 | // Test cases for JB#2327 | |
268 | // http://www.fourmilab.com/documents/calendar/ | |
269 | // http://www.calendarhome.com/converter/ | |
270 | // 2452465.5, 2002, JULY, 10, 5762, AV, 1, | |
271 | // 2452494.5, 2002, AUGUST, 8, 5762, AV, 30, | |
272 | // 2452495.5, 2002, AUGUST, 9, 5762, ELUL, 1, | |
273 | // 2452523.5, 2002, SEPTEMBER, 6, 5762, ELUL, 29, | |
274 | // 2452524.5, 2002, SEPTEMBER, 7, 5763, TISHRI, 1, | |
275 | // Julian Day Era Year Month Day WkDay Hour Min Sec | |
276 | {2452465.5, 0, 5762, AV+1, 1, WED, 0, 0, 0}, | |
277 | {2452494.5, 0, 5762, AV+1, 30, THU, 0, 0, 0}, | |
278 | {2452495.5, 0, 5762, ELUL+1, 1, FRI, 0, 0, 0}, | |
279 | {2452523.5, 0, 5762, ELUL+1, 29, FRI, 0, 0, 0}, | |
280 | {2452524.5, 0, 5763, TISHRI+1, 1, SAT, 0, 0, 0}, | |
281 | { -1,-1,-1,-1,-1,-1,-1,-1,-1 } | |
282 | }; | |
283 | ||
284 | UErrorCode status = U_ZERO_ERROR; | |
285 | Calendar *c = Calendar::createInstance("he_HE@calendar=hebrew", status); | |
286 | c->setLenient(TRUE); | |
287 | doTestCases(tests, c); | |
288 | ||
289 | ||
290 | // Additional test cases for bugs found during development | |
291 | // G.YY/MM/DD Era Year Month Day WkDay Hour Min Sec | |
292 | //{1013, 9, 8, 0, 4774, 1, 1, TUE, 0, 0, 0}, | |
293 | //{1239, 9, 1, 0, 5000, 1, 1, THU, 0, 0, 0}, | |
294 | //{1240, 9,18, 0, 5001, 1, 1, TUE, 0, 0, 0}, | |
295 | ||
296 | ||
297 | delete c; | |
298 | } | |
299 | ||
300 | ||
301 | #endif |