#include "unicode/msgfmt.h"
#include "unicode/decimfmt.h"
#include "unicode/numfmt.h"
+#include "unicode/brkiter.h"
#include "lrucache.h"
#include "uresimp.h"
#include "unicode/ures.h"
#include "charstr.h"
#include "sharedptr.h"
+#include "sharedbreakiterator.h"
#include "sharedpluralrules.h"
#include "sharednumberformat.h"
+#define RELDATE_STYLE_FULL 0
+#define RELDATE_STYLE_SHORT 1
+#define RELDATE_STYLE_NARROW 2
+#define RELDATE_STYLE_COUNT 3
+
// Copied from uscript_props.cpp
#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
static icu::LRUCache *gCache = NULL;
static UMutex gCacheMutex = U_MUTEX_INITIALIZER;
+static UMutex gBrkIterMutex = U_MUTEX_INITIALIZER;
static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER;
U_CDECL_BEGIN
U_NAMESPACE_BEGIN
+static int32_t getStyleIndex(UDateFormatStyle style) {
+ switch (style) {
+ case UDAT_FULL:
+ case UDAT_LONG:
+ return 0;
+ case UDAT_MEDIUM:
+ return 1;
+ case UDAT_SHORT:
+ return 2;
+ default:
+ return 0;
+ }
+}
+
// RelativeDateTimeFormatter specific data for a single locale
class RelativeDateTimeCacheData: public SharedObject {
public:
virtual ~RelativeDateTimeCacheData();
// no numbers: e.g Next Tuesday; Yesterday; etc.
- UnicodeString absoluteUnits[UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT];
+ UnicodeString absoluteUnits[RELDATE_STYLE_COUNT][UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT];
// has numbers: e.g Next Tuesday; Yesterday; etc. For second index, 0
// means past e.g 5 days ago; 1 means future e.g in 5 days.
- QuantityFormatter relativeUnits[UDAT_RELATIVE_UNIT_COUNT][2];
+ QuantityFormatter relativeUnits[RELDATE_STYLE_COUNT][UDAT_RELATIVE_UNIT_COUNT][2];
void adoptCombinedDateAndTime(MessageFormat *mfToAdopt) {
delete combinedDateAndTime;
status);
}
-static UBool loadUnitData(
+static void addTimeUnits(
const UResourceBundle *resource,
+ const char *path, const char *pathShort, const char *pathNarrow,
+ UDateRelativeUnit relativeUnit,
+ UDateAbsoluteUnit absoluteUnit,
RelativeDateTimeCacheData &cacheData,
UErrorCode &status) {
addTimeUnit(
+ resource,
+ path,
+ cacheData.relativeUnits[0][relativeUnit],
+ cacheData.absoluteUnits[0][absoluteUnit],
+ status);
+ addTimeUnit(
+ resource,
+ pathShort,
+ cacheData.relativeUnits[1][relativeUnit],
+ cacheData.absoluteUnits[1][absoluteUnit],
+ status);
+ addTimeUnit(
+ resource,
+ pathNarrow,
+ cacheData.relativeUnits[2][relativeUnit],
+ cacheData.absoluteUnits[2][absoluteUnit],
+ status);
+}
+
+static void initRelativeUnits(
+ const UResourceBundle *resource,
+ const char *path, const char *pathShort, const char *pathNarrow,
+ UDateRelativeUnit relativeUnit,
+ QuantityFormatter relativeUnits[][UDAT_RELATIVE_UNIT_COUNT][2],
+ UErrorCode &status) {
+ initRelativeUnit(
resource,
- "fields/day",
- cacheData.relativeUnits[UDAT_RELATIVE_DAYS],
- cacheData.absoluteUnits[UDAT_ABSOLUTE_DAY],
+ path,
+ relativeUnits[0][relativeUnit],
status);
- addTimeUnit(
+ initRelativeUnit(
resource,
- "fields/week",
- cacheData.relativeUnits[UDAT_RELATIVE_WEEKS],
- cacheData.absoluteUnits[UDAT_ABSOLUTE_WEEK],
+ pathShort,
+ relativeUnits[1][relativeUnit],
status);
- addTimeUnit(
+ initRelativeUnit(
resource,
- "fields/month",
- cacheData.relativeUnits[UDAT_RELATIVE_MONTHS],
- cacheData.absoluteUnits[UDAT_ABSOLUTE_MONTH],
+ pathNarrow,
+ relativeUnits[2][relativeUnit],
status);
- addTimeUnit(
+}
+
+static void addWeekDays(
+ const UResourceBundle *resource,
+ const char *path, const char *pathShort, const char *pathNarrow,
+ const UnicodeString daysOfWeek[][7],
+ UDateAbsoluteUnit absoluteUnit,
+ UnicodeString absoluteUnits[][UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT],
+ UErrorCode &status) {
+ addWeekDay(
resource,
- "fields/year",
- cacheData.relativeUnits[UDAT_RELATIVE_YEARS],
- cacheData.absoluteUnits[UDAT_ABSOLUTE_YEAR],
+ path,
+ daysOfWeek[0],
+ absoluteUnit,
+ absoluteUnits[0],
status);
- initRelativeUnit(
+ addWeekDay(
resource,
- "fields/second",
- cacheData.relativeUnits[UDAT_RELATIVE_SECONDS],
+ pathShort,
+ daysOfWeek[1],
+ absoluteUnit,
+ absoluteUnits[1],
status);
- initRelativeUnit(
+ addWeekDay(
resource,
- "fields/minute",
- cacheData.relativeUnits[UDAT_RELATIVE_MINUTES],
+ pathNarrow,
+ daysOfWeek[2],
+ absoluteUnit,
+ absoluteUnits[2],
status);
- initRelativeUnit(
+}
+
+static UBool loadUnitData(
+ const UResourceBundle *resource,
+ RelativeDateTimeCacheData &cacheData,
+ UErrorCode &status) {
+ addTimeUnits(
resource,
- "fields/hour",
- cacheData.relativeUnits[UDAT_RELATIVE_HOURS],
+ "fields/day", "fields/day-short", "fields/day-narrow",
+ UDAT_RELATIVE_DAYS,
+ UDAT_ABSOLUTE_DAY,
+ cacheData,
+ status);
+ addTimeUnits(
+ resource,
+ "fields/week", "fields/week-short", "fields/week-narrow",
+ UDAT_RELATIVE_WEEKS,
+ UDAT_ABSOLUTE_WEEK,
+ cacheData,
+ status);
+ addTimeUnits(
+ resource,
+ "fields/month", "fields/month-short", "fields/month-narrow",
+ UDAT_RELATIVE_MONTHS,
+ UDAT_ABSOLUTE_MONTH,
+ cacheData,
+ status);
+ addTimeUnits(
+ resource,
+ "fields/year", "fields/year-short", "fields/year-narrow",
+ UDAT_RELATIVE_YEARS,
+ UDAT_ABSOLUTE_YEAR,
+ cacheData,
+ status);
+ initRelativeUnits(
+ resource,
+ "fields/second", "fields/second-short", "fields/second-narrow",
+ UDAT_RELATIVE_SECONDS,
+ cacheData.relativeUnits,
+ status);
+ initRelativeUnits(
+ resource,
+ "fields/minute", "fields/minute-short", "fields/minute-narrow",
+ UDAT_RELATIVE_MINUTES,
+ cacheData.relativeUnits,
+ status);
+ initRelativeUnits(
+ resource,
+ "fields/hour", "fields/hour-short", "fields/hour-narrow",
+ UDAT_RELATIVE_HOURS,
+ cacheData.relativeUnits,
status);
getStringWithFallback(
resource,
"fields/second/relative/0",
- cacheData.absoluteUnits[UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+ cacheData.absoluteUnits[0][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+ status);
+ getStringWithFallback(
+ resource,
+ "fields/second-short/relative/0",
+ cacheData.absoluteUnits[1][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
status);
- UnicodeString daysOfWeek[7];
+ getStringWithFallback(
+ resource,
+ "fields/second-narrow/relative/0",
+ cacheData.absoluteUnits[2][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+ status);
+ UnicodeString daysOfWeek[3][7];
readDaysOfWeek(
resource,
"calendar/gregorian/dayNames/stand-alone/wide",
- daysOfWeek,
+ daysOfWeek[0],
status);
- addWeekDay(
+ readDaysOfWeek(
+ resource,
+ "calendar/gregorian/dayNames/stand-alone/short",
+ daysOfWeek[1],
+ status);
+ readDaysOfWeek(
+ resource,
+ "calendar/gregorian/dayNames/stand-alone/narrow",
+ daysOfWeek[2],
+ status);
+ addWeekDays(
resource,
"fields/mon/relative",
+ "fields/mon-short/relative",
+ "fields/mon-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_MONDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/tue/relative",
+ "fields/tue-short/relative",
+ "fields/tue-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_TUESDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/wed/relative",
+ "fields/wed-short/relative",
+ "fields/wed-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_WEDNESDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/thu/relative",
+ "fields/thu-short/relative",
+ "fields/thu-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_THURSDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/fri/relative",
+ "fields/fri-short/relative",
+ "fields/fri-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_FRIDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/sat/relative",
+ "fields/sat-short/relative",
+ "fields/sat-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_SATURDAY,
cacheData.absoluteUnits,
status);
- addWeekDay(
+ addWeekDays(
resource,
"fields/sun/relative",
+ "fields/sun-short/relative",
+ "fields/sun-narrow/relative",
daysOfWeek,
UDAT_ABSOLUTE_SUNDAY,
cacheData.absoluteUnits,
return U_SUCCESS(status);
}
-RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status)
- : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
- init(Locale::getDefault(), NULL, status);
+RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status) :
+ fCache(NULL),
+ fNumberFormat(NULL),
+ fPluralRules(NULL),
+ fStyle(UDAT_FULL),
+ fContext(UDISPCTX_CAPITALIZATION_NONE),
+ fOptBreakIterator(NULL) {
+ init(NULL, NULL, status);
}
RelativeDateTimeFormatter::RelativeDateTimeFormatter(
- const Locale& locale, UErrorCode& status)
- : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
- init(locale, NULL, status);
+ const Locale& locale, UErrorCode& status) :
+ fCache(NULL),
+ fNumberFormat(NULL),
+ fPluralRules(NULL),
+ fStyle(UDAT_FULL),
+ fContext(UDISPCTX_CAPITALIZATION_NONE),
+ fOptBreakIterator(NULL),
+ fLocale(locale) {
+ init(NULL, NULL, status);
}
RelativeDateTimeFormatter::RelativeDateTimeFormatter(
- const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status)
- : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
- init(locale, nfToAdopt, status);
+ const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status) :
+ fCache(NULL),
+ fNumberFormat(NULL),
+ fPluralRules(NULL),
+ fStyle(UDAT_FULL),
+ fContext(UDISPCTX_CAPITALIZATION_NONE),
+ fOptBreakIterator(NULL),
+ fLocale(locale) {
+ init(nfToAdopt, NULL, status);
+}
+
+RelativeDateTimeFormatter::RelativeDateTimeFormatter(
+ const Locale& locale,
+ NumberFormat *nfToAdopt,
+ UDateFormatStyle styl,
+ UDisplayContext capitalizationContext,
+ UErrorCode& status) :
+ fCache(NULL),
+ fNumberFormat(NULL),
+ fPluralRules(NULL),
+ fStyle(styl),
+ fContext(capitalizationContext),
+ fOptBreakIterator(NULL),
+ fLocale(locale) {
+ if (U_FAILURE(status)) {
+ return;
+ }
+ if ((capitalizationContext >> 8) != UDISPCTX_TYPE_CAPITALIZATION) {
+ status = U_ILLEGAL_ARGUMENT_ERROR;
+ return;
+ }
+ if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) {
+ BreakIterator *bi = BreakIterator::createSentenceInstance(locale, status);
+ if (U_FAILURE(status)) {
+ return;
+ }
+ init(nfToAdopt, bi, status);
+ } else {
+ init(nfToAdopt, NULL, status);
+ }
}
RelativeDateTimeFormatter::RelativeDateTimeFormatter(
const RelativeDateTimeFormatter& other)
- : cache(other.cache),
- numberFormat(other.numberFormat),
- pluralRules(other.pluralRules) {
- cache->addRef();
- numberFormat->addRef();
- pluralRules->addRef();
+ : fCache(other.fCache),
+ fNumberFormat(other.fNumberFormat),
+ fPluralRules(other.fPluralRules),
+ fStyle(other.fStyle),
+ fContext(other.fContext),
+ fOptBreakIterator(other.fOptBreakIterator),
+ fLocale(other.fLocale) {
+ fCache->addRef();
+ fNumberFormat->addRef();
+ fPluralRules->addRef();
+ if (fOptBreakIterator != NULL) {
+ fOptBreakIterator->addRef();
+ }
}
RelativeDateTimeFormatter& RelativeDateTimeFormatter::operator=(
const RelativeDateTimeFormatter& other) {
if (this != &other) {
- SharedObject::copyPtr(other.cache, cache);
- SharedObject::copyPtr(other.numberFormat, numberFormat);
- SharedObject::copyPtr(other.pluralRules, pluralRules);
+ SharedObject::copyPtr(other.fCache, fCache);
+ SharedObject::copyPtr(other.fNumberFormat, fNumberFormat);
+ SharedObject::copyPtr(other.fPluralRules, fPluralRules);
+ SharedObject::copyPtr(other.fOptBreakIterator, fOptBreakIterator);
+ fStyle = other.fStyle;
+ fContext = other.fContext;
+ fLocale = other.fLocale;
}
return *this;
}
RelativeDateTimeFormatter::~RelativeDateTimeFormatter() {
- if (cache != NULL) {
- cache->removeRef();
+ if (fCache != NULL) {
+ fCache->removeRef();
}
- if (numberFormat != NULL) {
- numberFormat->removeRef();
+ if (fNumberFormat != NULL) {
+ fNumberFormat->removeRef();
}
- if (pluralRules != NULL) {
- pluralRules->removeRef();
+ if (fPluralRules != NULL) {
+ fPluralRules->removeRef();
+ }
+ if (fOptBreakIterator != NULL) {
+ fOptBreakIterator->removeRef();
}
}
const NumberFormat& RelativeDateTimeFormatter::getNumberFormat() const {
- return **numberFormat;
+ return **fNumberFormat;
+}
+
+UDisplayContext RelativeDateTimeFormatter::getCapitalizationContext() const {
+ return fContext;
+}
+
+UDateFormatStyle RelativeDateTimeFormatter::getFormatStyle() const {
+ return fStyle;
}
UnicodeString& RelativeDateTimeFormatter::format(
}
int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0;
FieldPosition pos(FieldPosition::DONT_CARE);
- return cache->relativeUnits[unit][bFuture].format(
+ if (fOptBreakIterator == NULL) {
+ return fCache->relativeUnits[getStyleIndex(fStyle)][unit][bFuture].format(
quantity,
- **numberFormat,
- **pluralRules,
+ **fNumberFormat,
+ **fPluralRules,
appendTo,
pos,
status);
+ }
+ UnicodeString result;
+ fCache->relativeUnits[getStyleIndex(fStyle)][unit][bFuture].format(
+ quantity,
+ **fNumberFormat,
+ **fPluralRules,
+ result,
+ pos,
+ status);
+ adjustForContext(result);
+ return appendTo.append(result);
}
UnicodeString& RelativeDateTimeFormatter::format(
status = U_ILLEGAL_ARGUMENT_ERROR;
return appendTo;
}
- return appendTo.append(cache->absoluteUnits[unit][direction]);
+ if (fOptBreakIterator == NULL) {
+ return appendTo.append(fCache->absoluteUnits[getStyleIndex(fStyle)][unit][direction]);
+ }
+ UnicodeString result(fCache->absoluteUnits[getStyleIndex(fStyle)][unit][direction]);
+ adjustForContext(result);
+ return appendTo.append(result);
}
UnicodeString& RelativeDateTimeFormatter::combineDateAndTime(
UnicodeString& appendTo, UErrorCode& status) const {
Formattable args[2] = {timeString, relativeDateString};
FieldPosition fpos(0);
- return cache->getCombinedDateAndTime()->format(
+ return fCache->getCombinedDateAndTime()->format(
args, 2, appendTo, fpos, status);
}
+void RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const {
+ if (fOptBreakIterator == NULL
+ || str.length() == 0 || !u_islower(str.char32At(0))) {
+ return;
+ }
+
+ // Must guarantee that one thread at a time accesses the shared break
+ // iterator.
+ Mutex lock(&gBrkIterMutex);
+ str.toTitle(
+ fOptBreakIterator->get(),
+ fLocale,
+ U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
+}
+
void RelativeDateTimeFormatter::init(
- const Locale &locale, NumberFormat *nfToAdopt, UErrorCode &status) {
+ NumberFormat *nfToAdopt,
+ BreakIterator *biToAdopt,
+ UErrorCode &status) {
LocalPointer<NumberFormat> nf(nfToAdopt);
- if (!getFromCache(locale.getName(), cache, status)) {
+ LocalPointer<BreakIterator> bi(biToAdopt);
+ if (!getFromCache(fLocale.getName(), fCache, status)) {
return;
}
- SharedObject::copyPtr(
- PluralRules::createSharedInstance(
- locale, UPLURAL_TYPE_CARDINAL, status),
- pluralRules);
+ const SharedPluralRules *pr = PluralRules::createSharedInstance(
+ fLocale, UPLURAL_TYPE_CARDINAL, status);
if (U_FAILURE(status)) {
return;
}
- pluralRules->removeRef();
+ SharedObject::copyPtr(pr, fPluralRules);
+ pr->removeRef();
if (nf.isNull()) {
- SharedObject::copyPtr(
- NumberFormat::createSharedInstance(
- locale, UNUM_DECIMAL, status),
- numberFormat);
+ const SharedNumberFormat *shared = NumberFormat::createSharedInstance(
+ fLocale, UNUM_DECIMAL, status);
if (U_FAILURE(status)) {
return;
}
- numberFormat->removeRef();
+ SharedObject::copyPtr(shared, fNumberFormat);
+ shared->removeRef();
} else {
SharedNumberFormat *shared = new SharedNumberFormat(nf.getAlias());
if (shared == NULL) {
return;
}
nf.orphan();
- SharedObject::copyPtr(shared, numberFormat);
+ SharedObject::copyPtr(shared, fNumberFormat);
+ }
+ if (bi.isNull()) {
+ SharedObject::clearPtr(fOptBreakIterator);
+ } else {
+ SharedBreakIterator *shared = new SharedBreakIterator(bi.getAlias());
+ if (shared == NULL) {
+ status = U_MEMORY_ALLOCATION_ERROR;
+ return;
+ }
+ bi.orphan();
+ SharedObject::copyPtr(shared, fOptBreakIterator);
}
}
{2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
};
+static WithQuantityExpected kEnglishCaps[] = {
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0 seconds"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0.5 seconds"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 1 second"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 2 seconds"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0 minutes"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0.5 minutes"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 1 minute"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 2 minutes"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0 hours"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0.5 hours"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 1 hour"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 2 hours"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0 days"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0.5 days"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 1 day"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 2 days"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0 weeks"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0.5 weeks"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 1 week"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 2 weeks"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0 months"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0.5 months"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 1 month"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 2 months"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0 years"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0.5 years"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 1 year"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 2 years"},
+
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"}
+};
+
+static WithQuantityExpected kEnglishShort[] = {
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 sec."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 sec."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 sec."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 sec."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 min."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 min."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 min."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 min."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hr."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hr."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hr."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hr."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 wk."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 wk."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 wk."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 wk."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 mo."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 mo."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 mo."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 mo."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 yr."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 yr."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 yr."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 yr."},
+
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 sec. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 sec. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 sec. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 sec. ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 min. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 min. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 min. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 min. ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hr. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hr. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hr. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hr. ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 wk. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 wk. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 wk. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 wk. ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 mo. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 mo. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 mo. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 mo. ago"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 yr. ago"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 yr. ago"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 yr. ago"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 yr. ago"}
+};
+
+static WithQuantityExpected kEnglishNarrow[] = {
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+0 s"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+0.5 s"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+1 s"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+2 s"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+0 m"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+0.5 m"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+1 m"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+2 m"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+0 h"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+0.5 h"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+1 h"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+2 h"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+0 days"},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+0.5 days"},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+1 day"},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+2 days"},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+0 wk."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+0.5 wk."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+1 wk."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+2 wk."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+0 mo."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+0.5 mo."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+1 mo."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+2 mo."},
+ {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+0 yr."},
+ {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+0.5 yr."},
+ {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+1 yr."},
+ {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+2 yr."},
+
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-0 s"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-0.5 s"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-1 s"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-2 s"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-0 m"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-0.5 m"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-1 m"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-2 m"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-0 h"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-0.5 h"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-1 h"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-2 h"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-0 days"},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-0.5 days"},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-1 day"},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-2 days"},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-0 wk."},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-0.5 wk."},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-1 wk."},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-2 wk."},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-0 mo."},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-0.5 mo."},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-1 mo."},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-2 mo."},
+ {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-0 yr."},
+ {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-0.5 yr."},
+ {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-1 yr."},
+ {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-2 yr."}
+};
+
static WithQuantityExpected kEnglishDecimal[] = {
{0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.0 seconds"},
{0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
{UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
};
+static WithoutQuantityExpected kEnglishNoQuantityCaps[] = {
+ {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "Tomorrow"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "Next week"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "Next month"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "Next year"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "Next Monday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "Next Tuesday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "Next Wednesday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "Next Thursday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "Next Friday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "Next Saturday"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "Next Sunday"},
+
+ {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "Yesterday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "Last week"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "Last month"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "Last year"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "Last Monday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "Last Tuesday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "Last Wednesday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "Last Thursday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "Last Friday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "Last Saturday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "Last Sunday"},
+
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "Today"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "This week"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "This month"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "This year"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "This Monday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "This Tuesday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "This Wednesday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "This Thursday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "This Friday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "This Saturday"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "This Sunday"},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "Day"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "Week"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "Month"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "Year"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "Now"}
+};
+
+static WithoutQuantityExpected kEnglishNoQuantityShort[] = {
+ {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Mon."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tue."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wed."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thu."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Fri."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sat."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sun."},
+
+ {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Mon."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tue."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wed."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thu."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Fri."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sat."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sun."},
+
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Mon."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tue."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wed."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thu."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Fri."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sat."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sun."},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Mo"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tu"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "We"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Th"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Fr"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Sa"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Su"},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
+};
+
+static WithoutQuantityExpected kEnglishNoQuantityNarrow[] = {
+ {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next M"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tu"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next W"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Th"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next F"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sa"},
+ {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Su"},
+
+ {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last M"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tu"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last W"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Th"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last F"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sa"},
+ {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Su"},
+
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this M"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tu"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this W"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Th"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this F"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sa"},
+ {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Su"},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "M"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "T"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "W"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "T"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "F"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "S"},
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "S"},
+
+ {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
+};
+
static WithoutQuantityExpected kSpanishNoQuantity[] = {
{UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, "pasado ma\\u00F1ana"},
{UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, "antes de ayer"}
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
private:
void TestEnglish();
+ void TestEnglishCaps();
+ void TestEnglishShort();
+ void TestEnglishNarrow();
void TestSerbian();
+ void TestSerbianFallback();
void TestEnglishNoQuantity();
+ void TestEnglishNoQuantityCaps();
+ void TestEnglishNoQuantityShort();
+ void TestEnglishNoQuantityNarrow();
void TestSpanishNoQuantity();
void TestFormatWithQuantityIllegalArgument();
void TestFormatWithoutQuantityIllegalArgument();
void TestCustomNumberFormat();
+ void TestGetters();
void TestCombineDateAndTime();
+ void TestBadDisplayContext();
+ void RunTest(
+ const Locale& locale,
+ const WithQuantityExpected* expectedResults,
+ int32_t expectedResultLength);
void RunTest(
const Locale& locale,
+ UDateFormatStyle style,
const WithQuantityExpected* expectedResults,
int32_t expectedResultLength);
void RunTest(
const Locale& locale,
const WithoutQuantityExpected* expectedResults,
int32_t expectedResultLength);
+ void RunTest(
+ const Locale& locale,
+ UDateFormatStyle style,
+ const WithoutQuantityExpected* expectedResults,
+ int32_t expectedResultLength);
void RunTest(
const RelativeDateTimeFormatter& fmt,
const WithQuantityExpected* expectedResults,
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestEnglish);
+ TESTCASE_AUTO(TestEnglishCaps);
+ TESTCASE_AUTO(TestEnglishShort);
+ TESTCASE_AUTO(TestEnglishNarrow);
TESTCASE_AUTO(TestSerbian);
+ TESTCASE_AUTO(TestSerbianFallback);
TESTCASE_AUTO(TestEnglishNoQuantity);
+ TESTCASE_AUTO(TestEnglishNoQuantityCaps);
+ TESTCASE_AUTO(TestEnglishNoQuantityShort);
+ TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
TESTCASE_AUTO(TestSpanishNoQuantity);
TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
TESTCASE_AUTO(TestCustomNumberFormat);
+ TESTCASE_AUTO(TestGetters);
TESTCASE_AUTO(TestCombineDateAndTime);
+ TESTCASE_AUTO(TestBadDisplayContext);
TESTCASE_AUTO_END;
}
RunTest("en", kEnglish, LENGTHOF(kEnglish));
}
+void RelativeDateTimeFormatterTest::TestEnglishCaps() {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ "en",
+ NULL,
+ UDAT_FULL,
+ UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
+ status);
+ RelativeDateTimeFormatter fmt3(status);
+
+ // Test assignment and copy constructor with capitalization on.
+ RelativeDateTimeFormatter fmt2(fmt);
+ fmt3 = fmt2;
+ assertSuccess("", status);
+ RunTest(fmt3, kEnglishCaps, LENGTHOF(kEnglishCaps), "en caps");
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishShort() {
+ RunTest("en", UDAT_MEDIUM, kEnglishShort, LENGTHOF(kEnglishShort));
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNarrow() {
+ RunTest("en", UDAT_SHORT, kEnglishNarrow, LENGTHOF(kEnglishNarrow));
+}
+
void RelativeDateTimeFormatterTest::TestSerbian() {
RunTest("sr", kSerbian, LENGTHOF(kSerbian));
}
+void RelativeDateTimeFormatterTest::TestSerbianFallback() {
+ RunTest("sr", UDAT_SHORT, kSerbian, LENGTHOF(kSerbian));
+}
+
void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
RunTest("en", kEnglishNoQuantity, LENGTHOF(kEnglishNoQuantity));
}
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityCaps() {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ "en",
+ NULL,
+ UDAT_FULL,
+ UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
+ status);
+ assertSuccess("", status);
+ RunTest(
+ fmt,
+ kEnglishNoQuantityCaps,
+ LENGTHOF(kEnglishNoQuantityCaps),
+ "en caps no quantity");
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityShort() {
+ RunTest(
+ "en",
+ UDAT_MEDIUM,
+ kEnglishNoQuantityShort,
+ LENGTHOF(kEnglishNoQuantityShort));
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityNarrow() {
+ RunTest(
+ "en",
+ UDAT_SHORT,
+ kEnglishNoQuantityNarrow,
+ LENGTHOF(kEnglishNoQuantityNarrow));
+}
+
void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
RunTest("es", kSpanishNoQuantity, LENGTHOF(kSpanishNoQuantity));
}
}
+void RelativeDateTimeFormatterTest::TestGetters() {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ "en",
+ NULL,
+ UDAT_SHORT,
+ UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
+ status);
+ RelativeDateTimeFormatter fmt3(status);
+
+ // copy and assignment.
+ RelativeDateTimeFormatter fmt2(fmt);
+ fmt3 = fmt2;
+ assertEquals("style", UDAT_SHORT, fmt3.getFormatStyle());
+ assertEquals(
+ "context",
+ UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
+ fmt3.getCapitalizationContext());
+ assertSuccess("", status);
+}
+
void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
UErrorCode status = U_ZERO_ERROR;
RelativeDateTimeFormatter fmt("en", status);
}
}
+void RelativeDateTimeFormatterTest::TestBadDisplayContext() {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ "en", NULL, UDAT_FULL, UDISPCTX_STANDARD_NAMES, status);
+ if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+ errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
+ }
+}
+
+
void RelativeDateTimeFormatterTest::RunTest(
const Locale& locale,
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
- }
+ }
+ RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
+}
+
+void RelativeDateTimeFormatterTest::RunTest(
+ const Locale& locale,
+ UDateFormatStyle style,
+ const WithQuantityExpected* expectedResults,
+ int32_t expectedResultLength) {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
+ if (U_FAILURE(status)) {
+ dataerrln("Unable to create format object - %s", u_errorName(status));
+ return;
+ }
RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
}
RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
}
+void RelativeDateTimeFormatterTest::RunTest(
+ const Locale& locale,
+ UDateFormatStyle style,
+ const WithoutQuantityExpected* expectedResults,
+ int32_t expectedResultLength) {
+ UErrorCode status = U_ZERO_ERROR;
+ RelativeDateTimeFormatter fmt(
+ locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
+ if (U_FAILURE(status)) {
+ dataerrln("Unable to create format object - %s", u_errorName(status));
+ return;
+ }
+ RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
+}
+
void RelativeDateTimeFormatterTest::RunTest(
const RelativeDateTimeFormatter& fmt,
const WithQuantityExpected* expectedResults,