1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 1997-2013 International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Modification history
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Date        Name        Description
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 07/09/2007  srl         Copied from dadrcoll.cpp
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ***********************************************************************/
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/tstdtmod.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tsdate.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "dadrfmt.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/schriter.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/regex.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
2627f654740f2a26ad62a5c155af9199af9e69b889claireho#include "dbgutil.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "fldset.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenFormatTest::DataDrivenFormatTest() {
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    driver = TestDataModule::getTestDataModule("format", *this, status);
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDataDrivenFormatTest::~DataDrivenFormatTest() {
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete driver;
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenFormatTest::runIndexedTest(int32_t index, UBool exec,
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* &name, char* /*par */) {
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (driver != NULL) {
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (exec) {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //  logln("Begin ");
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const DataMap *info= NULL;
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status= U_ZERO_ERROR;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TestData *testData = driver->createTestData(index, status);
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = testData->getName();
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (testData->getInfo(info, status)) {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log(info->getString("Description", status));
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log(name);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("---");
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("");
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                processTest(testData);
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete testData;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "";
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("format/DataDriven*Test data (format.res) not initialized!");
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = "";
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
7654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *             Headers { "locale", "zone", "spec", "date", "str"}
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // locale: locale including calendar type
7854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            // zone:   time zone name, or "" to not explicitly set zone
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // spec:   either 'PATTERN=y mm h' etc, or 'DATE=SHORT,TIME=LONG'
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // date:   either an unsigned long (millis), or a calendar spec ERA=0,YEAR=1, etc.. applied to the calendar type specified by the locale
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // str:   the expected unicode string
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Cases {
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               {
8454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    "en_US@calendar=gregorian",
8554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    "",
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "DATE=SHORT,TIME=SHORT",
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "ERA=1,YEAR=2007,MONTH=AUGUST,DATE=8,HOUR=18,MINUTE=54,SECOND=12",
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    "8/8/2007 6:54pm"
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               },
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * */
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenFormatTest::testConvertDate(TestData *testData,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const DataMap * /* settings */, UBool fmt) {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString kPATTERN("PATTERN="); // TODO: static
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString kMILLIS("MILLIS="); // TODO: static
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString kRELATIVE_MILLIS("RELATIVE_MILLIS="); // TODO: static
98c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString kRELATIVE_ADD("RELATIVE_ADD:"); // TODO: static
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat basicFmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"),
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status);
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("FAIL: Couldn't create basic SimpleDateFormat: %s",
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                u_errorName(status));
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const DataMap *currentCase= NULL;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Start the processing
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int n = 0;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (testData->nextCase(currentCase, status)) {
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char calLoc[256] = "";
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DateTimeStyleSet styleSet;
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pattern;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool usePattern = FALSE;
11759d709d503bab6e2b61931737e662dd293b40578ccornelius        (void)usePattern;   // Suppress unused warning.
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CalendarFieldsSet fromSet;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate fromDate = 0;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool useDate = FALSE;
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate now = Calendar::getNow();
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ++n;
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char theCase[200];
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sprintf(theCase, "case %d:", n);
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString caseString(theCase, "");
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // load params
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString locale = currentCase->getString("locale", status);
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("case %d: No 'locale' line.", n);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
13654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString zone = currentCase->getString("zone", status);
13754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (U_FAILURE(status)) {
13854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            errln("case %d: No 'zone' line.", n);
13954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            continue;
14054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString spec = currentCase->getString("spec", status);
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("case %d: No 'spec' line.", n);
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString date = currentCase->getString("date", status);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("case %d: No 'date' line.", n);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expectStr= currentCase->getString("str", status);
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("case %d: No 'str' line.", n);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DateFormat *format = NULL;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Process: 'locale'
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        locale.extract(0, locale.length(), calLoc, (const char*)0); // default codepage.  Invariant codepage doesn't have '@'!
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale loc(calLoc);
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(spec.startsWith(kPATTERN)) {
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pattern = UnicodeString(spec,kPATTERN.length());
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            usePattern = TRUE;
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            format = new SimpleDateFormat(pattern, loc, status);
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("case %d: could not create SimpleDateFormat from pattern: %s", n, u_errorName(status));
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(styleSet.parseFrom(spec, status)<0 || U_FAILURE(status)) {
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("case %d: could not parse spec as style fields: %s", n, u_errorName(status));
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            format = DateFormat::createDateTimeInstance((DateFormat::EStyle)styleSet.getDateStyle(), (DateFormat::EStyle)styleSet.getTimeStyle(), loc);
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(format == NULL ) {
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("case %d: could not create SimpleDateFormat from styles.", n);
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Calendar *cal = Calendar::createInstance(loc, status);
183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(U_FAILURE(status)) {
184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("case %d: could not create calendar from %s", n, calLoc);
185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
18654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
18754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (zone.length() > 0) {
18854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            TimeZone * tz = TimeZone::createTimeZone(zone);
18954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            cal->setTimeZone(*tz);
19054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            format->setTimeZone(*tz);
19154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            delete tz;
19254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // parse 'date'
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(date.startsWith(kMILLIS)) {
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString millis = UnicodeString(date, kMILLIS.length());
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            useDate = TRUE;
198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            fromDate = udbg_stod(millis);
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(date.startsWith(kRELATIVE_MILLIS)) {
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString millis = UnicodeString(date, kRELATIVE_MILLIS.length());
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            useDate = TRUE;
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            fromDate = udbg_stod(millis) + now;
203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else if(date.startsWith(kRELATIVE_ADD)) {
204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            UnicodeString add = UnicodeString(date, kRELATIVE_ADD.length());  // "add" is a string indicating which fields to add
205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if(fromSet.parseFrom(add, status)<0 || U_FAILURE(status)) {
206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln("case %d: could not parse date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status));
207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                continue;
208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            useDate=TRUE;
210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            cal->clear();
211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            cal->setTime(now, status);
212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            for (int q=0; q<UCAL_FIELD_COUNT; q++) {
213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (fromSet.isSet((UCalendarDateFields)q)) {
214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    //int32_t oldv = cal->get((UCalendarDateFields)q, status);
21554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    if (q == UCAL_DATE) {
21654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        cal->add((UCalendarDateFields)q,
21754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                                    fromSet.get((UCalendarDateFields)q), status);
21854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    } else {
21954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                        cal->set((UCalendarDateFields)q,
22054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                                    fromSet.get((UCalendarDateFields)q));
22154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                    }
222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                    //int32_t newv = cal->get((UCalendarDateFields)q, status);
223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            fromDate = cal->getTime(status);
226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if(U_FAILURE(status)) {
227c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln("case %d: could not apply date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status));
228c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                continue;
229c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if(fromSet.parseFrom(date, status)<0 || U_FAILURE(status)) {
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("case %d: could not parse date as calendar fields: %s", n, u_errorName(status));
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // now, do it.
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fmt) {
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            FieldPosition pos;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//            logln((UnicodeString)"#"+n+" "+locale+"/"+from+" >>> "+toCalLoc+"/"
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                    +to);
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal->clear();
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString output;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            output.remove();
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(useDate) {
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                cal->setTime(fromDate, status);
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                if(U_FAILURE(status)) {
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                    errln("case %d: could not set time on calendar: %s", n, u_errorName(status));
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                    continue;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                }
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                format->format(fromDate, output, pos, status);
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fromSet.setOnCalendar(cal, status);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(U_FAILURE(status)) {
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("case %d: could not set fields on calendar: %s", n, u_errorName(status));
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                format->format(*cal, output, pos);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // check erro result from 'format'
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("case %d: could not format(): %s", n, u_errorName(status)); // TODO: use 'pos'
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//            if(pos.getBeginIndex()==0 && pos.getEndIndex()==0) { // TODO: more precise error?
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                errln("WARNING: case %d: format's pos returned (0,0) - error ??", n);
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//            }
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(output == expectStr) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(caseString+": format: SUCCESS! "+UnicodeString("expect=output=")+output);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString result;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString result2;
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(caseString+": format:  output!=expectStr, got " + *udbg_escape(output, &result) + " expected " + *udbg_escape(expectStr, &result2));
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal->clear();
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pos;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            format->parse(expectStr,*cal,pos);
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(useDate) {
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UDate gotDate = cal->getTime(status);
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(U_FAILURE(status)) {
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(caseString+": parse: could not get time on calendar: "+UnicodeString(u_errorName(status)));
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(gotDate == fromDate) {
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln(caseString+": parse: SUCCESS! "+UnicodeString("gotDate=parseDate=")+expectStr);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString expectDateStr, gotDateStr;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    basicFmt.format(fromDate,expectDateStr);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    basicFmt.format(gotDate,gotDateStr);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(caseString+": parse: FAIL. parsed '"+expectStr+"' and got "+gotDateStr+", expected " + expectDateStr);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                Calendar *cal2 = cal->clone();
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                cal2->clear();
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                fromSet.setOnCalendar(cal2, status);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(U_FAILURE(status)) {
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("case %d: parse: could not set fields on calendar: %s", n, u_errorName(status));
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    continue;
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                CalendarFieldsSet diffSet;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//                diffSet.clear();
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (!fromSet.matches(cal, diffSet, status)) {
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString diffs = diffSet.diffFrom(fromSet, status);
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln((UnicodeString)"FAIL: "+caseString
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            +", Differences: '"+ diffs
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            +"', status: "+ u_errorName(status));
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else if (U_FAILURE(status)) {
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln("FAIL: "+caseString+" parse SET SOURCE calendar Failed to match: "
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            +u_errorName(status));
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                } else {
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln("PASS: "+caseString+" parse.");
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete format;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//    delete basicFmt;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenFormatTest::processTest(TestData *testData) {
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //Format *cal= NULL;
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //const UChar *arguments= NULL;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //int32_t argLen = 0;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char testType[256];
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const DataMap *settings= NULL;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //const UChar *type= NULL;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString testSetting;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int n = 0;
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (testData->nextSettings(settings, status)) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // try to get a locale
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testSetting = settings->getString("Type", status);
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status)) {
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ((++n)>0) {
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("---");
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(testSetting + "---");
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testSetting.extract(0, testSetting.length(), testType, "");
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Unable to extract 'Type'. Skipping..");
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!strcmp(testType, "date_format")) {
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testConvertDate(testData, settings, true);
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (!strcmp(testType, "date_parse")) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testConvertDate(testData, settings, false);
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Unknown type: %s", testType);
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
363