1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2014, 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
addDateForRgrTest(TestNode ** root)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 */
Test4029195()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 the 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 */
Test4056591()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_PATTERN,UDAT_PATTERN,NULL, NULL, 0, pat, u_strlen(pat), &status);
164 if(U_FAILURE(status))
165 {
166 log_data_err("FAIL: error in creating the dateformat using u_openPattern(): %s - (Are you missing data?)\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 */
Test4059917()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_PATTERN,UDAT_PATTERN,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_PATTERN,UDAT_PATTERN,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
aux917(UDateFormat * fmt,UChar * str)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 */
Test4060212()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_PATTERN,UDAT_PATTERN,"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 (void)myString; /* Suppress set but not used warning. */
302 cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);
303 if(U_FAILURE(status)){
304 log_err("FAIL: error in ucal_open caldef : %s\n", myErrorName(status));
305 }
306 ucal_setMillis(cal, myDate, &status);
307 if ((ucal_get(cal, UCAL_DAY_OF_YEAR, &status) != 40)){
308 log_err("Fail: Got %d Expected 40\n", ucal_get(cal, UCAL_DAY_OF_YEAR, &status));
309 }
310
311 udat_close(formatter);
312 ucal_close(cal);
313 udat_close(fmt);
314
315 }
316
317 /**
318 * @bug 4061287
319 */
Test4061287()320 void Test4061287()
321 {
322 UBool ok;
323 int32_t pos;
324 UDateFormat *df;
325 UErrorCode status = U_ZERO_ERROR;
326 UDate myDate;
327 UChar pattern[21], dateString[11];
328
329 u_uastrcpy(dateString, "35/13/1971");
330 u_uastrcpy(pattern, "dd/mm/yyyy");
331 status = U_ZERO_ERROR;
332 log_verbose("Testing parsing by changing the attribute lenient\n");
333 df = udat_open(UDAT_PATTERN,UDAT_PATTERN,NULL,NULL,0,pattern, u_strlen(pattern),&status);
334 if(U_FAILURE(status)){
335 log_data_err("ERROR: failure in open pattern of test4061287: %s - (Are you missing data?)\n", myErrorName(status));
336 return;
337 }
338
339 pos=0;
340
341 udat_setLenient(df, FALSE);
342 ok=udat_isLenient(df);
343 if(ok==TRUE)
344 log_err("setLenient nor working\n");
345 ok = FALSE;
346 myDate = udat_parse(df, dateString, u_strlen(dateString), &pos, &status);
347 (void)myDate; /* Suppress set but not used warning. */
348 if(U_FAILURE(status))
349 ok = TRUE;
350 if(ok!=TRUE)
351 log_err("Fail: Lenient not working: does lenient parsing in spite of setting Leninent as FALSE ");
352
353 udat_close(df);
354
355 }
356
357
358
359 /* The java.text.DateFormat.parse(String) method expects for the
360 US locale a string formatted according to mm/dd/yy and parses it
361 correctly.
362
363 When given a string mm/dd/yyyy it only parses up to the first
364 two y's, typically resulting in a date in the year 1919.
365
366 Please extend the parsing method(s) to handle strings with
367 four-digit year values (probably also applicable to various
368 other locales. */
369 /**
370 * @bug 4073003
371 */
Test4073003()372 void Test4073003()
373 {
374 int32_t pos,i;
375 UDate d,dd;
376 UChar *datestr;
377 UChar temp[15];
378 UErrorCode status = U_ZERO_ERROR;
379 UDateFormat *fmt;
380 UChar *result, *result2;
381 const char* tests [] = {
382 "12/25/61",
383 "12/25/1961",
384 "4/3/1999",
385 "4/3/99"
386 };
387
388 fmt= udat_open(UDAT_SHORT,UDAT_SHORT ,NULL, NULL, 0, NULL, 0, &status);
389 if(U_FAILURE(status))
390 {
391 log_data_err("FAIL: error in creating the dateformat using short date and time style: %s (Are you missing data?)\n",
392 myErrorName(status));
393 return;
394 }
395 u_uastrcpy(temp, "m/D/yy");
396 udat_applyPattern(fmt, FALSE, temp, u_strlen(temp));
397
398 for(i= 0; i < 4; i+=2) {
399 status=U_ZERO_ERROR;
400 datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i])+1));
401 u_uastrcpy(datestr, tests[i]);
402
403 pos=0;
404 d = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status);
405 if(U_FAILURE(status)){
406 log_err("ERROR : in test 4073003: %s\n", myErrorName(status));
407 }
408
409 free(datestr);
410 datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i+1])+1));
411 u_uastrcpy(datestr, tests[i+1]);
412
413 pos=0;
414 status=U_ZERO_ERROR;
415 dd = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status);
416 if(U_FAILURE(status)){
417 log_err("ERROR : in test 4073003: %s\n", myErrorName(status));
418 }
419 free(datestr);
420
421 result =myFormatit(fmt, d);
422 result2 =myFormatit(fmt, dd);
423 if(!result || !result2) {
424 log_data_err("Fail: could not format - exitting test\n");
425 return;
426 }
427 if (u_strcmp(result, result2)!=0){
428 log_err("Fail: %s != %s\n", austrdup(result), austrdup(result2) );
429 }
430 else{
431 log_verbose("Ok: %s == %s\n", austrdup(result), austrdup(result2) );
432 }
433
434 }
435 udat_close(fmt);
436 }
437
438 /**
439 * @bug 4162071
440 **/
Test4162071()441 void Test4162071()
442 {
443 int32_t pos;
444 UDate x;
445 UErrorCode status = U_ZERO_ERROR;
446 UDateFormat *df;
447 UChar datestr[30];
448 UChar format[50];
449 u_uastrcpy(datestr, "Thu, 30-Jul-1999 11:51:14 GMT");
450 u_uastrcpy(format, "EEE', 'dd-MMM-yyyy HH:mm:ss z"); /* RFC 822/1123 */
451 status = U_ZERO_ERROR;
452 /* Can't hardcode the result to assume the default locale is "en_US". */
453 df = udat_open(UDAT_PATTERN,UDAT_PATTERN,"en_US",NULL,0,format, u_strlen(format),&status);
454 if(U_FAILURE(status)){
455 log_data_err("ERROR: couldn't create date format: %s\n", myErrorName(status));
456 return;
457 }
458 pos=0;
459 x = udat_parse(df, datestr, u_strlen(datestr), &pos, &status);
460 (void)x; /* Suppress set but not used warning. */
461 if(U_FAILURE(status)){
462 log_data_err("ERROR : parse format %s fails : %s\n", austrdup(format), myErrorName(status));
463 }
464 else{
465 log_verbose("Parse format \"%s \" ok.\n", austrdup(format) );
466 }
467 /*log_verbose("date= %s\n", austrdup(myFormatit(df, x)) );*/
468 udat_close(df);
469 }
470
Test714(void)471 void Test714(void)
472 {
473 UDate d=978103543000.0;
474 UChar temp[20];
475 UErrorCode status = U_ZERO_ERROR;
476 UDateFormat *fmt;
477 UChar *result;
478 const char* expect = "7:25:43 AM";
479
480 ctest_setTimeZone(NULL, &status);
481
482 fmt= udat_open(UDAT_MEDIUM,UDAT_NONE ,"en_US_CA", NULL, -1, NULL, 0, &status);
483 if(U_FAILURE(status))
484 {
485 log_data_err("FAIL: error in creating the dateformat using medium time style and NO date style: %s (Are you missing data?)\n",
486 myErrorName(status));
487 return;
488 }
489 result =myFormatit(fmt, d);
490 if(!result) {
491 log_data_err("Fail: could not format - exitting test\n");
492 return;
493 }
494 u_uastrcpy(temp, expect);
495 if (u_strcmp(result, temp)!=0){
496 log_err("Fail: %s != %s\n", austrdup(result), expect);
497 }
498 else{
499 log_verbose("Ok: %s == %s\n", austrdup(result), expect );
500 }
501
502 udat_close(fmt);
503
504 ctest_resetTimeZone();
505 }
506
507 enum { DATE_TEXT_MAX_CHARS = 64 };
508 static const UChar zonePST[] = { 0x50,0x53,0x54,0 }; /* "PST" */
509 static const UDate july022008 = 1215000001979.0; /* 02 July 2008 5:00:01.979 AM PDT (near ICU 4.0 release date :-) */
510 static const double dayMillisec = 8.64e+07;
511
512 static const UChar dMyGGGPattern[] = { 0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0x20,0x47,0x47,0x47,0 }; /* "dd MMM yyyy GGG" */
513 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" */
514 static const UChar dMyGGGText[] = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0x44,0 }; /* "02 Jul 2008 AD" */
515 static const UChar dMyGGGGGText[] = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0 }; /* "02 Jul 2008 A" */
516 static const UChar edMyPattern[] = { 0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "e dd MMM yyyy" */
517 static const UChar eedMyPattern[] = { 0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "ee dd MMM yyyy" */
518 static const UChar cdMyPattern[] = { 0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "c dd MMM yyyy" */
519 static const UChar ccdMyPattern[] = { 0x63,0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "cc dd MMM yyyy" */
520 static const UChar edMyText[] = { 0x34,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "4 02 Jul 2008" */
521 static const UChar eedMyText[] = { 0x30,0x34,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "04 02 Jul 2008" */
522 static const UChar eeedMyPattern[] = { 0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "eee dd MMM yyyy" */
523 static const UChar EEEdMyPattern[] = { 0x45,0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "EEE dd MMM yyyy" */
524 static const UChar EEdMyPattern[] = { 0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 }; /* "EE dd MMM yyyy" */
525 static const UChar eeedMyText[] = { 0x57,0x65,0x64,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "Wed 02 Jul 2008" */
526 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" */
527 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" */
528 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" */
529 static const UChar eeeeedMyText[] = { 0x57,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 }; /* "W 02 Jul 2008" */
530 static const UChar ewYPattern[] = { 0x65,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 }; /* "e ww YYYY" */
531 static const UChar cwYPattern[] = { 0x63,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 }; /* "c ww YYYY" */
532 static const UChar ewYText[] = { 0x34,0x20,0x32,0x37,0x20,0x32,0x30,0x30,0x38,0 }; /* "4 27 2008" */
533 static const UChar HHmmssPattern[] = { 0x48,0x48,0x3A,0x6D,0x6D,0x3A,0x73,0x73,0 }; /* "HH:mm:ss" */
534 static const UChar HHmmssText[] = { 0x30,0x35,0x3A,0x30,0x30,0x3A,0x30,0x31,0 }; /* "05:00:01" */
535 static const UChar ssSPattern[] = { 0x73,0x73,0x2E,0x53,0 }; /* "ss.S" */
536 static const UChar ssSText[] = { 0x30,0x31,0x2E,0x39,0 }; /* "01.9" */
537 static const UChar ssSSPattern[] = { 0x73,0x73,0x2E,0x53,0x53,0 }; /* "ss.SS" */
538 static const UChar ssSSText[] = { 0x30,0x31,0x2E,0x39,0x37,0 }; /* "01.97" */
539
540 typedef struct {
541 const UChar * pattern;
542 const UChar * text;
543 const char * label;
544 } DatePatternAndText;
545 static const DatePatternAndText datePatternsAndText[] = {
546 { dMyGGGPattern, dMyGGGText, "dd MMM yyyy GGG" },
547 { dMyGGGGGPattern, dMyGGGGGText, "dd MMM yyyy GGGGG" },
548 { edMyPattern, edMyText, "e dd MMM yyyy" },
549 { eedMyPattern, eedMyText, "ee dd MMM yyyy" },
550 { cdMyPattern, edMyText, "c dd MMM yyyy" },
551 { ccdMyPattern, edMyText, "cc dd MMM yyyy" },
552 { eeedMyPattern, eeedMyText, "eee dd MMM yyyy" },
553 { EEEdMyPattern, eeedMyText, "EEE dd MMM yyyy" },
554 { EEdMyPattern, eeedMyText, "EE dd MMM yyyy" },
555 { eeeedMyPattern, eeeedMyText, "eeee dd MMM yyyy" },
556 { eeeeedMyPattern, eeeeedMyText, "eeeee dd MMM yyyy" },
557 { ewYPattern, ewYText, "e ww YYYY" },
558 { cwYPattern, ewYText, "c ww YYYY" },
559 { HHmmssPattern, HHmmssText, "* HH:mm:ss" }, /* '*' at start means don't check value from parse (won't be july022008) */
560 { ssSPattern, ssSText, "* ss.S" },
561 { ssSSPattern, ssSSText, "* ss.SS" },
562 { NULL, NULL, NULL }
563 };
Test_GEec(void)564 void Test_GEec(void)
565 {
566 UErrorCode status = U_ZERO_ERROR;
567 UDateFormat * dtfmt = udat_open(UDAT_LONG, UDAT_LONG, "en", zonePST, -1, NULL, 0, &status);
568 if ( U_SUCCESS(status) ) {
569 const DatePatternAndText *patTextPtr;
570 for (patTextPtr = datePatternsAndText; patTextPtr->pattern != NULL; ++patTextPtr) {
571 UChar dmyGnText[DATE_TEXT_MAX_CHARS];
572 char byteText[3*DATE_TEXT_MAX_CHARS];
573 int32_t dmyGnTextLen;
574 UDate dateResult;
575
576 udat_applyPattern(dtfmt, FALSE, patTextPtr->pattern, -1);
577 dmyGnTextLen = udat_format(dtfmt, july022008, dmyGnText, DATE_TEXT_MAX_CHARS, NULL, &status);
578 (void)dmyGnTextLen; /* Suppress set but not used warning. */
579 if ( U_FAILURE(status) ) {
580 log_err("FAIL: udat_format with %s: %s\n", patTextPtr->label, myErrorName(status) );
581 status = U_ZERO_ERROR;
582 } else if ( u_strcmp(dmyGnText, patTextPtr->text) != 0 ) {
583 log_err("FAIL: udat_format with %s: wrong UChar[] result %s\n", patTextPtr->label, u_austrcpy(byteText,dmyGnText) );
584 }
585
586 dateResult = udat_parse(dtfmt, patTextPtr->text, -1, NULL, &status); /* no time, dateResult != july022008 by some hours */
587 if ( U_FAILURE(status) ) {
588 log_err("FAIL: udat_parse with %s: %s\n", patTextPtr->label, myErrorName(status) );
589 status = U_ZERO_ERROR;
590 } else if ( patTextPtr->label[0] != '*' && july022008 - dateResult > dayMillisec ) {
591 log_err("FAIL: udat_parse with %s: wrong UDate result\n", patTextPtr->label );
592 }
593 }
594 udat_close(dtfmt);
595 } else {
596 log_data_err("FAIL: udat_open fails: %s (Are you missing data?)\n", myErrorName(status));
597 }
598 }
599
600 /*INTERNAL FUNCTION USED */
601
myFormatit(UDateFormat * datdef,UDate d1)602 UChar* myFormatit(UDateFormat* datdef, UDate d1)
603 {
604 UChar *result1=NULL;
605 int32_t resultlength, resultlengthneeded;
606 UErrorCode status = U_ZERO_ERROR;
607
608 resultlength=0;
609 resultlengthneeded=udat_format(datdef, d1, NULL, resultlength, NULL, &status);
610 if(status==U_BUFFER_OVERFLOW_ERROR)
611 {
612 status=U_ZERO_ERROR;
613 resultlength=resultlengthneeded+1;
614 /*result1=(UChar*)malloc(sizeof(UChar) * resultlength);*/ /*this leaks*/
615 result1=(UChar*)ctst_malloc(sizeof(UChar) * resultlength); /*this won't*/
616 udat_format(datdef, d1, result1, resultlength, NULL, &status);
617 }
618 if(U_FAILURE(status))
619 {
620 log_err("FAIL: Error in formatting using udat_format(.....): %s\n", myErrorName(status));
621 return 0;
622 }
623
624
625 return result1;
626
627 }
628
629 #endif /* #if !UCONFIG_NO_FORMATTING */
630
631 /*eof*/
632