mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-07 22:44:49 +00:00
ICU-12072 C, Updates per review comments
X-SVN-Rev: 38481
This commit is contained in:
parent
491b8eaf00
commit
eddf3c7f4c
2 changed files with 58 additions and 40 deletions
|
@ -905,7 +905,7 @@ UnicodeString& RelativeDateTimeFormatter::formatNumeric(
|
|||
case UDAT_REL_UNIT_MINUTE: relunit = UDAT_RELATIVE_MINUTES; break;
|
||||
case UDAT_REL_UNIT_SECOND: relunit = UDAT_RELATIVE_SECONDS; break;
|
||||
default: // a unit that the above method does not handle
|
||||
status = U_MISSING_RESOURCE_ERROR;
|
||||
status = U_UNSUPPORTED_ERROR;
|
||||
return appendTo;
|
||||
}
|
||||
UDateDirection direction = UDAT_DIRECTION_NEXT;
|
||||
|
@ -951,14 +951,18 @@ UnicodeString& RelativeDateTimeFormatter::format(
|
|||
// rewrite this to use it directly, and rewrite the old format method to call this
|
||||
// new one; that is covered by http://bugs.icu-project.org/trac/ticket/12171.
|
||||
UDateDirection direction = UDAT_DIRECTION_COUNT;
|
||||
int32_t intoffset = (offset < 0)? (int32_t)(offset-0.5) : (int32_t)(offset+0.5);
|
||||
switch (intoffset) {
|
||||
case -2: direction = UDAT_DIRECTION_LAST_2; break;
|
||||
case -1: direction = UDAT_DIRECTION_LAST; break;
|
||||
case 0: direction = UDAT_DIRECTION_THIS; break;
|
||||
case 1: direction = UDAT_DIRECTION_NEXT; break;
|
||||
case 2: direction = UDAT_DIRECTION_NEXT_2; break;
|
||||
default: break;
|
||||
if (offset > -2.1 && offset < 2.1) {
|
||||
// Allow a 1% epsilon, so offsets in -1.01..-0.99 map to LAST
|
||||
double offsetx100 = offset * 100.0;
|
||||
int32_t intoffset = (offsetx100 < 0)? (int32_t)(offsetx100-0.5) : (int32_t)(offsetx100+0.5);
|
||||
switch (intoffset) {
|
||||
case -200/*-2*/: direction = UDAT_DIRECTION_LAST_2; break;
|
||||
case -100/*-1*/: direction = UDAT_DIRECTION_LAST; break;
|
||||
case 0/* 0*/: direction = UDAT_DIRECTION_THIS; break;
|
||||
case 100/* 1*/: direction = UDAT_DIRECTION_NEXT; break;
|
||||
case 200/* 2*/: direction = UDAT_DIRECTION_NEXT_2; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
UDateAbsoluteUnit absunit = UDAT_ABSOLUTE_UNIT_COUNT;
|
||||
switch (unit) {
|
||||
|
@ -966,7 +970,6 @@ UnicodeString& RelativeDateTimeFormatter::format(
|
|||
case UDAT_REL_UNIT_MONTH: absunit = UDAT_ABSOLUTE_MONTH; break;
|
||||
case UDAT_REL_UNIT_WEEK: absunit = UDAT_ABSOLUTE_WEEK; break;
|
||||
case UDAT_REL_UNIT_DAY: absunit = UDAT_ABSOLUTE_DAY; break;
|
||||
case UDAT_REL_UNIT_MINUTE:
|
||||
case UDAT_REL_UNIT_SECOND:
|
||||
if (direction == UDAT_DIRECTION_THIS) {
|
||||
absunit = UDAT_ABSOLUTE_NOW;
|
||||
|
@ -1086,7 +1089,7 @@ ureldatefmt_open( const char* locale,
|
|||
}
|
||||
LocalPointer<RelativeDateTimeFormatter> formatter(new RelativeDateTimeFormatter(Locale(locale),
|
||||
(NumberFormat*)nfToAdopt, width,
|
||||
capitalizationContext, *status));
|
||||
capitalizationContext, *status), *status);
|
||||
if (U_FAILURE(*status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1169,19 +1172,14 @@ ureldatefmt_combineDateAndTime( const URelativeDateTimeFormatter* reldatefmt,
|
|||
return 0;
|
||||
}
|
||||
if (result == NULL ? resultCapacity != 0 : resultCapacity < 0 ||
|
||||
relativeDateString == NULL || relativeDateStringLen < 1 ||
|
||||
timeString == NULL || timeStringLen < -1) {
|
||||
(relativeDateString == NULL ? relativeDateStringLen != 0 : relativeDateStringLen < -1) ||
|
||||
(timeString == NULL ? timeStringLen != 0 : timeStringLen < -1)) {
|
||||
*status = U_ILLEGAL_ARGUMENT_ERROR;
|
||||
return 0;
|
||||
}
|
||||
UnicodeString relDateStr((UBool)(relativeDateStringLen == -1), relativeDateString, relativeDateStringLen);
|
||||
UnicodeString timeStr((UBool)(timeStringLen == -1), timeString, timeStringLen);
|
||||
UnicodeString res;
|
||||
if (result != NULL) {
|
||||
// NULL destination for pure preflighting: empty dummy string
|
||||
// otherwise, alias the destination buffer (copied from udat_format)
|
||||
res.setTo(result, 0, resultCapacity);
|
||||
}
|
||||
((RelativeDateTimeFormatter*)reldatefmt)->combineDateAndTime(relDateStr, timeStr, res, *status);
|
||||
if (U_FAILURE(*status)) {
|
||||
return 0;
|
||||
|
|
|
@ -28,19 +28,20 @@ void addRelativeDateFormatTest(TestNode** root)
|
|||
TESTCASE(TestCombineDateTime);
|
||||
}
|
||||
|
||||
static const double offsets[] = { -5.0, -2.2, -1.0, -0.7, 0.0, 0.7, 1.0, 2.2, 5.0 };
|
||||
static const double offsets[] = { -5.0, -2.2, -2.0, -1.0, -0.7, 0.0, 0.7, 1.0, 2.0, 5.0 };
|
||||
enum { kNumOffsets = UPRV_LENGTHOF(offsets) };
|
||||
|
||||
static const char* en_decDef_long_midSent_week[kNumOffsets*2] = {
|
||||
/* text numeric */
|
||||
"5 weeks ago", "5 weeks ago", /* -5 */
|
||||
"2.2 weeks ago", "2.2 weeks ago", /* -2.2 */
|
||||
"2 weeks ago", "2 weeks ago", /* -2 */
|
||||
"last week", "1 week ago", /* -1 */
|
||||
"last week", "0.7 weeks ago", /* -0.7 */
|
||||
"0.7 weeks ago", "0.7 weeks ago", /* -0.7 */
|
||||
"this week", "in 0 weeks", /* 0 */
|
||||
"next week", "in 0.7 weeks", /* 0.7 */
|
||||
"in 0.7 weeks", "in 0.7 weeks", /* 0.7 */
|
||||
"next week", "in 1 week", /* 1 */
|
||||
"in 2.2 weeks", "in 2.2 weeks", /* 2.2 */
|
||||
"in 2 weeks", "in 2 weeks", /* 2 */
|
||||
"in 5 weeks", "in 5 weeks" /* 5 */
|
||||
};
|
||||
|
||||
|
@ -48,12 +49,13 @@ static const char* en_dec0_long_midSent_week[kNumOffsets*2] = {
|
|||
/* text numeric */
|
||||
"5 weeks ago", "5 weeks ago", /* -5 */
|
||||
"2 weeks ago", "2 weeks ago", /* -2.2 */
|
||||
"2 weeks ago", "2 weeks ago", /* -2 */
|
||||
"last week", "1 week ago", /* -1 */
|
||||
"last week", "0 weeks ago", /* -0.7 */
|
||||
"0 weeks ago", "0 weeks ago", /* -0.7 */
|
||||
"this week", "in 0 weeks", /* 0 */
|
||||
"next week", "in 0 weeks", /* 0.7 */
|
||||
"in 0 weeks", "in 0 weeks", /* 0.7 */
|
||||
"next week", "in 1 week", /* 1 */
|
||||
"in 2 weeks", "in 2 weeks", /* 2.2 */
|
||||
"in 2 weeks", "in 2 weeks", /* 2 */
|
||||
"in 5 weeks", "in 5 weeks" /* 5 */
|
||||
};
|
||||
|
||||
|
@ -61,12 +63,13 @@ static const char* en_decDef_short_midSent_week[kNumOffsets*2] = {
|
|||
/* text numeric */
|
||||
"5 wk. ago", "5 wk. ago", /* -5 */
|
||||
"2.2 wk. ago", "2.2 wk. ago", /* -2.2 */
|
||||
"2 wk. ago", "2 wk. ago", /* -2 */
|
||||
"last wk.", "1 wk. ago", /* -1 */
|
||||
"last wk.", "0.7 wk. ago", /* -0.7 */
|
||||
"0.7 wk. ago", "0.7 wk. ago", /* -0.7 */
|
||||
"this wk.", "in 0 wk.", /* 0 */
|
||||
"next wk.", "in 0.7 wk.", /* 0.7 */
|
||||
"in 0.7 wk.", "in 0.7 wk.", /* 0.7 */
|
||||
"next wk.", "in 1 wk.", /* 1 */
|
||||
"in 2.2 wk.", "in 2.2 wk.", /* 2.2 */
|
||||
"in 2 wk.", "in 2 wk.", /* 2 */
|
||||
"in 5 wk.", "in 5 wk." /* 5 */
|
||||
};
|
||||
|
||||
|
@ -74,12 +77,13 @@ static const char* en_decDef_long_midSent_min[kNumOffsets*2] = {
|
|||
/* text numeric */
|
||||
"5 minutes ago", "5 minutes ago", /* -5 */
|
||||
"2.2 minutes ago", "2.2 minutes ago", /* -2.2 */
|
||||
"2 minutes ago", "2 minutes ago", /* -2 */
|
||||
"1 minute ago", "1 minute ago", /* -1 */
|
||||
"0.7 minutes ago", "0.7 minutes ago", /* -0.7 */
|
||||
"now", "in 0 minutes", /* 0 */
|
||||
"in 0 minutes", "in 0 minutes", /* 0 */
|
||||
"in 0.7 minutes", "in 0.7 minutes", /* 0.7 */
|
||||
"in 1 minute", "in 1 minute", /* 1 */
|
||||
"in 2.2 minutes", "in 2.2 minutes", /* 2.2 */
|
||||
"in 2 minutes", "in 2 minutes", /* 2 */
|
||||
"in 5 minutes", "in 5 minutes" /* 5 */
|
||||
};
|
||||
|
||||
|
@ -87,25 +91,27 @@ static const char* en_dec0_long_midSent_tues[kNumOffsets*2] = {
|
|||
/* text numeric */
|
||||
""/*no data */, ""/*no data */, /* -5 */
|
||||
""/*no data */, ""/*no data */, /* -2.2 */
|
||||
""/*no data */, ""/*no data */, /* -2 */
|
||||
"last Tuesday", ""/*no data */, /* -1 */
|
||||
"last Tuesday", ""/*no data */, /* -0.7 */
|
||||
""/*no data */, ""/*no data */, /* -0.7 */
|
||||
"this Tuesday", ""/*no data */, /* 0 */
|
||||
"next Tuesday", ""/*no data */, /* 0.7 */
|
||||
""/*no data */, ""/*no data */, /* 0.7 */
|
||||
"next Tuesday", ""/*no data */, /* 1 */
|
||||
""/*no data */, ""/*no data */, /* 2.2 */
|
||||
""/*no data */, ""/*no data */, /* 2 */
|
||||
""/*no data */, ""/*no data */, /* 5 */
|
||||
};
|
||||
|
||||
static const char* fr_decDef_long_midSent_day[kNumOffsets*2] = {
|
||||
/* text numeric */
|
||||
"il y a 5 jours", "il y a 5 jours", /* -5 */
|
||||
"avant-hier", "il y a 2,2 jours", /* -2.2 */
|
||||
"il y a 2,2 jours", "il y a 2,2 jours", /* -2.2 */
|
||||
"avant-hier", "il y a 2 jours", /* -2 */
|
||||
"hier", "il y a 1 jour", /* -1 */
|
||||
"hier", "il y a 0,7 jour", /* -0.7 */
|
||||
"il y a 0,7 jour", "il y a 0,7 jour", /* -0.7 */
|
||||
"aujourd\\u2019hui", "dans 0 jour", /* 0 */
|
||||
"demain", "dans 0,7 jour", /* 0.7 */
|
||||
"dans 0,7 jour", "dans 0,7 jour", /* 0.7 */
|
||||
"demain", "dans 1 jour", /* 1 */
|
||||
"apr\\u00E8s-demain", "dans 2,2 jours", /* 2.2 */
|
||||
"apr\\u00E8s-demain", "dans 2 jours", /* 2 */
|
||||
"dans 5 jours", "dans 5 jours" /* 5 */
|
||||
};
|
||||
|
||||
|
@ -162,8 +168,8 @@ static void TestRelDateFmt()
|
|||
for (iOffset = 0; iOffset < kNumOffsets; iOffset++) {
|
||||
UChar ubufget[kUBufMax];
|
||||
int32_t ulenget;
|
||||
|
||||
if (itemPtr->unit >= UDAT_REL_UNIT_SUNDAY && (offsets[iOffset] < -1.0 || offsets[iOffset] > 1.0)) {
|
||||
|
||||
if (itemPtr->unit >= UDAT_REL_UNIT_SUNDAY && (offsets[iOffset] != -1.0 || offsets[iOffset] != 0.0 || offsets[iOffset] != 1.0)) {
|
||||
continue; /* we do not currently have data for this */
|
||||
}
|
||||
|
||||
|
@ -207,7 +213,7 @@ static void TestRelDateFmt()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ureldatefmt_close(reldatefmt);
|
||||
}
|
||||
}
|
||||
|
@ -261,6 +267,20 @@ static void TestCombineDateTime()
|
|||
itemPtr->locale, (int)itemPtr->width, (int)itemPtr->capContext, itemPtr->expectedResult, bbufget );
|
||||
}
|
||||
}
|
||||
// preflight test
|
||||
status = U_ZERO_ERROR;
|
||||
ulenget = ureldatefmt_combineDateAndTime(reldatefmt, ubufreldate, ulenreldate, ubuftime, ulentime, NULL, 0, &status);
|
||||
if ( status != U_BUFFER_OVERFLOW_ERROR) {
|
||||
log_err("FAIL: ureldatefmt_combineDateAndTime() preflight for locale %s, width %d, capContext %d: expected U_BUFFER_OVERFLOW_ERROR, got %s\n",
|
||||
itemPtr->locale, (int)itemPtr->width, (int)itemPtr->capContext, myErrorName(status) );
|
||||
} else {
|
||||
UChar ubufexp[kUBufMax];
|
||||
int32_t ulenexp = u_unescape(itemPtr->expectedResult, ubufexp, kUBufMax);
|
||||
if (ulenget != ulenexp) {
|
||||
log_err("ERROR: ureldatefmt_combineDateAndTime() preflight for locale %s, width %d, capContext %d;\n expected len %d, get len %d\n",
|
||||
itemPtr->locale, (int)itemPtr->width, (int)itemPtr->capContext, ulenexp, ulenget );
|
||||
}
|
||||
}
|
||||
|
||||
ureldatefmt_close(reldatefmt);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue