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