1 /********************************************************************* 2 * COPYRIGHT: 3 * Copyright (c) 2010-2014, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 *********************************************************************/ 6 7 #include "locnmtst.h" 8 #include "cstring.h" 9 10 /* 11 Usage: 12 test_assert( Test (should be TRUE) ) 13 14 Example: 15 test_assert(i==3); 16 17 the macro is ugly but makes the tests pretty. 18 */ 19 20 #define test_assert(test) \ 21 { \ 22 if(!(test)) \ 23 errln("FAIL: " #test " was not true. In " __FILE__ " on line %d", __LINE__ ); \ 24 else \ 25 logln("PASS: asserted " #test); \ 26 } 27 28 /* 29 Usage: 30 test_assert_print( Test (should be TRUE), printable ) 31 32 Example: 33 test_assert(i==3, toString(i)); 34 35 the macro is ugly but makes the tests pretty. 36 */ 37 38 #define test_assert_print(test,print) \ 39 { \ 40 if(!(test)) \ 41 errln("FAIL: " #test " was not true. " + UnicodeString(print) ); \ 42 else \ 43 logln("PASS: asserted " #test "-> " + UnicodeString(print)); \ 44 } 45 46 #define test_assert_equal(target,value) \ 47 { \ 48 if (UnicodeString(target)!=(value)) { \ 49 logln("unexpected value '" + (value) + "'"); \ 50 dataerrln("FAIL: " #target " == " #value " was not true. In " __FILE__ " on line %d", __LINE__); \ 51 } else { \ 52 logln("PASS: asserted " #target " == " #value); \ 53 } \ 54 } 55 56 #define test_dumpLocale(l) { logln(#l " = " + UnicodeString(l.getName(), "")); } 57 58 LocaleDisplayNamesTest::LocaleDisplayNamesTest() { 59 } 60 61 LocaleDisplayNamesTest::~LocaleDisplayNamesTest() { 62 } 63 64 void LocaleDisplayNamesTest::runIndexedTest(int32_t index, UBool exec, const char* &name, 65 char* /*par*/) { 66 switch (index) { 67 #if !UCONFIG_NO_FORMATTING 68 TESTCASE(0, TestCreate); 69 TESTCASE(1, TestCreateDialect); 70 TESTCASE(2, TestWithKeywordsAndEverything); 71 TESTCASE(3, TestUldnOpen); 72 TESTCASE(4, TestUldnOpenDialect); 73 TESTCASE(5, TestUldnWithKeywordsAndEverything); 74 TESTCASE(6, TestUldnComponents); 75 TESTCASE(7, TestRootEtc); 76 TESTCASE(8, TestKeywords); 77 TESTCASE(9, TestUntranslatedKeywords); 78 TESTCASE(10, TestPrivateUse); 79 TESTCASE(11, TestUldnDisplayContext); 80 #endif 81 default: 82 name = ""; 83 break; 84 } 85 } 86 87 #if !UCONFIG_NO_FORMATTING 88 void LocaleDisplayNamesTest::TestCreate() { 89 UnicodeString temp; 90 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getGermany()); 91 ldn->localeDisplayName("de_DE", temp); 92 delete ldn; 93 test_assert_equal("Deutsch (Deutschland)", temp); 94 } 95 96 void LocaleDisplayNamesTest::TestCreateDialect() { 97 UnicodeString temp; 98 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS(), ULDN_DIALECT_NAMES); 99 ldn->localeDisplayName("en_GB", temp); 100 delete ldn; 101 test_assert_equal("British English", temp); 102 } 103 104 void LocaleDisplayNamesTest::TestWithKeywordsAndEverything() { 105 UnicodeString temp; 106 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS()); 107 const char *locname = "en_Hant_US_VALLEY@calendar=gregorian;collation=phonebook"; 108 const char *target = "English (Traditional, United States, VALLEY, " 109 "Gregorian Calendar, Phonebook Sort Order)"; 110 ldn->localeDisplayName(locname, temp); 111 delete ldn; 112 test_assert_equal(target, temp); 113 } 114 115 void LocaleDisplayNamesTest::TestKeywords() { 116 UnicodeString temp; 117 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS()); 118 const char *locname = "de@currency=XYZ"; 119 const char *target = "German (Currency: XYZ)"; 120 ldn->localeDisplayName(locname, temp); 121 delete ldn; 122 test_assert_equal(target, temp); 123 } 124 125 void LocaleDisplayNamesTest::TestUntranslatedKeywords() { 126 UnicodeString temp; 127 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS()); 128 const char *locname = "de@foo=bar"; 129 const char *target = "German (foo=bar)"; 130 ldn->localeDisplayName(locname, temp); 131 delete ldn; 132 test_assert_equal(target, temp); 133 } 134 135 void LocaleDisplayNamesTest::TestPrivateUse() { 136 UnicodeString temp; 137 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS()); 138 const char *locname = "de@x=foobar"; 139 const char *target = "German (Private-Use: foobar)"; 140 ldn->localeDisplayName(locname, temp); 141 delete ldn; 142 test_assert_equal(target, temp); 143 } 144 145 void LocaleDisplayNamesTest::TestUldnOpen() { 146 UErrorCode status = U_ZERO_ERROR; 147 const int32_t kMaxResultSize = 150; // long enough 148 UChar result[150]; 149 ULocaleDisplayNames *ldn = uldn_open(Locale::getGermany().getName(), ULDN_STANDARD_NAMES, &status); 150 int32_t len = uldn_localeDisplayName(ldn, "de_DE", result, kMaxResultSize, &status); 151 uldn_close(ldn); 152 test_assert(U_SUCCESS(status)); 153 154 UnicodeString str(result, len, kMaxResultSize); 155 test_assert_equal("Deutsch (Deutschland)", str); 156 157 // make sure that NULL gives us the default locale as usual 158 ldn = uldn_open(NULL, ULDN_STANDARD_NAMES, &status); 159 const char *locale = uldn_getLocale(ldn); 160 if(0 != uprv_strcmp(uloc_getDefault(), locale)) { 161 errln("uldn_getLocale(uldn_open(NULL))=%s != default locale %s\n", locale, uloc_getDefault()); 162 } 163 uldn_close(ldn); 164 test_assert(U_SUCCESS(status)); 165 } 166 167 void LocaleDisplayNamesTest::TestUldnOpenDialect() { 168 UErrorCode status = U_ZERO_ERROR; 169 const int32_t kMaxResultSize = 150; // long enough 170 UChar result[150]; 171 ULocaleDisplayNames *ldn = uldn_open(Locale::getUS().getName(), ULDN_DIALECT_NAMES, &status); 172 int32_t len = uldn_localeDisplayName(ldn, "en_GB", result, kMaxResultSize, &status); 173 uldn_close(ldn); 174 test_assert(U_SUCCESS(status)); 175 176 UnicodeString str(result, len, kMaxResultSize); 177 test_assert_equal("British English", str); 178 } 179 180 void LocaleDisplayNamesTest::TestUldnWithKeywordsAndEverything() { 181 UErrorCode status = U_ZERO_ERROR; 182 const int32_t kMaxResultSize = 150; // long enough 183 UChar result[150]; 184 const char *locname = "en_Hant_US_VALLEY@calendar=gregorian;collation=phonebook"; 185 const char *target = "English (Traditional, United States, VALLEY, " 186 "Gregorian Calendar, Phonebook Sort Order)"; 187 ULocaleDisplayNames *ldn = uldn_open(Locale::getUS().getName(), ULDN_STANDARD_NAMES, &status); 188 int32_t len = uldn_localeDisplayName(ldn, locname, result, kMaxResultSize, &status); 189 uldn_close(ldn); 190 test_assert(U_SUCCESS(status)); 191 192 UnicodeString str(result, len, kMaxResultSize); 193 test_assert_equal(target, str); 194 } 195 196 void LocaleDisplayNamesTest::TestUldnComponents() { 197 UErrorCode status = U_ZERO_ERROR; 198 const int32_t kMaxResultSize = 150; // long enough 199 UChar result[150]; 200 201 ULocaleDisplayNames *ldn = uldn_open(Locale::getGermany().getName(), ULDN_STANDARD_NAMES, &status); 202 test_assert(U_SUCCESS(status)); 203 if (U_FAILURE(status)) { 204 return; 205 } 206 207 // "en_Hant_US_PRE_EURO@calendar=gregorian"; 208 209 { 210 int32_t len = uldn_languageDisplayName(ldn, "en", result, kMaxResultSize, &status); 211 UnicodeString str(result, len, kMaxResultSize); 212 test_assert_equal("Englisch", str); 213 } 214 215 216 { 217 int32_t len = uldn_scriptDisplayName(ldn, "Hant", result, kMaxResultSize, &status); 218 UnicodeString str(result, len, kMaxResultSize); 219 test_assert_equal("Traditionell", str); 220 } 221 222 { 223 int32_t len = uldn_scriptCodeDisplayName(ldn, USCRIPT_TRADITIONAL_HAN, result, kMaxResultSize, 224 &status); 225 UnicodeString str(result, len, kMaxResultSize); 226 test_assert_equal("Traditionell", str); 227 } 228 229 { 230 int32_t len = uldn_regionDisplayName(ldn, "US", result, kMaxResultSize, &status); 231 UnicodeString str(result, len, kMaxResultSize); 232 test_assert_equal("Vereinigte Staaten", str); 233 } 234 235 { 236 int32_t len = uldn_variantDisplayName(ldn, "PRE_EURO", result, kMaxResultSize, &status); 237 UnicodeString str(result, len, kMaxResultSize); 238 test_assert_equal("PRE_EURO", str); 239 } 240 241 { 242 int32_t len = uldn_keyDisplayName(ldn, "calendar", result, kMaxResultSize, &status); 243 UnicodeString str(result, len, kMaxResultSize); 244 test_assert_equal("Kalender", str); 245 } 246 247 { 248 int32_t len = uldn_keyValueDisplayName(ldn, "calendar", "gregorian", result, 249 kMaxResultSize, &status); 250 UnicodeString str(result, len, kMaxResultSize); 251 test_assert_equal("Gregorianischer Kalender", str); 252 } 253 254 uldn_close(ldn); 255 } 256 257 258 typedef struct { 259 const char * displayLocale; 260 UDisplayContext dialectHandling; 261 UDisplayContext capitalization; 262 const char * localeToBeNamed; 263 const UChar * result; 264 } LocNameDispContextItem; 265 266 static char en[] = "en"; 267 static char en_US[] = "en_US"; 268 269 static UChar daFor_en[] = {0x65,0x6E,0x67,0x65,0x6C,0x73,0x6B,0}; //"engelsk" 270 static UChar daFor_en_US[] = {0x65,0x6E,0x67,0x65,0x6C,0x73,0x6B,0x20,0x28,0x55,0x53,0x41,0x29,0}; //"engelsk (USA)" 271 static UChar daFor_en_US_D[] = {0x61,0x6D,0x65,0x72,0x69,0x6B,0x61,0x6E,0x73,0x6B,0x20,0x65,0x6E,0x67,0x65,0x6C,0x73,0x6B,0}; //"amerikansk engelsk" 272 static UChar esFor_en[] = {0x69,0x6E,0x67,0x6C,0xE9,0x73,0}; //"ingles" with acute on e 273 static UChar esFor_en_US[] = {0x69,0x6E,0x67,0x6C,0xE9,0x73,0x20,0x28,0x45,0x73,0x74,0x61,0x64,0x6F,0x73,0x20,0x55,0x6E,0x69,0x64,0x6F,0x73,0x29,0}; //"ingles (Estados Unidos)" ... 274 static UChar esFor_en_US_D[] = {0x69,0x6E,0x67,0x6C,0xE9,0x73,0x20,0x65,0x73,0x74,0x61,0x64,0x6F,0x75,0x6E,0x69,0x64,0x65,0x6E,0x73,0x65,0}; //"ingles estadounidense" ... 275 #if !UCONFIG_NO_BREAK_ITERATION 276 static UChar daFor_en_T[] = {0x45,0x6E,0x67,0x65,0x6C,0x73,0x6B,0}; //"Engelsk" 277 static UChar daFor_en_US_T[] = {0x45,0x6E,0x67,0x65,0x6C,0x73,0x6B,0x20,0x28,0x55,0x53,0x41,0x29,0}; //"Engelsk (USA)" 278 static UChar daFor_en_US_DT[] = {0x41,0x6D,0x65,0x72,0x69,0x6B,0x61,0x6E,0x73,0x6B,0x20,0x65,0x6E,0x67,0x65,0x6C,0x73,0x6B,0}; //"Amerikansk engelsk" 279 static UChar esFor_en_T[] = {0x49,0x6E,0x67,0x6C,0xE9,0x73,0}; //"Ingles" ... 280 static UChar esFor_en_US_T[] = {0x49,0x6E,0x67,0x6C,0xE9,0x73,0x20,0x28,0x45,0x73,0x74,0x61,0x64,0x6F,0x73,0x20,0x55,0x6E,0x69,0x64,0x6F,0x73,0x29,0}; //"Ingles (Estados Unidos)" ... 281 static UChar esFor_en_US_DT[] = {0x49,0x6E,0x67,0x6C,0xE9,0x73,0x20,0x65,0x73,0x74,0x61,0x64,0x6F,0x75,0x6E,0x69,0x64,0x65,0x6E,0x73,0x65,0}; //"Ingles estadounidense" ... 282 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ 283 284 static const LocNameDispContextItem ctxtItems[] = { 285 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en, daFor_en }, 286 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en_US, daFor_en_US }, 287 { "da", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en_US, daFor_en_US_D }, 288 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en, esFor_en }, 289 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en_US, esFor_en_US }, 290 { "es", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE, en_US, esFor_en_US_D }, 291 #if !UCONFIG_NO_BREAK_ITERATION 292 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en, daFor_en_T }, 293 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en_US, daFor_en_US_T }, 294 { "da", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en_US, daFor_en_US_DT }, 295 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en, esFor_en_T }, 296 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en_US, esFor_en_US_T }, 297 { "es", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE, en_US, esFor_en_US_DT }, 298 299 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en, daFor_en_T }, 300 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en_US, daFor_en_US_T }, 301 { "da", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en_US, daFor_en_US_DT }, 302 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en, esFor_en_T }, 303 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en_US, esFor_en_US_T }, 304 { "es", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_UI_LIST_OR_MENU, en_US, esFor_en_US_DT }, 305 306 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en, daFor_en }, 307 { "da", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en_US, daFor_en_US }, 308 { "da", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en_US, daFor_en_US_D }, 309 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en, esFor_en_T }, 310 { "es", UDISPCTX_STANDARD_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en_US, esFor_en_US_T }, 311 { "es", UDISPCTX_DIALECT_NAMES, UDISPCTX_CAPITALIZATION_FOR_STANDALONE, en_US, esFor_en_US_DT }, 312 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ 313 { NULL, (UDisplayContext)0, (UDisplayContext)0, NULL, NULL } 314 }; 315 316 void LocaleDisplayNamesTest::TestUldnDisplayContext() { 317 const LocNameDispContextItem * ctxtItemPtr; 318 for (ctxtItemPtr = ctxtItems; ctxtItemPtr->displayLocale != NULL; ctxtItemPtr++) { 319 UDisplayContext contexts[2] = {ctxtItemPtr->dialectHandling, ctxtItemPtr->capitalization}; 320 UErrorCode status = U_ZERO_ERROR; 321 ULocaleDisplayNames * uldn = uldn_openForContext(ctxtItemPtr->displayLocale, contexts, 2, &status); 322 if (U_FAILURE(status)) { 323 errln(UnicodeString("FAIL: uldn_openForContext failed for locale ") + ctxtItemPtr->displayLocale + 324 ", dialectHandling " + ctxtItemPtr->dialectHandling + ", capitalization " + ctxtItemPtr->capitalization); 325 } else { 326 UDisplayContext dialectHandling = uldn_getContext(uldn, UDISPCTX_TYPE_DIALECT_HANDLING, &status); 327 UDisplayContext capitalization = uldn_getContext(uldn, UDISPCTX_TYPE_CAPITALIZATION, &status); 328 if (U_FAILURE(status)) { 329 errln(UnicodeString("FAIL: uldn_getContext status ") + (int)status); 330 } else if (dialectHandling != ctxtItemPtr->dialectHandling || capitalization != ctxtItemPtr->capitalization) { 331 errln("FAIL: uldn_getContext retrieved incorrect dialectHandling or capitalization"); 332 } else { 333 UChar nameBuf[ULOC_FULLNAME_CAPACITY]; 334 int32_t len = uldn_localeDisplayName(uldn, ctxtItemPtr->localeToBeNamed, nameBuf, ULOC_FULLNAME_CAPACITY, &status); 335 if (U_FAILURE(status)) { 336 dataerrln(UnicodeString("FAIL: uldn_localeDisplayName status: ") + u_errorName(status)); 337 } else if (u_strcmp(ctxtItemPtr->result, nameBuf) != 0) { 338 UnicodeString exp(ctxtItemPtr->result, u_strlen(ctxtItemPtr->result)); 339 UnicodeString got(nameBuf, len); 340 dataerrln(UnicodeString("FAIL: uldn_localeDisplayName, capitalization ") + ctxtItemPtr->capitalization + 341 ", expected " + exp + ", got " + got ); 342 } 343 } 344 uldn_close(uldn); 345 } 346 } 347 } 348 349 void LocaleDisplayNamesTest::TestRootEtc() { 350 UnicodeString temp; 351 LocaleDisplayNames *ldn = LocaleDisplayNames::createInstance(Locale::getUS()); 352 const char *locname = "@collation=phonebook"; 353 const char *target = "Root (Phonebook Sort Order)"; 354 ldn->localeDisplayName(locname, temp); 355 test_assert_equal(target, temp); 356 357 ldn->languageDisplayName("root", temp); 358 test_assert_equal("root", temp); 359 360 ldn->languageDisplayName("en_GB", temp); 361 test_assert_equal("en_GB", temp); 362 363 delete ldn; 364 } 365 366 #endif /* UCONFIG_NO_FORMATTING */ 367