]> granicus.if.org Git - icu/commitdiff
ICU-21707 Fix LocaleBuilder assumption that the default locale doesn't have any BCP47...
authorJeff Genovy <29107334+jefgen@users.noreply.github.com>
Wed, 11 Aug 2021 00:35:34 +0000 (17:35 -0700)
committerJeff Genovy <29107334+jefgen@users.noreply.github.com>
Thu, 12 Aug 2021 23:58:12 +0000 (16:58 -0700)
Add test case for LocaleBuilder with default locale with extensions.

Use Locale::getRoot().clone() instead of new Locale();

Add CI build bot with LANG that has extension tags

.ci-builds/.azure-pipelines.yml
icu4c/source/common/localebuilder.cpp
icu4c/source/test/intltest/localebuildertest.cpp
icu4c/source/test/intltest/localebuildertest.h

index 872a052364a0c1b9b97f027592d2f307a32dda4b..c6f011495c2baa11e251f2cd48a2a0aaced7a17f 100644 (file)
@@ -118,6 +118,24 @@ jobs:
         CC: gcc
         CXX: g++
 #-------------------------------------------------------------------------
+- job: ICU4C_Clang_Ubuntu_2004_LANG
+  displayName: 'C: Linux Clang (Ubuntu 20.04) - LANG has extension tags'
+  timeoutInMinutes: 30
+  pool:
+    vmImage: 'ubuntu-20.04'
+  steps:
+    - checkout: self
+      lfs: true
+      fetchDepth: 10
+    - script: |
+        cd icu4c/source && ./runConfigureICU Linux && make -j2 check
+      displayName: 'Build and Test'
+      env:
+        CC: clang
+        CXX: clang++
+        LANG: "en_US@calendar=gregorian;hours=h12"
+
+#-------------------------------------------------------------------------
 # VS 2019 Builds
 #-------------------------------------------------------------------------
 - job: ICU4C_MSVC_x64_Release_Distrelease
index 1dd8131e5895a5800d5c4039493b25a5a07a0eb3..a5f201e8475b5ce5f7f98bc8a63f1f8faf776007 100644 (file)
@@ -228,7 +228,7 @@ LocaleBuilder& LocaleBuilder::setExtension(char key, StringPiece value)
         return *this;
     }
     if (extensions_ == nullptr) {
-        extensions_ = new Locale();
+        extensions_ = Locale::getRoot().clone();
         if (extensions_ == nullptr) {
             status_ = U_MEMORY_ALLOCATION_ERROR;
             return *this;
@@ -259,11 +259,11 @@ LocaleBuilder& LocaleBuilder::setUnicodeLocaleKeyword(
       return *this;
     }
     if (extensions_ == nullptr) {
-        extensions_ = new Locale();
-    }
-    if (extensions_ == nullptr) {
-        status_ = U_MEMORY_ALLOCATION_ERROR;
-        return *this;
+        extensions_ = Locale::getRoot().clone();
+        if (extensions_ == nullptr) {
+            status_ = U_MEMORY_ALLOCATION_ERROR;
+            return *this;
+        }
     }
     extensions_->setUnicodeKeywordValue(key, type, status_);
     return *this;
@@ -280,7 +280,7 @@ LocaleBuilder& LocaleBuilder::addUnicodeLocaleAttribute(
         return *this;
     }
     if (extensions_ == nullptr) {
-        extensions_ = new Locale();
+        extensions_ = Locale::getRoot().clone();
         if (extensions_ == nullptr) {
             status_ = U_MEMORY_ALLOCATION_ERROR;
             return *this;
@@ -415,7 +415,7 @@ void LocaleBuilder::copyExtensionsFrom(const Locale& src, UErrorCode& errorCode)
         return;
     }
     if (extensions_ == nullptr) {
-        extensions_ = new Locale();
+        extensions_ = Locale::getRoot().clone();
         if (extensions_ == nullptr) {
             status_ = U_MEMORY_ALLOCATION_ERROR;
             return;
index 70271211ab076a1bf91d9e75fd5742110ff15907..7cade3650c1481b13450d2450bcb0fc71316a178 100644 (file)
@@ -25,6 +25,7 @@ void LocaleBuilderTest::runIndexedTest( int32_t index, UBool exec, const char* &
     TESTCASE_AUTO(TestAddUnicodeLocaleAttributeIllFormed);
     TESTCASE_AUTO(TestLocaleBuilder);
     TESTCASE_AUTO(TestLocaleBuilderBasic);
+    TESTCASE_AUTO(TestLocaleBuilderBasicWithExtensionsOnDefaultLocale);
     TESTCASE_AUTO(TestPosixCases);
     TESTCASE_AUTO(TestSetExtensionOthers);
     TESTCASE_AUTO(TestSetExtensionPU);
@@ -363,6 +364,25 @@ void LocaleBuilderTest::TestLocaleBuilderBasic() {
            "setRegion('') got Error: %s\n");
 }
 
+void LocaleBuilderTest::TestLocaleBuilderBasicWithExtensionsOnDefaultLocale() {
+    // Change the default locale to one with extension tags.
+    UErrorCode status = U_ZERO_ERROR;
+    Locale originalDefault;
+    Locale::setDefault(Locale::createFromName("en-US-u-hc-h12"), status);
+    if (U_FAILURE(status)) {
+        errln("ERROR: Could not change the default locale");
+        return;
+    }
+
+    // Invoke the basic test now that the default locale has been changed.
+    TestLocaleBuilderBasic();
+
+    Locale::setDefault(originalDefault, status);
+    if (U_FAILURE(status)) {
+        errln("ERROR: Could not restore the default locale");
+    }
+}
+
 void LocaleBuilderTest::TestSetLanguageWellFormed() {
     // http://www.unicode.org/reports/tr35/tr35.html#unicode_language_subtag
     // unicode_language_subtag = alpha{2,3} | alpha{5,8};
index 41f3730ff240f019effef01fd7f533ca2c28cb49..f2c9658044a0244e57595a3db63171d711c1626b 100644 (file)
@@ -20,6 +20,7 @@ class LocaleBuilderTest: public IntlTest {
     void TestAddUnicodeLocaleAttributeIllFormed(void);
     void TestLocaleBuilder(void);
     void TestLocaleBuilderBasic(void);
+    void TestLocaleBuilderBasicWithExtensionsOnDefaultLocale(void);
     void TestPosixCases(void);
     void TestSetExtensionOthers(void);
     void TestSetExtensionPU(void);