Home | History | Annotate | Download | only in intltest
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 2013-2014, International Business Machines Corporation and    *
      4 * others. All Rights Reserved.                                                *
      5 *******************************************************************************
      6 *
      7 * File RELDATEFMTTEST.CPP
      8 *
      9 *******************************************************************************
     10 */
     11 #include <stdio.h>
     12 #include <stdlib.h>
     13 
     14 #include "intltest.h"
     15 
     16 #if !UCONFIG_NO_FORMATTING
     17 
     18 #include "unicode/localpointer.h"
     19 #include "unicode/numfmt.h"
     20 #include "unicode/reldatefmt.h"
     21 
     22 #define LENGTHOF(array) (int32_t)(sizeof(array) / sizeof((array)[0]))
     23 
     24 static const char *DirectionStr(UDateDirection direction);
     25 static const char *RelativeUnitStr(UDateRelativeUnit unit);
     26 static const char *AbsoluteUnitStr(UDateAbsoluteUnit unit);
     27 
     28 typedef struct WithQuantityExpected {
     29     double value;
     30     UDateDirection direction;
     31     UDateRelativeUnit unit;
     32     const char *expected;
     33 } WithQuantityExpected;
     34 
     35 typedef struct WithoutQuantityExpected {
     36     UDateDirection direction;
     37     UDateAbsoluteUnit unit;
     38     const char *expected;
     39 } WithoutQuantityExpected;
     40 
     41 static WithQuantityExpected kEnglish[] = {
     42         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 seconds"},
     43         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
     44         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 second"},
     45         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 seconds"},
     46         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 minutes"},
     47         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 minutes"},
     48         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 minute"},
     49         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 minutes"},
     50         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hours"},
     51         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hours"},
     52         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hour"},
     53         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hours"},
     54         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
     55         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
     56         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
     57         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
     58         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 weeks"},
     59         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 weeks"},
     60         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 week"},
     61         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 weeks"},
     62         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 months"},
     63         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 months"},
     64         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 month"},
     65         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 months"},
     66         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 years"},
     67         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 years"},
     68         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 year"},
     69         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 years"},
     70 
     71         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
     72         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
     73         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
     74         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
     75         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
     76         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
     77         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
     78         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
     79         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
     80         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
     81         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
     82         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
     83         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
     84         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
     85         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
     86         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
     87         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
     88         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
     89         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
     90         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
     91         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
     92         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
     93         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
     94         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
     95         {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
     96         {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
     97         {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
     98         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
     99 };
    100 
    101 static WithQuantityExpected kEnglishDecimal[] = {
    102         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.0 seconds"},
    103         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
    104         {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1.0 seconds"},
    105         {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2.0 seconds"}
    106 };
    107 
    108 static WithQuantityExpected kSerbian[] = {
    109         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 0 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0438"},
    110         {1.2, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 1,2 \\u043c\\u0435\\u0441\\u0435\\u0446\\u0430"},
    111         {21.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "\\u0437\\u0430 21 \\u043c\\u0435\\u0441\\u0435\\u0446"}
    112 };
    113 
    114 static WithoutQuantityExpected kEnglishNoQuantity[] = {
    115         {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
    116 
    117         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
    118         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next week"},
    119         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next month"},
    120         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next year"},
    121         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Monday"},
    122         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tuesday"},
    123         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wednesday"},
    124         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thursday"},
    125         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Friday"},
    126         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Saturday"},
    127         {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sunday"},
    128 
    129         {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
    130 
    131         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
    132         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last week"},
    133         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last month"},
    134         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last year"},
    135         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Monday"},
    136         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tuesday"},
    137         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wednesday"},
    138         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thursday"},
    139         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Friday"},
    140         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Saturday"},
    141         {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sunday"},
    142 
    143         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
    144         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this week"},
    145         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this month"},
    146         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this year"},
    147         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Monday"},
    148         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tuesday"},
    149         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wednesday"},
    150         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thursday"},
    151         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Friday"},
    152         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Saturday"},
    153         {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sunday"},
    154 
    155         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
    156         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "week"},
    157         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "month"},
    158         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "year"},
    159         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
    160         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
    161         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
    162         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
    163         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
    164         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
    165         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
    166 
    167         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
    168 };
    169 
    170 static WithoutQuantityExpected kSpanishNoQuantity[] = {
    171         {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, "pasado ma\\u00F1ana"},
    172         {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, "antes de ayer"}
    173 };
    174 
    175 class RelativeDateTimeFormatterTest : public IntlTest {
    176 public:
    177     RelativeDateTimeFormatterTest() {
    178     }
    179 
    180     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
    181 private:
    182     void TestEnglish();
    183     void TestSerbian();
    184     void TestEnglishNoQuantity();
    185     void TestSpanishNoQuantity();
    186     void TestFormatWithQuantityIllegalArgument();
    187     void TestFormatWithoutQuantityIllegalArgument();
    188     void TestCustomNumberFormat();
    189     void TestCombineDateAndTime();
    190     void RunTest(
    191             const Locale& locale,
    192             const WithQuantityExpected* expectedResults,
    193             int32_t expectedResultLength);
    194     void RunTest(
    195             const Locale& locale,
    196             const WithoutQuantityExpected* expectedResults,
    197             int32_t expectedResultLength);
    198     void RunTest(
    199             const RelativeDateTimeFormatter& fmt,
    200             const WithQuantityExpected* expectedResults,
    201             int32_t expectedResultLength,
    202             const char *description);
    203     void RunTest(
    204             const RelativeDateTimeFormatter& fmt,
    205             const WithoutQuantityExpected* expectedResults,
    206             int32_t expectedResultLength,
    207             const char *description);
    208     void CheckExpectedResult(
    209             const RelativeDateTimeFormatter& fmt,
    210             const WithQuantityExpected& expectedResult,
    211             const char* description);
    212     void CheckExpectedResult(
    213             const RelativeDateTimeFormatter& fmt,
    214             const WithoutQuantityExpected& expectedResult,
    215             const char* description);
    216     void VerifyIllegalArgument(
    217             const RelativeDateTimeFormatter& fmt,
    218             UDateDirection direction,
    219             UDateRelativeUnit unit);
    220     void VerifyIllegalArgument(
    221             const RelativeDateTimeFormatter& fmt,
    222             UDateDirection direction,
    223             UDateAbsoluteUnit unit);
    224 };
    225 
    226 void RelativeDateTimeFormatterTest::runIndexedTest(
    227         int32_t index, UBool exec, const char *&name, char *) {
    228     if (exec) {
    229         logln("TestSuite RelativeDateTimeFormatterTest: ");
    230     }
    231     TESTCASE_AUTO_BEGIN;
    232     TESTCASE_AUTO(TestEnglish);
    233     TESTCASE_AUTO(TestSerbian);
    234     TESTCASE_AUTO(TestEnglishNoQuantity);
    235     TESTCASE_AUTO(TestSpanishNoQuantity);
    236     TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
    237     TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
    238     TESTCASE_AUTO(TestCustomNumberFormat);
    239     TESTCASE_AUTO(TestCombineDateAndTime);
    240     TESTCASE_AUTO_END;
    241 }
    242 
    243 void RelativeDateTimeFormatterTest::TestEnglish() {
    244     RunTest("en", kEnglish, LENGTHOF(kEnglish));
    245 }
    246 
    247 void RelativeDateTimeFormatterTest::TestSerbian() {
    248     RunTest("sr", kSerbian, LENGTHOF(kSerbian));
    249 }
    250 
    251 void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
    252     RunTest("en", kEnglishNoQuantity, LENGTHOF(kEnglishNoQuantity));
    253 }
    254 
    255 void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
    256     RunTest("es", kSpanishNoQuantity, LENGTHOF(kSpanishNoQuantity));
    257 }
    258 
    259 void RelativeDateTimeFormatterTest::TestFormatWithQuantityIllegalArgument() {
    260     UErrorCode status = U_ZERO_ERROR;
    261     RelativeDateTimeFormatter fmt("en", status);
    262     if (U_FAILURE(status)) {
    263         dataerrln("Failure creating format object - %s", u_errorName(status));
    264         return;
    265     }
    266     VerifyIllegalArgument(fmt, UDAT_DIRECTION_PLAIN, UDAT_RELATIVE_DAYS);
    267     VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_RELATIVE_DAYS);
    268 }
    269 
    270 void RelativeDateTimeFormatterTest::TestFormatWithoutQuantityIllegalArgument() {
    271     UErrorCode status = U_ZERO_ERROR;
    272     RelativeDateTimeFormatter fmt("en", status);
    273     if (U_FAILURE(status)) {
    274         dataerrln("Failure creating format object - %s", u_errorName(status));
    275         return;
    276     }
    277     VerifyIllegalArgument(fmt, UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_NOW);
    278     VerifyIllegalArgument(fmt, UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_NOW);
    279     VerifyIllegalArgument(fmt, UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_NOW);
    280 }
    281 
    282 void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
    283     NumberFormat *nf;
    284     UErrorCode status = U_ZERO_ERROR;
    285     {
    286         RelativeDateTimeFormatter fmt("en", status);
    287         if (U_FAILURE(status)) {
    288             dataerrln(
    289                     "Failure creating format object - %s", u_errorName(status));
    290             return;
    291         }
    292         nf = (NumberFormat *) fmt.getNumberFormat().clone();
    293     }
    294     nf->setMinimumFractionDigits(1);
    295     nf->setMaximumFractionDigits(1);
    296     RelativeDateTimeFormatter fmt("en", nf, status);
    297 
    298     // Test copy constructor.
    299     RelativeDateTimeFormatter fmt2(fmt);
    300     RunTest(fmt2, kEnglishDecimal, LENGTHOF(kEnglishDecimal), "en decimal digits");
    301 
    302     // Test assignment
    303     fmt = RelativeDateTimeFormatter("es", status);
    304     RunTest(fmt, kSpanishNoQuantity, LENGTHOF(kSpanishNoQuantity), "assignment operator");
    305 
    306 }
    307 
    308 void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
    309     UErrorCode status = U_ZERO_ERROR;
    310     RelativeDateTimeFormatter fmt("en", status);
    311     if (U_FAILURE(status)) {
    312         dataerrln("Failure creating format object - %s", u_errorName(status));
    313         return;
    314     }
    315     UnicodeString actual;
    316     fmt.combineDateAndTime(
    317         UnicodeString("yesterday"),
    318         UnicodeString("3:50"),
    319         actual,
    320         status);
    321     UnicodeString expected("yesterday, 3:50");
    322     if (expected != actual) {
    323         errln("Expected "+expected+", got "+actual);
    324     }
    325 }
    326 
    327 
    328 void RelativeDateTimeFormatterTest::RunTest(
    329         const Locale& locale,
    330         const WithQuantityExpected* expectedResults,
    331         int32_t expectedResultLength) {
    332     UErrorCode status = U_ZERO_ERROR;
    333     RelativeDateTimeFormatter fmt(locale, status);
    334     if (U_FAILURE(status)) {
    335         dataerrln("Unable to create format object - %s", u_errorName(status));
    336         return;
    337    }
    338     RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
    339 }
    340 
    341 void RelativeDateTimeFormatterTest::RunTest(
    342         const Locale& locale,
    343         const WithoutQuantityExpected* expectedResults,
    344         int32_t expectedResultLength) {
    345     UErrorCode status = U_ZERO_ERROR;
    346     RelativeDateTimeFormatter fmt(locale, status);
    347     if (U_FAILURE(status)) {
    348         dataerrln("Unable to create format object - %s", u_errorName(status));
    349         return;
    350     }
    351     RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
    352 }
    353 
    354 void RelativeDateTimeFormatterTest::RunTest(
    355         const RelativeDateTimeFormatter& fmt,
    356         const WithQuantityExpected* expectedResults,
    357         int32_t expectedResultLength,
    358         const char *description) {
    359     for (int32_t i = 0; i < expectedResultLength; ++i) {
    360         CheckExpectedResult(fmt, expectedResults[i], description);
    361     }
    362 }
    363 
    364 void RelativeDateTimeFormatterTest::RunTest(
    365         const RelativeDateTimeFormatter& fmt,
    366         const WithoutQuantityExpected* expectedResults,
    367         int32_t expectedResultLength,
    368         const char *description) {
    369     for (int32_t i = 0; i < expectedResultLength; ++i) {
    370         CheckExpectedResult(fmt, expectedResults[i], description);
    371     }
    372 }
    373 
    374 void RelativeDateTimeFormatterTest::CheckExpectedResult(
    375         const RelativeDateTimeFormatter& fmt,
    376         const WithQuantityExpected& expectedResult,
    377         const char* description) {
    378     UErrorCode status = U_ZERO_ERROR;
    379     UnicodeString actual;
    380     fmt.format(expectedResult.value, expectedResult.direction, expectedResult.unit, actual, status);
    381     UnicodeString expected(expectedResult.expected, -1, US_INV);
    382     expected = expected.unescape();
    383     char buffer[256];
    384     sprintf(
    385             buffer,
    386             "%s, %f, %s, %s",
    387             description,
    388             expectedResult.value,
    389             DirectionStr(expectedResult.direction),
    390             RelativeUnitStr(expectedResult.unit));
    391     if (actual != expected) {
    392         errln(UnicodeString("Fail: Expected: ") + expected
    393                 + ", Got: " + actual
    394                 + ", For: " + buffer);
    395     }
    396 }
    397 
    398 void RelativeDateTimeFormatterTest::CheckExpectedResult(
    399         const RelativeDateTimeFormatter& fmt,
    400         const WithoutQuantityExpected& expectedResult,
    401         const char* description) {
    402     UErrorCode status = U_ZERO_ERROR;
    403     UnicodeString actual;
    404     fmt.format(expectedResult.direction, expectedResult.unit, actual, status);
    405     UnicodeString expected(expectedResult.expected, -1, US_INV);
    406     expected = expected.unescape();
    407     char buffer[256];
    408     sprintf(
    409             buffer,
    410             "%s, %s, %s",
    411             description,
    412             DirectionStr(expectedResult.direction),
    413             AbsoluteUnitStr(expectedResult.unit));
    414     if (actual != expected) {
    415         errln(UnicodeString("Fail: Expected: ") + expected
    416                 + ", Got: " + actual
    417                 + ", For: " + buffer);
    418     }
    419 }
    420 
    421 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
    422         const RelativeDateTimeFormatter& fmt,
    423         UDateDirection direction,
    424         UDateRelativeUnit unit) {
    425     UnicodeString appendTo;
    426     UErrorCode status = U_ZERO_ERROR;
    427     fmt.format(1.0, direction, unit, appendTo, status);
    428     if (status != U_ILLEGAL_ARGUMENT_ERROR) {
    429         errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
    430     }
    431 }
    432 
    433 void RelativeDateTimeFormatterTest::VerifyIllegalArgument(
    434         const RelativeDateTimeFormatter& fmt,
    435         UDateDirection direction,
    436         UDateAbsoluteUnit unit) {
    437     UnicodeString appendTo;
    438     UErrorCode status = U_ZERO_ERROR;
    439     fmt.format(direction, unit, appendTo, status);
    440     if (status != U_ILLEGAL_ARGUMENT_ERROR) {
    441         errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
    442     }
    443 }
    444 
    445 static const char *kLast2 = "Last_2";
    446 static const char *kLast = "Last";
    447 static const char *kThis = "This";
    448 static const char *kNext = "Next";
    449 static const char *kNext2 = "Next_2";
    450 static const char *kPlain = "Plain";
    451 
    452 static const char *kSeconds = "Seconds";
    453 static const char *kMinutes = "Minutes";
    454 static const char *kHours = "Hours";
    455 static const char *kDays = "Days";
    456 static const char *kWeeks = "Weeks";
    457 static const char *kMonths = "Months";
    458 static const char *kYears = "Years";
    459 
    460 static const char *kSunday = "Sunday";
    461 static const char *kMonday = "Monday";
    462 static const char *kTuesday = "Tuesday";
    463 static const char *kWednesday = "Wednesday";
    464 static const char *kThursday = "Thursday";
    465 static const char *kFriday = "Friday";
    466 static const char *kSaturday = "Saturday";
    467 static const char *kDay = "Day";
    468 static const char *kWeek = "Week";
    469 static const char *kMonth = "Month";
    470 static const char *kYear = "Year";
    471 static const char *kNow = "Now";
    472 
    473 static const char *kUndefined = "Undefined";
    474 
    475 static const char *DirectionStr(
    476         UDateDirection direction) {
    477     switch (direction) {
    478         case UDAT_DIRECTION_LAST_2:
    479             return kLast2;
    480         case UDAT_DIRECTION_LAST:
    481             return kLast;
    482         case UDAT_DIRECTION_THIS:
    483             return kThis;
    484         case UDAT_DIRECTION_NEXT:
    485             return kNext;
    486         case UDAT_DIRECTION_NEXT_2:
    487             return kNext2;
    488         case UDAT_DIRECTION_PLAIN:
    489             return kPlain;
    490         default:
    491             return kUndefined;
    492     }
    493     return kUndefined;
    494 }
    495 
    496 static const char *RelativeUnitStr(
    497         UDateRelativeUnit unit) {
    498     switch (unit) {
    499         case UDAT_RELATIVE_SECONDS:
    500             return kSeconds;
    501         case UDAT_RELATIVE_MINUTES:
    502             return kMinutes;
    503         case UDAT_RELATIVE_HOURS:
    504             return kHours;
    505         case UDAT_RELATIVE_DAYS:
    506             return kDays;
    507         case UDAT_RELATIVE_WEEKS:
    508             return kWeeks;
    509         case UDAT_RELATIVE_MONTHS:
    510             return kMonths;
    511         case UDAT_RELATIVE_YEARS:
    512             return kYears;
    513         default:
    514             return kUndefined;
    515     }
    516     return kUndefined;
    517 }
    518 
    519 static const char *AbsoluteUnitStr(
    520         UDateAbsoluteUnit unit) {
    521     switch (unit) {
    522         case UDAT_ABSOLUTE_SUNDAY:
    523             return kSunday;
    524         case UDAT_ABSOLUTE_MONDAY:
    525             return kMonday;
    526         case UDAT_ABSOLUTE_TUESDAY:
    527             return kTuesday;
    528         case UDAT_ABSOLUTE_WEDNESDAY:
    529             return kWednesday;
    530         case UDAT_ABSOLUTE_THURSDAY:
    531             return kThursday;
    532         case UDAT_ABSOLUTE_FRIDAY:
    533             return kFriday;
    534         case UDAT_ABSOLUTE_SATURDAY:
    535             return kSaturday;
    536         case UDAT_ABSOLUTE_DAY:
    537             return kDay;
    538         case UDAT_ABSOLUTE_WEEK:
    539             return kWeek;
    540         case UDAT_ABSOLUTE_MONTH:
    541             return kMonth;
    542         case UDAT_ABSOLUTE_YEAR:
    543             return kYear;
    544         case UDAT_ABSOLUTE_NOW:
    545             return kNow;
    546         default:
    547             return kUndefined;
    548     }
    549     return kUndefined;
    550 }
    551 
    552 extern IntlTest *createRelativeDateTimeFormatterTest() {
    553     return new RelativeDateTimeFormatterTest();
    554 }
    555 
    556 #endif
    557