]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/locnmtst.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / intltest / locnmtst.cpp
index e367e6bb5d8b534583e9ff1988729f32267bc75b..5fe9b08f76f81dd1689c4c7620ac5455f8dd7edd 100644 (file)
    the macro is ugly but makes the tests pretty.
 */
 
-#define test_assert(test) \
-    { \
-        if(!(test)) \
-            errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
-        else \
-            logln("PASS: asserted " #test); \
-    }
+#define test_assert(test) UPRV_BLOCK_MACRO_BEGIN { \
+    if(!(test)) \
+        errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \
+    else \
+        logln("PASS: asserted " #test); \
+} UPRV_BLOCK_MACRO_END
 
 /*
  Usage:
    the macro is ugly but makes the tests pretty.
 */
 
-#define test_assert_print(test,print) \
-    { \
-        if(!(test)) \
-            errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
-        else \
-            logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
-    }
+#define test_assert_print(test,print) UPRV_BLOCK_MACRO_BEGIN { \
+    if(!(test)) \
+        errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \
+    else \
+        logln("PASS: asserted " #test "-> " + UnicodeString(print)); \
+} UPRV_BLOCK_MACRO_END
 
-#define test_assert_equal(target,value) \
-  { \
+#define test_assert_equal(target,value) UPRV_BLOCK_MACRO_BEGIN { \
     if (UnicodeString(target)!=(value)) { \
-      logln("unexpected value '" + (value) + "'"); \
-      dataerrln("FAIL: " #target " == " #value " was not true. In " __FILE__ " on line %d", __LINE__); \
+        logln("unexpected value '" + (value) + "'"); \
+        dataerrln("FAIL: " #target " == " #value " was not true. In " __FILE__ " on line %d", __LINE__); \
     } else { \
-      logln("PASS: asserted " #target " == " #value); \
+        logln("PASS: asserted " #target " == " #value); \
     } \
-  }
+} UPRV_BLOCK_MACRO_END
 
-#define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); }
+#define test_dumpLocale(l) UPRV_BLOCK_MACRO_BEGIN { \
+    logln(#l " = " + UnicodeString(l.getName(), "")); \
+} UPRV_BLOCK_MACRO_END
 
 LocaleDisplayNamesTest::LocaleDisplayNamesTest() {
 }
@@ -82,6 +81,7 @@ void LocaleDisplayNamesTest::runIndexedTest(int32_t index, UBool exec, const cha
         TESTCASE(11, TestPrivateUse);
         TESTCASE(12, TestUldnDisplayContext);
         TESTCASE(13, TestUldnWithGarbage);
+        TESTCASE(14, TestSubstituteHandling);
 #endif
         default:
             name = "";
@@ -422,4 +422,161 @@ void LocaleDisplayNamesTest::TestRootEtc() {
   delete ldn;
 }
 
+static const char unknown_region[] = "wx";
+static const char unknown_lang[] = "xy";
+static const char unknown_script[] = "wxyz";
+static const char unknown_variant[] = "abc";
+static const char unknown_key[] = "efg";
+static const char unknown_ca_value[] = "ijk";
+static const char known_lang_unknown_script[] = "en-wxyz";
+static const char unknown_lang_unknown_script[] = "xy-wxyz";
+static const char unknown_lang_known_script[] = "xy-Latn";
+static const char unknown_lang_unknown_region[] = "xy-wx";
+static const char known_lang_unknown_region[] = "en-wx";
+static const char unknown_lang_known_region[] = "xy-US";
+static const char unknown_lang_unknown_script_unknown_region[] = "xy-wxyz-wx";
+static const char known_lang_unknown_script_unknown_region[] = "en-wxyz-wx";
+static const char unknown_lang_known_script_unknown_region[] = "xy-Latn-wx";
+static const char unknown_lang_known_script_known_region[] = "xy-wxyz-US";
+static const char known_lang[] = "en";
+static const char known_lang_known_script[] = "en-Latn";
+static const char known_lang_known_region[] = "en-US";
+static const char known_lang_known_script_known_region[] = "en-Latn-US";
+
+void LocaleDisplayNamesTest::VerifySubstitute(LocaleDisplayNames* ldn) {
+  UnicodeString temp;
+  // Ensure the default is UDISPCTX_SUBSTITUTE
+  UDisplayContext context = ldn->getContext(UDISPCTX_TYPE_SUBSTITUTE_HANDLING);
+  test_assert(UDISPCTX_SUBSTITUTE == context);
+
+  ldn->regionDisplayName(unknown_region, temp);
+  test_assert_equal(unknown_region, temp);
+  ldn->languageDisplayName(unknown_lang, temp);
+  test_assert_equal(unknown_lang, temp);
+  ldn->scriptDisplayName(unknown_script, temp);
+  test_assert_equal(unknown_script, temp);
+  ldn->variantDisplayName(unknown_variant, temp);
+  test_assert_equal(unknown_variant, temp);
+  ldn->keyDisplayName(unknown_key, temp);
+  test_assert_equal(unknown_key, temp);
+  ldn->keyValueDisplayName("ca", unknown_ca_value, temp);
+  test_assert_equal(unknown_ca_value, temp);
+
+  ldn->localeDisplayName(unknown_lang, temp);
+  test_assert_equal(unknown_lang, temp);
+  ldn->localeDisplayName(known_lang_unknown_script, temp);
+  test_assert_equal("Englisch (Wxyz)", temp);
+  ldn->localeDisplayName(unknown_lang_unknown_script, temp);
+  test_assert_equal("xy (Wxyz)", temp);
+  ldn->localeDisplayName(unknown_lang_known_script, temp);
+  test_assert_equal("xy (Lateinisch)", temp);
+  ldn->localeDisplayName(unknown_lang_unknown_region, temp);
+  test_assert_equal("xy (WX)", temp);
+  ldn->localeDisplayName(known_lang_unknown_region, temp);
+  test_assert_equal("Englisch (WX)", temp);
+  ldn->localeDisplayName(unknown_lang_known_region, temp);
+  test_assert_equal("xy (USA)", temp);
+  ldn->localeDisplayName(unknown_lang_unknown_script_unknown_region, temp);
+  test_assert_equal("xy (Wxyz, WX)", temp);
+  ldn->localeDisplayName(known_lang_unknown_script_unknown_region, temp);
+  test_assert_equal("Englisch (Wxyz, WX)", temp);
+  ldn->localeDisplayName(unknown_lang_known_script_unknown_region, temp);
+  test_assert_equal("xy (Lateinisch, WX)", temp);
+  ldn->localeDisplayName(unknown_lang_known_script_known_region, temp);
+  test_assert_equal("xy (Wxyz, USA)", temp);
+
+  ldn->localeDisplayName(known_lang, temp);
+  test_assert_equal("Englisch", temp);
+  ldn->localeDisplayName(known_lang_known_script, temp);
+  test_assert_equal("Englisch (Lateinisch)", temp);
+  ldn->localeDisplayName(known_lang_known_region, temp);
+  test_assert_equal("Englisch (USA)", temp);
+  ldn->localeDisplayName(known_lang_known_script_known_region, temp);
+  test_assert_equal("Englisch (Lateinisch, USA)", temp);
+}
+
+void LocaleDisplayNamesTest::VerifyNoSubstitute(LocaleDisplayNames* ldn) {
+  UnicodeString temp("");
+  std::string utf8;
+  // Ensure the default is UDISPCTX_SUBSTITUTE
+  UDisplayContext context = ldn->getContext(UDISPCTX_TYPE_SUBSTITUTE_HANDLING);
+  test_assert(UDISPCTX_NO_SUBSTITUTE == context);
+
+  ldn->regionDisplayName(unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->languageDisplayName(unknown_lang, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->scriptDisplayName(unknown_script, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->variantDisplayName(unknown_variant, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->keyDisplayName(unknown_key, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->keyValueDisplayName("ca", unknown_ca_value, temp);
+  test_assert(TRUE == temp.isBogus());
+
+  ldn->localeDisplayName(unknown_lang, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(known_lang_unknown_script, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_unknown_script, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_known_script, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(known_lang_unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_known_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_unknown_script_unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(known_lang_unknown_script_unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_known_script_unknown_region, temp);
+  test_assert(TRUE == temp.isBogus());
+  ldn->localeDisplayName(unknown_lang_known_script_known_region, temp);
+  test_assert(TRUE == temp.isBogus());
+
+  ldn->localeDisplayName(known_lang, temp);
+  test_assert_equal("Englisch", temp);
+  ldn->localeDisplayName(known_lang_known_script, temp);
+  test_assert_equal("Englisch (Lateinisch)", temp);
+  ldn->localeDisplayName(known_lang_known_region, temp);
+  test_assert_equal("Englisch (USA)", temp);
+  ldn->localeDisplayName(known_lang_known_script_known_region, temp);
+  test_assert_equal("Englisch (Lateinisch, USA)", temp);
+}
+
+void LocaleDisplayNamesTest::TestSubstituteHandling() {
+  // With substitute as default
+  logln("Context: none\n");
+  std::unique_ptr<LocaleDisplayNames> ldn(LocaleDisplayNames::createInstance(Locale::getGermany()));
+  VerifySubstitute(ldn.get());
+
+  // With explicit set substitute, and standard names
+  logln("Context: UDISPCTX_SUBSTITUTE, UDISPCTX_STANDARD_NAMES\n");
+  UDisplayContext context_1[] = { UDISPCTX_SUBSTITUTE, UDISPCTX_STANDARD_NAMES };
+  ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_1, 2));
+  VerifySubstitute(ldn.get());
+
+  // With explicit set substitute and dialect names
+  logln("Context: UDISPCTX_SUBSTITUTE, UDISPCTX_DIALECT_NAMES\n");
+  UDisplayContext context_2[] = { UDISPCTX_SUBSTITUTE, UDISPCTX_DIALECT_NAMES };
+  ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_2, 2));
+  VerifySubstitute(ldn.get());
+
+  // With explicit set no_substitute, and standard names
+  logln("Context: UDISPCTX_NO_SUBSTITUTE, UDISPCTX_STANDARD_NAMES\n");
+  UDisplayContext context_3[] = { UDISPCTX_NO_SUBSTITUTE, UDISPCTX_STANDARD_NAMES };
+  ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_3, 2));
+  VerifyNoSubstitute(ldn.get());
+
+  // With explicit set no_substitute and dialect names
+  logln("Context: UDISPCTX_NO_SUBSTITUTE, UDISPCTX_DIALECT_NAMES\n");
+  UDisplayContext context_4[] = { UDISPCTX_NO_SUBSTITUTE, UDISPCTX_DIALECT_NAMES };
+  ldn.reset(LocaleDisplayNames::createInstance(Locale::getGermany(), context_4, 2));
+  VerifyNoSubstitute(ldn.get());
+}
+
 #endif   /*  UCONFIG_NO_FORMATTING */