]>
Commit | Line | Data |
---|---|---|
1 | /******************************************************************** | |
2 | * COPYRIGHT: | |
3 | * Copyright (c) 1997-2010, International Business Machines Corporation and | |
4 | * others. All Rights Reserved. | |
5 | ********************************************************************/ | |
6 | /******************************************************************************** | |
7 | * | |
8 | * File CDTRGTST.C | |
9 | * | |
10 | * Madhu Katragadda Ported for C API | |
11 | * Modification History: | |
12 | * Date Name Description | |
13 | * 07/15/99 helena Ported to HPUX 10/11 CC. | |
14 | ********************************************************************************* | |
15 | */ | |
16 | /* REGRESSION TEST FOR DATE FORMAT */ | |
17 | ||
18 | #include "unicode/utypes.h" | |
19 | ||
20 | #if !UCONFIG_NO_FORMATTING | |
21 | ||
22 | #include "unicode/uloc.h" | |
23 | #include "unicode/udat.h" | |
24 | #include "unicode/ucal.h" | |
25 | #include "unicode/unum.h" | |
26 | #include "unicode/ustring.h" | |
27 | #include "cintltst.h" | |
28 | #include "cdtrgtst.h" | |
29 | #include "cmemory.h" | |
30 | ||
31 | void addDateForRgrTest(TestNode** root); | |
32 | ||
33 | void addDateForRgrTest(TestNode** root) | |
34 | { | |
35 | addTest(root, &Test4029195, "tsformat/cdtrgtst/Test4029195"); | |
36 | addTest(root, &Test4056591, "tsformat/cdtrgtst/Test4056591"); | |
37 | addTest(root, &Test4059917, "tsformat/cdtrgtst/Test4059917"); | |
38 | addTest(root, &Test4060212, "tsformat/cdtrgtst/Test4060212"); | |
39 | addTest(root, &Test4061287, "tsformat/cdtrgtst/Test4061287"); | |
40 | addTest(root, &Test4073003, "tsformat/cdtrgtst/Test4073003"); | |
41 | addTest(root, &Test4162071, "tsformat/cdtrgtst/Test4162071"); | |
42 | addTest(root, &Test714, "tsformat/cdtrgtst/Test714"); | |
43 | addTest(root, &Test_GEec, "tsformat/cdtrgtst/Test_GEec"); /* tests for format chars GEec, jitterbugs 5726 6072 6585 */ | |
44 | } | |
45 | ||
46 | /** | |
47 | * @bug 4029195 | |
48 | */ | |
49 | void Test4029195() | |
50 | { | |
51 | int32_t resultlength, resultlengthneeded; | |
52 | UChar *fmdt, *todayS, *rt; | |
53 | UChar *pat=NULL; | |
54 | UChar *temp; | |
55 | UDate today, d1; | |
56 | UDateFormat *df; | |
57 | int32_t parsepos; | |
58 | UErrorCode status = U_ZERO_ERROR; | |
59 | ||
60 | log_verbose("Testing date format and parse function in regression test\n"); | |
61 | today = ucal_getNow(); | |
62 | ||
63 | df = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,"en_US", NULL, 0, NULL, 0, &status); | |
64 | if(U_FAILURE(status)) | |
65 | { | |
66 | log_data_err("FAIL: error in creating the dateformat using default date and time style : %s (Are you missing data?)\n", myErrorName(status)); | |
67 | return; | |
68 | } | |
69 | resultlength=0; | |
70 | resultlengthneeded=udat_toPattern(df, TRUE, NULL, resultlength, &status); | |
71 | if(status==U_BUFFER_OVERFLOW_ERROR) | |
72 | { | |
73 | status=U_ZERO_ERROR; | |
74 | resultlength=resultlengthneeded + 1; | |
75 | pat=(UChar*)malloc(sizeof(UChar) * resultlength); | |
76 | udat_toPattern(df, TRUE, pat, resultlength, &status); | |
77 | } | |
78 | ||
79 | log_verbose("pattern: %s\n", austrdup(pat)); | |
80 | ||
81 | ||
82 | fmdt = myFormatit(df, today); | |
83 | if(fmdt) { | |
84 | log_verbose("today: %s\n", austrdup(fmdt)); | |
85 | } else { | |
86 | log_data_err("ERROR: couldn't format, exitting test"); | |
87 | return; | |
88 | } | |
89 | ||
90 | temp=(UChar*)malloc(sizeof(UChar) * 10); | |
91 | u_uastrcpy(temp, "M yyyy dd"); | |
92 | udat_applyPattern(df, TRUE, temp, u_strlen(temp)); | |
93 | ||
94 | todayS =myFormatit(df, today); | |
95 | log_verbose("After teh pattern is applied\n today: %s\n", austrdup(todayS) ); | |
96 | parsepos=0; | |
97 | d1=udat_parse(df, todayS, u_strlen(todayS), &parsepos, &status); | |
98 | if(U_FAILURE(status)) | |
99 | { | |
100 | log_err("FAIL: Error in parsing using udat_parse(.....): %s\n", myErrorName(status)); | |
101 | } | |
102 | ||
103 | rt =myFormatit(df, d1); | |
104 | log_verbose("today: %s\n", austrdup(rt) ); | |
105 | ||
106 | log_verbose("round trip: %s\n", austrdup(rt) ); | |
107 | ||
108 | if(u_strcmp(rt, todayS)!=0) { | |
109 | log_err("Fail: Want %s Got %s\n", austrdup(todayS), austrdup(rt) ); | |
110 | } | |
111 | else | |
112 | log_verbose("Pass: parse and format working fine\n"); | |
113 | udat_close(df); | |
114 | free(temp); | |
115 | if(pat != NULL) { | |
116 | free(pat); | |
117 | } | |
118 | } | |
119 | ||
120 | ||
121 | /** | |
122 | * @bug 4056591 | |
123 | * Verify the function of the [s|g]et2DigitYearStart() API. | |
124 | */ | |
125 | void Test4056591() | |
126 | { | |
127 | int i; | |
128 | UCalendar *cal; | |
129 | UDateFormat *def; | |
130 | UDate start,exp,got; | |
131 | UChar s[10]; | |
132 | UChar *gotdate, *expdate; | |
133 | UChar pat[10]; | |
134 | UDate d[4]; | |
135 | UErrorCode status = U_ZERO_ERROR; | |
136 | const char* strings[] = { | |
137 | "091225", | |
138 | "091224", | |
139 | "611226", | |
140 | "991227" | |
141 | }; | |
142 | ||
143 | log_verbose("Testing s[get] 2 digit year start regressively\n"); | |
144 | cal=ucal_open(NULL, 0, "en_US", UCAL_GREGORIAN, &status); | |
145 | if(U_FAILURE(status)){ | |
146 | log_data_err("error in ucal_open caldef : %s - (Are you missing data?)\n", myErrorName(status)); | |
147 | return; | |
148 | } | |
149 | ucal_setDateTime(cal, 1809, UCAL_DECEMBER, 25, 17, 40, 30, &status); | |
150 | d[0]=ucal_getMillis(cal, &status); | |
151 | if(U_FAILURE(status)){ | |
152 | log_err("Error: failure in get millis: %s\n", myErrorName(status)); | |
153 | } | |
154 | ucal_setDateTime(cal, 1909, UCAL_DECEMBER, 24, 17, 40, 30, &status); | |
155 | d[1]=ucal_getMillis(cal, &status); | |
156 | ucal_setDateTime(cal, 1861, UCAL_DECEMBER, 26, 17, 40, 30, &status); | |
157 | d[2]=ucal_getMillis(cal, &status); | |
158 | ucal_setDateTime(cal, 1999, UCAL_DECEMBER, 27, 17, 40, 30, &status); | |
159 | d[3]=ucal_getMillis(cal, &status); | |
160 | ||
161 | ||
162 | u_uastrcpy(pat, "yyMMdd"); | |
163 | def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL, NULL, 0, pat, u_strlen(pat), &status); | |
164 | if(U_FAILURE(status)) | |
165 | { | |
166 | log_err_status(status, "FAIL: error in creating the dateformat using u_openPattern(): %s\n", myErrorName(status)); | |
167 | return; | |
168 | } | |
169 | start = 1800; | |
170 | udat_set2DigitYearStart(def, start, &status); | |
171 | if(U_FAILURE(status)) | |
172 | log_err("ERROR: in setTwoDigitStartDate: %s\n", myErrorName(status)); | |
173 | if( (udat_get2DigitYearStart(def, &status) != start)) | |
174 | log_err("ERROR: get2DigitYearStart broken\n"); | |
175 | ||
176 | ||
177 | for(i = 0; i < 4; ++i) { | |
178 | u_uastrcpy(s, strings[i]); | |
179 | exp = d[i]; | |
180 | got = udat_parse(def, s, u_strlen(s), 0, &status); | |
181 | gotdate=myFormatit(def, got); | |
182 | expdate=myFormatit(def, exp); | |
183 | ||
184 | if (gotdate == NULL || expdate == NULL) { | |
185 | log_err("myFormatit failed!\n"); | |
186 | } | |
187 | else if(u_strcmp(gotdate, expdate) !=0){ | |
188 | log_err("set2DigitYearStart broken for %s \n got: %s, expected: %s\n", austrdup(s), | |
189 | austrdup(gotdate), austrdup(expdate) ); | |
190 | } | |
191 | } | |
192 | ||
193 | udat_close(def); | |
194 | ucal_close(cal); | |
195 | } | |
196 | ||
197 | ||
198 | /** | |
199 | * SimpleDateFormat does not properly parse date strings without delimiters | |
200 | * @bug 4059917 | |
201 | */ | |
202 | void Test4059917() | |
203 | { | |
204 | UDateFormat* def; | |
205 | UChar *myDate; | |
206 | UErrorCode status = U_ZERO_ERROR; | |
207 | UChar pattern[11]; | |
208 | UChar tzID[4]; | |
209 | ||
210 | log_verbose("Testing apply pattern and to pattern regressively\n"); | |
211 | u_uastrcpy(tzID, "PST"); | |
212 | u_uastrcpy(pattern, "yyyy/MM/dd"); | |
213 | log_verbose("%s\n", austrdup(pattern) ); | |
214 | def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,tzID,-1,pattern, u_strlen(pattern),&status); | |
215 | if(U_FAILURE(status)) | |
216 | { | |
217 | log_data_err("FAIL: error in creating the dateformat using openPattern: %s - (Are you missing data?)\n", myErrorName(status)); | |
218 | return; | |
219 | } | |
220 | myDate=(UChar*)malloc(sizeof(UChar) * 11); | |
221 | u_uastrcpy(myDate, "1970/01/12"); | |
222 | ||
223 | aux917( def, myDate ); | |
224 | udat_close(def); | |
225 | ||
226 | u_uastrcpy(pattern, "yyyyMMdd"); | |
227 | def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,tzID,-1,pattern, u_strlen(pattern),&status); | |
228 | if(U_FAILURE(status)) | |
229 | { | |
230 | log_err("FAIL: error in creating the dateformat using openPattern: %s\n", myErrorName(status)); | |
231 | return; | |
232 | } | |
233 | u_uastrcpy(myDate, "19700112"); | |
234 | aux917( def, myDate ); | |
235 | udat_close(def); | |
236 | free(myDate); | |
237 | } | |
238 | ||
239 | void aux917( UDateFormat *fmt, UChar* str) | |
240 | { | |
241 | int32_t resultlength, resultlengthneeded; | |
242 | UErrorCode status = U_ZERO_ERROR; | |
243 | UChar* formatted=NULL; | |
244 | UChar *pat=NULL; | |
245 | UDate d1=1000000000.0; | |
246 | ||
247 | resultlength=0; | |
248 | resultlengthneeded=udat_toPattern(fmt, TRUE, NULL, resultlength, &status); | |
249 | if(status==U_BUFFER_OVERFLOW_ERROR) | |
250 | { | |
251 | status=U_ZERO_ERROR; | |
252 | resultlength=resultlengthneeded + 1; | |
253 | pat=(UChar*)malloc(sizeof(UChar) * (resultlength)); | |
254 | udat_toPattern(fmt, TRUE, pat, resultlength, &status); | |
255 | } | |
256 | if(U_FAILURE(status)){ | |
257 | log_err("failure in retrieving the pattern: %s\n", myErrorName(status)); | |
258 | } | |
259 | log_verbose("pattern: %s\n", austrdup(pat) ); | |
260 | ||
261 | status = U_ZERO_ERROR; | |
262 | formatted = myFormatit(fmt, d1); | |
263 | if( u_strcmp(formatted,str)!=0) { | |
264 | log_err("Fail: Want %s Got: %s\n", austrdup(str), austrdup(formatted) ); | |
265 | } | |
266 | free(pat); | |
267 | } | |
268 | ||
269 | /** | |
270 | * @bug 4060212 | |
271 | */ | |
272 | void Test4060212() | |
273 | { | |
274 | int32_t pos; | |
275 | UCalendar *cal; | |
276 | UDateFormat *formatter, *fmt; | |
277 | UErrorCode status = U_ZERO_ERROR; | |
278 | UDate myDate; | |
279 | UChar *myString; | |
280 | UChar dateString[30], pattern[20], tzID[4]; | |
281 | u_uastrcpy(dateString, "1995-040.05:01:29 -8"); | |
282 | u_uastrcpy(pattern, "yyyy-DDD.hh:mm:ss z"); | |
283 | ||
284 | log_verbose( "dateString= %s Using yyyy-DDD.hh:mm:ss\n", austrdup(dateString) ); | |
285 | status = U_ZERO_ERROR; | |
286 | u_uastrcpy(tzID, "PST"); | |
287 | ||
288 | formatter = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",tzID,-1,pattern, u_strlen(pattern), &status); | |
289 | pos=0; | |
290 | myDate = udat_parse(formatter, dateString, u_strlen(dateString), &pos, &status); | |
291 | ||
292 | ||
293 | fmt = udat_open(UDAT_FULL,UDAT_LONG ,NULL, tzID, -1, NULL, 0, &status); | |
294 | if(U_FAILURE(status)) | |
295 | { | |
296 | log_data_err("FAIL: error in creating the dateformat using default date and time style: %s - (Are you missing data?)\n", | |
297 | myErrorName(status) ); | |
298 | return; | |
299 | } | |
300 | myString = myFormatit(fmt, myDate); | |
301 | cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status); | |
302 | if(U_FAILURE(status)){ | |
303 | log_err("FAIL: error in ucal_open caldef : %s\n", myErrorName(status)); | |
304 | } | |
305 | ucal_setMillis(cal, myDate, &status); | |
306 | if ((ucal_get(cal, UCAL_DAY_OF_YEAR, &status) != 40)){ | |
307 | log_err("Fail: Got %d Expected 40\n", ucal_get(cal, UCAL_DAY_OF_YEAR, &status)); | |
308 | } | |
309 | ||
310 | udat_close(formatter); | |
311 | ucal_close(cal); | |
312 | udat_close(fmt); | |
313 | ||
314 | } | |
315 | ||
316 | /** | |
317 | * @bug 4061287 | |
318 | */ | |
319 | void Test4061287() | |
320 | { | |
321 | UBool ok; | |
322 | int32_t pos; | |
323 | UDateFormat *df; | |
324 | UErrorCode status = U_ZERO_ERROR; | |
325 | UDate myDate; | |
326 | UChar pattern[21], dateString[11]; | |
327 | ||
328 | u_uastrcpy(dateString, "35/13/1971"); | |
329 | u_uastrcpy(pattern, "dd/mm/yyyy"); | |
330 | status = U_ZERO_ERROR; | |
331 | log_verbose("Testing parsing by changing the attribute lenient\n"); | |
332 | df = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,NULL,0,pattern, u_strlen(pattern),&status); | |
333 | if(U_FAILURE(status)){ | |
334 | log_data_err("ERROR: failure in open pattern of test4061287: %s - (Are you missing data?)\n", myErrorName(status)); | |
335 | return; | |
336 | } | |
337 | ||
338 | pos=0; | |
339 | ||
340 | udat_setLenient(df, FALSE); | |
341 | ok=udat_isLenient(df); | |
342 | if(ok==TRUE) | |
343 | log_err("setLenient nor working\n"); | |
344 | ok = FALSE; | |
345 | myDate = udat_parse(df, dateString, u_strlen(dateString), &pos, &status); | |
346 | if(U_FAILURE(status)) | |
347 | ok = TRUE; | |
348 | if(ok!=TRUE) | |
349 | log_err("Fail: Lenient not working: does lenient parsing in spite of setting Leninent as FALSE "); | |
350 | ||
351 | udat_close(df); | |
352 | ||
353 | } | |
354 | ||
355 | ||
356 | ||
357 | /* The java.text.DateFormat.parse(String) method expects for the | |
358 | US locale a string formatted according to mm/dd/yy and parses it | |
359 | correctly. | |
360 | ||
361 | When given a string mm/dd/yyyy it only parses up to the first | |
362 | two y's, typically resulting in a date in the year 1919. | |
363 | ||
364 | Please extend the parsing method(s) to handle strings with | |
365 | four-digit year values (probably also applicable to various | |
366 | other locales. */ | |
367 | /** | |
368 | * @bug 4073003 | |
369 | */ | |
370 | void Test4073003() | |
371 | { | |
372 | int32_t pos,i; | |
373 | UDate d,dd; | |
374 | UChar *datestr; | |
375 | UChar temp[15]; | |
376 | UErrorCode status = U_ZERO_ERROR; | |
377 | UDateFormat *fmt; | |
378 | UChar *result, *result2; | |
379 | const char* tests [] = { | |
380 | "12/25/61", | |
381 | "12/25/1961", | |
382 | "4/3/1999", | |
383 | "4/3/99" | |
384 | }; | |
385 | ||
386 | fmt= udat_open(UDAT_SHORT,UDAT_SHORT ,NULL, NULL, 0, NULL, 0, &status); | |
387 | if(U_FAILURE(status)) | |
388 | { | |
389 | log_data_err("FAIL: error in creating the dateformat using short date and time style: %s (Are you missing data?)\n", | |
390 | myErrorName(status)); | |
391 | return; | |
392 | } | |
393 | u_uastrcpy(temp, "m/D/yy"); | |
394 | udat_applyPattern(fmt, FALSE, temp, u_strlen(temp)); | |
395 | ||
396 | for(i= 0; i < 4; i+=2) { | |
397 | status=U_ZERO_ERROR; | |
398 | datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i])+1)); | |
399 | u_uastrcpy(datestr, tests[i]); | |
400 | ||
401 | pos=0; | |
402 | d = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status); | |
403 | if(U_FAILURE(status)){ | |
404 | log_err("ERROR : in test 4073003: %s\n", myErrorName(status)); | |
405 | } | |
406 | ||
407 | free(datestr); | |
408 | datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i+1])+1)); | |
409 | u_uastrcpy(datestr, tests[i+1]); | |
410 | ||
411 | pos=0; | |
412 | status=U_ZERO_ERROR; | |
413 | dd = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status); | |
414 | if(U_FAILURE(status)){ | |
415 | log_err("ERROR : in test 4073003: %s\n", myErrorName(status)); | |
416 | } | |
417 | free(datestr); | |
418 | ||
419 | result =myFormatit(fmt, d); | |
420 | result2 =myFormatit(fmt, dd); | |
421 | if(!result || !result2) { | |
422 | log_data_err("Fail: could not format - exitting test\n"); | |
423 | return; | |
424 | } | |
425 | if (u_strcmp(result, result2)!=0){ | |
426 | log_err("Fail: %s != %s\n", austrdup(result), austrdup(result2) ); | |
427 | } | |
428 | else{ | |
429 | log_verbose("Ok: %s == %s\n", austrdup(result), austrdup(result2) ); | |
430 | } | |
431 | ||
432 | } | |
433 | udat_close(fmt); | |
434 | } | |
435 | ||
436 | /** | |
437 | * @bug 4162071 | |
438 | **/ | |
439 | void Test4162071() | |
440 | { | |
441 | int32_t pos; | |
442 | UDate x; | |
443 | UErrorCode status = U_ZERO_ERROR; | |
444 | UDateFormat *df; | |
445 | UChar datestr[30]; | |
446 | UChar format[50]; | |
447 | u_uastrcpy(datestr, "Thu, 30-Jul-1999 11:51:14 GMT"); | |
448 | u_uastrcpy(format, "EEE', 'dd-MMM-yyyy HH:mm:ss z"); /* RFC 822/1123 */ | |
449 | status = U_ZERO_ERROR; | |
450 | /* Can't hardcode the result to assume the default locale is "en_US". */ | |
451 | df = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",NULL,0,format, u_strlen(format),&status); | |
452 | if(U_FAILURE(status)){ | |
453 | log_data_err("ERROR: couldn't create date format: %s\n", myErrorName(status)); | |
454 | return; | |
455 | } | |
456 | pos=0; | |
457 | x = udat_parse(df, datestr, u_strlen(datestr), &pos, &status); | |
458 | if(U_FAILURE(status)){ | |
459 | log_data_err("ERROR : parse format %s fails : %s\n", austrdup(format), myErrorName(status)); | |
460 | } | |
461 | else{ | |
462 | log_verbose("Parse format \"%s \" ok.\n", austrdup(format) ); | |
463 | } | |
464 | /*log_verbose("date= %s\n", austrdup(myFormatit(df, x)) );*/ | |
465 | udat_close(df); | |
466 | } | |
467 | ||
468 | void Test714(void) | |
469 | { | |
470 | UDate d=978103543000.0; | |
471 | UChar temp[20]; | |
472 | UErrorCode status = U_ZERO_ERROR; | |
473 | UDateFormat *fmt; | |
474 | UChar *result; | |
475 | const char* expect = "7:25:43 AM"; | |
476 | ||
477 | ctest_setTimeZone(NULL, &status); | |
478 | ||
479 | fmt= udat_open(UDAT_MEDIUM,UDAT_NONE ,"en_US_CA", NULL, -1, NULL, 0, &status); | |
480 | if(U_FAILURE(status)) | |
481 | { | |
482 | log_data_err("FAIL: error in creating the dateformat using medium time style and NO date style: %s (Are you missing data?)\n", | |
483 | myErrorName(status)); | |
484 | return; | |
485 | } | |
486 | result =myFormatit(fmt, d); | |
487 | if(!result) { | |
488 | log_data_err("Fail: could not format - exitting test\n"); | |
489 | return; | |
490 | } | |
491 | u_uastrcpy(temp, expect); | |
492 | if (u_strcmp(result, temp)!=0){ | |
493 | log_err("Fail: %s != %s\n", austrdup(result), expect); | |
494 | } | |
495 | else{ | |
496 | log_verbose("Ok: %s == %s\n", austrdup(result), expect ); | |
497 | } | |
498 | ||
499 | udat_close(fmt); | |
500 | ||
501 | ctest_resetTimeZone(); | |
502 | } | |
503 | ||
504 | enum { DATE_TEXT_MAX_CHARS = 64 }; | |
505 | static const UChar zonePST[] = { 0x50,0x53,0x54,0 }; /* "PST" */ | |
506 | static const UDate july022008 = 1215000001979.0; /* 02 July 2008 5:00:01.979 AM PDT (near ICU 4.0 release date :-) */ | |
507 | static const double dayMillisec = 8.64e+07; | |
508 | ||
509 | static const UChar dMyGGGPattern[] = { 0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0x20,0x47,0x47,0x47,0 }; /* "dd MMM yyyy GGG" */ | |
510 | static const UChar dMyGGGGGPattern[] = { 0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0x20,0x47,0x47,0x47,0x47,0x47,0 }; /* "dd MMM yyyy GGGGG" */ | |
511 | static const UChar dMyGGGText[] = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0x44,0 }; /* "02 Jul 2008 AD" */ | |
512 | static const UChar dMyGGGGGText[] = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0 }; /* "02 Jul 2008 A" */ | |
513 | static const UChar edMyPattern[] = { 0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "e dd MMM yyyy" */ | |
514 | static const UChar eedMyPattern[] = { 0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "ee dd MMM yyyy" */ | |
515 | static const UChar cdMyPattern[] = { 0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "c dd MMM yyyy" */ | |
516 | static const UChar ccdMyPattern[] = { 0x63,0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "cc dd MMM yyyy" */ | |
517 | static const UChar edMyText[] = { 0x34,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "4 02 Jul 2008" */ | |
518 | static const UChar eedMyText[] = { 0x30,0x34,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "04 02 Jul 2008" */ | |
519 | static const UChar eeedMyPattern[] = { 0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "eee dd MMM yyyy" */ | |
520 | static const UChar EEEdMyPattern[] = { 0x45,0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "EEE dd MMM yyyy" */ | |
521 | static const UChar EEdMyPattern[] = { 0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "EE dd MMM yyyy" */ | |
522 | static const UChar eeedMyText[] = { 0x57,0x65,0x64,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "Wed 02 Jul 2008" */ | |
523 | static const UChar eeeedMyPattern[] = { 0x65,0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "eeee dd MMM yyyy" */ | |
524 | static const UChar eeeedMyText[] = { 0x57,0x65,0x64,0x6E,0x65,0x73,0x64,0x61,0x79,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "Wednesday 02 Jul 2008" */ | |
525 | static const UChar eeeeedMyPattern[] = { 0x65,0x65,0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "eeeee dd MMM yyyy" */ | |
526 | static const UChar eeeeedMyText[] = { 0x57,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "W 02 Jul 2008" */ | |
527 | static const UChar ewYPattern[] = { 0x65,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 }; /* "e ww YYYY" */ | |
528 | static const UChar cwYPattern[] = { 0x63,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 }; /* "c ww YYYY" */ | |
529 | static const UChar ewYText[] = { 0x34,0x20,0x32,0x37,0x20,0x32,0x30,0x30,0x38,0 }; /* "4 27 2008" */ | |
530 | static const UChar HHmmssPattern[] = { 0x48,0x48,0x3A,0x6D,0x6D,0x3A,0x73,0x73,0 }; /* "HH:mm:ss" */ | |
531 | static const UChar HHmmssText[] = { 0x30,0x35,0x3A,0x30,0x30,0x3A,0x30,0x31,0 }; /* "05:00:01" */ | |
532 | static const UChar ssSPattern[] = { 0x73,0x73,0x2E,0x53,0 }; /* "ss.S" */ | |
533 | static const UChar ssSText[] = { 0x30,0x31,0x2E,0x39,0 }; /* "01.9" */ | |
534 | static const UChar ssSSPattern[] = { 0x73,0x73,0x2E,0x53,0x53,0 }; /* "ss.SS" */ | |
535 | static const UChar ssSSText[] = { 0x30,0x31,0x2E,0x39,0x37,0 }; /* "01.97" */ | |
536 | ||
537 | typedef struct { | |
538 | const UChar * pattern; | |
539 | const UChar * text; | |
540 | const char * label; | |
541 | } DatePatternAndText; | |
542 | static const DatePatternAndText datePatternsAndText[] = { | |
543 | { dMyGGGPattern, dMyGGGText, "dd MMM yyyy GGG" }, | |
544 | { dMyGGGGGPattern, dMyGGGGGText, "dd MMM yyyy GGGGG" }, | |
545 | { edMyPattern, edMyText, "e dd MMM yyyy" }, | |
546 | { eedMyPattern, eedMyText, "ee dd MMM yyyy" }, | |
547 | { cdMyPattern, edMyText, "c dd MMM yyyy" }, | |
548 | { ccdMyPattern, edMyText, "cc dd MMM yyyy" }, | |
549 | { eeedMyPattern, eeedMyText, "eee dd MMM yyyy" }, | |
550 | { EEEdMyPattern, eeedMyText, "EEE dd MMM yyyy" }, | |
551 | { EEdMyPattern, eeedMyText, "EE dd MMM yyyy" }, | |
552 | { eeeedMyPattern, eeeedMyText, "eeee dd MMM yyyy" }, | |
553 | { eeeeedMyPattern, eeeeedMyText, "eeeee dd MMM yyyy" }, | |
554 | { ewYPattern, ewYText, "e ww YYYY" }, | |
555 | { cwYPattern, ewYText, "c ww YYYY" }, | |
556 | { HHmmssPattern, HHmmssText, "* HH:mm:ss" }, /* '*' at start means don't check value from parse (won't be july022008) */ | |
557 | { ssSPattern, ssSText, "* ss.S" }, | |
558 | { ssSSPattern, ssSSText, "* ss.SS" }, | |
559 | { NULL, NULL, NULL } | |
560 | }; | |
561 | void Test_GEec(void) | |
562 | { | |
563 | UErrorCode status = U_ZERO_ERROR; | |
564 | UDateFormat * dtfmt = udat_open(UDAT_LONG, UDAT_LONG, "en", zonePST, -1, NULL, 0, &status); | |
565 | if ( U_SUCCESS(status) ) { | |
566 | const DatePatternAndText *patTextPtr; | |
567 | for (patTextPtr = datePatternsAndText; patTextPtr->pattern != NULL; ++patTextPtr) { | |
568 | UChar dmyGnText[DATE_TEXT_MAX_CHARS]; | |
569 | char byteText[3*DATE_TEXT_MAX_CHARS]; | |
570 | int32_t dmyGnTextLen; | |
571 | UDate dateResult; | |
572 | ||
573 | udat_applyPattern(dtfmt, FALSE, patTextPtr->pattern, -1); | |
574 | dmyGnTextLen = udat_format(dtfmt, july022008, dmyGnText, DATE_TEXT_MAX_CHARS, NULL, &status); | |
575 | if ( U_FAILURE(status) ) { | |
576 | log_err("FAIL: udat_format with %s: %s\n", patTextPtr->label, myErrorName(status) ); | |
577 | status = U_ZERO_ERROR; | |
578 | } else if ( u_strcmp(dmyGnText, patTextPtr->text) != 0 ) { | |
579 | log_err("FAIL: udat_format with %s: wrong UChar[] result %s\n", patTextPtr->label, u_austrcpy(byteText,dmyGnText) ); | |
580 | } | |
581 | ||
582 | dateResult = udat_parse(dtfmt, patTextPtr->text, -1, NULL, &status); /* no time, dateResult != july022008 by some hours */ | |
583 | if ( U_FAILURE(status) ) { | |
584 | log_err("FAIL: udat_parse with %s: %s\n", patTextPtr->label, myErrorName(status) ); | |
585 | status = U_ZERO_ERROR; | |
586 | } else if ( patTextPtr->label[0] != '*' && july022008 - dateResult > dayMillisec ) { | |
587 | log_err("FAIL: udat_parse with %s: wrong UDate result\n", patTextPtr->label ); | |
588 | } | |
589 | } | |
590 | udat_close(dtfmt); | |
591 | } else { | |
592 | log_data_err("FAIL: udat_open fails: %s (Are you missing data?)\n", myErrorName(status)); | |
593 | } | |
594 | } | |
595 | ||
596 | /*INTERNAL FUNCTION USED */ | |
597 | ||
598 | UChar* myFormatit(UDateFormat* datdef, UDate d1) | |
599 | { | |
600 | UChar *result1=NULL; | |
601 | int32_t resultlength, resultlengthneeded; | |
602 | UErrorCode status = U_ZERO_ERROR; | |
603 | ||
604 | resultlength=0; | |
605 | resultlengthneeded=udat_format(datdef, d1, NULL, resultlength, NULL, &status); | |
606 | if(status==U_BUFFER_OVERFLOW_ERROR) | |
607 | { | |
608 | status=U_ZERO_ERROR; | |
609 | resultlength=resultlengthneeded+1; | |
610 | /*result1=(UChar*)malloc(sizeof(UChar) * resultlength);*/ /*this leaks*/ | |
611 | result1=(UChar*)ctst_malloc(sizeof(UChar) * resultlength); /*this won't*/ | |
612 | udat_format(datdef, d1, result1, resultlength, NULL, &status); | |
613 | } | |
614 | if(U_FAILURE(status)) | |
615 | { | |
616 | log_err("FAIL: Error in formatting using udat_format(.....): %s\n", myErrorName(status)); | |
617 | return 0; | |
618 | } | |
619 | ||
620 | ||
621 | return result1; | |
622 | ||
623 | } | |
624 | ||
625 | #endif /* #if !UCONFIG_NO_FORMATTING */ | |
626 | ||
627 | /*eof*/ |