ICU-20205 RelativeDateTimeFormatter pt data fix, improved error handling and test. (#210)

* ICU-20205 Add locale test for RelativeDateTimeFormatter.

* ICU-20205 Fix error in pt relative date data. Improve error handling in code.

* ICU-20205 Add instantiation test & regen data from ICU4C

* ICU-20205 Added DateFormatSymbols error check per jefgen's comments.
This commit is contained in:
Andy Heninger 2018-10-12 16:19:14 -07:00 committed by GitHub
parent 35e3ba8530
commit e509105c9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 11 deletions

View file

@ -2000,7 +2000,7 @@ pt{
}
past{
one{"há {0} segunda-feira"}
other{"{{0} segundas-feiras atrás"}
other{"{0} segundas-feiras atrás"}
}
}
}

View file

@ -605,8 +605,14 @@ static void loadWeekdayNames(UnicodeString absoluteUnits[UDAT_STYLE_COUNT]
[UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT],
const char* localeId,
UErrorCode& status) {
if (U_FAILURE(status)) {
return;
}
Locale locale(localeId);
DateFormatSymbols dfSym(locale, status);
if (U_FAILURE(status)) {
return;
}
for (int32_t style = 0; style < UDAT_STYLE_COUNT; ++style) {
DateFormatSymbols::DtWidthType dtfmtWidth = styleToDateFormatSymbolWidth[style];
int32_t count;
@ -630,6 +636,9 @@ static UBool loadUnitData(
RelDateTimeFmtDataSink sink(cacheData);
ures_getAllItemsWithFallback(resource, "fields", sink, status);
if (U_FAILURE(status)) {
return false;
}
// Get the weekday names from DateFormatSymbols.
loadWeekdayNames(cacheData.absoluteUnits, localeId, status);

View file

@ -10,8 +10,10 @@
*
*******************************************************************************
*/
#include <memory>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include "intltest.h"
@ -765,6 +767,7 @@ private:
void TestBadDisplayContext();
void TestFormat();
void TestFormatNumeric();
void TestLocales();
void RunTest(
const Locale& locale,
const WithQuantityExpected* expectedResults,
@ -854,6 +857,7 @@ void RelativeDateTimeFormatterTest::runIndexedTest(
TESTCASE_AUTO(TestSidewaysDataLoading);
TESTCASE_AUTO(TestFormat);
TESTCASE_AUTO(TestFormatNumeric);
TESTCASE_AUTO(TestLocales);
TESTCASE_AUTO_END;
}
@ -1296,6 +1300,19 @@ void RelativeDateTimeFormatterTest::TestFormat() {
RunTest("en", kEnglishFormat, UPRV_LENGTHOF(kEnglishFormat), false);
}
void RelativeDateTimeFormatterTest::TestLocales() {
int32_t numLocales = 0;
const Locale *availableLocales = Locale::getAvailableLocales(numLocales);
std::vector<std::unique_ptr<RelativeDateTimeFormatter>> allFormatters;
for (int localeIdx=0; localeIdx<numLocales; localeIdx++) {
const Locale &loc = availableLocales[localeIdx];
UErrorCode status = U_ZERO_ERROR;
std::unique_ptr<RelativeDateTimeFormatter> rdtf(new RelativeDateTimeFormatter(loc, status));
allFormatters.push_back(std::move(rdtf));
assertSuccess(loc.getName(), status);
}
}
static const char *kLast2 = "Last_2";
static const char *kLast = "Last";
static const char *kThis = "This";

View file

@ -970,9 +970,9 @@ public final class RelativeDateTimeFormatter {
}
EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>> qualitativeUnitMap =
new EnumMap<Style, EnumMap<AbsoluteUnit, EnumMap<Direction, String>>>(Style.class);
new EnumMap<>(Style.class);
EnumMap<Style, EnumMap<RelativeUnit, String[][]>> styleRelUnitPatterns =
new EnumMap<Style, EnumMap<RelativeUnit, String[][]>>(Style.class);
new EnumMap<>(Style.class);
StringBuilder sb = new StringBuilder();
@ -1023,7 +1023,7 @@ public final class RelativeDateTimeFormatter {
// Handle Zero seconds for "now".
EnumMap<Direction, String> unitStrings = absMap.get(AbsoluteUnit.NOW);
if (unitStrings == null) {
unitStrings = new EnumMap<Direction, String>(Direction.class);
unitStrings = new EnumMap<>(Direction.class);
absMap.put(AbsoluteUnit.NOW, unitStrings);
}
if (unitStrings.get(Direction.PLAIN) == null) {
@ -1042,12 +1042,12 @@ public final class RelativeDateTimeFormatter {
}
if (absMap == null) {
absMap = new EnumMap<AbsoluteUnit, EnumMap<Direction, String>>(AbsoluteUnit.class);
absMap = new EnumMap<>(AbsoluteUnit.class);
qualitativeUnitMap.put(style, absMap);
}
EnumMap<Direction, String> dirMap = absMap.get(absUnit);
if (dirMap == null) {
dirMap = new EnumMap<Direction, String>(Direction.class);
dirMap = new EnumMap<>(Direction.class);
absMap.put(absUnit, dirMap);
}
if (dirMap.get(keyDirection) == null) {
@ -1082,7 +1082,7 @@ public final class RelativeDateTimeFormatter {
EnumMap<RelativeUnit, String[][]> unitPatterns = styleRelUnitPatterns.get(style);
if (unitPatterns == null) {
unitPatterns = new EnumMap<RelativeUnit, String[][]>(RelativeUnit.class);
unitPatterns = new EnumMap<>(RelativeUnit.class);
styleRelUnitPatterns.put(style, unitPatterns);
}
String[][] patterns = unitPatterns.get(unit.relUnit);
@ -1112,12 +1112,12 @@ public final class RelativeDateTimeFormatter {
EnumMap<AbsoluteUnit, EnumMap<Direction, String>> unitMap =
qualitativeUnitMap.get(style);
if (unitMap == null) {
unitMap = new EnumMap<AbsoluteUnit, EnumMap<Direction, String>>(AbsoluteUnit.class);
unitMap = new EnumMap<>(AbsoluteUnit.class);
qualitativeUnitMap.put(style, unitMap);
}
EnumMap<Direction,String> dirMap = unitMap.get(absUnit);
if (dirMap == null) {
dirMap = new EnumMap<Direction,String>(Direction.class);
dirMap = new EnumMap<>(Direction.class);
unitMap.put(absUnit, dirMap);
}
if (dirMap.get(Direction.PLAIN) == null) {

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:605d9be70f081c26ec0c632d4a73a121a2c80f8b5cc1d8da265458264c5474e1
size 12683589
oid sha256:7000d5c698e9d3ec24a866694d719a51cbfe4929220c1c3043f4405eeb33f288
size 12683583

View file

@ -973,4 +973,13 @@ public class RelativeDateTimeFormatterTest extends TestFmwk {
String w = fmt.format(6.0, Direction.NEXT, RelativeUnit.QUARTERS);
assertEquals("narrow: in 6 qtr", "in 6 qtr", w);
}
@Test
public void TestLocales() {
ULocale[] availableLocales = ULocale.getAvailableLocales();
for (ULocale loc: availableLocales) {
RelativeDateTimeFormatter.getInstance(loc);
}
}
}