void DataDrivenCalendarTest::testOps(TestData *testData, const DataMap * /*settings*/) { UErrorCode status = U_ZERO_ERROR; UBool useDate = FALSE; // TODO UnicodeString kMILLIS("MILLIS="); // TODO: static UDate fromDate = 0; // TODO UDate toDate = 0; const DataMap *currentCase= NULL; char toCalLoc[256] = ""; // TODO: static strings? const UnicodeString kADD("add", ""); const UnicodeString kROLL("roll", ""); // Get 'from' time CalendarFieldsSet fromSet, toSet, paramsSet, diffSet; SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), status); if (U_FAILURE(status)) { dataerrln("FAIL: Couldn't create SimpleDateFormat: %s", u_errorName(status)); return; } // Start the processing int n = 0; while (testData->nextCase(currentCase, status)) { ++n; Calendar *toCalendar= NULL; Calendar *fromCalendar= NULL; // load parameters char theCase[200]; sprintf(theCase, "[case %d]", n); UnicodeString caseString(theCase, ""); // build to calendar // Headers { "locale","from","operation","params","to" } // #1 locale const char *param = "locale"; UnicodeString locale; UnicodeString testSetting = currentCase->getString(param, status); if (U_FAILURE(status)) { errln(caseString+": Unable to get param '"+param+"' " + UnicodeString(" - ")); continue; } testSetting.extract(0, testSetting.length(), toCalLoc, (const char*)0); fromCalendar = Calendar::createInstance(toCalLoc, status); if (U_FAILURE(status)) { errln(caseString+": Unable to instantiate calendar for " +testSetting); continue; } fromSet.clear(); // #2 'from' info param = "from"; UnicodeString from = testSetting=currentCase->getString(param, status); if (U_FAILURE(status)) { errln(caseString+": Unable to get parameter '"+param+"' " + UnicodeString(" - ")); continue; } if(from.startsWith(kMILLIS)){ UnicodeString millis = UnicodeString(from, kMILLIS.length()); useDate = TRUE; fromDate = udbg_stod(millis); } else if(fromSet.parseFrom(testSetting, status)<0 || U_FAILURE(status)){ errln(caseString+": Failed to parse '"+param+"' parameter: " +testSetting); continue; } // #4 'operation' info param = "operation"; UnicodeString operation = testSetting=currentCase->getString(param, status); if (U_FAILURE(status)) { errln(caseString+": Unable to get parameter '"+param+"' " + UnicodeString(" - ")); continue; } if (U_FAILURE(status)) { errln(caseString+": Failed to parse '"+param+"' parameter: " +testSetting); continue; } paramsSet.clear(); // #3 'params' info param = "params"; UnicodeString params = testSetting =currentCase->getString(param, status); if (U_FAILURE(status)) { errln(caseString+": Unable to get parameter '"+param+"' " + UnicodeString(" - ")); continue; } paramsSet.parseFrom(testSetting, status); // parse with inheritance. if (U_FAILURE(status)) { errln(caseString+": Failed to parse '"+param+"' parameter: " +testSetting); continue; } toSet.clear(); // #4 'to' info param = "to"; UnicodeString to = testSetting=currentCase->getString(param, status); if (U_FAILURE(status)) { errln(caseString+": Unable to get parameter '"+param+"' " + UnicodeString(" - ")); continue; } if(to.startsWith(kMILLIS)){ UnicodeString millis = UnicodeString(to, kMILLIS.length()); useDate = TRUE; toDate = udbg_stod(millis); } else if(toSet.parseFrom(testSetting, &fromSet, status)<0 || U_FAILURE(status)){ errln(caseString+": Failed to parse '"+param+"' parameter: " +testSetting); continue; } UnicodeString caseContentsString = locale+": from "+from+": " +operation +" [[[ "+params+" ]]] >>> "+to; logln(caseString+": "+caseContentsString); // ------ // now, do it. /// prepare calendar if(useDate){ fromCalendar->setTime(fromDate, status); if (U_FAILURE(status)) { errln(caseString+" FAIL: Failed to set time on Source calendar: " + u_errorName(status)); return; } } else { fromSet.setOnCalendar(fromCalendar, status); if (U_FAILURE(status)) { errln(caseString+" FAIL: Failed to set on Source calendar: " + u_errorName(status)); return; } } diffSet.clear(); // Is the calendar sane after being set? if (!fromSet.matches(fromCalendar, diffSet, status)) { UnicodeString diffs = diffSet.diffFrom(fromSet, status); errln((UnicodeString)"FAIL: "+caseString +", SET SOURCE calendar was not set: Differences: "+ diffs +"', status: "+ u_errorName(status)); } else if (U_FAILURE(status)) { errln("FAIL: "+caseString+" SET SOURCE calendar Failed to match: " +u_errorName(status)); } else { logln("PASS: "******" SET SOURCE calendar match."); } // to calendar - copy of from calendar toCalendar = fromCalendar->clone(); /// perform op for (int q=0; q<UCAL_FIELD_COUNT; q++) { if (paramsSet.isSet((UCalendarDateFields)q)) { if (operation == kROLL) { toCalendar->roll((UCalendarDateFields)q, paramsSet.get((UCalendarDateFields)q), status); } else if (operation == kADD) { toCalendar->add((UCalendarDateFields)q, paramsSet.get((UCalendarDateFields)q), status); } else { errln(caseString+ " FAIL: unknown operation "+ operation); } logln(operation + " of "+ paramsSet.get((UCalendarDateFields)q) +" -> "+u_errorName(status)); } } if (U_FAILURE(status)) { errln(caseString+" FAIL: after "+operation+" of "+params+" -> " +u_errorName(status)); continue; } // now - what's the result? diffSet.clear(); if(useDate){ if(!(toCalendar->getTime(status)==toDate) || U_FAILURE(status)){ errln("FAIL: "+caseString+" Match operation had an error: " +u_errorName(status)); }else{ logln(caseString + " SUCCESS: got=expected="+toDate); logln("PASS: "******" matched!"); } } else if (!toSet.matches(toCalendar, diffSet, status)) { UnicodeString diffs = diffSet.diffFrom(toSet, status); errln((UnicodeString)"FAIL: "+caseString+" - , "+caseContentsString +" Differences: "+ diffs +"', status: " + u_errorName(status)); }else if (U_FAILURE(status)) { errln("FAIL: "+caseString+" Match operation had an error: " +u_errorName(status)); }else { logln("PASS: "******" matched!"); } delete fromCalendar; delete toCalendar; } }
void DataDrivenFormatTest::testConvertDate(TestData *testData, const DataMap * /* settings */, UBool fmt) { UnicodeString kPATTERN("PATTERN="); // TODO: static UnicodeString kMILLIS("MILLIS="); // TODO: static UnicodeString kRELATIVE_MILLIS("RELATIVE_MILLIS="); // TODO: static UnicodeString kRELATIVE_ADD("RELATIVE_ADD:"); // TODO: static UErrorCode status = U_ZERO_ERROR; SimpleDateFormat basicFmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), status); if (U_FAILURE(status)) { dataerrln("FAIL: Couldn't create basic SimpleDateFormat: %s", u_errorName(status)); return; } const DataMap *currentCase= NULL; // Start the processing int n = 0; while (testData->nextCase(currentCase, status)) { char calLoc[256] = ""; DateTimeStyleSet styleSet; UnicodeString pattern; UBool usePattern = FALSE; (void)usePattern; // Suppress unused warning. CalendarFieldsSet fromSet; UDate fromDate = 0; UBool useDate = FALSE; UDate now = Calendar::getNow(); ++n; char theCase[200]; sprintf(theCase, "case %d:", n); UnicodeString caseString(theCase, ""); // load params UnicodeString locale = currentCase->getString("locale", status); if (U_FAILURE(status)) { errln("case %d: No 'locale' line.", n); continue; } UnicodeString zone = currentCase->getString("zone", status); if (U_FAILURE(status)) { errln("case %d: No 'zone' line.", n); continue; } UnicodeString spec = currentCase->getString("spec", status); if(U_FAILURE(status)) { errln("case %d: No 'spec' line.", n); continue; } UnicodeString date = currentCase->getString("date", status); if(U_FAILURE(status)) { errln("case %d: No 'date' line.", n); continue; } UnicodeString expectStr= currentCase->getString("str", status); if(U_FAILURE(status)) { errln("case %d: No 'str' line.", n); continue; } DateFormat *format = NULL; // Process: 'locale' locale.extract(0, locale.length(), calLoc, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! Locale loc(calLoc); if(spec.startsWith(kPATTERN)) { pattern = UnicodeString(spec,kPATTERN.length()); usePattern = TRUE; format = new SimpleDateFormat(pattern, loc, status); if(U_FAILURE(status)) { errln("case %d: could not create SimpleDateFormat from pattern: %s", n, u_errorName(status)); continue; } } else { if(styleSet.parseFrom(spec, status)<0 || U_FAILURE(status)) { errln("case %d: could not parse spec as style fields: %s", n, u_errorName(status)); continue; } format = DateFormat::createDateTimeInstance((DateFormat::EStyle)styleSet.getDateStyle(), (DateFormat::EStyle)styleSet.getTimeStyle(), loc); if(format == NULL ) { errln("case %d: could not create SimpleDateFormat from styles.", n); continue; } } Calendar *cal = Calendar::createInstance(loc, status); if(U_FAILURE(status)) { errln("case %d: could not create calendar from %s", n, calLoc); } if (zone.length() > 0) { TimeZone * tz = TimeZone::createTimeZone(zone); cal->setTimeZone(*tz); format->setTimeZone(*tz); delete tz; } // parse 'date' if(date.startsWith(kMILLIS)) { UnicodeString millis = UnicodeString(date, kMILLIS.length()); useDate = TRUE; fromDate = udbg_stod(millis); } else if(date.startsWith(kRELATIVE_MILLIS)) { UnicodeString millis = UnicodeString(date, kRELATIVE_MILLIS.length()); useDate = TRUE; fromDate = udbg_stod(millis) + now; } else if(date.startsWith(kRELATIVE_ADD)) { UnicodeString add = UnicodeString(date, kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add if(fromSet.parseFrom(add, status)<0 || U_FAILURE(status)) { errln("case %d: could not parse date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status)); continue; } useDate=TRUE; cal->clear(); cal->setTime(now, status); for (int q=0; q<UCAL_FIELD_COUNT; q++) { if (fromSet.isSet((UCalendarDateFields)q)) { //int32_t oldv = cal->get((UCalendarDateFields)q, status); if (q == UCAL_DATE) { cal->add((UCalendarDateFields)q, fromSet.get((UCalendarDateFields)q), status); } else { cal->set((UCalendarDateFields)q, fromSet.get((UCalendarDateFields)q)); } //int32_t newv = cal->get((UCalendarDateFields)q, status); } } fromDate = cal->getTime(status); if(U_FAILURE(status)) { errln("case %d: could not apply date as RELATIVE_ADD calendar fields: %s", n, u_errorName(status)); continue; } } else if(fromSet.parseFrom(date, status)<0 || U_FAILURE(status)) { errln("case %d: could not parse date as calendar fields: %s", n, u_errorName(status)); continue; } // now, do it. if (fmt) { FieldPosition pos; // logln((UnicodeString)"#"+n+" "+locale+"/"+from+" >>> "+toCalLoc+"/" // +to); cal->clear(); UnicodeString output; output.remove(); if(useDate) { // cal->setTime(fromDate, status); // if(U_FAILURE(status)) { // errln("case %d: could not set time on calendar: %s", n, u_errorName(status)); // continue; // } format->format(fromDate, output, pos, status); } else { fromSet.setOnCalendar(cal, status); if(U_FAILURE(status)) { errln("case %d: could not set fields on calendar: %s", n, u_errorName(status)); continue; } format->format(*cal, output, pos); } // check erro result from 'format' if(U_FAILURE(status)) { errln("case %d: could not format(): %s", n, u_errorName(status)); // TODO: use 'pos' } // if(pos.getBeginIndex()==0 && pos.getEndIndex()==0) { // TODO: more precise error? // errln("WARNING: case %d: format's pos returned (0,0) - error ??", n); // } if(output == expectStr) { logln(caseString+": format: SUCCESS! "+UnicodeString("expect=output=")+output); } else { UnicodeString result; UnicodeString result2; errln(caseString+": format: output!=expectStr, got " + *udbg_escape(output, &result) + " expected " + *udbg_escape(expectStr, &result2)); } } else { cal->clear(); ParsePosition pos; format->parse(expectStr,*cal,pos); if(useDate) { UDate gotDate = cal->getTime(status); if(U_FAILURE(status)) { errln(caseString+": parse: could not get time on calendar: "+UnicodeString(u_errorName(status))); continue; } if(gotDate == fromDate) { logln(caseString+": parse: SUCCESS! "+UnicodeString("gotDate=parseDate=")+expectStr); } else { UnicodeString expectDateStr, gotDateStr; basicFmt.format(fromDate,expectDateStr); basicFmt.format(gotDate,gotDateStr); errln(caseString+": parse: FAIL. parsed '"+expectStr+"' and got "+gotDateStr+", expected " + expectDateStr); } } else { // Calendar *cal2 = cal->clone(); // cal2->clear(); // fromSet.setOnCalendar(cal2, status); if(U_FAILURE(status)) { errln("case %d: parse: could not set fields on calendar: %s", n, u_errorName(status)); continue; } CalendarFieldsSet diffSet; // diffSet.clear(); if (!fromSet.matches(cal, diffSet, status)) { UnicodeString diffs = diffSet.diffFrom(fromSet, status); errln((UnicodeString)"FAIL: "+caseString +", Differences: '"+ diffs +"', status: "+ u_errorName(status)); } else if (U_FAILURE(status)) { errln("FAIL: "+caseString+" parse SET SOURCE calendar Failed to match: " +u_errorName(status)); } else { logln("PASS: "******" parse."); } } } delete cal; delete format; } // delete basicFmt; }