const char *language = locale.getLanguage();
const char *country = locale.getCountry();
+
+ char regionOverride[8];
+ int32_t regionOverrideLength = locale.getKeywordValue("rg", regionOverride, sizeof(regionOverride), status);
+ if (U_SUCCESS(status) && regionOverrideLength > 0) {
+ country = regionOverride;
+ if (regionOverrideLength > 2) {
+ // chop off any subdivision codes that may have been included
+ regionOverride[2] = '\0';
+ }
+ }
+
Locale maxLocale; // must be here for correct lifetime
if (*language == '\0' || *country == '\0') {
maxLocale = locale;
static void TestGetDefaultHourCycleOnEmptyInstance(void);
static void TestEras(void);
static void TestDateTimePatterns(void);
+static void TestRegionOverride(void);
void addDateTimePatternGeneratorTest(TestNode** root) {
TESTCASE(TestOpenClose);
TESTCASE(TestGetDefaultHourCycleOnEmptyInstance);
TESTCASE(TestEras);
TESTCASE(TestDateTimePatterns);
+ TESTCASE(TestRegionOverride);
}
/*
}
}
+static void TestRegionOverride(void) {
+ typedef struct RegionOverrideTest {
+ const char* locale;
+ const UChar* expectedPattern;
+ UDateFormatHourCycle expectedHourCycle;
+ } RegionOverrideTest;
+
+ const RegionOverrideTest testCases[] = {
+ { "en_US", u"h:mm\u202fa", UDAT_HOUR_CYCLE_12 },
+ { "en_GB", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ { "en_US@rg=GBZZZZ", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ { "en_US@hours=h23", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ };
+
+ for (int32_t i = 0; i < UPRV_LENGTHOF(testCases); i++) {
+ UErrorCode err = U_ZERO_ERROR;
+ UChar actualPattern[200];
+ UDateTimePatternGenerator* dtpg = udatpg_open(testCases[i].locale, &err);
+
+ if (assertSuccess("Error creating dtpg", &err)) {
+ UDateFormatHourCycle actualHourCycle = udatpg_getDefaultHourCycle(dtpg, &err);
+ udatpg_getBestPattern(dtpg, u"jmm", -1, actualPattern, 200, &err);
+
+ if (assertSuccess("Error using dtpg", &err)) {
+ assertIntEquals("Wrong hour cycle", testCases[i].expectedHourCycle, actualHourCycle);
+ assertUEquals("Wrong pattern", testCases[i].expectedPattern, actualPattern);
+ }
+ }
+ udatpg_close(dtpg);
+ }
+}
#endif
TESTCASE(11, test_jConsistencyOddLocales);
TESTCASE(12, testBestPattern);
TESTCASE(13, testDateTimePatterns);
+ TESTCASE(14, testRegionOverride);
default: name = ""; break;
}
}
}
}
+void IntlTestDateTimePatternGeneratorAPI::testRegionOverride() {
+ const struct TestCase {
+ const char* locale;
+ const UChar* expectedPattern;
+ UDateFormatHourCycle expectedHourCycle;
+ } testCases[] = {
+ { "en_US", u"h:mm\u202fa", UDAT_HOUR_CYCLE_12 },
+ { "en_GB", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ { "en_US@rg=GBZZZZ", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ { "en_US@hours=h23", u"HH:mm", UDAT_HOUR_CYCLE_23 },
+ };
+
+ for (int32_t i = 0; i < UPRV_LENGTHOF(testCases); i++) {
+ UErrorCode err = U_ZERO_ERROR;
+ LocalPointer<DateTimePatternGenerator> dtpg(DateTimePatternGenerator::createInstance(testCases[i].locale, err));
+
+ if (assertSuccess("Error creating dtpg", err)) {
+ UDateFormatHourCycle actualHourCycle = dtpg->getDefaultHourCycle(err);
+ UnicodeString actualPattern = dtpg->getBestPattern(u"jmm", err);
+
+ if (assertSuccess("Error using dtpg", err)) {
+ assertEquals("Wrong hour cycle", testCases[i].expectedHourCycle, actualHourCycle);
+ assertEquals("Wrong pattern", testCases[i].expectedPattern, actualPattern);
+ }
+ }
+ }
+}
+
void IntlTestDateTimePatternGeneratorAPI::doDTPatternTest(DateTimePatternGenerator* dtpg, UnicodeString* skeletons, DTPLocaleAndResults* localeAndResultsPtr) {
for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
UErrorCode status = U_ZERO_ERROR;
void test_jConsistencyOddLocales();
void testBestPattern();
void testDateTimePatterns();
+ void testRegionOverride();
enum { kNumDateTimePatterns = 4 };
typedef struct {
String language = uLocale.getLanguage();
String country = uLocale.getCountry();
+
if (language.isEmpty() || country.isEmpty()) {
// Note: addLikelySubtags is documented not to throw in Java,
// unlike in C++.
country = max.getCountry();
}
+ String regionOverride = uLocale.getKeywordValue("rg");
+ if (regionOverride != null && !regionOverride.isEmpty()) {
+ // chop off any subdivision codes that may have been included
+ if (regionOverride.length() > 2) {
+ regionOverride = regionOverride.substring(0, 2);
+ }
+ country = regionOverride;
+ }
+
if (language.isEmpty()) {
// Unexpected, but fail gracefully
language = "und";
}
}
}
+
+ @Test
+ public void testRegionOverride() {
+ String[][] testCases = {
+ { "en_US", "h:mm\u202fa", "HOUR_CYCLE_12" },
+ { "en_GB", "HH:mm", "HOUR_CYCLE_23" },
+ { "en_US@rg=GBZZZZ", "HH:mm", "HOUR_CYCLE_23" },
+ { "en_US@hours=h23", "HH:mm", "HOUR_CYCLE_23" },
+ };
+
+ for (String[] testCase : testCases) {
+ String localeID = testCase[0];
+ String expectedPattern = testCase[1];
+ String expectedHourCycle = testCase[2];
+
+ DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance(new ULocale(localeID));
+ String actualHourCycle = dtpg.getDefaultHourCycle().toString();
+ String actualPattern = dtpg.getBestPattern("jmm");
+
+ assertEquals("Wrong hour cycle", expectedHourCycle, actualHourCycle);
+ assertEquals("Wrong pattern", expectedPattern, actualPattern);
+ }
+ }
}