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