ICU-20661 Adding test that (U)Locale constructor accepts BCP47.
diff --git a/icu4c/source/test/intltest/loctest.cpp b/icu4c/source/test/intltest/loctest.cpp
index ee94656..79cb887 100644
--- a/icu4c/source/test/intltest/loctest.cpp
+++ b/icu4c/source/test/intltest/loctest.cpp
@@ -253,6 +253,7 @@
TESTCASE_AUTO(TestBug13277);
TESTCASE_AUTO(TestBug13554);
TESTCASE_AUTO(TestBug20410);
+ TESTCASE_AUTO(TestConstructorAcceptsBCP47);
TESTCASE_AUTO(TestForLanguageTag);
TESTCASE_AUTO(TestToLanguageTag);
TESTCASE_AUTO(TestMoveAssign);
@@ -3078,6 +3079,45 @@
assertEquals(locid4, expected4.getName(), result4.getName());
}
+void LocaleTest::TestConstructorAcceptsBCP47() {
+ IcuTestErrorCode status(*this, "TestConstructorAcceptsBCP47");
+
+ Locale loc1("ar-EG-u-nu-latn");
+ Locale loc2("ar-EG@numbers=latn");
+ Locale loc3("ar-EG");
+ std::string val;
+
+ // Check getKeywordValue "numbers"
+ val = loc1.getKeywordValue<std::string>("numbers", status);
+ assertEquals("BCP47 syntax has ICU keyword value", "latn", val.c_str());
+
+ val = loc2.getKeywordValue<std::string>("numbers", status);
+ assertEquals("ICU syntax has ICU keyword value", "latn", val.c_str());
+
+ val = loc3.getKeywordValue<std::string>("numbers", status);
+ assertEquals("Default, ICU keyword", "", val.c_str());
+
+ // Check getUnicodeKeywordValue "nu"
+ val = loc1.getUnicodeKeywordValue<std::string>("nu", status);
+ assertEquals("BCP47 syntax has short unicode keyword value", "latn", val.c_str());
+
+ val = loc2.getUnicodeKeywordValue<std::string>("nu", status);
+ assertEquals("ICU syntax has short unicode keyword value", "latn", val.c_str());
+
+ val = loc3.getUnicodeKeywordValue<std::string>("nu", status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR, "Default, short unicode keyword");
+
+ // Check getUnicodeKeywordValue "numbers"
+ val = loc1.getUnicodeKeywordValue<std::string>("numbers", status);
+ assertEquals("BCP47 syntax has long unicode keyword value", "latn", val.c_str());
+
+ val = loc2.getUnicodeKeywordValue<std::string>("numbers", status);
+ assertEquals("ICU syntax has long unicode keyword value", "latn", val.c_str());
+
+ val = loc3.getUnicodeKeywordValue<std::string>("numbers", status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR, "Default, long unicode keyword");
+}
+
void LocaleTest::TestForLanguageTag() {
IcuTestErrorCode status(*this, "TestForLanguageTag()");
diff --git a/icu4c/source/test/intltest/loctest.h b/icu4c/source/test/intltest/loctest.h
index 2771419..6b6b3a6 100644
--- a/icu4c/source/test/intltest/loctest.h
+++ b/icu4c/source/test/intltest/loctest.h
@@ -117,6 +117,7 @@
void TestBug13277();
void TestBug13554();
void TestBug20410();
+ void TestConstructorAcceptsBCP47();
void TestAddLikelySubtags();
void TestMinimizeSubtags();
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
index be4564a..e71a833 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/util/ULocaleTest.java
@@ -4139,6 +4139,26 @@
}
@Test
+ public void TestConstructorAcceptsBCP47() {
+ ULocale loc1 = new ULocale("ar-EG-u-nu-latn");
+ ULocale loc2 = new ULocale("ar-EG@numbers=latn");
+ ULocale loc3 = new ULocale("ar-EG");
+ String val;
+
+ // Check getKeywordValue "numbers"
+ val = loc1.getKeywordValue("numbers");
+ assertEquals("BCP47 syntax has ICU keyword value", "latn", val);
+
+ val = loc2.getKeywordValue("numbers");
+ assertEquals("ICU syntax has ICU keyword value", "latn", val);
+
+ val = loc3.getKeywordValue("numbers");
+ assertEquals("Default, ICU keyword", null, val);
+
+ // Note: ICU does not have getUnicodeKeywordValue()
+ }
+
+ @Test
public void TestForLanguageTag() {
final Integer NOERROR = Integer.valueOf(-1);