16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/***********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2011, International Business Machines Corporation
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ***********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "dtfmapts.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/datefmt.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/smpdtfmt.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/decimfmt.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/choicfmt.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/msgfmt.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// try to test the full functionality.  It just calls each function in the class and
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// verifies that it works on a basic level.
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestDateFormatAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (exec) logln("TestSuite DateFormatAPI");
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (index) {
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0: name = "DateFormat API test";
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (exec) {
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logln("DateFormat API test---"); logln("");
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UErrorCode status = U_ZERO_ERROR;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    Locale saveLocale;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    Locale::setDefault(Locale::getEnglish(), status);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if(U_FAILURE(status)) {
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        errln("ERROR: Could not set default locale, test may not give correct results");
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testAPI(/*par*/);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    Locale::setDefault(saveLocale, status);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1: name = "TestEquals";
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (exec) {
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logln("TestEquals---"); logln("");
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TestEquals();
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 2: name = "TestNameHiding";
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (exec) {
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logln("TestNameHiding---"); logln("");
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TestNameHiding();
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 3: name = "TestCoverage";
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (exec) {
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logln("TestCoverage---"); logln("");
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    TestCoverage();
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        default: name = ""; break;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Add better code coverage.
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestDateFormatAPI::TestCoverage(void)
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *LOCALES[] = {
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "zh_CN@calendar=chinese",
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "cop_EG@calendar=coptic",
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "hi_IN@calendar=indian",
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            "am_ET@calendar=ethiopic"
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numOfLocales = 4;
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i = 0; i < numOfLocales; i++) {
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormat *df = DateFormat::createDateTimeInstance(DateFormat::kMedium, DateFormat::kMedium, Locale(LOCALES[i]));
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (df == NULL){
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("Error creating DateFormat instances.");
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete df;
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test that the equals method works correctly.
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestDateFormatAPI::TestEquals(void)
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Create two objects at different system times
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *a = DateFormat::createInstance();
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate start = Calendar::getNow();
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (Calendar::getNow() == start) ; // Wait for time to change
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *b = DateFormat::createInstance();
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (a == NULL || b == NULL){
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Error calling DateFormat::createInstance()");
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete a;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete b;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!(*a == *b))
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: DateFormat objects created at different times are unequal.");
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat *sdtfmt = dynamic_cast<SimpleDateFormat *>(b);
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (sdtfmt != NULL)
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double ONE_YEAR = 365*24*60*60*1000.0;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sdtfmt->set2DigitYearStart(start + 50*ONE_YEAR, status);
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status))
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: setTwoDigitStartDate failed.");
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else if (*a == *b)
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: DateFormat objects with different two digit start dates are equal.");
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete a;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete b;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This test checks various generic API methods in DateFormat to achieve 100%
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * API coverage.
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid IntlTestDateFormatAPI::testAPI(/* char* par */)
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test constructors
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing DateFormat constructors");
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *def = DateFormat::createInstance();
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *fr = DateFormat::createTimeInstance(DateFormat::FULL, Locale::getFrench());
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *it = DateFormat::createDateInstance(DateFormat::MEDIUM, Locale::getItalian());
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *de = DateFormat::createDateTimeInstance(DateFormat::LONG, DateFormat::LONG, Locale::getGerman());
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (def == NULL || fr == NULL || it == NULL || de == NULL){
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Error creating DateFormat instances.");
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test equality
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgif (fr != NULL && def != NULL)
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing equality operator");
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( *fr == *it ) {
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: == failed");
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test various format() methods
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgif (fr != NULL && it != NULL && de != NULL)
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing various format() methods");
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d = 837039928046.0;
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable fD(d, Formattable::kIsDate);
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString res1, res2, res3;
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FieldPosition pos1(0), pos2(0);
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    res1 = fr->format(d, res1, pos1, status);
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: format() failed (French)");
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( (UnicodeString) "" + d + " formatted to " + res1);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    res2 = it->format(d, res2, pos2);
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( (UnicodeString) "" + d + " formatted to " + res2);
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    res3 = de->format(d, res3);
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( (UnicodeString) "" + d + " formatted to " + res3);
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test parse()
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgif (def != NULL)
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing parse()");
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString text("02/03/76 2:50 AM, CST");
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable result1;
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate result2, result3;
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ParsePosition pos(0), pos01(0);
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    def->parseObject(text, result1, pos);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(result1.getType() != Formattable::kDate) {
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: parseObject() failed for " + text);
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(text + " parsed into " + result1.getDate());
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result2 = def->parse(text, status);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: parse() failed, stopping testing");
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(text + " parsed into " + result2);
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result3 = def->parse(text, pos01);
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(text + " parsed into " + result3);
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test getters and setters
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgif (fr != NULL && it != NULL && de != NULL)
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing getters and setters");
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count = 0;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Locale *locales = DateFormat::getAvailableLocales(count);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln((UnicodeString) "Got " + count + " locales" );
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(int32_t i = 0; i < count; i++) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString name;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        name = locales[i].getName();
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(name);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fr->setLenient(it->isLenient());
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(fr->isLenient() != it->isLenient()) {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: setLenient() failed");
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Calendar *cal = def->getCalendar();
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *newCal = cal->clone();
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    de->adoptCalendar(newCal);
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    it->setCalendar(*newCal);
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( *(de->getCalendar()) != *(it->getCalendar())) {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: adopt or set Calendar() failed");
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const NumberFormat *nf = def->getNumberFormat();
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    NumberFormat *newNf = (NumberFormat*) nf->clone();
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    de->adoptNumberFormat(newNf);
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    it->setNumberFormat(*newNf);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( *(de->getNumberFormat()) != *(it->getNumberFormat())) {
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: adopt or set NumberFormat() failed");
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TimeZone& tz = def->getTimeZone();
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *newTz = tz.clone();
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    de->adoptTimeZone(newTz);
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    it->setTimeZone(*newTz);
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( de->getTimeZone() != it->getTimeZone()) {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: adopt or set TimeZone() failed");
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ======= Test getStaticClassID()
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("Testing getStaticClassID()");
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *test = new SimpleDateFormat(status);
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("ERROR: Couldn't create a DateFormat - %s", u_errorName(status));
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(test->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("ERROR: getDynamicClassID() didn't return the expected value");
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete test;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete def;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fr;
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete it;
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete de;
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test hiding of parse() and format() APIs in the Format hierarchy.
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We test the entire hierarchy, even though this test is located in
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the DateFormat API test.
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgIntlTestDateFormatAPI::TestNameHiding(void) {
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // N.B.: This test passes if it COMPILES, since it's a test of
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // compile-time name hiding.
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable dateObj(0, Formattable::kIsDate);
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable numObj(3.1415926535897932384626433832795);
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable obj;
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str;
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FieldPosition fpos;
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ParsePosition ppos;
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // DateFormat calling Format API
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("DateFormat");
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DateFormat *dateFmt = DateFormat::createInstance();
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dateFmt) {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dateFmt->format(dateObj, str, status);
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dateFmt->format(dateObj, str, fpos, status);
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete dateFmt;
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("FAIL: Can't create DateFormat");
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // SimpleDateFormat calling Format & DateFormat API
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("SimpleDateFormat");
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        SimpleDateFormat sdf(status);
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // Format API
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.format(dateObj, str, status);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.format(dateObj, str, fpos, status);
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // DateFormat API
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.format((UDate)0, str, fpos);
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.format((UDate)0, str);
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.parse(str, status);
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.parse(str, ppos);
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sdf.getNumberFormat();
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("FAIL: Can't create SimpleDateFormat() - %s", u_errorName(status));
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // NumberFormat calling Format API
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("NumberFormat");
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        NumberFormat *fmt = NumberFormat::createInstance(status);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (fmt) {
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt->format(numObj, str, status);
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fmt->format(numObj, str, fpos, status);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete fmt;
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("FAIL: Can't create NumberFormat()");
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // DecimalFormat calling Format & NumberFormat API
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("DecimalFormat");
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DecimalFormat fmt(status);
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status)) {
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          // Format API
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format(numObj, str, status);
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format(numObj, str, fpos, status);
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          // NumberFormat API
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format(2.71828, str);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format((int32_t)1234567, str);
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format(1.41421, str, fpos);
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format((int32_t)9876543, str, fpos);
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.parse(str, obj, ppos);
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.parse(str, obj, status);
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          errcheckln(status, "FAIL: Couldn't instantiate DecimalFormat, error %s. Quitting test", u_errorName(status));
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // ChoiceFormat calling Format & NumberFormat API
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("ChoiceFormat");
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ChoiceFormat fmt("0#foo|1#foos|2#foos", status);
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Format API
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(numObj, str, status);
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(numObj, str, fpos, status);
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NumberFormat API
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(2.71828, str);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format((int32_t)1234567, str);
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(1.41421, str, fpos);
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format((int32_t)9876543, str, fpos);
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.parse(str, obj, ppos);
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.parse(str, obj, status);
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // MessageFormat calling Format API
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("MessageFormat");
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        MessageFormat fmt("", status);
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Format API
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // We use dateObj, which MessageFormat should reject.
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // We're testing name hiding, not the format method.
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(dateObj, str, status);
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        fmt.format(dateObj, str, fpos, status);
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
390