You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
8.9 KiB
283 lines
8.9 KiB
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
/********************************************************************
|
|
* COPYRIGHT:
|
|
* Copyright (c) 1997-2016, International Business Machines Corporation and
|
|
* others. All Rights Reserved.
|
|
********************************************************************/
|
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#if !UCONFIG_NO_FORMATTING
|
|
|
|
#include "sdtfmtts.h"
|
|
|
|
#include "unicode/smpdtfmt.h"
|
|
#include "unicode/dtfmtsym.h"
|
|
|
|
// This is an API test, not a unit test. It doesn't test very many cases, and doesn't
|
|
// try to test the full functionality. It just calls each function in the class and
|
|
// verifies that it works on a basic level.
|
|
|
|
void IntlTestSimpleDateFormatAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
|
|
{
|
|
if (exec) logln("TestSuite SimpleDateFormatAPI");
|
|
switch (index) {
|
|
case 0: name = "SimpleDateFormat API test";
|
|
if (exec) {
|
|
logln("SimpleDateFormat API test---"); logln("");
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
Locale saveLocale;
|
|
Locale::setDefault(Locale::getEnglish(), status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not set default locale, test may not give correct results");
|
|
}
|
|
testAPI(/*par*/);
|
|
Locale::setDefault(saveLocale, status);
|
|
}
|
|
break;
|
|
|
|
default: name = ""; break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test various generic API methods of SimpleDateFormat for API coverage.
|
|
*/
|
|
void IntlTestSimpleDateFormatAPI::testAPI(/*char *par*/)
|
|
{
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
|
|
// ======= Test constructors
|
|
|
|
logln("Testing SimpleDateFormat constructors");
|
|
|
|
SimpleDateFormat def(status);
|
|
if(U_FAILURE(status)) {
|
|
dataerrln("ERROR: Could not create SimpleDateFormat (default) - exitting");
|
|
return;
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
const UnicodeString pattern("yyyy.MM.dd G 'at' hh:mm:ss z", "");
|
|
const UnicodeString override("y=hebr;d=thai;s=arab", ""); /* use invariant converter */
|
|
const UnicodeString override_bogus("y=hebr;d=thai;s=bogus", "");
|
|
|
|
SimpleDateFormat pat(pattern, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create SimpleDateFormat (pattern) - %s", u_errorName(status));
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
SimpleDateFormat pat_fr(pattern, Locale::getFrench(), status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create SimpleDateFormat (pattern French)");
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getFrench(), status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create DateFormatSymbols (French)");
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
SimpleDateFormat cust1(pattern, symbols, status);
|
|
if(U_FAILURE(status)) {
|
|
dataerrln("ERROR: Could not create SimpleDateFormat (pattern, symbols*) - exitting");
|
|
return;
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
SimpleDateFormat cust2(pattern, *symbols, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create SimpleDateFormat (pattern, symbols)");
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
logln(UnicodeString("Override with: ") + override);
|
|
SimpleDateFormat ovr1(pattern, override, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create SimpleDateFormat (pattern, override) - %s", u_errorName(status));
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
SimpleDateFormat ovr2(pattern, override, Locale::getGerman(), status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Could not create SimpleDateFormat (pattern, override, locale) - %s", u_errorName(status));
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
logln(UnicodeString("Override with: ") + override_bogus);
|
|
SimpleDateFormat ovr3(pattern, override_bogus, Locale::getGerman(), status);
|
|
if(U_SUCCESS(status)) {
|
|
errln("ERROR: Should not have been able to create SimpleDateFormat (pattern, override, locale) with a bogus override");
|
|
}
|
|
|
|
|
|
SimpleDateFormat copy(pat);
|
|
|
|
// ======= Test clone(), assignment, and equality
|
|
|
|
logln("Testing clone(), assignment and equality operators");
|
|
|
|
if( ! (copy == pat) || copy != pat) {
|
|
errln("ERROR: Copy constructor (or ==) failed");
|
|
}
|
|
|
|
copy = cust1;
|
|
if(copy != cust1) {
|
|
errln("ERROR: Assignment (or !=) failed");
|
|
}
|
|
|
|
Format *clone = def.clone();
|
|
if( ! (*clone == def) ) {
|
|
errln("ERROR: Clone() (or ==) failed");
|
|
}
|
|
delete clone;
|
|
|
|
// ======= Test various format() methods
|
|
|
|
logln("Testing various format() methods");
|
|
|
|
UDate d = 837039928046.0;
|
|
Formattable fD(d, Formattable::kIsDate);
|
|
|
|
UnicodeString res1, res2;
|
|
FieldPosition pos1(FieldPosition::DONT_CARE), pos2(FieldPosition::DONT_CARE);
|
|
|
|
res1 = def.format(d, res1, pos1);
|
|
logln( (UnicodeString) "" + d + " formatted to " + res1);
|
|
|
|
status = U_ZERO_ERROR;
|
|
res2 = cust1.format(fD, res2, pos2, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: format(Formattable [Date]) failed");
|
|
}
|
|
logln((UnicodeString) "" + fD.getDate() + " formatted to " + res2);
|
|
|
|
// ======= Test parse()
|
|
|
|
logln("Testing parse()");
|
|
|
|
UnicodeString text("02/03/76 2:50 AM, CST");
|
|
UDate result1, result2;
|
|
ParsePosition pos(0);
|
|
result1 = def.parse(text, pos);
|
|
logln(text + " parsed into " + result1);
|
|
|
|
status = U_ZERO_ERROR;
|
|
result2 = def.parse(text, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: parse() failed");
|
|
}
|
|
logln(text + " parsed into " + result2);
|
|
|
|
// ======= Test getters and setters
|
|
|
|
logln("Testing getters and setters");
|
|
|
|
const DateFormatSymbols *syms = pat.getDateFormatSymbols();
|
|
if(!syms) {
|
|
errln("Couldn't obtain DateFormatSymbols. Quitting test!");
|
|
return;
|
|
}
|
|
if(syms->getDynamicClassID() != DateFormatSymbols::getStaticClassID()) {
|
|
errln("ERROR: format->getDateFormatSymbols()->getDynamicClassID() != DateFormatSymbols::getStaticClassID()");
|
|
}
|
|
DateFormatSymbols *newSyms = new DateFormatSymbols(*syms);
|
|
def.adoptDateFormatSymbols(newSyms);
|
|
pat_fr.setDateFormatSymbols(*newSyms);
|
|
if( *(pat.getDateFormatSymbols()) != *(def.getDateFormatSymbols())) {
|
|
errln("ERROR: adopt or set DateFormatSymbols() failed");
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
UDate startDate = pat.get2DigitYearStart(status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: getTwoDigitStartDate() failed");
|
|
}
|
|
|
|
status = U_ZERO_ERROR;
|
|
pat_fr.set2DigitYearStart(startDate, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: setTwoDigitStartDate() failed");
|
|
}
|
|
|
|
// ======= Test DateFormatSymbols constructor
|
|
newSyms =new DateFormatSymbols("gregorian", status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: new DateFormatSymbols() failed");
|
|
}
|
|
def.adoptDateFormatSymbols(newSyms);
|
|
|
|
// ======= Test applyPattern()
|
|
|
|
logln("Testing applyPattern()");
|
|
|
|
UnicodeString p1("yyyy.MM.dd G 'at' hh:mm:ss z");
|
|
logln("Applying pattern " + p1);
|
|
status = U_ZERO_ERROR;
|
|
pat.applyPattern(p1);
|
|
|
|
UnicodeString s2;
|
|
s2 = pat.toPattern(s2);
|
|
logln("Extracted pattern is " + s2);
|
|
if(s2 != p1) {
|
|
errln("ERROR: toPattern() result did not match pattern applied");
|
|
}
|
|
|
|
logln("Applying pattern " + p1);
|
|
status = U_ZERO_ERROR;
|
|
pat.applyLocalizedPattern(p1, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: applyPattern() failed with %s", u_errorName(status));
|
|
}
|
|
UnicodeString s3;
|
|
status = U_ZERO_ERROR;
|
|
s3 = pat.toLocalizedPattern(s3, status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: toLocalizedPattern() failed");
|
|
}
|
|
logln("Extracted pattern is " + s3);
|
|
if(s3 != p1) {
|
|
errln("ERROR: toLocalizedPattern() result did not match pattern applied");
|
|
}
|
|
|
|
// ======= Test getStaticClassID()
|
|
|
|
logln("Testing getStaticClassID()");
|
|
|
|
status = U_ZERO_ERROR;
|
|
DateFormat *test = new SimpleDateFormat(status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Couldn't create a SimpleDateFormat");
|
|
}
|
|
|
|
if(test->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
|
|
errln("ERROR: getDynamicClassID() didn't return the expected value");
|
|
}
|
|
|
|
delete test;
|
|
|
|
// ======= Test Ticket 5684 (Parsing with 'e' and 'Y')
|
|
SimpleDateFormat object(UNICODE_STRING_SIMPLE("YYYY'W'wwe"), status);
|
|
if(U_FAILURE(status)) {
|
|
errln("ERROR: Couldn't create a SimpleDateFormat");
|
|
}
|
|
object.setLenient(false);
|
|
ParsePosition pp(0);
|
|
UDate udDate = object.parse("2007W014", pp);
|
|
if ((double)udDate == 0.0) {
|
|
errln("ERROR: Parsing failed using 'Y' and 'e'");
|
|
}
|
|
|
|
// ====== Test ticket 11295 getNumberFormatForField returns wild pointer
|
|
if (object.getNumberFormatForField('N') != NULL) {
|
|
errln("N is not a valid field, "
|
|
"getNumberFormatForField should return NULL");
|
|
}
|
|
}
|
|
|
|
#endif /* #if !UCONFIG_NO_FORMATTING */
|