1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010, 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/* 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Headers { "locale","spec", "date", "str"} 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // locale: locale including calendar type 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // spec: either 'PATTERN=y mm h' etc, or 'DATE=SHORT,TIME=LONG' 79b13da9df870a61b11249bf741347908dbea0edd8Jean-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 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // str: the expected unicode string 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Cases { 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "en_US@calendar=gregorian", 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "DATE=SHORT,TIME=SHORT", 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "ERA=1,YEAR=2007,MONTH=AUGUST,DATE=8,HOUR=18,MINUTE=54,SECOND=12", 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "8/8/2007 6:54pm" 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }, 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * */ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenFormatTest::testConvertDate(TestData *testData, 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap * /* settings */, UBool fmt) { 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString kPATTERN("PATTERN="); // TODO: static 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString kMILLIS("MILLIS="); // TODO: static 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString kRELATIVE_MILLIS("RELATIVE_MILLIS="); // TODO: static 96c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString kRELATIVE_ADD("RELATIVE_ADD:"); // TODO: static 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SimpleDateFormat basicFmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status); 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("FAIL: Couldn't create basic SimpleDateFormat: %s", 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_errorName(status)); 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *currentCase= NULL; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Start the processing 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int n = 0; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (testData->nextCase(currentCase, status)) { 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char calLoc[256] = ""; 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateTimeStyleSet styleSet; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pattern; 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool usePattern = FALSE; 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CalendarFieldsSet fromSet; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate fromDate = 0; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool useDate = FALSE; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate now = Calendar::getNow(); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++n; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char theCase[200]; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(theCase, "case %d:", n); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString caseString(theCase, ""); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // load params 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString locale = currentCase->getString("locale", status); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: No 'locale' line.", n); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString spec = currentCase->getString("spec", status); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: No 'spec' line.", n); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString date = currentCase->getString("date", status); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: No 'date' line.", n); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectStr= currentCase->getString("str", status); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: No 'str' line.", n); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateFormat *format = NULL; 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Process: 'locale' 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locale.extract(0, locale.length(), calLoc, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc(calLoc); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(spec.startsWith(kPATTERN)) { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern = UnicodeString(spec,kPATTERN.length()); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru usePattern = TRUE; 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format = new SimpleDateFormat(pattern, loc, status); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not create SimpleDateFormat from pattern: %s", n, u_errorName(status)); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(styleSet.parseFrom(spec, status)<0 || U_FAILURE(status)) { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not parse spec as style fields: %s", n, u_errorName(status)); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format = DateFormat::createDateTimeInstance((DateFormat::EStyle)styleSet.getDateStyle(), (DateFormat::EStyle)styleSet.getTimeStyle(), loc); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(format == NULL ) { 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not create SimpleDateFormat from styles.", n); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru Calendar *cal = Calendar::createInstance(loc, status); 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(status)) { 176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("case %d: could not create calendar from %s", n, calLoc); 177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // parse 'date' 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(date.startsWith(kMILLIS)) { 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString millis = UnicodeString(date, kMILLIS.length()); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru useDate = TRUE; 183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fromDate = udbg_stod(millis); 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(date.startsWith(kRELATIVE_MILLIS)) { 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString millis = UnicodeString(date, kRELATIVE_MILLIS.length()); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru useDate = TRUE; 187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fromDate = udbg_stod(millis) + now; 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else if(date.startsWith(kRELATIVE_ADD)) { 189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString add = UnicodeString(date, kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add 190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(fromSet.parseFrom(add, status)<0 || U_FAILURE(status)) { 191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("case %d: could not parse date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status)); 192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru continue; 193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru useDate=TRUE; 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru cal->clear(); 196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru cal->setTime(now, status); 197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru for (int q=0; q<UCAL_FIELD_COUNT; q++) { 198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (fromSet.isSet((UCalendarDateFields)q)) { 199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru //int32_t oldv = cal->get((UCalendarDateFields)q, status); 200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru cal->add((UCalendarDateFields)q, 201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fromSet.get((UCalendarDateFields)q), status); 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru //int32_t newv = cal->get((UCalendarDateFields)q, status); 203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fromDate = cal->getTime(status); 206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if(U_FAILURE(status)) { 207c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru errln("case %d: could not apply date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status)); 208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru continue; 209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(fromSet.parseFrom(date, status)<0 || U_FAILURE(status)) { 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not parse date as calendar fields: %s", n, u_errorName(status)); 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // now, do it. 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt) { 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// logln((UnicodeString)"#"+n+" "+locale+"/"+from+" >>> "+toCalLoc+"/" 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// +to); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cal->clear(); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString output; 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru output.remove(); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(useDate) { 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// cal->setTime(fromDate, status); 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// if(U_FAILURE(status)) { 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// errln("case %d: could not set time on calendar: %s", n, u_errorName(status)); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// continue; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format->format(fromDate, output, pos, status); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fromSet.setOnCalendar(cal, status); 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not set fields on calendar: %s", n, u_errorName(status)); 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format->format(*cal, output, pos); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check erro result from 'format' 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: could not format(): %s", n, u_errorName(status)); // TODO: use 'pos' 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// if(pos.getBeginIndex()==0 && pos.getEndIndex()==0) { // TODO: more precise error? 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// errln("WARNING: case %d: format's pos returned (0,0) - error ??", n); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(output == expectStr) { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(caseString+": format: SUCCESS! "+UnicodeString("expect=output=")+output); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result2; 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(caseString+": format: output!=expectStr, got " + *udbg_escape(output, &result) + " expected " + *udbg_escape(expectStr, &result2)); 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru cal->clear(); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pos; 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format->parse(expectStr,*cal,pos); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(useDate) { 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate gotDate = cal->getTime(status); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(caseString+": parse: could not get time on calendar: "+UnicodeString(u_errorName(status))); 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(gotDate == fromDate) { 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(caseString+": parse: SUCCESS! "+UnicodeString("gotDate=parseDate=")+expectStr); 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectDateStr, gotDateStr; 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru basicFmt.format(fromDate,expectDateStr); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru basicFmt.format(gotDate,gotDateStr); 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(caseString+": parse: FAIL. parsed '"+expectStr+"' and got "+gotDateStr+", expected " + expectDateStr); 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Calendar *cal2 = cal->clone(); 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// cal2->clear(); 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// fromSet.setOnCalendar(cal2, status); 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("case %d: parse: could not set fields on calendar: %s", n, u_errorName(status)); 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CalendarFieldsSet diffSet; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// diffSet.clear(); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!fromSet.matches(cal, diffSet, status)) { 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString diffs = diffSet.diffFrom(fromSet, status); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln((UnicodeString)"FAIL: "+caseString 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +", Differences: '"+ diffs 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +"', status: "+ u_errorName(status)); 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (U_FAILURE(status)) { 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: "+caseString+" parse SET SOURCE calendar Failed to match: " 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru +u_errorName(status)); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("PASS: "+caseString+" parse."); 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete cal; 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete format; 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// delete basicFmt; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DataDrivenFormatTest::processTest(TestData *testData) { 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //Format *cal= NULL; 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //const UChar *arguments= NULL; 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //int32_t argLen = 0; 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char testType[256]; 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DataMap *settings= NULL; 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //const UChar *type= NULL; 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString testSetting; 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int n = 0; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (testData->nextSettings(settings, status)) { 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // try to get a locale 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting = settings->getString("Type", status); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((++n)>0) { 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("---"); 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(testSetting + "---"); 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testSetting.extract(0, testSetting.length(), testType, ""); 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Unable to extract 'Type'. Skipping.."); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!strcmp(testType, "date_format")) { 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testConvertDate(testData, settings, true); 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (!strcmp(testType, "date_parse")) { 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru testConvertDate(testData, settings, false); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Unknown type: %s", testType); 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 343