1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CDATTST.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                     Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda               Creation
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* C API TEST FOR DATE FORMAT */
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udat.h"
24103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/udatpg.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucal.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unum.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cdattst.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cformtst.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <math.h>
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeDates(void);
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAllLocales(void);
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestRelativeCrash(void);
38103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestContext(void);
398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic void TestCalendarDateParse(void);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LEN(a) (sizeof(a)/sizeof(a[0]))
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addDateForTest(TestNode** root);
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TESTCASE(x) addTest(root, &x, "tsformat/cdattst/" #x)
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addDateForTest(TestNode** root)
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDateFormat);
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestRelativeDateFormat);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestSymbols);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestDateFormatCalendar);
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestExtremeDates);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TESTCASE(TestAllLocales);
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    TESTCASE(TestRelativeCrash);
56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    TESTCASE(TestContext);
578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    TESTCASE(TestCalendarDateParse);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Testing the DateFormat API */
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDateFormat()
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *def, *fr, *it, *de, *def1, *fr_pat;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *any;
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *copy;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar* result = NULL;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UCalendar *cal;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UNumberFormat *numformat1, *numformat2;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar temp[50];
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t numlocales;
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d1;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthneeded;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t parsepos;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = 837039928046.0;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double num = -10456.37;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*const char* str="yyyy.MM.dd G 'at' hh:mm:ss z";
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char t[]="2/3/76 2:50 AM";*/
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing udat_open() to open a dateformat */
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ctest_setTimeZone(NULL, &status);
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting udat_open() with various parameters\n");
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr = udat_open(UDAT_FULL, UDAT_DEFAULT, "fr_FR", NULL,0, NULL, 0,&status);
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAIL: error in creating the dateformat using full time style with french locale -> %s (Are you missing data?)\n",
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this is supposed to open default date format, but later on it treats it like it is "en_US"
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* def = udat_open(UDAT_SHORT, UDAT_SHORT, NULL, NULL, 0, &status); */
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    def = udat_open(UDAT_SHORT, UDAT_SHORT, "en_US", NULL, 0,NULL, 0, &status);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in creating the dateformat using short date and time style\n %s\n",
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    it = udat_open(UDAT_DEFAULT, UDAT_MEDIUM, "it_IT", NULL, 0, NULL, 0,&status);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in creating the dateformat using medium date style with italian locale\n %s\n",
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    de = udat_open(UDAT_LONG, UDAT_LONG, "de_DE", NULL, 0, NULL, 0,&status);
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in creating the dateformat using long time and date styles with german locale\n %s\n",
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status));
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*creating a default dateformat */
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    def1 = udat_open(UDAT_SHORT, UDAT_SHORT, NULL, NULL, 0,NULL, 0, &status);
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in creating the dateformat using short date and time style\n %s\n",
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing udat_getAvailable() and udat_countAvailable()*/
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getAvailableLocales and countAvailable()\n");
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numlocales=udat_countAvailable();
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* use something sensible w/o hardcoding the count */
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(numlocales < 0)
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: error in countAvailable\n");
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("The number of locales for which date/time formatting patterns are available is %d\n", numlocales);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<numlocales;i++) {
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      UErrorCode subStatus = U_ZERO_ERROR;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("Testing open of %s\n", udat_getAvailable(i));
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      any = udat_open(UDAT_SHORT, UDAT_SHORT, udat_getAvailable(i), NULL ,0, NULL, 0, &subStatus);
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(U_FAILURE(subStatus)) {
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: date format %s (getAvailable(%d)) is not instantiable: %s\n", udat_getAvailable(i), i, u_errorName(subStatus));
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      udat_close(any);
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing udat_clone()*/
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the udat_clone() function of date format\n");
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    copy=udat_clone(def, &status);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in creating the clone using udat_clone: %s\n", myErrorName(status) );
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*if(def != copy)
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("Error in udat_clone");*/ /*how should i check for equality???? */
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing udat_format()*/
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the udat_format() function of date format\n");
15554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(temp, "7/10/96, 4:05 PM");
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format using def */
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=udat_format(def, d, NULL, resultlength, NULL, &status);
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != NULL) {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(result);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result = NULL;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_format(def, d, result, resultlength, NULL, &status);
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status) || !result)
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in formatting using udat_format(.....) %s\n", myErrorName(status) );
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: formatting successful\n");
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp)==0)
178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_verbose("PASS: Date Format for US locale successful using udat_format()\n");
179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    else {
180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        char xbuf[2048];
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        char gbuf[2048];
182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_austrcpy(xbuf, temp);
183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_austrcpy(gbuf, result);
184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        log_err("FAIL: Date Format for US locale failed using udat_format() - expected %s got %s\n", xbuf, gbuf);
185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format using fr */
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_unescape("10 juil. 1996 16:05:28 heure avanc\\u00E9e du Pacifique", temp, 50);
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result != NULL) {
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = NULL;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    result=myDateFormat(fr, d);
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp)==0)
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: Date Format for french locale successful using udat_format()\n");
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: Date Format for french locale failed using udat_format().\n" );
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format using it */
20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    u_uastrcpy(temp, "10/lug/1996 16:05:28");
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar *fmtted;
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char g[100];
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char x[100];
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmtted = myDateFormat(it,d);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_austrcpy(g, fmtted);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_austrcpy(x, temp);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(u_strcmp(fmtted, temp)==0) {
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_verbose("PASS: Date Format for italian locale successful uisng udat_format() - wanted %s, got %s\n", x, g);
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_data_err("FAIL: Date Format for italian locale failed using udat_format() - wanted %s, got %s\n", x, g);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing parsing using udat_parse()*/
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting parsing using udat_parse()\n");
21954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    u_uastrcpy(temp,"2/3/76, 2:50 AM");
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parsepos=0;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1=udat_parse(def, temp, u_strlen(temp), &parsepos, &status);
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in parsing using udat_parse(.....) %s\n", myErrorName(status) );
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: parsing succesful\n");
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*format it back and check for equality */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(myDateFormat(def, d1),temp)!=0)
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in parsing\n");
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing parsing using udat_parse()*/
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting parsing using udat_parse()\n");
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(temp,"2/Don't parse this part");
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1=udat_parse(def, temp, u_strlen(temp), NULL, &status);
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status != U_PARSE_ERROR)
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_parse(\"bad string\") passed when it should have failed\n");
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: parsing succesful\n");
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing udat_openPattern()  */
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status=U_ZERO_ERROR;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the udat_openPattern with a specified pattern\n");
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*for french locale */
25554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    fr_pat=udat_open(UDAT_PATTERN, UDAT_PATTERN,"fr_FR",NULL,0,temp, u_strlen(temp), &status);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in creating a date format using udat_openPattern \n %s\n",
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: creating dateformat using udat_openPattern() succesful\n");
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*Testing applyPattern and toPattern */
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting applyPattern and toPattern()\n");
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_applyPattern(def1, FALSE, temp, u_strlen(temp));
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("Extracting the pattern\n");
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=udat_toPattern(def1, FALSE, NULL, resultlength, &status);
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded + 1;
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_toPattern(def1, FALSE, result, resultlength, &status);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, temp)!=0)
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in extracting the pattern\n");
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: applyPattern and toPattern work fine\n");
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result != NULL) {
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = NULL;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing getter and setter functions*/
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*isLenient and setLenient()*/
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the isLenient and setLenient properties\n");
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_setLenient(fr, udat_isLenient(it));
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(udat_isLenient(fr) != udat_isLenient(it))
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: setLenient() failed\n");
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: setLenient() successful\n");
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Test get2DigitYearStart set2DigitYearStart */
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the get and set 2DigitYearStart properties\n");
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1= udat_get2DigitYearStart(fr_pat,&status);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("ERROR: udat_get2DigitYearStart failed %s\n", myErrorName(status) );
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_set2DigitYearStart(def1 ,d1, &status);
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR: udat_set2DigitYearStart failed %s\n", myErrorName(status) );
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(udat_get2DigitYearStart(fr_pat, &status) != udat_get2DigitYearStart(def1, &status))
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in set2DigitYearStart\n");
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: set2DigitYearStart successful\n");
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*try setting it to another value */
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_set2DigitYearStart(de, 2000.0, &status);
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("ERROR: udat_set2DigitYearStart failed %s\n", myErrorName(status) );
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(udat_get2DigitYearStart(de, &status) != 2000)
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in set2DigitYearStart\n");
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: set2DigitYearStart successful\n");
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Test getNumberFormat() and setNumberFormat() */
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the get and set NumberFormat properties of date format\n");
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numformat1=udat_getNumberFormat(fr_pat);
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_setNumberFormat(def1, numformat1);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numformat2=udat_getNumberFormat(def1);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(myNumformat(numformat1, num), myNumformat(numformat2, num)) !=0)
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in setNumberFormat or getNumberFormat()\n");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS:setNumberFormat and getNumberFormat succesful\n");
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*try setting the number format to another format */
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numformat1=udat_getNumberFormat(def);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_setNumberFormat(def1, numformat1);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numformat2=udat_getNumberFormat(def1);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(myNumformat(numformat1, num), myNumformat(numformat2, num)) !=0)
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in setNumberFormat or getNumberFormat()\n");
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: setNumberFormat and getNumberFormat succesful\n");
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Test getCalendar and setCalendar*/
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting the udat_getCalendar() and udat_setCalendar() properties\n");
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal=udat_getCalendar(fr_pat);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_setCalendar(def1, cal);
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!ucal_equivalentTo(udat_getCalendar(fr_pat), udat_getCalendar(def1)))
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in setting and getting the calendar\n");
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: getting and setting calendar successful\n");
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result!=NULL) {
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Closing the UDateForamt */
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(def);
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(fr);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(it);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(de);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(def1);
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(fr_pat);
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(copy);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ctest_resetTimeZone();
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/*
381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruTest combined relative date formatting (relative date + non-relative time).
382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruThis is a bit tricky since we can't have static test data for comparison, the
383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querurelative date formatting is relative to the time the tests are run. We generate
384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruthe data for comparison dynamically. However, the tests could fail if they are
385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querurun right at midnight Pacific time and the call to ucal_getNow() is before midnight
386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruwhile the calls to udat_format are after midnight or span midnight.
387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*/
388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UDate dayInterval = 24.0*60.0*60.0*1000.0;
389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar trdfZone[] = { 0x0055, 0x0053, 0x002F, 0x0050, 0x0061, 0x0063, 0x0069, 0x0066, 0x0069, 0x0063, 0 }; /* US/Pacific */
390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const char trdfLocale[] = "en_US";
391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar minutesPatn[] = { 0x006D, 0x006D, 0 }; /* "mm" */
392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar monthLongPatn[] = { 0x004D, 0x004D, 0x004D, 0x004D, 0 }; /* "MMMM" */
393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar monthMediumPatn[] = { 0x004D, 0x004D, 0x004D, 0 }; /* "MMM" */
394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar monthShortPatn[] = { 0x004D, 0 }; /* "M" */
395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UDateFormatStyle dateStylesList[] = { UDAT_FULL, UDAT_LONG, UDAT_MEDIUM, UDAT_SHORT, UDAT_NONE };
396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar *monthPatnsList[] = { monthLongPatn, monthLongPatn, monthMediumPatn, monthShortPatn, NULL };
397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar newTimePatn[] = { 0x0048, 0x0048, 0x002C, 0x006D, 0x006D, 0 }; /* "HH,mm" */
398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar minutesStr[] = { 0x0034, 0x0039, 0 }; /* "49", minutes string to search for in output */
399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruenum { kDateOrTimeOutMax = 96, kDateAndTimeOutMax = 192 };
400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
40154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const UDate minutesTolerance = 2 * 60.0 * 1000.0;
40254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic const UDate daysTolerance = 2 * 24.0 * 60.0 * 60.0 * 1000.0;
40354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestRelativeDateFormat()
405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UDate today = 0.0;
407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UDateFormatStyle * stylePtr;
408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const UChar ** monthPtnPtr;
409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UCalendar * ucal = ucal_open(trdfZone, -1, trdfLocale, UCAL_GREGORIAN, &status);
411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( U_SUCCESS(status) ) {
412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t    year, month, day;
413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucal_setMillis(ucal, ucal_getNow(), &status);
414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        year = ucal_get(ucal, UCAL_YEAR, &status);
415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        month = ucal_get(ucal, UCAL_MONTH, &status);
416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        day = ucal_get(ucal, UCAL_DATE, &status);
417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucal_setDateTime(ucal, year, month, day, 18, 49, 0, &status); /* set to today at 18:49:00 */
418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        today = ucal_getMillis(ucal, &status);
419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        ucal_close(ucal);
420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( U_FAILURE(status) || today == 0.0 ) {
42250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("Generate UDate for a specified time today fails, error %s - (Are you missing data?)\n", myErrorName(status) );
423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    for (stylePtr = dateStylesList, monthPtnPtr = monthPatnsList; *stylePtr != UDAT_NONE; ++stylePtr, ++monthPtnPtr) {
426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UDateFormat* fmtRelDateTime;
427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UDateFormat* fmtRelDate;
428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UDateFormat* fmtTime;
429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t dayOffset, limit;
430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        UFieldPosition fp;
43154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UChar   strDateTime[kDateAndTimeOutMax];
43254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UChar   strDate[kDateOrTimeOutMax];
43354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UChar   strTime[kDateOrTimeOutMax];
43454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UChar * strPtr;
435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t dtpatLen;
436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fmtRelDateTime = udat_open(UDAT_SHORT, *stylePtr | UDAT_RELATIVE, trdfLocale, trdfZone, -1, NULL, 0, &status);
438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
4396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            log_data_err("udat_open timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s (Are you missing data?)\n", *stylePtr, myErrorName(status) );
440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fmtRelDate = udat_open(UDAT_NONE, *stylePtr | UDAT_RELATIVE, trdfLocale, trdfZone, -1, NULL, 0, &status);
443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("udat_open timeStyle NONE dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_close(fmtRelDateTime);
446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fmtTime = udat_open(UDAT_SHORT, UDAT_NONE, trdfLocale, trdfZone, -1, NULL, 0, &status);
449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_err("udat_open timeStyle SHORT dateStyle NONE fails, error %s\n", myErrorName(status) );
451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_close(fmtRelDateTime);
452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_close(fmtRelDate);
453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            continue;
454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        dtpatLen = udat_toPatternRelativeDate(fmtRelDateTime, strDate, kDateAndTimeOutMax, &status);
457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
45854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPatternRelativeDate timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
45954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            status = U_ZERO_ERROR;
460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if ( u_strstr(strDate, *monthPtnPtr) == NULL || dtpatLen != u_strlen(strDate) ) {
46154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPatternRelativeDate timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) date pattern incorrect\n", *stylePtr );
462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        dtpatLen = udat_toPatternRelativeTime(fmtRelDateTime, strTime, kDateAndTimeOutMax, &status);
464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
46554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPatternRelativeTime timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
46654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            status = U_ZERO_ERROR;
467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if ( u_strstr(strTime, minutesPatn) == NULL || dtpatLen != u_strlen(strTime) ) {
46854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPatternRelativeTime timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) time pattern incorrect\n", *stylePtr );
469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
470b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        dtpatLen = udat_toPattern(fmtRelDateTime, FALSE, strDateTime, kDateAndTimeOutMax, &status);
471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
47254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPattern timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
47354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            status = U_ZERO_ERROR;
474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else if ( u_strstr(strDateTime, strDate) == NULL || u_strstr(strDateTime, strTime) == NULL || dtpatLen != u_strlen(strDateTime) ) {
47554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_toPattern timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) dateTime pattern incorrect\n", *stylePtr );
476b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_applyPatternRelative(fmtRelDateTime, strDate, u_strlen(strDate), newTimePatn, u_strlen(newTimePatn), &status);
478b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if ( U_FAILURE(status) ) {
47954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            log_err("udat_applyPatternRelative timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
48054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            status = U_ZERO_ERROR;
481b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        } else {
48254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            udat_toPattern(fmtRelDateTime, FALSE, strDateTime, kDateAndTimeOutMax, &status);
48354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if ( U_FAILURE(status) ) {
48454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                log_err("udat_toPattern timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
48554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                status = U_ZERO_ERROR;
48654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            } else if ( u_strstr(strDateTime, newTimePatn) == NULL ) {
48754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                log_err("udat_applyPatternRelative timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) didn't update time pattern\n", *stylePtr );
48854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_applyPatternRelative(fmtRelDateTime, strDate, u_strlen(strDate), strTime, u_strlen(strTime), &status); /* restore original */
491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        fp.field = UDAT_MINUTE_FIELD;
493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        for (dayOffset = -2, limit = 2; dayOffset <= limit; ++dayOffset) {
494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UDate   dateToUse = today + (float)dayOffset*dayInterval;
495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
496b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_format(fmtRelDateTime, dateToUse, strDateTime, kDateAndTimeOutMax, &fp, &status);
497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if ( U_FAILURE(status) ) {
498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
499b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                status = U_ZERO_ERROR;
500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
50154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                int32_t parsePos = 0;
50254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                UDate dateResult = udat_parse(fmtRelDateTime, strDateTime, -1, &parsePos, &status);
50354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                UDate dateDiff =  (dateResult >= dateToUse)? dateResult - dateToUse: dateToUse - dateResult;
50454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                if ( U_FAILURE(status) || dateDiff > minutesTolerance ) {
50554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    log_err("udat_parse timeStyle SHORT dateStyle (%d | UDAT_RELATIVE) fails, error %s, expect approx %.1f, got %.1f, parsePos %d\n",
50654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                            *stylePtr, myErrorName(status), dateToUse, dateResult, parsePos );
50754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    status = U_ZERO_ERROR;
50854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                }
50954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
510b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                udat_format(fmtRelDate, dateToUse, strDate, kDateOrTimeOutMax, NULL, &status);
511b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if ( U_FAILURE(status) ) {
512b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("udat_format timeStyle NONE dateStyle (%d | UDAT_RELATIVE) fails, error %s\n", *stylePtr, myErrorName(status) );
513b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    status = U_ZERO_ERROR;
514b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else if ( u_strstr(strDateTime, strDate) == NULL ) {
515b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("relative date string not found in udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE)\n", *stylePtr );
51654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                } else {
51754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    parsePos = 0;
51854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    dateResult = udat_parse(fmtRelDate, strDate, -1, &parsePos, &status);
51954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    dateDiff =  (dateResult >= dateToUse)? dateResult - dateToUse: dateToUse - dateResult;
52054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    if ( U_FAILURE(status) || dateDiff > daysTolerance ) {
52154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        log_err("udat_parse timeStyle NONE dateStyle (%d | UDAT_RELATIVE) fails, error %s, expect approx %.1f, got %.1f, parsePos %d\n",
52254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                                *stylePtr, myErrorName(status), dateToUse, dateResult, parsePos );
52354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        status = U_ZERO_ERROR;
52454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    }
525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                udat_format(fmtTime, dateToUse, strTime, kDateOrTimeOutMax, NULL, &status);
528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if ( U_FAILURE(status) ) {
529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("udat_format timeStyle SHORT dateStyle NONE fails, error %s\n", myErrorName(status) );
530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    status = U_ZERO_ERROR;
531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else if ( u_strstr(strDateTime, strTime) == NULL ) {
532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("time string not found in udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE)\n", *stylePtr );
533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                strPtr = u_strstr(strDateTime, minutesStr);
536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                if ( strPtr != NULL ) {
537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    int32_t beginIndex = strPtr - strDateTime;
538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    if ( fp.beginIndex != beginIndex ) {
539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        log_err("UFieldPosition beginIndex %d, expected %d, in udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE)\n", fp.beginIndex, beginIndex, *stylePtr );
540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    }
541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                } else {
542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    log_err("minutes string not found in udat_format timeStyle SHORT dateStyle (%d | UDAT_RELATIVE)\n", *stylePtr );
543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                }
544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_close(fmtRelDateTime);
548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_close(fmtRelDate);
549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_close(fmtTime);
550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru     }
551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*Testing udat_getSymbols() and udat_setSymbols() and udat_countSymbols()*/
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestSymbols()
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *def, *fr;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *value=NULL;
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result = NULL;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlengthout;
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pattern;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*creating a dateformat with french locale */
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\ncreating a date format with french locale\n");
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fr = udat_open(UDAT_FULL, UDAT_DEFAULT, "fr_FR", NULL, 0, NULL, 0, &status);
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
5706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("error in creating the dateformat using full time style with french locale -> %s (Are you missing data?)\n",
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*creating a default dateformat */
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\ncreating a date format with default locale\n");
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* this is supposed to open default date format, but later on it treats it like it is "en_US"
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* def = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL, NULL, 0, &status); */
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    def = udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,"en_US", NULL, 0, NULL, 0, &status);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error in creating the dateformat using short date and time style\n %s\n",
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Testing countSymbols, getSymbols and setSymbols*/
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting countSymbols\n");
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*since the month names has the last string empty and week names are 1 based 1.e first string in the weeknames array is empty */
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(udat_countSymbols(def, UDAT_ERAS)!=2 || udat_countSymbols(def, UDAT_MONTHS)!=12 ||
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_countSymbols(def, UDAT_SHORT_MONTHS)!=12 || udat_countSymbols(def, UDAT_WEEKDAYS)!=8 ||
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_countSymbols(def, UDAT_SHORT_WEEKDAYS)!=8 || udat_countSymbols(def, UDAT_AM_PMS)!=2 ||
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_countSymbols(def, UDAT_QUARTERS) != 4 || udat_countSymbols(def, UDAT_SHORT_QUARTERS) != 4 ||
5958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        udat_countSymbols(def, UDAT_LOCALIZED_CHARS)!=1 || udat_countSymbols(def, UDAT_SHORTER_WEEKDAYS)!=8)
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in udat_countSymbols\n");
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: udat_countSymbols() successful\n");
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing getSymbols*/
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getSymbols\n");
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=(UChar*)malloc(sizeof(UChar) * 10);
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pattern, "jeudi");
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthout=udat_getSymbols(fr, UDAT_WEEKDAYS, 5 , NULL, resultlength, &status);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != NULL) {
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(result);
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result = NULL;
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_getSymbols(fr, UDAT_WEEKDAYS, 5, result, resultlength, &status);
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in udat_getSymbols().... %s\n", myErrorName(status) );
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: getSymbols succesful\n");
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, pattern)==0)
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: getSymbols retrieved the right value\n");
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: getSymbols retrieved the wrong value\n");
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*run series of tests to test getsymbols regressively*/
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting getSymbols() regressively\n");
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_WEEKDAYS, 1, "dimanche");
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_WEEKDAYS, 1, "Sunday");
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_SHORT_WEEKDAYS, 7, "sam.");
6378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    VerifygetSymbols(fr, UDAT_SHORTER_WEEKDAYS, 7, "sa");
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_SHORT_WEEKDAYS, 7, "Sat");
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_MONTHS, 11, "December");
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_MONTHS, 0, "January");
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_ERAS, 0, "av. J.-C.");
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_AM_PMS, 0, "AM");
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_AM_PMS, 1, "PM");
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_SHORT_MONTHS, 0, "janv.");
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_SHORT_MONTHS, 11, "Dec");
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_QUARTERS, 0, "1er trimestre");
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_QUARTERS, 3, "4th quarter");
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(fr, UDAT_SHORT_QUARTERS, 1, "T2");
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetSymbols(def, UDAT_SHORT_QUARTERS, 2, "Q3");
650fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    VerifygetSymbols(def,UDAT_LOCALIZED_CHARS, 0, "GyMdkHmsSEDFwWahKzYeugAZvcLQqVUOXxr");
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result != NULL) {
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = NULL;
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(pattern);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting setSymbols\n");
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*applying the pattern so that setSymbolss works */
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthout=udat_toPattern(fr, FALSE, NULL, resultlength, &status);
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout + 1;
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pattern=(UChar*)malloc(sizeof(UChar) * resultlength);
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_toPattern(fr, FALSE, pattern, resultlength, &status);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_applyPattern(def, FALSE, pattern, u_strlen(pattern));
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthout=udat_toPattern(def, FALSE, NULL, resultlength,&status);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout + 1;
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != NULL) {
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(result);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result = NULL;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_toPattern(fr, FALSE,result, resultlength, &status);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in extracting the pattern from UNumberFormat\n %s\n",
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, pattern)==0)
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Pattern applied properly\n");
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("pattern could not be applied properly\n");
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufree(pattern);
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*testing set symbols */
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthout=udat_getSymbols(fr, UDAT_MONTHS, 11 , NULL, resultlength, &status);
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result != NULL) {
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            free(result);
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            result = NULL;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_getSymbols(fr, UDAT_MONTHS, 11, result, resultlength, &status);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in getSymbols() %s\n", myErrorName(status) );
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=resultlengthout+1;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_setSymbols(def, UDAT_MONTHS, 11, result, resultlength, &status);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in udat_setSymbols() : %s\n", myErrorName(status) );
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: SetSymbols successful\n");
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthout=udat_getSymbols(def, UDAT_MONTHS, 11, NULL, resultlength, &status);
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value=(UChar*)malloc(sizeof(UChar) * resultlength);
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        udat_getSymbols(def, UDAT_MONTHS, 11, value, resultlength, &status);
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in retrieving the value using getSymbols i.e roundtrip\n");
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, value)!=0)
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: Error in settting and getting symbols\n");
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: setSymbols successful\n");
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*run series of tests to test setSymbols regressively*/
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting setSymbols regressively\n");
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_ERAS, 0, "BeforeChrist");
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_ERA_NAMES, 1, "AnnoDomini");
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_WEEKDAYS, 1, "Sundayweek");
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_SHORT_WEEKDAYS, 7, "Satweek");
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_NARROW_WEEKDAYS, 4, "M");
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_STANDALONE_WEEKDAYS, 1, "Sonntagweek");
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_STANDALONE_SHORT_WEEKDAYS, 7, "Sams");
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(def, UDAT_STANDALONE_NARROW_WEEKDAYS, 4, "V");
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_MONTHS, 11, "december");
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_SHORT_MONTHS, 0, "Jan");
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_NARROW_MONTHS, 1, "R");
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_STANDALONE_MONTHS, 11, "dezember");
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_STANDALONE_SHORT_MONTHS, 7, "Aug");
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_STANDALONE_NARROW_MONTHS, 2, "M");
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_QUARTERS, 0, "1. Quart");
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_SHORT_QUARTERS, 1, "QQ2");
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_STANDALONE_QUARTERS, 2, "3rd Quar.");
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifysetSymbols(fr, UDAT_STANDALONE_SHORT_QUARTERS, 3, "4QQ");
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*run series of tests to test get and setSymbols regressively*/
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\nTesting get and set symbols regressively\n");
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_WEEKDAYS, 1);
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_WEEKDAYS, 7);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_SHORT_WEEKDAYS, 1);
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_SHORT_WEEKDAYS, 7);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_MONTHS, 0);
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_SHORT_MONTHS, 0);
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_ERAS,1);
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_LOCALIZED_CHARS, 0);
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    VerifygetsetSymbols(fr, def, UDAT_AM_PMS, 1);
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*closing*/
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(fr);
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(def);
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result != NULL) {
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(result);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result = NULL;
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(value);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test DateFormat(Calendar) API
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestDateFormatCalendar() {
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *date=0, *time=0, *full=0;
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCalendar *cal=0;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buf[256];
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char cbuf[256];
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t pos;
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate when;
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ctest_setTimeZone(NULL, &ec);
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Create a formatter for date fields. */
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    date = udat_open(UDAT_NONE, UDAT_SHORT, "en_US", NULL, 0, NULL, 0, &ec);
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
8086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAIL: udat_open(NONE, SHORT, en_US) failed with %s (Are you missing data?)\n",
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(ec));
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Create a formatter for time fields. */
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    time = udat_open(UDAT_SHORT, UDAT_NONE, "en_US", NULL, 0, NULL, 0, &ec);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_open(SHORT, NONE, en_US) failed with %s\n",
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(ec));
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Create a full format for output */
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    full = udat_open(UDAT_FULL, UDAT_FULL, "en_US", NULL, 0, NULL, 0, &ec);
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_open(FULL, FULL, en_US) failed with %s\n",
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(ec));
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Create a calendar */
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = ucal_open(NULL, 0, "en_US", UCAL_GREGORIAN, &ec);
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ucal_open(en_US) failed with %s\n",
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(ec));
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Parse the date */
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucal_clear(cal);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(buf, "4/5/2001");
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = 0;
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_parseCalendar(date, cal, buf, -1, &pos, &ec);
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_parseCalendar(4/5/2001) failed at %d with %s\n",
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos, u_errorName(ec));
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Parse the time */
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(buf, "5:45 PM");
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos = 0;
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_parseCalendar(time, cal, buf, -1, &pos, &ec);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_parseCalendar(17:45) failed at %d with %s\n",
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pos, u_errorName(ec));
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Check result */
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    when = ucal_getMillis(cal, &ec);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: ucal_getMillis() failed with %s\n", u_errorName(ec));
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_format(full, when, buf, sizeof(buf), NULL, &ec);
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_format() failed with %s\n", u_errorName(ec));
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        goto FAIL;
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_austrcpy(cbuf, buf);
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Thursday, April 5, 2001 5:45:00 PM PDT 986517900000 */
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (when == 986517900000.0) {
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("Ok: Parsed result: %s\n", cbuf);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Parsed result: %s, exp 4/5/2001 5:45 PM\n", cbuf);
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FAIL:
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(date);
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(time);
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(full);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ucal_close(cal);
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ctest_resetTimeZone();
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8868393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
8878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
8888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/**
88959d709d503bab6e2b61931737e662dd293b40578ccornelius * Test parsing two digit year against "YY" vs. "YYYY" patterns
8908393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */
8918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic void TestCalendarDateParse() {
8928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
89359d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t result;
89459d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode ec = U_ZERO_ERROR;
8958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UDateFormat* simpleDateFormat = 0;
89659d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t parsePos = 0;
89759d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t twoDigitCenturyStart = 75;
89859d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t currentTwoDigitYear = 0;
89959d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t startCentury = 0;
9008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UCalendar* tempCal = 0;
9018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    UCalendar* calendar = 0;
9028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_DECL(pattern, "yyyy", 4);
9048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_DECL(pattern2, "yy", 2);
9058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_DECL(text, "75", 2);
9068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_INIT(pattern, "yyyy", 4);
9088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_INIT(pattern2, "yy", 2);
9098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    U_STRING_INIT(text, "75", 2);
9108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    simpleDateFormat = udat_open(UDAT_FULL, UDAT_FULL, "en-GB", 0, 0, 0, 0, &ec);
9128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (U_FAILURE(ec)) {
9138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_data_err("udat_open(UDAT_FULL, UDAT_FULL, \"en-GB\", 0, 0, 0, 0, &ec) failed: %s - (Are you missing data?)\n", u_errorName(ec));
9148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        return;
9158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_applyPattern(simpleDateFormat, 0, pattern, u_strlen(pattern));
9178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_setLenient(simpleDateFormat, 0);
9188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    currentTwoDigitYear = getCurrentYear() % 100;
9208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    startCentury = getCurrentYear() - currentTwoDigitYear;
9218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (twoDigitCenturyStart > currentTwoDigitYear) {
92259d709d503bab6e2b61931737e662dd293b40578ccornelius      startCentury -= 100;
9238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
92459d709d503bab6e2b61931737e662dd293b40578ccornelius    tempCal = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &ec);
92559d709d503bab6e2b61931737e662dd293b40578ccornelius    ucal_setMillis(tempCal, 0, &ec);
92659d709d503bab6e2b61931737e662dd293b40578ccornelius    ucal_setDateTime(tempCal, startCentury + twoDigitCenturyStart, UCAL_JANUARY, 1, 0, 0, 0, &ec);
92759d709d503bab6e2b61931737e662dd293b40578ccornelius    udat_set2DigitYearStart(simpleDateFormat, ucal_getMillis(tempCal, &ec), &ec);
9288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
92959d709d503bab6e2b61931737e662dd293b40578ccornelius    calendar = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &ec);
93059d709d503bab6e2b61931737e662dd293b40578ccornelius    ucal_setMillis(calendar, 0, &ec);
93159d709d503bab6e2b61931737e662dd293b40578ccornelius    ucal_setDateTime(calendar, twoDigitCenturyStart, UCAL_JANUARY, 1, 0, 0, 0, &ec);
9328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
93359d709d503bab6e2b61931737e662dd293b40578ccornelius    udat_parseCalendar(simpleDateFormat, calendar, text, u_strlen(text), &parsePos, &ec);
9348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    /* Check result */
9368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    result = ucal_get(calendar, UCAL_YEAR, &ec);
9378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (U_FAILURE(ec)) {
9388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_err("FAIL: ucal_get(UCAL_YEAR) failed with %s\n", u_errorName(ec));
9398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        goto FAIL;
9408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (result != 75) {
9438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_err("FAIL: parsed incorrect year: %d\n", result);
9448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        goto FAIL;
9458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    parsePos = 0;
9488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_applyPattern(simpleDateFormat, 0, pattern2, u_strlen(pattern2));
94959d709d503bab6e2b61931737e662dd293b40578ccornelius    udat_parseCalendar(simpleDateFormat, calendar, text, u_strlen(text), &parsePos, &ec);
9508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    /* Check result */
9528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    result = ucal_get(calendar, UCAL_YEAR, &ec);
9538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (U_FAILURE(ec)) {
9548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_err("FAIL: ucal_get(UCAL_YEAR) failed with %s\n", u_errorName(ec));
9558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        goto FAIL;
9568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (result != 1975) {
9598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        log_err("FAIL: parsed incorrect year: %d\n", result);
9608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        goto FAIL;
9618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius FAIL:
9648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_close(simpleDateFormat);
9658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_close(tempCal);
9668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    udat_close(calendar);
9678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
9688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*INTERNAL FUNCTIONS USED*/
9718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic int getCurrentYear() {
9728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    static int currentYear = 0;
9738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if (currentYear == 0) {
9748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UErrorCode status = U_ZERO_ERROR;
9758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        UCalendar *cal = ucal_open(NULL, -1, NULL, UCAL_GREGORIAN, &status);
9768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        if (!U_FAILURE(status)) {
9778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            /* Get the current year from the default UCalendar */
9788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            currentYear = ucal_get(cal, UCAL_YEAR, &status);
9798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            ucal_close(cal);
9808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
9818393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
9828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
9838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    return currentYear;
9848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
9858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/* N.B.:  use idx instead of index to avoid 'shadow' warnings in strict mode. */
987b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void VerifygetSymbols(UDateFormat* datfor, UDateFormatSymbolType type, int32_t idx, const char* expected)
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *pattern=NULL;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength, resultlengthout;
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pattern=(UChar*)malloc(sizeof(UChar) * (strlen(expected)+1));
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(pattern, expected);
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    resultlengthout=udat_getSymbols(datfor, type, idx , NULL, resultlength, &status);
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
1004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_getSymbols(datfor, type, idx, result, resultlength, &status);
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in udat_getSymbols()... %s\n", myErrorName(status) );
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, pattern)==0)
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: getSymbols retrieved the right value\n");
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else{
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL: getSymbols retrieved the wrong value\n Expected %s Got %s\n", austrdup(pattern),
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            austrdup(result) );
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(result);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(pattern);
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void VerifysetSymbols(UDateFormat* datfor, UDateFormatSymbolType type, int32_t idx, const char* expected)
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *value=NULL;
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength, resultlengthout;
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    value=(UChar*)malloc(sizeof(UChar) * (strlen(expected) + 1));
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_uastrcpy(value, expected);
1031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    udat_setSymbols(datfor, type, idx, value, u_strlen(value), &status);
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in udat_setSymbols()  %s\n", myErrorName(status) );
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1039b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    resultlengthout=udat_getSymbols(datfor, type, idx, NULL, resultlength, &status);
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
1044b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_getSymbols(datfor, type, idx, result, resultlength, &status);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in retrieving the value using getSymbols after setting it previously\n %s\n",
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, value)!=0){
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL:Error in setting and then getting symbols\n Expected %s Got %s\n", austrdup(value),
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            austrdup(result) );
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: setSymbols successful\n");
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(value);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(result);
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1064b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void VerifygetsetSymbols(UDateFormat* from, UDateFormat* to, UDateFormatSymbolType type, int32_t idx)
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result=NULL;
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *value=NULL;
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength, resultlengthout;
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    resultlengthout=udat_getSymbols(from, type, idx , NULL, resultlength, &status);
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result=(UChar*)malloc(sizeof(UChar) * resultlength);
1077b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_getSymbols(from, type, idx, result, resultlength, &status);
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in getSymbols() %s\n", myErrorName(status) );
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=resultlengthout+1;
1085b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    udat_setSymbols(to, type, idx, result, resultlength, &status);
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("FAIL: Error in udat_setSymbols() : %s\n", myErrorName(status) );
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1093b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    resultlengthout=udat_getSymbols(to, type, idx, NULL, resultlength, &status);
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR){
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthout+1;
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value=(UChar*)malloc(sizeof(UChar) * resultlength);
1098b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_getSymbols(to, type, idx, value, resultlength, &status);
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: error in retrieving the value using getSymbols i.e roundtrip\n %s\n",
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            myErrorName(status) );
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, value)!=0){
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_data_err("FAIL:Error in setting and then getting symbols\n Expected %s Got %s\n", austrdup(result),
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            austrdup(value) );
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("PASS: setSymbols successful\n");
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(value);
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(result);
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar* myNumformat(const UNumberFormat* numfor, double d)
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *result2=NULL;
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t resultlength, resultlengthneeded;
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlength=0;
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    resultlengthneeded=unum_formatDouble(numfor, d, NULL, resultlength, NULL, &status);
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==U_BUFFER_OVERFLOW_ERROR)
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status=U_ZERO_ERROR;
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        resultlength=resultlengthneeded+1;
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*result2=(UChar*)malloc(sizeof(UChar) * resultlength);*/ /* this leaks */
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result2=(UChar*)ctst_malloc(sizeof(UChar) * resultlength); /*this won't*/
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        unum_formatDouble(numfor, d, result2, resultlength, NULL, &status);
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: Error in formatting using unum_format(.....) %s\n", myErrorName(status) );
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result2;
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The search depth for TestExtremeDates.  The total number of
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * dates that will be tested is (2^EXTREME_DATES_DEPTH) - 1.
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define EXTREME_DATES_DEPTH 8
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Support for TestExtremeDates (below).
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test a single date to see whether udat_format handles it properly.
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool _aux1ExtremeDates(UDateFormat* fmt, UDate date,
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               UChar* buf, int32_t buflen, char* cbuf,
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               UErrorCode* ec) {
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = udat_format(fmt, date, buf, buflen, 0, ec);
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!assertSuccess("udat_format", ec)) return FALSE;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_austrncpy(cbuf, buf, buflen);
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (len < 4) {
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("FAIL: udat_format(%g) => \"%s\"\n", date, cbuf);
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("udat_format(%g) => \"%s\"\n", date, cbuf);
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Support for TestExtremeDates (below).
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Recursively test between 'small' and 'large', up to the depth
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * limit specified by EXTREME_DATES_DEPTH.
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool _aux2ExtremeDates(UDateFormat* fmt, UDate small, UDate large,
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               UChar* buf, int32_t buflen, char* cbuf,
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               int32_t count,
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               UErrorCode* ec) {
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Logarithmic midpoint; see below */
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate mid = (UDate) exp((log(small) + log(large)) / 2);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (count == EXTREME_DATES_DEPTH) {
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _aux1ExtremeDates(fmt, mid, buf, buflen, cbuf, ec) &&
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _aux2ExtremeDates(fmt, small, mid, buf, buflen, cbuf, count+1, ec) &&
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _aux2ExtremeDates(fmt, mid, large, buf, buflen, cbuf, count+1, ec);
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * http://www.jtcsv.com/cgibin/icu-bugs?findid=3659
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For certain large dates, udat_format crashes on MacOS.  This test
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * attempts to reproduce this problem by doing a recursive logarithmic*
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * binary search of a predefined interval (from 'small' to 'large').
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The limit of the search is given by EXTREME_DATES_DEPTH, above.
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * *The search has to be logarithmic, not linear.  A linear search of the
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  range 0..10^30, for example, will find 0.5*10^30, then 0.25*10^30 and
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  0.75*10^30, etc.  A logarithmic search will find 10^15, then 10^7.5
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *  and 10^22.5, etc.
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestExtremeDates() {
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDateFormat *fmt;
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buf[256];
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char cbuf[256];
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double small = 1000; /* 1 sec */
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double large = 1e+30; /* well beyond usable UDate range */
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* There is no need to test larger values from 1e+30 to 1e+300;
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       the failures occur around 1e+27, and never above 1e+30. */
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ec = U_ZERO_ERROR;
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = udat_open(UDAT_LONG, UDAT_LONG, "en_US",
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    0, 0, 0, 0, &ec);
12176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (U_FAILURE(ec)) {
12186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        log_data_err("FAIL: udat_open (%s) (Are you missing data?)\n", u_errorName(ec));
12196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
12206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _aux2ExtremeDates(fmt, small, large, buf, LEN(buf), cbuf, 0, &ec);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    udat_close(fmt);
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestAllLocales(void) {
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t idx, dateIdx, timeIdx, localeCount;
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UDateFormatStyle style[] = {
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDAT_FULL, UDAT_LONG, UDAT_MEDIUM, UDAT_SHORT
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    localeCount = uloc_countAvailable();
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (idx = 0; idx < localeCount; idx++) {
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (dateIdx = 0; dateIdx < (int32_t)(sizeof(style)/sizeof(style[0])); dateIdx++) {
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (timeIdx = 0; timeIdx < (int32_t)(sizeof(style)/sizeof(style[0])); timeIdx++) {
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UErrorCode status = U_ZERO_ERROR;
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                udat_close(udat_open(style[dateIdx], style[timeIdx],
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    uloc_getAvailable(idx), NULL, 0, NULL, 0, &status));
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_FAILURE(status)) {
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    log_err("FAIL: udat_open(%s) failed with (%s) dateIdx=%d, timeIdx=%d\n",
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        uloc_getAvailable(idx), u_errorName(status), dateIdx, timeIdx);
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic void TestRelativeCrash(void) {
1249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru       static const UChar tzName[] = { 0x0055, 0x0053, 0x002F, 0x0050, 0x0061, 0x0063, 0x0069, 0x0066, 0x0069, 0x0063, 0 };
1250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru       static const UDate aDate = -631152000000.0;
1251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1253b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode expectStatus = U_ILLEGAL_ARGUMENT_ERROR;
1254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UDateFormat icudf;
1255b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    icudf = udat_open(UDAT_NONE, UDAT_SHORT_RELATIVE, "en", tzName, -1, NULL, 0, &status);
1257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if ( U_SUCCESS(status) ) {
1258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        const char *what = "???";
1259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_set2DigitYearStart";
1262b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_set2DigitYearStart(icudf, aDate, &subStatus);
1264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == expectStatus) {
1265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* clone works polymorphically. try it anyways */
1272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UDateFormat *oth;
1274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "clone";
1275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            oth = udat_clone(icudf, &subStatus);
1277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == U_ZERO_ERROR) {
1278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                udat_close(oth); /* ? */
1280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got  %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_get2DigitYearStart";
1287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_get2DigitYearStart(icudf, &subStatus);
1289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == expectStatus) {
1290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            /* Now udat_toPattern works for relative date formatters, unless localized is TRUE */
1297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_toPattern";
1299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_toPattern(icudf, TRUE,NULL,0, &subStatus);
1301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == expectStatus) {
1302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_applyPattern";
1310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_applyPattern(icudf, FALSE,tzName,-1);
1312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            subStatus = U_ILLEGAL_ARGUMENT_ERROR; /* what it should be, if this took an errorcode. */
1313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == expectStatus) {
1314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
132054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            UChar erabuf[32];
1321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_getSymbols";
1323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            udat_getSymbols(icudf, UDAT_ERAS,0,erabuf,sizeof(erabuf)/sizeof(erabuf[0]), &subStatus);
1325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(subStatus == U_ZERO_ERROR) {
1326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_verbose("Success: %s returned %s.\n", what, u_errorName(subStatus));
1327b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                log_err("FAIL: didn't crash on %s, but got %s instead of U_ZERO_ERROR.\n", what, u_errorName(subStatus));
132927f654740f2a26ad62a5c155af9199af9e69b889claireho            }
133027f654740f2a26ad62a5c155af9199af9e69b889claireho        }
133127f654740f2a26ad62a5c155af9199af9e69b889claireho        {
133227f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode subStatus = U_ZERO_ERROR;
133327f654740f2a26ad62a5c155af9199af9e69b889claireho            UChar symbolValue = 0x0041;
133427f654740f2a26ad62a5c155af9199af9e69b889claireho            what = "udat_setSymbols";
133527f654740f2a26ad62a5c155af9199af9e69b889claireho            log_verbose("Trying %s on a relative date..\n", what);
133627f654740f2a26ad62a5c155af9199af9e69b889claireho            udat_setSymbols(icudf, UDAT_ERAS,0,&symbolValue,1, &subStatus);  /* bogus values */
133727f654740f2a26ad62a5c155af9199af9e69b889claireho            if(subStatus == expectStatus) {
133827f654740f2a26ad62a5c155af9199af9e69b889claireho                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
133927f654740f2a26ad62a5c155af9199af9e69b889claireho            } else {
134027f654740f2a26ad62a5c155af9199af9e69b889claireho                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {
1344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            UErrorCode subStatus = U_ZERO_ERROR;
1345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            what = "udat_countSymbols";
1346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            log_verbose("Trying %s on a relative date..\n", what);
1347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            udat_countSymbols(icudf, UDAT_ERAS);
1348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            subStatus = U_ILLEGAL_ARGUMENT_ERROR; /* should have an errorcode. */
1349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if(subStatus == expectStatus) {
1350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_verbose("Success: did not crash on %s, but got %s.\n", what, u_errorName(subStatus));
1351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                log_err("FAIL: didn't crash on %s, but got success %s instead of %s. \n", what, u_errorName(subStatus), u_errorName(expectStatus));
1353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        }
1355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        udat_close(icudf);
1357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else {
13586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru         log_data_err("FAIL: err calling udat_open() ->%s (Are you missing data?)\n", u_errorName(status));
1359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
1361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1362103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const UChar skeleton_yMMMM[] = { 0x79,0x4D,0x4D,0x4D,0x4D,0 }; /* "yMMMM"; fr maps to "MMMM y", cs maps to "LLLL y" */
1363103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const UChar july2008_frDefault[] = { 0x6A,0x75,0x69,0x6C,0x6C,0x65,0x74,0x20,0x32,0x30,0x30,0x38,0 }; /* "juillet 2008" */
1364103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const UChar july2008_frTitle[] = { 0x4A,0x75,0x69,0x6C,0x6C,0x65,0x74,0x20,0x32,0x30,0x30,0x38,0 };  /* "Juillet 2008" sentence-begin, standalone */
1365103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const UChar july2008_csDefault[] = { 0x10D,0x65,0x72,0x76,0x65,0x6E,0x65,0x63,0x20,0x32,0x30,0x30,0x38,0 }; /* "c(hacek)ervenec 2008" */
1366103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const UChar july2008_csTitle[] = { 0x10C,0x65,0x72,0x76,0x65,0x6E,0x65,0x63,0x20,0x32,0x30,0x30,0x38,0 }; /* "C(hacek)ervenec 2008" sentence-begin, uiListOrMenu */
1367103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1368103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliustypedef struct {
1369103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char * locale;
1370103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UChar * skeleton;
137154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UDisplayContext capitalizationContext;
1372103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UChar * expectedFormat;
1373103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} TestContextItem;
1374103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1375103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const TestContextItem textContextItems[] = {
137654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "fr", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_NONE,                   july2008_frDefault },
1377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !UCONFIG_NO_BREAK_ITERATION
137854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "fr", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, july2008_frDefault },
137954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "fr", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, july2008_frTitle },
138054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "fr", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,    july2008_frDefault },
138154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "fr", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_STANDALONE,         july2008_frTitle },
1382103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
138354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "cs", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_NONE,                   july2008_csDefault },
1384103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !UCONFIG_NO_BREAK_ITERATION
138554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "cs", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, july2008_csDefault },
138654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "cs", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, july2008_csTitle },
138754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "cs", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,    july2008_csTitle },
138854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { "cs", skeleton_yMMMM, UDISPCTX_CAPITALIZATION_FOR_STANDALONE,         july2008_csDefault },
1389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif
139054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    { NULL, NULL, (UDisplayContext)0, NULL }
1391103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius};
1392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar today_enDefault[]     = { 0x74,0x6F,0x64,0x61,0x79,0 }; /* "today" */
1394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar today_enTitle[]       = { 0x54,0x6F,0x64,0x61,0x79,0 };  /* "Today" sentence-begin, uiListOrMenu, standalone */
1395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar yesterday_enDefault[] = { 0x79,0x65,0x73,0x74,0x65,0x72,0x64,0x61,0x79,0 }; /* "yesterday" */
1396fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar yesterday_enTitle[]   = { 0x59,0x65,0x73,0x74,0x65,0x72,0x64,0x61,0x79,0 };  /* "Yesterday" sentence-begin, uiListOrMenu, standalone */
1397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar today_nbDefault[]     = { 0x69,0x20,0x64,0x61,0x67,0 }; /* "i dag" */
1398fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar today_nbTitle[]       = { 0x49,0x20,0x64,0x61,0x67,0 };  /* "I dag" sentence-begin, standalone */
1399fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar yesterday_nbDefault[] = { 0x69,0x20,0x67,0xE5,0x72,0 };
1400fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar yesterday_nbTitle[]   = { 0x49,0x20,0x67,0xE5,0x72,0 };
1401fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1402fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliustypedef struct {
1403fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char * locale;
1404fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UDisplayContext capitalizationContext;
1405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const UChar * expectedFormatToday;
1406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const UChar * expectedFormatYesterday;
1407fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} TestRelativeContextItem;
1408fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1409fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const TestRelativeContextItem textContextRelativeItems[] = {
1410fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UDISPCTX_CAPITALIZATION_NONE,                   today_enDefault, yesterday_enDefault },
1411fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION
1412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, today_enDefault, yesterday_enDefault },
1413fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, today_enTitle, yesterday_enTitle },
1414fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,    today_enTitle, yesterday_enTitle },
1415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "en", UDISPCTX_CAPITALIZATION_FOR_STANDALONE,         today_enTitle, yesterday_enTitle },
1416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1417fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "nb", UDISPCTX_CAPITALIZATION_NONE,                   today_nbDefault, yesterday_nbDefault },
1418fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if !UCONFIG_NO_BREAK_ITERATION
1419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "nb", UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, today_nbDefault, yesterday_nbDefault },
1420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "nb", UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, today_nbTitle, yesterday_nbTitle },
1421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "nb", UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU,    today_nbDefault, yesterday_nbDefault },
1422fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { "nb", UDISPCTX_CAPITALIZATION_FOR_STANDALONE,         today_nbTitle, yesterday_nbTitle },
1423fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
1424fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    { NULL, (UDisplayContext)0, NULL, NULL }
1425fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius};
1426fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
1427fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UChar zoneGMT[] = { 0x47,0x4D,0x54,0 }; /* "GMT" */
1428fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const UDate july022008 = 1215000000000.0;
1429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusenum { kUbufMax = 64, kBbufMax = 3*kUbufMax };
1430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1431103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestContext(void) {
1432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const TestContextItem* textContextItemPtr;
1433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const TestRelativeContextItem* textRelContextItemPtr;
1434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (textContextItemPtr = textContextItems; textContextItemPtr->locale != NULL; ++textContextItemPtr) {
1435103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UErrorCode status = U_ZERO_ERROR;
1436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UDateTimePatternGenerator* udtpg = udatpg_open(textContextItemPtr->locale, &status);
1437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if ( U_SUCCESS(status) ) {
1438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UChar ubuf[kUbufMax];
1439fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            int32_t len = udatpg_getBestPattern(udtpg, textContextItemPtr->skeleton, -1, ubuf, kUbufMax, &status);
1440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if ( U_SUCCESS(status) ) {
1441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                UDateFormat* udfmt = udat_open(UDAT_PATTERN, UDAT_PATTERN, textContextItemPtr->locale, zoneGMT, -1, ubuf, len, &status);
1442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                if ( U_SUCCESS(status) ) {
144354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    udat_setContext(udfmt, textContextItemPtr->capitalizationContext, &status);
1444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    if ( U_SUCCESS(status) ) {
144554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        UDisplayContext getContext;
1446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        len = udat_format(udfmt, july022008, ubuf, kUbufMax, NULL, &status);
1447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        if ( U_FAILURE(status) ) {
1448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            log_err("FAIL: udat_format for locale %s, capitalizationContext %d, status %s\n",
1449103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
1450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            status = U_ZERO_ERROR;
1451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        } else if (u_strncmp(ubuf, textContextItemPtr->expectedFormat, kUbufMax) != 0) {
1452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            char bbuf1[kBbufMax];
1453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            char bbuf2[kBbufMax];
1454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            log_err("FAIL: udat_format for locale %s, capitalizationContext %d, expected %s, got %s\n",
1455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext,
1456103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                                    u_austrncpy(bbuf1,textContextItemPtr->expectedFormat,kUbufMax), u_austrncpy(bbuf2,ubuf,kUbufMax) );
1457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        }
145854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        getContext = udat_getContext(udfmt, UDISPCTX_TYPE_CAPITALIZATION, &status);
1459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        if ( U_FAILURE(status) ) {
146054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                            log_err("FAIL: udat_getContext for locale %s, capitalizationContext %d, status %s\n",
1461103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
146254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        } else if (getContext != textContextItemPtr->capitalizationContext) {
146354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                            log_err("FAIL: udat_getContext for locale %s, capitalizationContext %d, got context %d\n",
146454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                                    textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, (int)getContext );
1465103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        }
1466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    } else {
1467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        log_err("FAIL: udat_setContext for locale %s, capitalizationContext %d, status %s\n",
1468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                textContextItemPtr->locale, (int)textContextItemPtr->capitalizationContext, u_errorName(status) );
1469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    }
1470fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    udat_close(udfmt);
1471fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                } else {
1472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    log_data_err("FAIL: udat_open for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
1473fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                }
1474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            } else {
1475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                log_err("FAIL: udatpg_getBestPattern for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
1476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            }
1477fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            udatpg_close(udtpg);
1478fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } else {
1479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_data_err("FAIL: udatpg_open for locale %s, status %s\n", textContextItemPtr->locale, u_errorName(status) );
1480fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
1481fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
1482fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (textRelContextItemPtr = textContextRelativeItems; textRelContextItemPtr->locale != NULL; ++textRelContextItemPtr) {
1483fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UErrorCode status = U_ZERO_ERROR;
1484fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UCalendar* ucal = ucal_open(zoneGMT, -1, "root", UCAL_GREGORIAN, &status);
1485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if ( U_SUCCESS(status) ) {
1486fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UDateFormat* udfmt = udat_open(UDAT_NONE, UDAT_LONG_RELATIVE, textRelContextItemPtr->locale, zoneGMT, -1, NULL, 0, &status);
1487fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if ( U_SUCCESS(status) ) {
1488fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                udat_setContext(udfmt, textRelContextItemPtr->capitalizationContext, &status);
1489fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                if ( U_SUCCESS(status) ) {
1490fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UDate yesterday, today = ucal_getNow();
1491fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    UChar ubuf[kUbufMax];
1492fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    char bbuf1[kBbufMax];
1493fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    char bbuf2[kBbufMax];
1494fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    int32_t len = udat_format(udfmt, today, ubuf, kUbufMax, NULL, &status);
1495fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    (void)len;
1496fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    if ( U_FAILURE(status) ) {
1497fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        log_err("FAIL: udat_format today for locale %s, capitalizationContext %d, status %s\n",
1498fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                textRelContextItemPtr->locale, (int)textRelContextItemPtr->capitalizationContext, u_errorName(status) );
1499fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    } else if (u_strncmp(ubuf, textRelContextItemPtr->expectedFormatToday, kUbufMax) != 0) {
1500fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        log_err("FAIL: udat_format today for locale %s, capitalizationContext %d, expected %s, got %s\n",
1501fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                textRelContextItemPtr->locale, (int)textRelContextItemPtr->capitalizationContext,
1502fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                u_austrncpy(bbuf1,textRelContextItemPtr->expectedFormatToday,kUbufMax), u_austrncpy(bbuf2,ubuf,kUbufMax) );
1503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    }
1504fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    status = U_ZERO_ERROR;
1505fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    ucal_setMillis(ucal, today, &status);
1506fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    ucal_add(ucal, UCAL_DATE, -1, &status);
1507fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    yesterday = ucal_getMillis(ucal, &status);
1508fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    if ( U_SUCCESS(status) ) {
1509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        len = udat_format(udfmt, yesterday, ubuf, kUbufMax, NULL, &status);
1510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        if ( U_FAILURE(status) ) {
1511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            log_err("FAIL: udat_format yesterday for locale %s, capitalizationContext %d, status %s\n",
1512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                    textRelContextItemPtr->locale, (int)textRelContextItemPtr->capitalizationContext, u_errorName(status) );
1513fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        } else if (u_strncmp(ubuf, textRelContextItemPtr->expectedFormatYesterday, kUbufMax) != 0) {
1514fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            log_err("FAIL: udat_format yesterday for locale %s, capitalizationContext %d, expected %s, got %s\n",
1515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                    textRelContextItemPtr->locale, (int)textRelContextItemPtr->capitalizationContext,
1516fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                    u_austrncpy(bbuf1,textRelContextItemPtr->expectedFormatYesterday,kUbufMax), u_austrncpy(bbuf2,ubuf,kUbufMax) );
1517fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        }
1518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    }
1519fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                } else {
1520fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    log_err("FAIL: udat_setContext relative for locale %s, capitalizationContext %d, status %s\n",
1521fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            textRelContextItemPtr->locale, (int)textRelContextItemPtr->capitalizationContext, u_errorName(status) );
1522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                }
1523fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                udat_close(udfmt);
1524fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            } else {
1525fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                log_data_err("FAIL: udat_open relative for locale %s, status %s\n", textRelContextItemPtr->locale, u_errorName(status) );
1526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
1527fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            ucal_close(ucal);
1528fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } else {
1529fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            log_data_err("FAIL: ucal_open for locale root, status %s\n", u_errorName(status) );
1530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
1531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1532103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
1533103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1535