1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2009, 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
31void addDateForRgrTest(TestNode** root);
32
33void 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 */
49void 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 */
125void 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_err("error in ucal_open caldef : %s\n", myErrorName(status));
147    }
148    ucal_setDateTime(cal, 1809, UCAL_DECEMBER, 25, 17, 40, 30, &status);
149    d[0]=ucal_getMillis(cal, &status);
150    if(U_FAILURE(status)){
151            log_err("Error: failure in get millis: %s\n", myErrorName(status));
152    }
153    ucal_setDateTime(cal, 1909, UCAL_DECEMBER, 24, 17, 40, 30, &status);
154    d[1]=ucal_getMillis(cal, &status);
155    ucal_setDateTime(cal, 1861, UCAL_DECEMBER, 26, 17, 40, 30, &status);
156    d[2]=ucal_getMillis(cal, &status);
157    ucal_setDateTime(cal, 1999, UCAL_DECEMBER, 27, 17, 40, 30, &status);
158    d[3]=ucal_getMillis(cal, &status);
159
160
161    u_uastrcpy(pat, "yyMMdd");
162    def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL, NULL, 0, pat, u_strlen(pat), &status);
163    if(U_FAILURE(status))
164    {
165        log_err_status(status, "FAIL: error in creating the dateformat using u_openPattern(): %s\n", myErrorName(status));
166        return;
167    }
168    start = 1800;
169    udat_set2DigitYearStart(def, start, &status);
170    if(U_FAILURE(status))
171        log_err("ERROR: in setTwoDigitStartDate: %s\n", myErrorName(status));
172    if( (udat_get2DigitYearStart(def, &status) != start))
173        log_err("ERROR: get2DigitYearStart broken\n");
174
175
176    for(i = 0; i < 4; ++i) {
177        u_uastrcpy(s, strings[i]);
178        exp = d[i];
179        got = udat_parse(def, s, u_strlen(s), 0, &status);
180        gotdate=myFormatit(def, got);
181        expdate=myFormatit(def, exp);
182
183        if (gotdate == NULL || expdate == NULL) {
184            log_err("myFormatit failed!\n");
185        }
186        else if(u_strcmp(gotdate, expdate) !=0){
187            log_err("set2DigitYearStart broken for %s \n  got: %s, expected: %s\n", austrdup(s),
188                austrdup(gotdate), austrdup(expdate) );
189        }
190    }
191
192    udat_close(def);
193    ucal_close(cal);
194}
195
196
197/**
198 * SimpleDateFormat does not properly parse date strings without delimiters
199 * @bug 4059917
200 */
201void Test4059917()
202{
203    UDateFormat* def;
204    UChar *myDate;
205    UErrorCode status = U_ZERO_ERROR;
206    UChar pattern[11];
207    UChar tzID[4];
208
209    log_verbose("Testing apply pattern and to pattern regressively\n");
210    u_uastrcpy(tzID, "PST");
211    u_uastrcpy(pattern, "yyyy/MM/dd");
212    log_verbose("%s\n", austrdup(pattern) );
213    def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,tzID,-1,pattern, u_strlen(pattern),&status);
214    if(U_FAILURE(status))
215    {
216        log_err_status(status, "FAIL: error in creating the dateformat using openPattern: %s\n", myErrorName(status));
217        return;
218    }
219    myDate=(UChar*)malloc(sizeof(UChar) * 11);
220    u_uastrcpy(myDate, "1970/01/12");
221
222    aux917( def, myDate );
223    udat_close(def);
224
225    u_uastrcpy(pattern, "yyyyMMdd");
226    def = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,tzID,-1,pattern, u_strlen(pattern),&status);
227    if(U_FAILURE(status))
228    {
229        log_err("FAIL: error in creating the dateformat using openPattern: %s\n", myErrorName(status));
230        return;
231    }
232    u_uastrcpy(myDate, "19700112");
233    aux917( def, myDate );
234    udat_close(def);
235    free(myDate);
236}
237
238void aux917( UDateFormat *fmt, UChar* str)
239{
240    int32_t resultlength, resultlengthneeded;
241    UErrorCode status = U_ZERO_ERROR;
242    UChar* formatted=NULL;
243    UChar *pat=NULL;
244    UDate d1=1000000000.0;
245
246    resultlength=0;
247    resultlengthneeded=udat_toPattern(fmt, TRUE, NULL, resultlength, &status);
248    if(status==U_BUFFER_OVERFLOW_ERROR)
249    {
250        status=U_ZERO_ERROR;
251        resultlength=resultlengthneeded + 1;
252        pat=(UChar*)malloc(sizeof(UChar) * (resultlength));
253        udat_toPattern(fmt, TRUE, pat, resultlength, &status);
254    }
255    if(U_FAILURE(status)){
256        log_err("failure in retrieving the pattern: %s\n", myErrorName(status));
257    }
258    log_verbose("pattern: %s\n", austrdup(pat) );
259
260    status = U_ZERO_ERROR;
261    formatted = myFormatit(fmt, d1);
262    if( u_strcmp(formatted,str)!=0) {
263        log_err("Fail: Want %s Got: %s\n", austrdup(str),  austrdup(formatted) );
264    }
265    free(pat);
266}
267
268/**
269 * @bug 4060212
270 */
271void Test4060212()
272{
273    int32_t pos;
274    UCalendar *cal;
275    UDateFormat *formatter, *fmt;
276    UErrorCode status = U_ZERO_ERROR;
277    UDate myDate;
278    UChar *myString;
279    UChar dateString[30], pattern[20], tzID[4];
280    u_uastrcpy(dateString, "1995-040.05:01:29 -8");
281    u_uastrcpy(pattern, "yyyy-DDD.hh:mm:ss z");
282
283    log_verbose( "dateString= %s Using yyyy-DDD.hh:mm:ss\n", austrdup(dateString) );
284    status = U_ZERO_ERROR;
285    u_uastrcpy(tzID, "PST");
286
287    formatter = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",tzID,-1,pattern, u_strlen(pattern), &status);
288    pos=0;
289    myDate = udat_parse(formatter, dateString, u_strlen(dateString), &pos, &status);
290
291
292    fmt = udat_open(UDAT_FULL,UDAT_LONG ,NULL, tzID, -1, NULL, 0, &status);
293    if(U_FAILURE(status))
294    {
295        log_err_status(status, "FAIL: error in creating the dateformat using default date and time style: %s\n",
296                        myErrorName(status) );
297        return;
298    }
299    myString = myFormatit(fmt, myDate);
300    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);
301    if(U_FAILURE(status)){
302        log_err("FAIL: error in ucal_open caldef : %s\n", myErrorName(status));
303    }
304    ucal_setMillis(cal, myDate, &status);
305    if ((ucal_get(cal, UCAL_DAY_OF_YEAR, &status) != 40)){
306        log_err("Fail: Got  %d Expected 40\n", ucal_get(cal, UCAL_DAY_OF_YEAR, &status));
307    }
308
309    udat_close(formatter);
310    ucal_close(cal);
311    udat_close(fmt);
312
313}
314
315/**
316 * @bug 4061287
317 */
318void Test4061287()
319{
320    UBool ok;
321    int32_t pos;
322    UDateFormat *df;
323    UErrorCode status = U_ZERO_ERROR;
324    UDate myDate;
325    UChar pattern[21], dateString[11];
326
327    u_uastrcpy(dateString, "35/13/1971");
328    u_uastrcpy(pattern, "dd/mm/yyyy");
329    status = U_ZERO_ERROR;
330    log_verbose("Testing parsing by changing the attribute lenient\n");
331    df = udat_open(UDAT_IGNORE,UDAT_IGNORE,NULL,NULL,0,pattern, u_strlen(pattern),&status);
332    if(U_FAILURE(status)){
333        log_err_status(status, "ERROR: failure in open pattern of test4061287: %s\n", myErrorName(status));
334        return;
335    }
336
337    pos=0;
338
339    udat_setLenient(df, FALSE);
340    ok=udat_isLenient(df);
341    if(ok==TRUE)
342        log_err("setLenient nor working\n");
343    ok = FALSE;
344    myDate = udat_parse(df, dateString, u_strlen(dateString), &pos, &status);
345    if(U_FAILURE(status))
346        ok = TRUE;
347    if(ok!=TRUE)
348        log_err("Fail: Lenient not working: does lenient parsing in spite of setting Leninent as FALSE ");
349
350    udat_close(df);
351
352}
353
354
355
356/* The java.text.DateFormat.parse(String) method expects for the
357  US locale a string formatted according to mm/dd/yy and parses it
358  correctly.
359
360  When given a string mm/dd/yyyy it only parses up to the first
361  two y's, typically resulting in a date in the year 1919.
362
363  Please extend the parsing method(s) to handle strings with
364  four-digit year values (probably also applicable to various
365  other locales.  */
366/**
367 * @bug 4073003
368 */
369void Test4073003()
370{
371    int32_t pos,i;
372    UDate d,dd;
373    UChar *datestr;
374    UChar temp[15];
375    UErrorCode status = U_ZERO_ERROR;
376    UDateFormat *fmt;
377    UChar *result, *result2;
378    const char* tests [] = {
379                "12/25/61",
380                "12/25/1961",
381                "4/3/1999",
382                "4/3/99"
383        };
384
385    fmt= udat_open(UDAT_SHORT,UDAT_SHORT ,NULL, NULL, 0, NULL, 0, &status);
386    if(U_FAILURE(status))
387    {
388        log_data_err("FAIL: error in creating the dateformat using short date and time style: %s (Are you missing data?)\n",
389            myErrorName(status));
390        return;
391    }
392    u_uastrcpy(temp, "m/D/yy");
393    udat_applyPattern(fmt, FALSE, temp, u_strlen(temp));
394
395    for(i= 0; i < 4; i+=2) {
396        status=U_ZERO_ERROR;
397        datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i])+1));
398        u_uastrcpy(datestr, tests[i]);
399
400        pos=0;
401        d = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status);
402        if(U_FAILURE(status)){
403            log_err("ERROR : in test 4073003: %s\n", myErrorName(status));
404        }
405
406        free(datestr);
407        datestr=(UChar*)malloc(sizeof(UChar) * (strlen(tests[i+1])+1));
408        u_uastrcpy(datestr, tests[i+1]);
409
410        pos=0;
411        status=U_ZERO_ERROR;
412        dd = udat_parse(fmt, datestr, u_strlen(datestr), &pos, &status);
413        if(U_FAILURE(status)){
414            log_err("ERROR : in test 4073003: %s\n", myErrorName(status));
415        }
416        free(datestr);
417
418        result =myFormatit(fmt, d);
419        result2 =myFormatit(fmt, dd);
420        if(!result || !result2) {
421            log_data_err("Fail: could not format - exitting test\n");
422            return;
423        }
424        if (u_strcmp(result, result2)!=0){
425            log_err("Fail: %s != %s\n", austrdup(result), austrdup(result2) );
426        }
427        else{
428            log_verbose("Ok: %s == %s\n", austrdup(result), austrdup(result2) );
429        }
430
431    }
432    udat_close(fmt);
433}
434
435/**
436 * @bug 4162071
437 **/
438void Test4162071()
439{
440    int32_t pos;
441    UDate x;
442    UErrorCode status = U_ZERO_ERROR;
443    UDateFormat *df;
444    UChar datestr[30];
445    UChar format[50];
446    u_uastrcpy(datestr, "Thu, 30-Jul-1999 11:51:14 GMT");
447    u_uastrcpy(format, "EEE', 'dd-MMM-yyyy HH:mm:ss z"); /*  RFC 822/1123 */
448    status = U_ZERO_ERROR;
449    /* Can't hardcode the result to assume the default locale is "en_US". */
450    df = udat_open(UDAT_IGNORE,UDAT_IGNORE,"en_US",NULL,0,format, u_strlen(format),&status);
451    if(U_FAILURE(status)){
452        log_data_err("ERROR: couldn't create date format: %s\n", myErrorName(status));
453        return;
454    }
455    pos=0;
456    x = udat_parse(df, datestr, u_strlen(datestr), &pos, &status);
457    if(U_FAILURE(status)){
458        log_data_err("ERROR : parse format  %s fails : %s\n", austrdup(format), myErrorName(status));
459    }
460    else{
461        log_verbose("Parse format \"%s \" ok.\n", austrdup(format) );
462    }
463    /*log_verbose("date= %s\n", austrdup(myFormatit(df, x)) );*/
464    udat_close(df);
465}
466
467void Test714(void)
468{
469    UDate d=978103543000.0;
470    UChar temp[20];
471    UErrorCode status = U_ZERO_ERROR;
472    UDateFormat *fmt;
473    UChar *result;
474    const char* expect =  "7:25:43 AM";
475
476    ctest_setTimeZone(NULL, &status);
477
478    fmt= udat_open(UDAT_MEDIUM,UDAT_NONE ,"en_US_CA", NULL, -1, NULL, 0, &status);
479    if(U_FAILURE(status))
480    {
481        log_data_err("FAIL: error in creating the dateformat using medium time style and NO date style: %s (Are you missing data?)\n",
482            myErrorName(status));
483        return;
484    }
485    result =myFormatit(fmt, d);
486    if(!result) {
487      log_data_err("Fail: could not format - exitting test\n");
488      return;
489    }
490    u_uastrcpy(temp, expect);
491    if (u_strcmp(result, temp)!=0){
492      log_err("Fail: %s != %s\n", austrdup(result), expect);
493    }
494    else{
495      log_verbose("Ok: %s == %s\n", austrdup(result), expect );
496    }
497
498    udat_close(fmt);
499
500    ctest_resetTimeZone();
501}
502
503enum { DATE_TEXT_MAX_CHARS = 64 };
504static const UChar zonePST[] = { 0x50,0x53,0x54,0 }; /* "PST" */
505static const UDate july022008 = 1.215e+12; /* 02 July 2008 5:00 AM PDT (approx ICU 4.0 release date :-) */
506static const double dayMillisec = 8.64e+07;
507
508static const UChar dMyGGGPattern[]   = { 0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0x20,0x47,0x47,0x47,0 };           /* "dd MMM yyyy GGG" */
509static 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" */
510static const UChar dMyGGGText[]      = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0x44,0 };                /* "02 Jul 2008 AD" */
511static const UChar dMyGGGGGText[]    = { 0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0x20,0x41,0 };                     /* "02 Jul 2008 A" */
512static const UChar edMyPattern[]     = { 0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };                     /* "e dd MMM yyyy" */
513static const UChar eedMyPattern[]    = { 0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };                /* "ee dd MMM yyyy" */
514static const UChar cdMyPattern[]     = { 0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };                     /* "c dd MMM yyyy" */
515static const UChar ccdMyPattern[]    = { 0x63,0x63,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };                /* "cc dd MMM yyyy" */
516static const UChar edMyText[]        = { 0x33,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 };                     /* "3 02 Jul 2008" */
517static const UChar eedMyText[]       = { 0x30,0x33,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 };                /* "03 02 Jul 2008" */
518static const UChar eeedMyPattern[]   = { 0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };           /* "eee dd MMM yyyy" */
519static const UChar EEEdMyPattern[]   = { 0x45,0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };           /* "EEE dd MMM yyyy" */
520static const UChar EEdMyPattern[]    = { 0x45,0x45,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };                /* "EE dd MMM yyyy" */
521static const UChar eeedMyText[]      = { 0x57,0x65,0x64,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 };           /* "Wed 02 Jul 2008" */
522static const UChar eeeedMyPattern[]  = { 0x65,0x65,0x65,0x65,0x20,0x64,0x64,0x20,0x4D,0x4D,0x4D,0x20,0x79,0x79,0x79,0x79,0 };      /* "eeee dd MMM yyyy" */
523static 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" */
524static 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" */
525static const UChar eeeeedMyText[]    = { 0x57,0x20,0x30,0x32,0x20,0x4A,0x75,0x6C,0x20,0x32,0x30,0x30,0x38,0 };                     /* "W 02 Jul 2008" */
526static const UChar ewYPattern[]      = { 0x65,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 };                					       /* "e ww YYYY" */
527static const UChar cwYPattern[]      = { 0x63,0x20,0x77,0x77,0x20,0x59,0x59,0x59,0x59,0 };                					       /* "c ww YYYY" */
528static const UChar ewYText[]         = { 0x33,0x20,0x32,0x37,0x20,0x32,0x30,0x30,0x38,0 };                					       /* "3 27 2008" */
529
530typedef struct {
531    const UChar * pattern;
532    const UChar * text;
533    const char *  label;
534} DatePatternAndText;
535static const DatePatternAndText datePatternsAndText[] = {
536    { dMyGGGPattern,   dMyGGGText,   "dd MMM yyyy GGG"   },
537    { dMyGGGGGPattern, dMyGGGGGText, "dd MMM yyyy GGGGG" },
538    { edMyPattern,     edMyText,     "e dd MMM yyyy"     },
539    { eedMyPattern,    eedMyText,    "ee dd MMM yyyy"    },
540    { cdMyPattern,     edMyText,     "c dd MMM yyyy"     },
541    { ccdMyPattern,    edMyText,     "cc dd MMM yyyy"    },
542    { eeedMyPattern,   eeedMyText,   "eee dd MMM yyyy"   },
543    { EEEdMyPattern,   eeedMyText,   "EEE dd MMM yyyy"   },
544    { EEdMyPattern,    eeedMyText,   "EE dd MMM yyyy"    },
545    { eeeedMyPattern,  eeeedMyText,  "eeee dd MMM yyyy"  },
546    { eeeeedMyPattern, eeeeedMyText, "eeeee dd MMM yyyy" },
547    { ewYPattern,      ewYText,      "e ww YYYY"         },
548    { cwYPattern,      ewYText,      "c ww YYYY"         },
549    { NULL,            NULL,         NULL                }
550};
551void Test_GEec(void)
552{
553    UErrorCode    status = U_ZERO_ERROR;
554    UDateFormat * dtfmt = udat_open(UDAT_LONG, UDAT_LONG, "en", zonePST, -1, NULL, 0, &status);
555    if ( U_SUCCESS(status) ) {
556        const DatePatternAndText *patTextPtr;
557        for (patTextPtr = datePatternsAndText; patTextPtr->pattern != NULL; ++patTextPtr) {
558            UChar   dmyGnText[DATE_TEXT_MAX_CHARS];
559            int32_t dmyGnTextLen;
560            UDate   dateResult;
561
562            udat_applyPattern(dtfmt, FALSE, patTextPtr->pattern, -1);
563            dmyGnTextLen = udat_format(dtfmt, july022008, dmyGnText, DATE_TEXT_MAX_CHARS, NULL, &status);
564            if ( U_FAILURE(status) ) {
565                log_err("FAIL: udat_format with %s: %s\n", patTextPtr->label, myErrorName(status) );
566                status = U_ZERO_ERROR;
567            } else if ( u_strcmp(dmyGnText, patTextPtr->text) != 0 ) {
568                log_err("FAIL: udat_format with %s: wrong UChar[] result\n", patTextPtr->label );
569            }
570
571            dateResult = udat_parse(dtfmt, patTextPtr->text, -1, NULL, &status); /* no time, dateResult != july022008 by some hours */
572            if ( U_FAILURE(status) ) {
573                log_err("FAIL: udat_parse with %s: %s\n", patTextPtr->label, myErrorName(status) );
574                status = U_ZERO_ERROR;
575            } else if ( july022008 - dateResult > dayMillisec ) {
576                log_err("FAIL: udat_parse with %s: wrong UDate result\n", patTextPtr->label );
577            }
578        }
579        udat_close(dtfmt);
580    } else {
581        log_data_err("FAIL: udat_open fails: %s (Are you missing data?)\n", myErrorName(status));
582    }
583}
584
585/*INTERNAL FUNCTION USED */
586
587UChar* myFormatit(UDateFormat* datdef, UDate d1)
588{
589    UChar *result1=NULL;
590    int32_t resultlength, resultlengthneeded;
591    UErrorCode status = U_ZERO_ERROR;
592
593    resultlength=0;
594    resultlengthneeded=udat_format(datdef, d1, NULL, resultlength, NULL, &status);
595    if(status==U_BUFFER_OVERFLOW_ERROR)
596    {
597        status=U_ZERO_ERROR;
598        resultlength=resultlengthneeded+1;
599        /*result1=(UChar*)malloc(sizeof(UChar) * resultlength);*/ /*this leaks*/
600        result1=(UChar*)ctst_malloc(sizeof(UChar) * resultlength); /*this won't*/
601        udat_format(datdef, d1, result1, resultlength, NULL, &status);
602    }
603    if(U_FAILURE(status))
604    {
605        log_err("FAIL: Error in formatting using udat_format(.....): %s\n", myErrorName(status));
606        return 0;
607    }
608
609
610    return result1;
611
612}
613
614#endif /* #if !UCONFIG_NO_FORMATTING */
615
616/*eof*/
617