Index: source/test/cintltst/cloctst.c |
diff --git a/source/test/cintltst/cloctst.c b/source/test/cintltst/cloctst.c |
deleted file mode 100644 |
index 7531ffe46e7bfc10c9cce52059818552cecafd8a..0000000000000000000000000000000000000000 |
--- a/source/test/cintltst/cloctst.c |
+++ /dev/null |
@@ -1,6121 +0,0 @@ |
-/******************************************************************** |
- * COPYRIGHT: |
- * Copyright (c) 1997-2015, International Business Machines Corporation and |
- * others. All Rights Reserved. |
- ********************************************************************/ |
-/***************************************************************************** |
-* |
-* File CLOCTST.C |
-* |
-* Modification History: |
-* Name Description |
-* Madhu Katragadda Ported for C API |
-****************************************************************************** |
-*/ |
-#include "cloctst.h" |
-#include <stdlib.h> |
-#include <stdio.h> |
-#include <string.h> |
-#include "cintltst.h" |
-#include "cstring.h" |
-#include "uparse.h" |
-#include "uresimp.h" |
- |
-#include "unicode/putil.h" |
-#include "unicode/ubrk.h" |
-#include "unicode/uchar.h" |
-#include "unicode/ucol.h" |
-#include "unicode/udat.h" |
-#include "unicode/uloc.h" |
-#include "unicode/umsg.h" |
-#include "unicode/ures.h" |
-#include "unicode/uset.h" |
-#include "unicode/ustring.h" |
-#include "unicode/utypes.h" |
-#include "unicode/ulocdata.h" |
-#include "unicode/uldnames.h" |
-#include "unicode/parseerr.h" /* may not be included with some uconfig switches */ |
-#include "udbgutil.h" |
- |
-static void TestNullDefault(void); |
-static void TestNonexistentLanguageExemplars(void); |
-static void TestLocDataErrorCodeChaining(void); |
-static void TestLanguageExemplarsFallbacks(void); |
-static void TestDisplayNameBrackets(void); |
- |
-static void TestUnicodeDefines(void); |
- |
-static void TestIsRightToLeft(void); |
- |
-void PrintDataTable(); |
- |
-/*--------------------------------------------------- |
- table of valid data |
- --------------------------------------------------- */ |
-#define LOCALE_SIZE 9 |
-#define LOCALE_INFO_SIZE 28 |
- |
-static const char* const rawData2[LOCALE_INFO_SIZE][LOCALE_SIZE] = { |
- /* language code */ |
- { "en", "fr", "ca", "el", "no", "zh", "de", "es", "ja" }, |
- /* script code */ |
- { "", "", "", "", "", "", "", "", "" }, |
- /* country code */ |
- { "US", "FR", "ES", "GR", "NO", "CN", "DE", "", "JP" }, |
- /* variant code */ |
- { "", "", "", "", "NY", "", "", "", "" }, |
- /* full name */ |
- { "en_US", "fr_FR", "ca_ES", |
- "el_GR", "no_NO_NY", "zh_Hans_CN", |
- "de_DE@collation=phonebook", "es@collation=traditional", "ja_JP@calendar=japanese" }, |
- /* ISO-3 language */ |
- { "eng", "fra", "cat", "ell", "nor", "zho", "deu", "spa", "jpn" }, |
- /* ISO-3 country */ |
- { "USA", "FRA", "ESP", "GRC", "NOR", "CHN", "DEU", "", "JPN" }, |
- /* LCID */ |
- { "409", "40c", "403", "408", "814", "804", "10407", "40a", "411" }, |
- |
- /* display language (English) */ |
- { "English", "French", "Catalan", "Greek", "Norwegian", "Chinese", "German", "Spanish", "Japanese" }, |
- /* display script code (English) */ |
- { "", "", "", "", "", "Simplified Han", "", "", "" }, |
- /* display country (English) */ |
- { "United States", "France", "Spain", "Greece", "Norway", "China", "Germany", "", "Japan" }, |
- /* display variant (English) */ |
- { "", "", "", "", "NY", "", "", "", "" }, |
- /* display name (English) */ |
- { "English (United States)", "French (France)", "Catalan (Spain)", |
- "Greek (Greece)", "Norwegian (Norway, NY)", "Chinese (Simplified, China)", |
- "German (Germany, Sort Order=Phonebook Sort Order)", "Spanish (Sort Order=Traditional Sort Order)", "Japanese (Japan, Calendar=Japanese Calendar)" }, |
- |
- /* display language (French) */ |
- { "anglais", "fran\\u00E7ais", "catalan", "grec", "norv\\u00E9gien", "chinois", "allemand", "espagnol", "japonais" }, |
- /* display script code (French) */ |
- { "", "", "", "", "", "sinogrammes simplifi\\u00e9s", "", "", "" }, |
- /* display country (French) */ |
- { "\\u00C9tats-Unis", "France", "Espagne", "Gr\\u00E8ce", "Norv\\u00E8ge", "Chine", "Allemagne", "", "Japon" }, |
- /* display variant (French) */ |
- { "", "", "", "", "NY", "", "", "", "" }, |
- /* display name (French) */ |
- { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "catalan (Espagne)", |
- "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, NY)", "chinois (simplifi\\u00e9, Chine)", |
- "allemand (Allemagne, ordre de tri=Ordre de l\\u2019annuaire)", "espagnol (ordre de tri=Ordre traditionnel)", "japonais (Japon, calendrier=calendrier japonais)" }, |
- |
- /* display language (Catalan) */ |
- { "angl\\u00E8s", "franc\\u00E8s", "catal\\u00E0", "grec", "noruec", "xin\\u00E8s", "alemany", "espanyol", "japon\\u00E8s" }, |
- /* display script code (Catalan) */ |
- { "", "", "", "", "", "han simplificat", "", "", "" }, |
- /* display country (Catalan) */ |
- { "Estats Units", "Fran\\u00E7a", "Espanya", "Gr\\u00E8cia", "Noruega", "Xina", "Alemanya", "", "Jap\\u00F3" }, |
- /* display variant (Catalan) */ |
- { "", "", "", "", "NY", "", "", "", "" }, |
- /* display name (Catalan) */ |
- { "angl\\u00E8s (Estats Units)", "franc\\u00E8s (Fran\\u00E7a)", "catal\\u00E0 (Espanya)", |
- "grec (Gr\\u00E8cia)", "noruec (Noruega, NY)", "xin\\u00E8s (simplificat, Xina)", |
- "alemany (Alemanya, ordenaci\\u00F3=ordre de la guia telef\\u00F2nica)", "espanyol (ordenaci\\u00F3=ordre tradicional)", "japon\\u00E8s (Jap\\u00F3, calendari=calendari japon\\u00e8s)" }, |
- |
- /* display language (Greek) */ |
- { |
- "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac", |
- "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac", |
- "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac", |
- "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", |
- "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac", |
- "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC", |
- "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", |
- "\\u0399\\u03C3\\u03C0\\u03B1\\u03BD\\u03B9\\u03BA\\u03AC", |
- "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03B9\\u03BA\\u03AC" |
- }, |
- /* display script code (Greek) */ |
- |
- { "", "", "", "", "", "\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf \\u03a7\\u03b1\\u03bd", "", "", "" }, |
- /* display country (Greek) */ |
- { |
- "\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2", |
- "\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1", |
- "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1", |
- "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1", |
- "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1", |
- "\\u039A\\u03AF\\u03BD\\u03B1", |
- "\\u0393\\u03B5\\u03C1\\u03BC\\u03B1\\u03BD\\u03AF\\u03B1", |
- "", |
- "\\u0399\\u03B1\\u03C0\\u03C9\\u03BD\\u03AF\\u03B1" |
- }, |
- /* display variant (Greek) */ |
- { "", "", "", "", "NY", "", "", "", "" }, /* TODO: currently there is no translation for NY in Greek fix this test when we have it */ |
- /* display name (Greek) */ |
- { |
- "\\u0391\\u03b3\\u03b3\\u03bb\\u03b9\\u03ba\\u03ac (\\u0397\\u03BD\\u03C9\\u03BC\\u03AD\\u03BD\\u03B5\\u03C2 \\u03A0\\u03BF\\u03BB\\u03B9\\u03C4\\u03B5\\u03AF\\u03B5\\u03C2)", |
- "\\u0393\\u03b1\\u03bb\\u03bb\\u03b9\\u03ba\\u03ac (\\u0393\\u03b1\\u03bb\\u03bb\\u03af\\u03b1)", |
- "\\u039a\\u03b1\\u03c4\\u03b1\\u03bb\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03af\\u03b1)", |
- "\\u0395\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)", |
- "\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03b9\\u03ba\\u03ac (\\u039d\\u03bf\\u03c1\\u03b2\\u03b7\\u03b3\\u03af\\u03b1, NY)", |
- "\\u039A\\u03B9\\u03BD\\u03B5\\u03B6\\u03B9\\u03BA\\u03AC (\\u0391\\u03c0\\u03bb\\u03bf\\u03c0\\u03bf\\u03b9\\u03b7\\u03bc\\u03ad\\u03bd\\u03bf, \\u039A\\u03AF\\u03BD\\u03B1)", |
- "\\u0393\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0393\\u03b5\\u03c1\\u03bc\\u03b1\\u03bd\\u03af\\u03b1, \\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2 \\u03c4\\u03b7\\u03bb\\u03b5\\u03c6\\u03c9\\u03bd\\u03b9\\u03ba\\u03bf\\u03cd \\u03ba\\u03b1\\u03c4\\u03b1\\u03bb\\u03cc\\u03b3\\u03bf\\u03c5)", |
- "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2)", |
- "\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03ac (\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03af\\u03b1, \\u0397\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf)" |
- } |
-}; |
- |
-static UChar*** dataTable=0; |
-enum { |
- ENGLISH = 0, |
- FRENCH = 1, |
- CATALAN = 2, |
- GREEK = 3, |
- NORWEGIAN = 4 |
-}; |
- |
-enum { |
- LANG = 0, |
- SCRIPT = 1, |
- CTRY = 2, |
- VAR = 3, |
- NAME = 4, |
- LANG3 = 5, |
- CTRY3 = 6, |
- LCID = 7, |
- DLANG_EN = 8, |
- DSCRIPT_EN = 9, |
- DCTRY_EN = 10, |
- DVAR_EN = 11, |
- DNAME_EN = 12, |
- DLANG_FR = 13, |
- DSCRIPT_FR = 14, |
- DCTRY_FR = 15, |
- DVAR_FR = 16, |
- DNAME_FR = 17, |
- DLANG_CA = 18, |
- DSCRIPT_CA = 19, |
- DCTRY_CA = 20, |
- DVAR_CA = 21, |
- DNAME_CA = 22, |
- DLANG_EL = 23, |
- DSCRIPT_EL = 24, |
- DCTRY_EL = 25, |
- DVAR_EL = 26, |
- DNAME_EL = 27 |
-}; |
- |
-#define TESTCASE(name) addTest(root, &name, "tsutil/cloctst/" #name) |
- |
-void addLocaleTest(TestNode** root); |
- |
-void addLocaleTest(TestNode** root) |
-{ |
- TESTCASE(TestObsoleteNames); /* srl- move */ |
- TESTCASE(TestBasicGetters); |
- TESTCASE(TestNullDefault); |
- TESTCASE(TestPrefixes); |
- TESTCASE(TestSimpleResourceInfo); |
- TESTCASE(TestDisplayNames); |
- TESTCASE(TestGetAvailableLocales); |
- TESTCASE(TestDataDirectory); |
-#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
- TESTCASE(TestISOFunctions); |
-#endif |
- TESTCASE(TestISO3Fallback); |
- TESTCASE(TestUninstalledISO3Names); |
- TESTCASE(TestSimpleDisplayNames); |
- TESTCASE(TestVariantParsing); |
- TESTCASE(TestKeywordVariants); |
- TESTCASE(TestKeywordVariantParsing); |
- TESTCASE(TestCanonicalization); |
- TESTCASE(TestKeywordSet); |
- TESTCASE(TestKeywordSetError); |
- TESTCASE(TestDisplayKeywords); |
- TESTCASE(TestDisplayKeywordValues); |
- TESTCASE(TestGetBaseName); |
-#if !UCONFIG_NO_FILE_IO |
- TESTCASE(TestGetLocale); |
-#endif |
- TESTCASE(TestDisplayNameWarning); |
- TESTCASE(TestNonexistentLanguageExemplars); |
- TESTCASE(TestLocDataErrorCodeChaining); |
- TESTCASE(TestLanguageExemplarsFallbacks); |
- TESTCASE(TestCalendar); |
- TESTCASE(TestDateFormat); |
- TESTCASE(TestCollation); |
- TESTCASE(TestULocale); |
- TESTCASE(TestUResourceBundle); |
- TESTCASE(TestDisplayName); |
- TESTCASE(TestAcceptLanguage); |
- TESTCASE(TestGetLocaleForLCID); |
- TESTCASE(TestOrientation); |
- TESTCASE(TestLikelySubtags); |
- TESTCASE(TestToLanguageTag); |
- TESTCASE(TestForLanguageTag); |
- TESTCASE(TestTrailingNull); |
- TESTCASE(TestUnicodeDefines); |
- TESTCASE(TestEnglishExemplarCharacters); |
- TESTCASE(TestDisplayNameBrackets); |
- TESTCASE(TestIsRightToLeft); |
- TESTCASE(TestToUnicodeLocaleKey); |
- TESTCASE(TestToLegacyKey); |
- TESTCASE(TestToUnicodeLocaleType); |
- TESTCASE(TestToLegacyType); |
-} |
- |
- |
-/* testing uloc(), uloc_getName(), uloc_getLanguage(), uloc_getVariant(), uloc_getCountry() */ |
-static void TestBasicGetters() { |
- int32_t i; |
- int32_t cap; |
- UErrorCode status = U_ZERO_ERROR; |
- char *testLocale = 0; |
- char *temp = 0, *name = 0; |
- log_verbose("Testing Basic Getters\n"); |
- for (i = 0; i < LOCALE_SIZE; i++) { |
- testLocale=(char*)malloc(sizeof(char) * (strlen(rawData2[NAME][i])+1)); |
- strcpy(testLocale,rawData2[NAME][i]); |
- |
- log_verbose("Testing %s .....\n", testLocale); |
- cap=uloc_getLanguage(testLocale, NULL, 0, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status=U_ZERO_ERROR; |
- temp=(char*)malloc(sizeof(char) * (cap+1)); |
- uloc_getLanguage(testLocale, temp, cap+1, &status); |
- } |
- if(U_FAILURE(status)){ |
- log_err("ERROR: in uloc_getLanguage %s\n", myErrorName(status)); |
- } |
- if (0 !=strcmp(temp,rawData2[LANG][i])) { |
- log_err(" Language code mismatch: %s versus %s\n", temp, rawData2[LANG][i]); |
- } |
- |
- |
- cap=uloc_getCountry(testLocale, temp, cap, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status=U_ZERO_ERROR; |
- temp=(char*)realloc(temp, sizeof(char) * (cap+1)); |
- uloc_getCountry(testLocale, temp, cap+1, &status); |
- } |
- if(U_FAILURE(status)){ |
- log_err("ERROR: in uloc_getCountry %s\n", myErrorName(status)); |
- } |
- if (0 != strcmp(temp, rawData2[CTRY][i])) { |
- log_err(" Country code mismatch: %s versus %s\n", temp, rawData2[CTRY][i]); |
- |
- } |
- |
- cap=uloc_getVariant(testLocale, temp, cap, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status=U_ZERO_ERROR; |
- temp=(char*)realloc(temp, sizeof(char) * (cap+1)); |
- uloc_getVariant(testLocale, temp, cap+1, &status); |
- } |
- if(U_FAILURE(status)){ |
- log_err("ERROR: in uloc_getVariant %s\n", myErrorName(status)); |
- } |
- if (0 != strcmp(temp, rawData2[VAR][i])) { |
- log_err("Variant code mismatch: %s versus %s\n", temp, rawData2[VAR][i]); |
- } |
- |
- cap=uloc_getName(testLocale, NULL, 0, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status=U_ZERO_ERROR; |
- name=(char*)malloc(sizeof(char) * (cap+1)); |
- uloc_getName(testLocale, name, cap+1, &status); |
- } else if(status==U_ZERO_ERROR) { |
- log_err("ERROR: in uloc_getName(%s,NULL,0,..), expected U_BUFFER_OVERFLOW_ERROR!\n", testLocale); |
- } |
- if(U_FAILURE(status)){ |
- log_err("ERROR: in uloc_getName %s\n", myErrorName(status)); |
- } |
- if (0 != strcmp(name, rawData2[NAME][i])){ |
- log_err(" Mismatch in getName: %s versus %s\n", name, rawData2[NAME][i]); |
- } |
- |
- free(temp); |
- free(name); |
- |
- free(testLocale); |
- } |
-} |
- |
-static void TestNullDefault() { |
- UErrorCode status = U_ZERO_ERROR; |
- char original[ULOC_FULLNAME_CAPACITY]; |
- |
- uprv_strcpy(original, uloc_getDefault()); |
- uloc_setDefault("qq_BLA", &status); |
- if (uprv_strcmp(uloc_getDefault(), "qq_BLA") != 0) { |
- log_err(" Mismatch in uloc_setDefault: qq_BLA versus %s\n", uloc_getDefault()); |
- } |
- uloc_setDefault(NULL, &status); |
- if (uprv_strcmp(uloc_getDefault(), original) != 0) { |
- log_err(" uloc_setDefault(NULL, &status) didn't get the default locale back!\n"); |
- } |
- |
- { |
- /* Test that set & get of default locale work, and that |
- * default locales are cached and reused, and not overwritten. |
- */ |
- const char *n_en_US; |
- const char *n_fr_FR; |
- const char *n2_en_US; |
- |
- status = U_ZERO_ERROR; |
- uloc_setDefault("en_US", &status); |
- n_en_US = uloc_getDefault(); |
- if (strcmp(n_en_US, "en_US") != 0) { |
- log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", got \"%s\"\n", n_en_US); |
- } |
- |
- uloc_setDefault("fr_FR", &status); |
- n_fr_FR = uloc_getDefault(); |
- if (strcmp(n_en_US, "en_US") != 0) { |
- log_err("uloc_setDefault altered previously default string." |
- "Expected \"en_US\", got \"%s\"\n", n_en_US); |
- } |
- if (strcmp(n_fr_FR, "fr_FR") != 0) { |
- log_err("Wrong result from uloc_getDefault(). Expected \"fr_FR\", got %s\n", n_fr_FR); |
- } |
- |
- uloc_setDefault("en_US", &status); |
- n2_en_US = uloc_getDefault(); |
- if (strcmp(n2_en_US, "en_US") != 0) { |
- log_err("Wrong result from uloc_getDefault(). Expected \"en_US\", got \"%s\"\n", n_en_US); |
- } |
- if (n2_en_US != n_en_US) { |
- log_err("Default locale cache failed to reuse en_US locale.\n"); |
- } |
- |
- if (U_FAILURE(status)) { |
- log_err("Failure returned from uloc_setDefault - \"%s\"\n", u_errorName(status)); |
- } |
- |
- } |
- |
-} |
-/* Test the i- and x- and @ and . functionality |
-*/ |
- |
-#define PREFIXBUFSIZ 128 |
- |
-static void TestPrefixes() { |
- int row = 0; |
- int n; |
- const char *loc, *expected; |
- |
- static const char * const testData[][7] = |
- { |
- /* NULL canonicalize() column means "expect same as getName()" */ |
- {"sv", "", "FI", "AL", "sv-fi-al", "sv_FI_AL", NULL}, |
- {"en", "", "GB", "", "en-gb", "en_GB", NULL}, |
- {"i-hakka", "", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA", NULL}, |
- {"i-hakka", "", "CN", "", "i-hakka_CN", "i-hakka_CN", NULL}, |
- {"i-hakka", "", "MX", "", "I-hakka_MX", "i-hakka_MX", NULL}, |
- {"x-klingon", "", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE", NULL}, |
- |
- {"zh", "Hans", "", "PINYIN", "zh-Hans-pinyin", "zh_Hans__PINYIN", "zh_Hans@collation=pinyin"}, |
- {"hy", "", "", "AREVMDA", "hy_AREVMDA", "hy__AREVMDA", NULL}, |
- |
- {"de", "", "", "1901", "de-1901", "de__1901", NULL}, |
- {"mr", "", "", "", "mr.utf8", "mr.utf8", "mr"}, |
- {"de", "", "TV", "", "de-tv.koi8r", "de_TV.koi8r", "de_TV"}, |
- {"x-piglatin", "", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML"}, /* Multibyte English */ |
- {"i-cherokee", "","US", "", "i-Cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US"}, |
- {"x-filfli", "", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"}, |
- {"no", "", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY.utf32@B", "no_NO_NY_B"}, |
- {"no", "", "NO", "", "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B"}, |
- {"no", "", "", "NY", "no__ny", "no__NY", NULL}, |
- {"no", "", "", "", "no@ny", "no@ny", "no__NY"}, |
- {"el", "Latn", "", "", "el-latn", "el_Latn", NULL}, |
- {"en", "Cyrl", "RU", "", "en-cyrl-ru", "en_Cyrl_RU", NULL}, |
- {"zh", "Hant", "TW", "STROKE", "zh-hant_TW_STROKE", "zh_Hant_TW_STROKE", "zh_Hant_TW@collation=stroke"}, |
- {"qq", "Qqqq", "QQ", "QQ", "qq_Qqqq_QQ_QQ", "qq_Qqqq_QQ_QQ", NULL}, |
- {"qq", "Qqqq", "", "QQ", "qq_Qqqq__QQ", "qq_Qqqq__QQ", NULL}, |
- {"ab", "Cdef", "GH", "IJ", "ab_cdef_gh_ij", "ab_Cdef_GH_IJ", NULL}, /* total garbage */ |
- |
- {NULL,NULL,NULL,NULL,NULL,NULL,NULL} |
- }; |
- |
- static const char * const testTitles[] = { |
- "uloc_getLanguage()", |
- "uloc_getScript()", |
- "uloc_getCountry()", |
- "uloc_getVariant()", |
- "name", |
- "uloc_getName()", |
- "uloc_canonicalize()" |
- }; |
- |
- char buf[PREFIXBUFSIZ]; |
- int32_t len; |
- UErrorCode err; |
- |
- |
- for(row=0;testData[row][0] != NULL;row++) { |
- loc = testData[row][NAME]; |
- log_verbose("Test #%d: %s\n", row, loc); |
- |
- err = U_ZERO_ERROR; |
- len=0; |
- buf[0]=0; |
- for(n=0;n<=(NAME+2);n++) { |
- if(n==NAME) continue; |
- |
- for(len=0;len<PREFIXBUFSIZ;len++) { |
- buf[len] = '%'; /* Set a tripwire.. */ |
- } |
- len = 0; |
- |
- switch(n) { |
- case LANG: |
- len = uloc_getLanguage(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- case SCRIPT: |
- len = uloc_getScript(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- case CTRY: |
- len = uloc_getCountry(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- case VAR: |
- len = uloc_getVariant(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- case NAME+1: |
- len = uloc_getName(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- case NAME+2: |
- len = uloc_canonicalize(loc, buf, PREFIXBUFSIZ, &err); |
- break; |
- |
- default: |
- strcpy(buf, "**??"); |
- len=4; |
- } |
- |
- if(U_FAILURE(err)) { |
- log_err("#%d: %s on %s: err %s\n", |
- row, testTitles[n], loc, u_errorName(err)); |
- } else { |
- log_verbose("#%d: %s on %s: -> [%s] (length %d)\n", |
- row, testTitles[n], loc, buf, len); |
- |
- if(len != (int32_t)strlen(buf)) { |
- log_err("#%d: %s on %s: -> [%s] (length returned %d, actual %d!)\n", |
- row, testTitles[n], loc, buf, len, strlen(buf)+1); |
- |
- } |
- |
- /* see if they smashed something */ |
- if(buf[len+1] != '%') { |
- log_err("#%d: %s on %s: -> [%s] - wrote [%X] out ofbounds!\n", |
- row, testTitles[n], loc, buf, buf[len+1]); |
- } |
- |
- expected = testData[row][n]; |
- if (expected == NULL && n == (NAME+2)) { |
- /* NULL expected canonicalize() means "expect same as getName()" */ |
- expected = testData[row][NAME+1]; |
- } |
- if(strcmp(buf, expected)) { |
- log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n", |
- row, testTitles[n], loc, buf, expected); |
- |
- } |
- } |
- } |
- } |
-} |
- |
- |
-/* testing uloc_getISO3Language(), uloc_getISO3Country(), */ |
-static void TestSimpleResourceInfo() { |
- int32_t i; |
- char* testLocale = 0; |
- UChar* expected = 0; |
- |
- const char* temp; |
- char temp2[20]; |
- testLocale=(char*)malloc(sizeof(char) * 1); |
- expected=(UChar*)malloc(sizeof(UChar) * 1); |
- |
- setUpDataTable(); |
- log_verbose("Testing getISO3Language and getISO3Country\n"); |
- for (i = 0; i < LOCALE_SIZE; i++) { |
- |
- testLocale=(char*)realloc(testLocale, sizeof(char) * (u_strlen(dataTable[NAME][i])+1)); |
- u_austrcpy(testLocale, dataTable[NAME][i]); |
- |
- log_verbose("Testing %s ......\n", testLocale); |
- |
- temp=uloc_getISO3Language(testLocale); |
- expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); |
- u_uastrcpy(expected,temp); |
- if (0 != u_strcmp(expected, dataTable[LANG3][i])) { |
- log_err(" ISO-3 language code mismatch: %s versus %s\n", austrdup(expected), |
- austrdup(dataTable[LANG3][i])); |
- } |
- |
- temp=uloc_getISO3Country(testLocale); |
- expected=(UChar*)realloc(expected, sizeof(UChar) * (strlen(temp) + 1)); |
- u_uastrcpy(expected,temp); |
- if (0 != u_strcmp(expected, dataTable[CTRY3][i])) { |
- log_err(" ISO-3 Country code mismatch: %s versus %s\n", austrdup(expected), |
- austrdup(dataTable[CTRY3][i])); |
- } |
- sprintf(temp2, "%x", (int)uloc_getLCID(testLocale)); |
- if (strcmp(temp2, rawData2[LCID][i]) != 0) { |
- log_err("LCID mismatch: %s versus %s\n", temp2 , rawData2[LCID][i]); |
- } |
- } |
- |
- free(expected); |
- free(testLocale); |
- cleanUpDataTable(); |
-} |
- |
-/* if len < 0, we convert until we hit UChar 0x0000, which is not output. will add trailing null |
- * if there's room but won't be included in result. result < 0 indicates an error. |
- * Returns the number of chars written (not those that would be written if there's enough room.*/ |
-static int32_t UCharsToEscapedAscii(const UChar* utext, int32_t len, char* resultChars, int32_t buflen) { |
- static const struct { |
- char escapedChar; |
- UChar sourceVal; |
- } ESCAPE_MAP[] = { |
- /*a*/ {'a', 0x07}, |
- /*b*/ {'b', 0x08}, |
- /*e*/ {'e', 0x1b}, |
- /*f*/ {'f', 0x0c}, |
- /*n*/ {'n', 0x0a}, |
- /*r*/ {'r', 0x0d}, |
- /*t*/ {'t', 0x09}, |
- /*v*/ {'v', 0x0b} |
- }; |
- static const int32_t ESCAPE_MAP_LENGTH = sizeof(ESCAPE_MAP)/sizeof(ESCAPE_MAP[0]); |
- static const char HEX_DIGITS[] = { |
- '0', '1', '2', '3', '4', '5', '6', '7', |
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' |
- }; |
- int32_t i, j; |
- int32_t resultLen = 0; |
- const int32_t limit = len<0 ? buflen : len; /* buflen is long enough to hit the buffer limit */ |
- const int32_t escapeLimit1 = buflen-2; |
- const int32_t escapeLimit2 = buflen-6; |
- UChar uc; |
- |
- if(utext==NULL || resultChars==NULL || buflen<0) { |
- return -1; |
- } |
- |
- for(i=0;i<limit && resultLen<buflen;++i) { |
- uc=utext[i]; |
- if(len<0 && uc==0) { |
- break; |
- } |
- if(uc<0x20) { |
- for(j=0;j<ESCAPE_MAP_LENGTH && uc!=ESCAPE_MAP[j].sourceVal;j++) { |
- } |
- if(j<ESCAPE_MAP_LENGTH) { |
- if(resultLen>escapeLimit1) { |
- break; |
- } |
- resultChars[resultLen++]='\\'; |
- resultChars[resultLen++]=ESCAPE_MAP[j].escapedChar; |
- continue; |
- } |
- } else if(uc<0x7f) { |
- u_austrncpy(resultChars + resultLen, &uc, 1); |
- resultLen++; |
- continue; |
- } |
- |
- if(resultLen>escapeLimit2) { |
- break; |
- } |
- |
- /* have to escape the uchar */ |
- resultChars[resultLen++]='\\'; |
- resultChars[resultLen++]='u'; |
- resultChars[resultLen++]=HEX_DIGITS[(uc>>12)&0xff]; |
- resultChars[resultLen++]=HEX_DIGITS[(uc>>8)&0xff]; |
- resultChars[resultLen++]=HEX_DIGITS[(uc>>4)&0xff]; |
- resultChars[resultLen++]=HEX_DIGITS[uc&0xff]; |
- } |
- |
- if(resultLen<buflen) { |
- resultChars[resultLen] = 0; |
- } |
- |
- return resultLen; |
-} |
- |
-/* |
- * Jitterbug 2439 -- markus 20030425 |
- * |
- * The lookup of display names must not fall back through the default |
- * locale because that yields useless results. |
- */ |
-static void TestDisplayNames() |
-{ |
- UChar buffer[100]; |
- UErrorCode errorCode=U_ZERO_ERROR; |
- int32_t length; |
- log_verbose("Testing getDisplayName for different locales\n"); |
- |
- log_verbose(" In locale = en_US...\n"); |
- doTestDisplayNames("en_US", DLANG_EN); |
- log_verbose(" In locale = fr_FR....\n"); |
- doTestDisplayNames("fr_FR", DLANG_FR); |
- log_verbose(" In locale = ca_ES...\n"); |
- doTestDisplayNames("ca_ES", DLANG_CA); |
- log_verbose(" In locale = gr_EL..\n"); |
- doTestDisplayNames("el_GR", DLANG_EL); |
- |
- /* test that the default locale has a display name for its own language */ |
- errorCode=U_ZERO_ERROR; |
- length=uloc_getDisplayLanguage(NULL, NULL, buffer, UPRV_LENGTHOF(buffer), &errorCode); |
- if(U_FAILURE(errorCode) || (length<=3 && buffer[0]<=0x7f)) { |
- /* check <=3 to reject getting the language code as a display name */ |
- log_data_err("unable to get a display string for the language of the default locale - %s (Are you missing data?)\n", u_errorName(errorCode)); |
- } |
- |
- /* test that we get the language code itself for an unknown language, and a default warning */ |
- errorCode=U_ZERO_ERROR; |
- length=uloc_getDisplayLanguage("qq", "rr", buffer, UPRV_LENGTHOF(buffer), &errorCode); |
- if(errorCode!=U_USING_DEFAULT_WARNING || length!=2 || buffer[0]!=0x71 || buffer[1]!=0x71) { |
- log_err("error getting the display string for an unknown language - %s\n", u_errorName(errorCode)); |
- } |
- |
- /* test that we get a default warning for a display name where one component is unknown (4255) */ |
- errorCode=U_ZERO_ERROR; |
- length=uloc_getDisplayName("qq_US_POSIX", "en_US", buffer, UPRV_LENGTHOF(buffer), &errorCode); |
- if(errorCode!=U_USING_DEFAULT_WARNING) { |
- log_err("error getting the display name for a locale with an unknown language - %s\n", u_errorName(errorCode)); |
- } |
- |
- { |
- int32_t i; |
- static const char *aLocale = "es@collation=traditional;calendar=japanese"; |
- static const char *testL[] = { "en_US", |
- "fr_FR", |
- "ca_ES", |
- "el_GR" }; |
- static const char *expect[] = { "Spanish (Calendar=Japanese Calendar, Sort Order=Traditional Sort Order)", /* note sorted order of keywords */ |
- "espagnol (calendrier=calendrier japonais, ordre de tri=Ordre traditionnel)", |
- "espanyol (calendari=calendari japon\\u00e8s, ordenaci\\u00f3=ordre tradicional)", |
- "\\u0399\\u03c3\\u03c0\\u03b1\\u03bd\\u03b9\\u03ba\\u03ac (\\u0397\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf=\\u0399\\u03b1\\u03c0\\u03c9\\u03bd\\u03b9\\u03ba\\u03cc \\u03b7\\u03bc\\u03b5\\u03c1\\u03bf\\u03bb\\u03cc\\u03b3\\u03b9\\u03bf, \\u03a3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2=\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03bf\\u03c3\\u03b9\\u03b1\\u03ba\\u03ae \\u03c3\\u03b5\\u03b9\\u03c1\\u03ac \\u03c4\\u03b1\\u03be\\u03b9\\u03bd\\u03cc\\u03bc\\u03b7\\u03c3\\u03b7\\u03c2)" }; |
- UChar *expectBuffer; |
- |
- for(i=0;i<UPRV_LENGTHOF(testL);i++) { |
- errorCode = U_ZERO_ERROR; |
- uloc_getDisplayName(aLocale, testL[i], buffer, UPRV_LENGTHOF(buffer), &errorCode); |
- if(U_FAILURE(errorCode)) { |
- log_err("FAIL in uloc_getDisplayName(%s,%s,..) -> %s\n", aLocale, testL[i], u_errorName(errorCode)); |
- } else { |
- expectBuffer = CharsToUChars(expect[i]); |
- if(u_strcmp(buffer,expectBuffer)) { |
- log_data_err("FAIL in uloc_getDisplayName(%s,%s,..) expected '%s' got '%s' (Are you missing data?)\n", aLocale, testL[i], expect[i], austrdup(buffer)); |
- } else { |
- log_verbose("pass in uloc_getDisplayName(%s,%s,..) got '%s'\n", aLocale, testL[i], expect[i]); |
- } |
- free(expectBuffer); |
- } |
- } |
- } |
- |
- /* test that we properly preflight and return data when there's a non-default pattern, |
- see ticket #8262. */ |
- { |
- int32_t i; |
- static const char *locale="az_Cyrl"; |
- static const char *displayLocale="ja"; |
- static const char *expectedChars = |
- "\\u30a2\\u30bc\\u30eb\\u30d0\\u30a4\\u30b8\\u30e3\\u30f3\\u8a9e " |
- "(\\u30ad\\u30ea\\u30eb\\u6587\\u5b57)"; |
- UErrorCode ec=U_ZERO_ERROR; |
- UChar result[256]; |
- int32_t len; |
- int32_t preflightLen=uloc_getDisplayName(locale, displayLocale, NULL, 0, &ec); |
- /* inconvenient semantics when preflighting, this condition is expected... */ |
- if(ec==U_BUFFER_OVERFLOW_ERROR) { |
- ec=U_ZERO_ERROR; |
- } |
- len=uloc_getDisplayName(locale, displayLocale, result, UPRV_LENGTHOF(result), &ec); |
- if(U_FAILURE(ec)) { |
- log_err("uloc_getDisplayName(%s, %s...) returned error: %s", |
- locale, displayLocale, u_errorName(ec)); |
- } else { |
- UChar *expected=CharsToUChars(expectedChars); |
- int32_t expectedLen=u_strlen(expected); |
- |
- if(len!=expectedLen) { |
- log_data_err("uloc_getDisplayName(%s, %s...) returned string of length %d, expected length %d", |
- locale, displayLocale, len, expectedLen); |
- } else if(preflightLen!=expectedLen) { |
- log_err("uloc_getDisplayName(%s, %s...) returned preflight length %d, expected length %d", |
- locale, displayLocale, preflightLen, expectedLen); |
- } else if(u_strncmp(result, expected, len)) { |
- int32_t cap=len*6+1; /* worst case + space for trailing null */ |
- char* resultChars=(char*)malloc(cap); |
- int32_t resultCharsLen=UCharsToEscapedAscii(result, len, resultChars, cap); |
- if(resultCharsLen<0 || resultCharsLen<cap-1) { |
- log_err("uloc_getDisplayName(%s, %s...) mismatch", locale, displayLocale); |
- } else { |
- log_err("uloc_getDisplayName(%s, %s...) returned '%s' but expected '%s'", |
- locale, displayLocale, resultChars, expectedChars); |
- } |
- free(resultChars); |
- resultChars=NULL; |
- } else { |
- /* test all buffer sizes */ |
- for(i=len+1;i>=0;--i) { |
- len=uloc_getDisplayName(locale, displayLocale, result, i, &ec); |
- if(ec==U_BUFFER_OVERFLOW_ERROR) { |
- ec=U_ZERO_ERROR; |
- } |
- if(U_FAILURE(ec)) { |
- log_err("using buffer of length %d returned error %s", i, u_errorName(ec)); |
- break; |
- } |
- if(len!=expectedLen) { |
- log_err("with buffer of length %d, expected length %d but got %d", i, expectedLen, len); |
- break; |
- } |
- /* There's no guarantee about what's in the buffer if we've overflowed, in particular, |
- * we don't know that it's been filled, so no point in checking. */ |
- } |
- } |
- |
- free(expected); |
- } |
- } |
-} |
- |
- |
-/* test for uloc_getAvialable() and uloc_countAvilable()*/ |
-static void TestGetAvailableLocales() |
-{ |
- |
- const char *locList; |
- int32_t locCount,i; |
- |
- log_verbose("Testing the no of avialable locales\n"); |
- locCount=uloc_countAvailable(); |
- if (locCount == 0) |
- log_data_err("countAvailable() returned an empty list!\n"); |
- |
- /* use something sensible w/o hardcoding the count */ |
- else if(locCount < 0){ |
- log_data_err("countAvailable() returned a wrong value!= %d\n", locCount); |
- } |
- else{ |
- log_info("Number of locales returned = %d\n", locCount); |
- } |
- for(i=0;i<locCount;i++){ |
- locList=uloc_getAvailable(i); |
- |
- log_verbose(" %s\n", locList); |
- } |
-} |
- |
-/* test for u_getDataDirectory, u_setDataDirectory, uloc_getISO3Language */ |
-static void TestDataDirectory() |
-{ |
- |
- char oldDirectory[512]; |
- const char *temp,*testValue1,*testValue2,*testValue3; |
- const char path[40] ="d:\\icu\\source\\test\\intltest" U_FILE_SEP_STRING; /*give the required path */ |
- |
- log_verbose("Testing getDataDirectory()\n"); |
- temp = u_getDataDirectory(); |
- strcpy(oldDirectory, temp); |
- |
- testValue1=uloc_getISO3Language("en_US"); |
- log_verbose("first fetch of language retrieved %s\n", testValue1); |
- |
- if (0 != strcmp(testValue1,"eng")){ |
- log_err("Initial check of ISO3 language failed: expected \"eng\", got %s \n", testValue1); |
- } |
- |
- /*defining the path for DataDirectory */ |
- log_verbose("Testing setDataDirectory\n"); |
- u_setDataDirectory( path ); |
- if(strcmp(path, u_getDataDirectory())==0) |
- log_verbose("setDataDirectory working fine\n"); |
- else |
- log_err("Error in setDataDirectory. Directory not set correctly - came back as [%s], expected [%s]\n", u_getDataDirectory(), path); |
- |
- testValue2=uloc_getISO3Language("en_US"); |
- log_verbose("second fetch of language retrieved %s \n", testValue2); |
- |
- u_setDataDirectory(oldDirectory); |
- testValue3=uloc_getISO3Language("en_US"); |
- log_verbose("third fetch of language retrieved %s \n", testValue3); |
- |
- if (0 != strcmp(testValue3,"eng")) { |
- log_err("get/setDataDirectory() failed: expected \"eng\", got \" %s \" \n", testValue3); |
- } |
-} |
- |
- |
- |
-/*=========================================================== */ |
- |
-static UChar _NUL=0; |
- |
-static void doTestDisplayNames(const char* displayLocale, int32_t compareIndex) |
-{ |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t i; |
- int32_t maxresultsize; |
- |
- const char *testLocale; |
- |
- |
- UChar *testLang = 0; |
- UChar *testScript = 0; |
- UChar *testCtry = 0; |
- UChar *testVar = 0; |
- UChar *testName = 0; |
- |
- |
- UChar* expectedLang = 0; |
- UChar* expectedScript = 0; |
- UChar* expectedCtry = 0; |
- UChar* expectedVar = 0; |
- UChar* expectedName = 0; |
- |
-setUpDataTable(); |
- |
- for(i=0;i<LOCALE_SIZE; ++i) |
- { |
- testLocale=rawData2[NAME][i]; |
- |
- log_verbose("Testing..... %s\n", testLocale); |
- |
- maxresultsize=0; |
- maxresultsize=uloc_getDisplayLanguage(testLocale, displayLocale, NULL, maxresultsize, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) |
- { |
- status=U_ZERO_ERROR; |
- testLang=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); |
- uloc_getDisplayLanguage(testLocale, displayLocale, testLang, maxresultsize + 1, &status); |
- } |
- else |
- { |
- testLang=&_NUL; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Error in getDisplayLanguage() %s\n", myErrorName(status)); |
- } |
- |
- maxresultsize=0; |
- maxresultsize=uloc_getDisplayScript(testLocale, displayLocale, NULL, maxresultsize, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) |
- { |
- status=U_ZERO_ERROR; |
- testScript=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); |
- uloc_getDisplayScript(testLocale, displayLocale, testScript, maxresultsize + 1, &status); |
- } |
- else |
- { |
- testScript=&_NUL; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Error in getDisplayScript() %s\n", myErrorName(status)); |
- } |
- |
- maxresultsize=0; |
- maxresultsize=uloc_getDisplayCountry(testLocale, displayLocale, NULL, maxresultsize, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) |
- { |
- status=U_ZERO_ERROR; |
- testCtry=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); |
- uloc_getDisplayCountry(testLocale, displayLocale, testCtry, maxresultsize + 1, &status); |
- } |
- else |
- { |
- testCtry=&_NUL; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Error in getDisplayCountry() %s\n", myErrorName(status)); |
- } |
- |
- maxresultsize=0; |
- maxresultsize=uloc_getDisplayVariant(testLocale, displayLocale, NULL, maxresultsize, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) |
- { |
- status=U_ZERO_ERROR; |
- testVar=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); |
- uloc_getDisplayVariant(testLocale, displayLocale, testVar, maxresultsize + 1, &status); |
- } |
- else |
- { |
- testVar=&_NUL; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Error in getDisplayVariant() %s\n", myErrorName(status)); |
- } |
- |
- maxresultsize=0; |
- maxresultsize=uloc_getDisplayName(testLocale, displayLocale, NULL, maxresultsize, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) |
- { |
- status=U_ZERO_ERROR; |
- testName=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1)); |
- uloc_getDisplayName(testLocale, displayLocale, testName, maxresultsize + 1, &status); |
- } |
- else |
- { |
- testName=&_NUL; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Error in getDisplayName() %s\n", myErrorName(status)); |
- } |
- |
- expectedLang=dataTable[compareIndex][i]; |
- if(u_strlen(expectedLang)== 0) |
- expectedLang=dataTable[DLANG_EN][i]; |
- |
- expectedScript=dataTable[compareIndex + 1][i]; |
- if(u_strlen(expectedScript)== 0) |
- expectedScript=dataTable[DSCRIPT_EN][i]; |
- |
- expectedCtry=dataTable[compareIndex + 2][i]; |
- if(u_strlen(expectedCtry)== 0) |
- expectedCtry=dataTable[DCTRY_EN][i]; |
- |
- expectedVar=dataTable[compareIndex + 3][i]; |
- if(u_strlen(expectedVar)== 0) |
- expectedVar=dataTable[DVAR_EN][i]; |
- |
- expectedName=dataTable[compareIndex + 4][i]; |
- if(u_strlen(expectedName) == 0) |
- expectedName=dataTable[DNAME_EN][i]; |
- |
- if (0 !=u_strcmp(testLang,expectedLang)) { |
- log_data_err(" Display Language mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testLang), austrdup(expectedLang), displayLocale); |
- } |
- |
- if (0 != u_strcmp(testScript,expectedScript)) { |
- log_data_err(" Display Script mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testScript), austrdup(expectedScript), displayLocale); |
- } |
- |
- if (0 != u_strcmp(testCtry,expectedCtry)) { |
- log_data_err(" Display Country mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testCtry), austrdup(expectedCtry), displayLocale); |
- } |
- |
- if (0 != u_strcmp(testVar,expectedVar)) { |
- log_data_err(" Display Variant mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testVar), austrdup(expectedVar), displayLocale); |
- } |
- |
- if(0 != u_strcmp(testName, expectedName)) { |
- log_data_err(" Display Name mismatch: got %s expected %s displayLocale=%s (Are you missing data?)\n", austrdup(testName), austrdup(expectedName), displayLocale); |
- } |
- |
- if(testName!=&_NUL) { |
- free(testName); |
- } |
- if(testLang!=&_NUL) { |
- free(testLang); |
- } |
- if(testScript!=&_NUL) { |
- free(testScript); |
- } |
- if(testCtry!=&_NUL) { |
- free(testCtry); |
- } |
- if(testVar!=&_NUL) { |
- free(testVar); |
- } |
- } |
-cleanUpDataTable(); |
-} |
- |
-/*------------------------------ |
- * TestDisplayNameBrackets |
- */ |
- |
-typedef struct { |
- const char * displayLocale; |
- const char * namedRegion; |
- const char * namedLocale; |
- const char * regionName; |
- const char * localeName; |
-} DisplayNameBracketsItem; |
- |
-static const DisplayNameBracketsItem displayNameBracketsItems[] = { |
- { "en", "CC", "en_CC", "Cocos (Keeling) Islands", "English (Cocos [Keeling] Islands)" }, |
- { "en", "MM", "my_MM", "Myanmar (Burma)", "Burmese (Myanmar [Burma])" }, |
- { "en", "MM", "my_Mymr_MM", "Myanmar (Burma)", "Burmese (Myanmar, Myanmar [Burma])" }, |
- { "zh", "CC", "en_CC", "\\u79D1\\u79D1\\u65AF\\uFF08\\u57FA\\u6797\\uFF09\\u7FA4\\u5C9B", "\\u82F1\\u6587\\uFF08\\u79D1\\u79D1\\u65AF\\uFF3B\\u57FA\\u6797\\uFF3D\\u7FA4\\u5C9B\\uFF09" }, |
- { "zh", "CG", "fr_CG", "\\u521A\\u679C\\uFF08\\u5E03\\uFF09", "\\u6CD5\\u6587\\uFF08\\u521A\\u679C\\uFF3B\\u5E03\\uFF3D\\uFF09" }, |
- { NULL, NULL, NULL, NULL, NULL } |
-}; |
- |
-enum { kDisplayNameBracketsMax = 128 }; |
- |
-static void TestDisplayNameBrackets() |
-{ |
- const DisplayNameBracketsItem * itemPtr = displayNameBracketsItems; |
- for (; itemPtr->displayLocale != NULL; itemPtr++) { |
- ULocaleDisplayNames * uldn; |
- UErrorCode status; |
- UChar expectRegionName[kDisplayNameBracketsMax]; |
- UChar expectLocaleName[kDisplayNameBracketsMax]; |
- UChar getName[kDisplayNameBracketsMax]; |
- int32_t ulen; |
- |
- (void) u_unescape(itemPtr->regionName, expectRegionName, kDisplayNameBracketsMax); |
- (void) u_unescape(itemPtr->localeName, expectLocaleName, kDisplayNameBracketsMax); |
- |
- status = U_ZERO_ERROR; |
- ulen = uloc_getDisplayCountry(itemPtr->namedLocale, itemPtr->displayLocale, getName, kDisplayNameBracketsMax, &status); |
- if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 ) { |
- log_data_err("uloc_getDisplayCountry for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status)); |
- } |
- |
- status = U_ZERO_ERROR; |
- ulen = uloc_getDisplayName(itemPtr->namedLocale, itemPtr->displayLocale, getName, kDisplayNameBracketsMax, &status); |
- if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 ) { |
- log_data_err("uloc_getDisplayName for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status)); |
- } |
- |
-#if !UCONFIG_NO_FORMATTING |
- status = U_ZERO_ERROR; |
- uldn = uldn_open(itemPtr->displayLocale, ULDN_STANDARD_NAMES, &status); |
- if (U_SUCCESS(status)) { |
- status = U_ZERO_ERROR; |
- ulen = uldn_regionDisplayName(uldn, itemPtr->namedRegion, getName, kDisplayNameBracketsMax, &status); |
- if ( U_FAILURE(status) || u_strcmp(getName, expectRegionName) != 0 ) { |
- log_data_err("uldn_regionDisplayName for displayLocale %s and namedRegion %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedRegion, myErrorName(status)); |
- } |
- |
- status = U_ZERO_ERROR; |
- ulen = uldn_localeDisplayName(uldn, itemPtr->namedLocale, getName, kDisplayNameBracketsMax, &status); |
- if ( U_FAILURE(status) || u_strcmp(getName, expectLocaleName) != 0 ) { |
- log_data_err("uldn_localeDisplayName for displayLocale %s and namedLocale %s returns unexpected name or status %s\n", itemPtr->displayLocale, itemPtr->namedLocale, myErrorName(status)); |
- } |
- |
- uldn_close(uldn); |
- } else { |
- log_data_err("uldn_open fails for displayLocale %s, status=%s\n", itemPtr->displayLocale, u_errorName(status)); |
- } |
-#endif |
- (void)ulen; /* Suppress variable not used warning */ |
- } |
-} |
- |
-/*------------------------------ |
- * TestISOFunctions |
- */ |
- |
-#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
-/* test for uloc_getISOLanguages, uloc_getISOCountries */ |
-static void TestISOFunctions() |
-{ |
- const char* const* str=uloc_getISOLanguages(); |
- const char* const* str1=uloc_getISOCountries(); |
- const char* test; |
- const char *key = NULL; |
- int32_t count = 0, skipped = 0; |
- int32_t expect; |
- UResourceBundle *res; |
- UResourceBundle *subRes; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- /* test getISOLanguages*/ |
- /*str=uloc_getISOLanguages(); */ |
- log_verbose("Testing ISO Languages: \n"); |
- |
- /* use structLocale - this data is no longer in root */ |
- res = ures_openDirect(loadTestData(&status), "structLocale", &status); |
- subRes = ures_getByKey(res, "Languages", NULL, &status); |
- if (U_FAILURE(status)) { |
- log_data_err("There is an error in structLocale's ures_getByKey(\"Languages\"), status=%s\n", u_errorName(status)); |
- return; |
- } |
- |
- expect = ures_getSize(subRes); |
- for(count = 0; *(str+count) != 0; count++) |
- { |
- key = NULL; |
- test = *(str+count); |
- status = U_ZERO_ERROR; |
- |
- do { |
- /* Skip over language tags. This API only returns language codes. */ |
- skipped += (key != NULL); |
- ures_getNextString(subRes, NULL, &key, &status); |
- } |
- while (key != NULL && strchr(key, '_')); |
- |
- if(key == NULL) |
- break; |
- /* TODO: Consider removing sh, which is deprecated */ |
- if(strcmp(key,"root") == 0 || strcmp(key,"Fallback") == 0 || strcmp(key,"sh") == 0) { |
- ures_getNextString(subRes, NULL, &key, &status); |
- skipped++; |
- } |
-#if U_CHARSET_FAMILY==U_ASCII_FAMILY |
- /* This code only works on ASCII machines where the keys are stored in ASCII order */ |
- if(strcmp(test,key)) { |
- /* The first difference usually implies the place where things get out of sync */ |
- log_err("FAIL Language diff at offset %d, \"%s\" != \"%s\"\n", count, test, key); |
- } |
-#endif |
- |
- if(!strcmp(test,"in")) |
- log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); |
- if(!strcmp(test,"iw")) |
- log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); |
- if(!strcmp(test,"ji")) |
- log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); |
- if(!strcmp(test,"jw")) |
- log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); |
- if(!strcmp(test,"sh")) |
- log_err("FAIL getISOLanguages() has obsolete language code %s\n", test); |
- } |
- |
- expect -= skipped; /* Ignore the skipped resources from structLocale */ |
- |
- if(count!=expect) { |
- log_err("There is an error in getISOLanguages, got %d, expected %d (as per structLocale)\n", count, expect); |
- } |
- |
- subRes = ures_getByKey(res, "Countries", subRes, &status); |
- log_verbose("Testing ISO Countries"); |
- skipped = 0; |
- expect = ures_getSize(subRes) - 1; /* Skip ZZ */ |
- for(count = 0; *(str1+count) != 0; count++) |
- { |
- key = NULL; |
- test = *(str1+count); |
- do { |
- /* Skip over numeric UN tags. This API only returns ISO-3166 codes. */ |
- skipped += (key != NULL); |
- ures_getNextString(subRes, NULL, &key, &status); |
- } |
- while (key != NULL && strlen(key) != 2); |
- |
- if(key == NULL) |
- break; |
- /* TODO: Consider removing CS, which is deprecated */ |
- while(strcmp(key,"QO") == 0 || strcmp(key,"QU") == 0 || strcmp(key,"CS") == 0) { |
- ures_getNextString(subRes, NULL, &key, &status); |
- skipped++; |
- } |
-#if U_CHARSET_FAMILY==U_ASCII_FAMILY |
- /* This code only works on ASCII machines where the keys are stored in ASCII order */ |
- if(strcmp(test,key)) { |
- /* The first difference usually implies the place where things get out of sync */ |
- log_err("FAIL Country diff at offset %d, \"%s\" != \"%s\"\n", count, test, key); |
- } |
-#endif |
- if(!strcmp(test,"FX")) |
- log_err("FAIL getISOCountries() has obsolete country code %s\n", test); |
- if(!strcmp(test,"YU")) |
- log_err("FAIL getISOCountries() has obsolete country code %s\n", test); |
- if(!strcmp(test,"ZR")) |
- log_err("FAIL getISOCountries() has obsolete country code %s\n", test); |
- } |
- |
- ures_getNextString(subRes, NULL, &key, &status); |
- if (strcmp(key, "ZZ") != 0) { |
- log_err("ZZ was expected to be the last entry in structLocale, but got %s\n", key); |
- } |
-#if U_CHARSET_FAMILY==U_EBCDIC_FAMILY |
- /* On EBCDIC machines, the numbers are sorted last. Account for those in the skipped value too. */ |
- key = NULL; |
- do { |
- /* Skip over numeric UN tags. uloc_getISOCountries only returns ISO-3166 codes. */ |
- skipped += (key != NULL); |
- ures_getNextString(subRes, NULL, &key, &status); |
- } |
- while (U_SUCCESS(status) && key != NULL && strlen(key) != 2); |
-#endif |
- expect -= skipped; /* Ignore the skipped resources from structLocale */ |
- if(count!=expect) |
- { |
- log_err("There is an error in getISOCountries, got %d, expected %d \n", count, expect); |
- } |
- ures_close(subRes); |
- ures_close(res); |
-} |
-#endif |
- |
-static void setUpDataTable() |
-{ |
- int32_t i,j; |
- dataTable = (UChar***)(calloc(sizeof(UChar**),LOCALE_INFO_SIZE)); |
- |
- for (i = 0; i < LOCALE_INFO_SIZE; i++) { |
- dataTable[i] = (UChar**)(calloc(sizeof(UChar*),LOCALE_SIZE)); |
- for (j = 0; j < LOCALE_SIZE; j++){ |
- dataTable[i][j] = CharsToUChars(rawData2[i][j]); |
- } |
- } |
-} |
- |
-static void cleanUpDataTable() |
-{ |
- int32_t i,j; |
- if(dataTable != NULL) { |
- for (i=0; i<LOCALE_INFO_SIZE; i++) { |
- for(j = 0; j < LOCALE_SIZE; j++) { |
- free(dataTable[i][j]); |
- } |
- free(dataTable[i]); |
- } |
- free(dataTable); |
- } |
- dataTable = NULL; |
-} |
- |
-/** |
- * @bug 4011756 4011380 |
- */ |
-static void TestISO3Fallback() |
-{ |
- const char* test="xx_YY"; |
- |
- const char * result; |
- |
- result = uloc_getISO3Language(test); |
- |
- /* Conform to C API usage */ |
- |
- if (!result || (result[0] != 0)) |
- log_err("getISO3Language() on xx_YY returned %s instead of \"\""); |
- |
- result = uloc_getISO3Country(test); |
- |
- if (!result || (result[0] != 0)) |
- log_err("getISO3Country() on xx_YY returned %s instead of \"\""); |
-} |
- |
-/** |
- * @bug 4118587 |
- */ |
-static void TestSimpleDisplayNames() |
-{ |
- /* |
- This test is different from TestDisplayNames because TestDisplayNames checks |
- fallback behavior, combination of language and country names to form locale |
- names, and other stuff like that. This test just checks specific language |
- and country codes to make sure we have the correct names for them. |
- */ |
- char languageCodes[] [4] = { "he", "id", "iu", "ug", "yi", "za", "419" }; |
- const char* languageNames [] = { "Hebrew", "Indonesian", "Inuktitut", "Uyghur", "Yiddish", |
- "Zhuang", "419" }; |
- const char* inLocale [] = { "en_US", "zh_Hant"}; |
- UErrorCode status=U_ZERO_ERROR; |
- |
- int32_t i; |
- int32_t localeIndex = 0; |
- for (i = 0; i < 7; i++) { |
- UChar *testLang=0; |
- UChar *expectedLang=0; |
- int size=0; |
- |
- if (i == 6) { |
- localeIndex = 1; /* Use the second locale for the rest of the test. */ |
- } |
- |
- size=uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- testLang=(UChar*)malloc(sizeof(UChar) * (size + 1)); |
- uloc_getDisplayLanguage(languageCodes[i], inLocale[localeIndex], testLang, size + 1, &status); |
- } |
- expectedLang=(UChar*)malloc(sizeof(UChar) * (strlen(languageNames[i])+1)); |
- u_uastrcpy(expectedLang, languageNames[i]); |
- if (u_strcmp(testLang, expectedLang) != 0) |
- log_data_err("Got wrong display name for %s : Expected \"%s\", got \"%s\".\n", |
- languageCodes[i], languageNames[i], austrdup(testLang)); |
- free(testLang); |
- free(expectedLang); |
- } |
- |
-} |
- |
-/** |
- * @bug 4118595 |
- */ |
-static void TestUninstalledISO3Names() |
-{ |
- /* This test checks to make sure getISO3Language and getISO3Country work right |
- even for locales that are not installed. */ |
- static const char iso2Languages [][4] = { "am", "ba", "fy", "mr", "rn", |
- "ss", "tw", "zu" }; |
- static const char iso3Languages [][5] = { "amh", "bak", "fry", "mar", "run", |
- "ssw", "twi", "zul" }; |
- static const char iso2Countries [][6] = { "am_AF", "ba_BW", "fy_KZ", "mr_MO", "rn_MN", |
- "ss_SB", "tw_TC", "zu_ZW" }; |
- static const char iso3Countries [][4] = { "AFG", "BWA", "KAZ", "MAC", "MNG", |
- "SLB", "TCA", "ZWE" }; |
- int32_t i; |
- |
- for (i = 0; i < 8; i++) { |
- UErrorCode err = U_ZERO_ERROR; |
- const char *test; |
- test = uloc_getISO3Language(iso2Languages[i]); |
- if(strcmp(test, iso3Languages[i]) !=0 || U_FAILURE(err)) |
- log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n", |
- iso2Languages[i], iso3Languages[i], test, myErrorName(err)); |
- } |
- for (i = 0; i < 8; i++) { |
- UErrorCode err = U_ZERO_ERROR; |
- const char *test; |
- test = uloc_getISO3Country(iso2Countries[i]); |
- if(strcmp(test, iso3Countries[i]) !=0 || U_FAILURE(err)) |
- log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n", |
- iso2Countries[i], iso3Countries[i], test, myErrorName(err)); |
- } |
-} |
- |
- |
-static void TestVariantParsing() |
-{ |
- static const char* en_US_custom="en_US_De Anza_Cupertino_California_United States_Earth"; |
- static const char* dispName="English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)"; |
- static const char* dispVar="DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH"; |
- static const char* shortVariant="fr_FR_foo"; |
- static const char* bogusVariant="fr_FR__foo"; |
- static const char* bogusVariant2="fr_FR_foo_"; |
- static const char* bogusVariant3="fr_FR__foo_"; |
- |
- |
- UChar displayVar[100]; |
- UChar displayName[100]; |
- UErrorCode status=U_ZERO_ERROR; |
- UChar* got=0; |
- int32_t size=0; |
- size=uloc_getDisplayVariant(en_US_custom, "en_US", NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayVariant(en_US_custom, "en_US", got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- u_uastrcpy(displayVar, dispVar); |
- if(u_strcmp(got,displayVar)!=0) { |
- log_err("FAIL: getDisplayVariant() Wanted %s, got %s\n", dispVar, austrdup(got)); |
- } |
- size=0; |
- size=uloc_getDisplayName(en_US_custom, "en_US", NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayName(en_US_custom, "en_US", got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- u_uastrcpy(displayName, dispName); |
- if(u_strcmp(got,displayName)!=0) { |
- if (status == U_USING_DEFAULT_WARNING) { |
- log_data_err("FAIL: getDisplayName() got %s. Perhaps you are missing data?\n", u_errorName(status)); |
- } else { |
- log_err("FAIL: getDisplayName() Wanted %s, got %s\n", dispName, austrdup(got)); |
- } |
- } |
- |
- size=0; |
- status=U_ZERO_ERROR; |
- size=uloc_getDisplayVariant(shortVariant, NULL, NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayVariant(shortVariant, NULL, got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- if(strcmp(austrdup(got),"FOO")!=0) { |
- log_err("FAIL: getDisplayVariant() Wanted: foo Got: %s\n", austrdup(got)); |
- } |
- size=0; |
- status=U_ZERO_ERROR; |
- size=uloc_getDisplayVariant(bogusVariant, NULL, NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayVariant(bogusVariant, NULL, got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- if(strcmp(austrdup(got),"_FOO")!=0) { |
- log_err("FAIL: getDisplayVariant() Wanted: _FOO Got: %s\n", austrdup(got)); |
- } |
- size=0; |
- status=U_ZERO_ERROR; |
- size=uloc_getDisplayVariant(bogusVariant2, NULL, NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayVariant(bogusVariant2, NULL, got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- if(strcmp(austrdup(got),"FOO_")!=0) { |
- log_err("FAIL: getDisplayVariant() Wanted: FOO_ Got: %s\n", austrdup(got)); |
- } |
- size=0; |
- status=U_ZERO_ERROR; |
- size=uloc_getDisplayVariant(bogusVariant3, NULL, NULL, size, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR) { |
- status=U_ZERO_ERROR; |
- got=(UChar*)realloc(got, sizeof(UChar) * (size+1)); |
- uloc_getDisplayVariant(bogusVariant3, NULL, got, size + 1, &status); |
- } |
- else { |
- log_err("FAIL: Didn't get U_BUFFER_OVERFLOW_ERROR\n"); |
- } |
- if(strcmp(austrdup(got),"_FOO_")!=0) { |
- log_err("FAIL: getDisplayVariant() Wanted: _FOO_ Got: %s\n", austrdup(got)); |
- } |
- free(got); |
-} |
- |
- |
-static void TestObsoleteNames(void) |
-{ |
- int32_t i; |
- UErrorCode status = U_ZERO_ERROR; |
- char buff[256]; |
- |
- static const struct |
- { |
- char locale[9]; |
- char lang3[4]; |
- char lang[4]; |
- char ctry3[4]; |
- char ctry[4]; |
- } tests[] = |
- { |
- { "eng_USA", "eng", "en", "USA", "US" }, |
- { "kok", "kok", "kok", "", "" }, |
- { "in", "ind", "in", "", "" }, |
- { "id", "ind", "id", "", "" }, /* NO aliasing */ |
- { "sh", "srp", "sh", "", "" }, |
- { "zz_CS", "", "zz", "SCG", "CS" }, |
- { "zz_FX", "", "zz", "FXX", "FX" }, |
- { "zz_RO", "", "zz", "ROU", "RO" }, |
- { "zz_TP", "", "zz", "TMP", "TP" }, |
- { "zz_TL", "", "zz", "TLS", "TL" }, |
- { "zz_ZR", "", "zz", "ZAR", "ZR" }, |
- { "zz_FXX", "", "zz", "FXX", "FX" }, /* no aliasing. Doesn't go to PS(PSE). */ |
- { "zz_ROM", "", "zz", "ROU", "RO" }, |
- { "zz_ROU", "", "zz", "ROU", "RO" }, |
- { "zz_ZAR", "", "zz", "ZAR", "ZR" }, |
- { "zz_TMP", "", "zz", "TMP", "TP" }, |
- { "zz_TLS", "", "zz", "TLS", "TL" }, |
- { "zz_YUG", "", "zz", "YUG", "YU" }, |
- { "mlt_PSE", "mlt", "mt", "PSE", "PS" }, |
- { "iw", "heb", "iw", "", "" }, |
- { "ji", "yid", "ji", "", "" }, |
- { "jw", "jaw", "jw", "", "" }, |
- { "sh", "srp", "sh", "", "" }, |
- { "", "", "", "", "" } |
- }; |
- |
- for(i=0;tests[i].locale[0];i++) |
- { |
- const char *locale; |
- |
- locale = tests[i].locale; |
- log_verbose("** %s:\n", locale); |
- |
- status = U_ZERO_ERROR; |
- if(strcmp(tests[i].lang3,uloc_getISO3Language(locale))) |
- { |
- log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"\n", |
- locale, uloc_getISO3Language(locale), tests[i].lang3); |
- } |
- else |
- { |
- log_verbose(" uloc_getISO3Language()==\t\"%s\"\n", |
- uloc_getISO3Language(locale) ); |
- } |
- |
- status = U_ZERO_ERROR; |
- uloc_getLanguage(locale, buff, 256, &status); |
- if(U_FAILURE(status)) |
- { |
- log_err("FAIL: error getting language from %s\n", locale); |
- } |
- else |
- { |
- if(strcmp(buff,tests[i].lang)) |
- { |
- log_err("FAIL: uloc_getLanguage(%s)==\t\"%s\"\t expected \"%s\"\n", |
- locale, buff, tests[i].lang); |
- } |
- else |
- { |
- log_verbose(" uloc_getLanguage(%s)==\t%s\n", locale, buff); |
- } |
- } |
- if(strcmp(tests[i].lang3,uloc_getISO3Language(locale))) |
- { |
- log_err("FAIL: uloc_getISO3Language(%s)==\t\"%s\",\t expected \"%s\"\n", |
- locale, uloc_getISO3Language(locale), tests[i].lang3); |
- } |
- else |
- { |
- log_verbose(" uloc_getISO3Language()==\t\"%s\"\n", |
- uloc_getISO3Language(locale) ); |
- } |
- |
- if(strcmp(tests[i].ctry3,uloc_getISO3Country(locale))) |
- { |
- log_err("FAIL: uloc_getISO3Country(%s)==\t\"%s\",\t expected \"%s\"\n", |
- locale, uloc_getISO3Country(locale), tests[i].ctry3); |
- } |
- else |
- { |
- log_verbose(" uloc_getISO3Country()==\t\"%s\"\n", |
- uloc_getISO3Country(locale) ); |
- } |
- |
- status = U_ZERO_ERROR; |
- uloc_getCountry(locale, buff, 256, &status); |
- if(U_FAILURE(status)) |
- { |
- log_err("FAIL: error getting country from %s\n", locale); |
- } |
- else |
- { |
- if(strcmp(buff,tests[i].ctry)) |
- { |
- log_err("FAIL: uloc_getCountry(%s)==\t\"%s\"\t expected \"%s\"\n", |
- locale, buff, tests[i].ctry); |
- } |
- else |
- { |
- log_verbose(" uloc_getCountry(%s)==\t%s\n", locale, buff); |
- } |
- } |
- } |
- |
- if (uloc_getLCID("iw_IL") != uloc_getLCID("he_IL")) { |
- log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw_IL"), uloc_getLCID("he_IL")); |
- } |
- |
- if (uloc_getLCID("iw") != uloc_getLCID("he")) { |
- log_err("he,iw LCID mismatch: %X versus %X\n", uloc_getLCID("iw"), uloc_getLCID("he")); |
- } |
- |
-#if 0 |
- |
- i = uloc_getLanguage("kok",NULL,0,&icu_err); |
- if(U_FAILURE(icu_err)) |
- { |
- log_err("FAIL: Got %s trying to do uloc_getLanguage(kok)\n", u_errorName(icu_err)); |
- } |
- |
- icu_err = U_ZERO_ERROR; |
- uloc_getLanguage("kok",r1_buff,12,&icu_err); |
- if(U_FAILURE(icu_err)) |
- { |
- log_err("FAIL: Got %s trying to do uloc_getLanguage(kok, buff)\n", u_errorName(icu_err)); |
- } |
- |
- r1_addr = (char *)uloc_getISO3Language("kok"); |
- |
- icu_err = U_ZERO_ERROR; |
- if (strcmp(r1_buff,"kok") != 0) |
- { |
- log_err("FAIL: uloc_getLanguage(kok)==%s not kok\n",r1_buff); |
- line--; |
- } |
- r1_addr = (char *)uloc_getISO3Language("in"); |
- i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err); |
- if (strcmp(r1_buff,"id") != 0) |
- { |
- printf("uloc_getLanguage error (%s)\n",r1_buff); |
- line--; |
- } |
- r1_addr = (char *)uloc_getISO3Language("sh"); |
- i = uloc_getLanguage(r1_addr,r1_buff,12,&icu_err); |
- if (strcmp(r1_buff,"sr") != 0) |
- { |
- printf("uloc_getLanguage error (%s)\n",r1_buff); |
- line--; |
- } |
- |
- r1_addr = (char *)uloc_getISO3Country("zz_ZR"); |
- strcpy(p1_buff,"zz_"); |
- strcat(p1_buff,r1_addr); |
- i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err); |
- if (strcmp(r1_buff,"ZR") != 0) |
- { |
- printf("uloc_getCountry error (%s)\n",r1_buff); |
- line--; |
- } |
- r1_addr = (char *)uloc_getISO3Country("zz_FX"); |
- strcpy(p1_buff,"zz_"); |
- strcat(p1_buff,r1_addr); |
- i = uloc_getCountry(p1_buff,r1_buff,12,&icu_err); |
- if (strcmp(r1_buff,"FX") != 0) |
- { |
- printf("uloc_getCountry error (%s)\n",r1_buff); |
- line--; |
- } |
- |
-#endif |
- |
-} |
- |
-static void TestKeywordVariants(void) |
-{ |
- static const struct { |
- const char *localeID; |
- const char *expectedLocaleID; /* uloc_getName */ |
- const char *expectedLocaleIDNoKeywords; /* uloc_getBaseName */ |
- const char *expectedCanonicalID; /* uloc_canonicalize */ |
- const char *expectedKeywords[10]; |
- int32_t numKeywords; |
- UErrorCode expectedStatus; /* from uloc_openKeywords */ |
- } testCases[] = { |
- { |
- "de_DE@ currency = euro; C o ll A t i o n = Phonebook ; C alen dar = buddhist ", |
- "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", |
- "de_DE", |
- "de_DE@calendar=buddhist;collation=Phonebook;currency=euro", |
- {"calendar", "collation", "currency"}, |
- 3, |
- U_ZERO_ERROR |
- }, |
- { |
- "de_DE@euro", |
- "de_DE@euro", |
- "de_DE@euro", /* we probably should strip off the POSIX style variant @euro see #11690 */ |
- "de_DE@currency=EUR", |
- {"","","","","","",""}, |
- 0, |
- U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ |
- }, |
- { |
- "de_DE@euro;collation=phonebook", /* The POSIX style variant @euro cannot be combined with key=value? */ |
- "de_DE", /* getName returns de_DE - should be INVALID_FORMAT_ERROR? */ |
- "de_DE", /* getBaseName returns de_DE - should be INVALID_FORMAT_ERROR? see #11690 */ |
- "de_DE", /* canonicalize returns de_DE - should be INVALID_FORMAT_ERROR? */ |
- {"","","","","","",""}, |
- 0, |
- U_INVALID_FORMAT_ERROR |
- }, |
- { |
- "de_DE@collation=", |
- 0, /* expected getName to fail */ |
- "de_DE", /* getBaseName returns de_DE - should be INVALID_FORMAT_ERROR? see #11690 */ |
- 0, /* expected canonicalize to fail */ |
- {"","","","","","",""}, |
- 0, |
- U_INVALID_FORMAT_ERROR /* must have '=' after '@' */ |
- } |
- }; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- int32_t i = 0, j = 0; |
- int32_t resultLen = 0; |
- char buffer[256]; |
- UEnumeration *keywords; |
- int32_t keyCount = 0; |
- const char *keyword = NULL; |
- int32_t keywordLen = 0; |
- |
- for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- status = U_ZERO_ERROR; |
- *buffer = 0; |
- keywords = uloc_openKeywords(testCases[i].localeID, &status); |
- |
- if(status != testCases[i].expectedStatus) { |
- log_err("Expected to uloc_openKeywords(\"%s\") => status %s. Got %s instead\n", |
- testCases[i].localeID, |
- u_errorName(testCases[i].expectedStatus), u_errorName(status)); |
- } |
- status = U_ZERO_ERROR; |
- if(keywords) { |
- if((keyCount = uenum_count(keywords, &status)) != testCases[i].numKeywords) { |
- log_err("Expected to get %i keywords, got %i\n", testCases[i].numKeywords, keyCount); |
- } |
- if(keyCount) { |
- j = 0; |
- while((keyword = uenum_next(keywords, &keywordLen, &status))) { |
- if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { |
- log_err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword); |
- } |
- j++; |
- } |
- j = 0; |
- uenum_reset(keywords, &status); |
- while((keyword = uenum_next(keywords, &keywordLen, &status))) { |
- if(strcmp(keyword, testCases[i].expectedKeywords[j]) != 0) { |
- log_err("Expected to get keyword value %s, got %s\n", testCases[i].expectedKeywords[j], keyword); |
- } |
- j++; |
- } |
- } |
- uenum_close(keywords); |
- } |
- |
- status = U_ZERO_ERROR; |
- resultLen = uloc_getName(testCases[i].localeID, buffer, 256, &status); |
- if (U_SUCCESS(status)) { |
- if (testCases[i].expectedLocaleID == 0) { |
- log_err("Expected uloc_getName(\"%s\") to fail; got \"%s\"\n", |
- testCases[i].localeID, buffer); |
- } else if (uprv_strcmp(testCases[i].expectedLocaleID, buffer) != 0) { |
- log_err("Expected uloc_getName(\"%s\") => \"%s\"; got \"%s\"\n", |
- testCases[i].localeID, testCases[i].expectedLocaleID, buffer); |
- } |
- } else { |
- if (testCases[i].expectedLocaleID != 0) { |
- log_err("Expected uloc_getName(\"%s\") => \"%s\"; but returned error: %s\n", |
- testCases[i].localeID, testCases[i].expectedLocaleID, buffer, u_errorName(status)); |
- } |
- } |
- |
- status = U_ZERO_ERROR; |
- resultLen = uloc_getBaseName(testCases[i].localeID, buffer, 256, &status); |
- if (U_SUCCESS(status)) { |
- if (testCases[i].expectedLocaleIDNoKeywords == 0) { |
- log_err("Expected uloc_getBaseName(\"%s\") to fail; got \"%s\"\n", |
- testCases[i].localeID, buffer); |
- } else if (uprv_strcmp(testCases[i].expectedLocaleIDNoKeywords, buffer) != 0) { |
- log_err("Expected uloc_getBaseName(\"%s\") => \"%s\"; got \"%s\"\n", |
- testCases[i].localeID, testCases[i].expectedLocaleIDNoKeywords, buffer); |
- } |
- } else { |
- if (testCases[i].expectedLocaleIDNoKeywords != 0) { |
- log_err("Expected uloc_getBaseName(\"%s\") => \"%s\"; but returned error: %s\n", |
- testCases[i].localeID, testCases[i].expectedLocaleIDNoKeywords, buffer, u_errorName(status)); |
- } |
- } |
- |
- status = U_ZERO_ERROR; |
- resultLen = uloc_canonicalize(testCases[i].localeID, buffer, 256, &status); |
- if (U_SUCCESS(status)) { |
- if (testCases[i].expectedCanonicalID == 0) { |
- log_err("Expected uloc_canonicalize(\"%s\") to fail; got \"%s\"\n", |
- testCases[i].localeID, buffer); |
- } else if (uprv_strcmp(testCases[i].expectedCanonicalID, buffer) != 0) { |
- log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; got \"%s\"\n", |
- testCases[i].localeID, testCases[i].expectedCanonicalID, buffer); |
- } |
- } else { |
- if (testCases[i].expectedCanonicalID != 0) { |
- log_err("Expected uloc_canonicalize(\"%s\") => \"%s\"; but returned error: %s\n", |
- testCases[i].localeID, testCases[i].expectedCanonicalID, buffer, u_errorName(status)); |
- } |
- } |
- } |
-} |
- |
-static void TestKeywordVariantParsing(void) |
-{ |
- static const struct { |
- const char *localeID; |
- const char *keyword; |
- const char *expectedValue; |
- } testCases[] = { |
- { "de_DE@ C o ll A t i o n = Phonebook ", "c o ll a t i o n", "Phonebook" }, |
- { "de_DE", "collation", ""}, |
- { "de_DE@collation=PHONEBOOK", "collation", "PHONEBOOK" }, |
- { "de_DE@currency = euro; CoLLaTion = PHONEBOOk", "collatiON", "PHONEBOOk" }, |
- }; |
- |
- UErrorCode status = U_ZERO_ERROR; |
- |
- int32_t i = 0; |
- int32_t resultLen = 0; |
- char buffer[256]; |
- |
- for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- *buffer = 0; |
- resultLen = uloc_getKeywordValue(testCases[i].localeID, testCases[i].keyword, buffer, 256, &status); |
- (void)resultLen; /* Suppress set but not used warning. */ |
- if(uprv_strcmp(testCases[i].expectedValue, buffer) != 0) { |
- log_err("Expected to extract \"%s\" from \"%s\" for keyword \"%s\". Got \"%s\" instead\n", |
- testCases[i].expectedValue, testCases[i].localeID, testCases[i].keyword, buffer); |
- } |
- } |
-} |
- |
-static const struct { |
- const char *l; /* locale */ |
- const char *k; /* kw */ |
- const char *v; /* value */ |
- const char *x; /* expected */ |
-} kwSetTestCases[] = { |
-#if 1 |
- { "en_US", "calendar", "japanese", "en_US@calendar=japanese" }, |
- { "en_US@", "calendar", "japanese", "en_US@calendar=japanese" }, |
- { "en_US@calendar=islamic", "calendar", "japanese", "en_US@calendar=japanese" }, |
- { "en_US@calendar=slovakian", "calendar", "gregorian", "en_US@calendar=gregorian" }, /* don't know what this means, but it has the same # of chars as gregorian */ |
- { "en_US@calendar=gregorian", "calendar", "japanese", "en_US@calendar=japanese" }, |
- { "de", "Currency", "CHF", "de@currency=CHF" }, |
- { "de", "Currency", "CHF", "de@currency=CHF" }, |
- |
- { "en_US@collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, |
- { "en_US@calendar=japanese", "collation", "phonebook", "en_US@calendar=japanese;collation=phonebook" }, |
- { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" }, |
- { "en_US@calendar=gregorian;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, |
- { "en_US@calendar=slovakian;collation=phonebook", "calendar", "gregorian", "en_US@calendar=gregorian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */ |
- { "en_US@calendar=slovakian;collation=videobook", "collation", "phonebook", "en_US@calendar=slovakian;collation=phonebook" }, /* don't know what this means, but it has the same # of chars as gregorian */ |
- { "en_US@calendar=islamic;collation=phonebook", "calendar", "japanese", "en_US@calendar=japanese;collation=phonebook" }, |
- { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" }, |
-#endif |
-#if 1 |
- { "mt@a=0;b=1;c=2;d=3", "c","j", "mt@a=0;b=1;c=j;d=3" }, |
- { "mt@a=0;b=1;c=2;d=3", "x","j", "mt@a=0;b=1;c=2;d=3;x=j" }, |
- { "mt@a=0;b=1;c=2;d=3", "a","f", "mt@a=f;b=1;c=2;d=3" }, |
- { "mt@a=0;aa=1;aaa=3", "a","x", "mt@a=x;aa=1;aaa=3" }, |
- { "mt@a=0;aa=1;aaa=3", "aa","x", "mt@a=0;aa=x;aaa=3" }, |
- { "mt@a=0;aa=1;aaa=3", "aaa","x", "mt@a=0;aa=1;aaa=x" }, |
- { "mt@a=0;aa=1;aaa=3", "a","yy", "mt@a=yy;aa=1;aaa=3" }, |
- { "mt@a=0;aa=1;aaa=3", "aa","yy", "mt@a=0;aa=yy;aaa=3" }, |
- { "mt@a=0;aa=1;aaa=3", "aaa","yy", "mt@a=0;aa=1;aaa=yy" }, |
-#endif |
-#if 1 |
- /* removal tests */ |
- /* 1. removal of item at end */ |
- { "de@collation=phonebook;currency=CHF", "currency", "", "de@collation=phonebook" }, |
- { "de@collation=phonebook;currency=CHF", "currency", NULL, "de@collation=phonebook" }, |
- /* 2. removal of item at beginning */ |
- { "de@collation=phonebook;currency=CHF", "collation", "", "de@currency=CHF" }, |
- { "de@collation=phonebook;currency=CHF", "collation", NULL, "de@currency=CHF" }, |
- /* 3. removal of an item not there */ |
- { "de@collation=phonebook;currency=CHF", "calendar", NULL, "de@collation=phonebook;currency=CHF" }, |
- /* 4. removal of only item */ |
- { "de@collation=phonebook", "collation", NULL, "de" }, |
-#endif |
- { "de@collation=phonebook", "Currency", "CHF", "de@collation=phonebook;currency=CHF" } |
-}; |
- |
- |
-static void TestKeywordSet(void) |
-{ |
- int32_t i = 0; |
- int32_t resultLen = 0; |
- char buffer[1024]; |
- |
- char cbuffer[1024]; |
- |
- for(i = 0; i < sizeof(kwSetTestCases)/sizeof(kwSetTestCases[0]); i++) { |
- UErrorCode status = U_ZERO_ERROR; |
- memset(buffer,'%',1023); |
- strcpy(buffer, kwSetTestCases[i].l); |
- |
- uloc_canonicalize(kwSetTestCases[i].l, cbuffer, 1023, &status); |
- if(strcmp(buffer,cbuffer)) { |
- log_verbose("note: [%d] wasn't canonical, should be: '%s' not '%s'. Won't check for canonicity in output.\n", i, cbuffer, buffer); |
- } |
- /* sanity check test case results for canonicity */ |
- uloc_canonicalize(kwSetTestCases[i].x, cbuffer, 1023, &status); |
- if(strcmp(kwSetTestCases[i].x,cbuffer)) { |
- log_err("%s:%d: ERROR: kwSetTestCases[%d].x = '%s', should be %s (must be canonical)\n", __FILE__, __LINE__, i, kwSetTestCases[i].x, cbuffer); |
- } |
- |
- resultLen = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, 1023, &status); |
- if(U_FAILURE(status)) { |
- log_err("Err on test case %d: got error %s\n", i, u_errorName(status)); |
- continue; |
- } |
- if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=resultLen)) { |
- log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, |
- kwSetTestCases[i].v, buffer, resultLen, kwSetTestCases[i].x, strlen(buffer)); |
- } else { |
- log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v,buffer); |
- } |
- } |
-} |
- |
-static void TestKeywordSetError(void) |
-{ |
- char buffer[1024]; |
- UErrorCode status; |
- int32_t res; |
- int32_t i; |
- int32_t blen; |
- |
- /* 0-test whether an error condition modifies the buffer at all */ |
- blen=0; |
- i=0; |
- memset(buffer,'%',1023); |
- status = U_ZERO_ERROR; |
- res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); |
- if(status != U_ILLEGAL_ARGUMENT_ERROR) { |
- log_err("expected illegal err got %s\n", u_errorName(status)); |
- return; |
- } |
- /* if(res!=strlen(kwSetTestCases[i].x)) { |
- log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); |
- return; |
- } */ |
- if(buffer[blen]!='%') { |
- log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]); |
- return; |
- } |
- log_verbose("0-buffer modify OK\n"); |
- |
- for(i=0;i<=2;i++) { |
- /* 1- test a short buffer with growing text */ |
- blen=(int32_t)strlen(kwSetTestCases[i].l)+1; |
- memset(buffer,'%',1023); |
- strcpy(buffer,kwSetTestCases[i].l); |
- status = U_ZERO_ERROR; |
- res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); |
- if(status != U_BUFFER_OVERFLOW_ERROR) { |
- log_err("expected buffer overflow on buffer %d got %s, len %d (%s + [%s=%s])\n", blen, u_errorName(status), res, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v); |
- return; |
- } |
- if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { |
- log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); |
- return; |
- } |
- if(buffer[blen]!='%') { |
- log_err("Buffer byte %d was modified: now %c\n", blen, buffer[blen]); |
- return; |
- } |
- log_verbose("1/%d-buffer modify OK\n",i); |
- } |
- |
- for(i=3;i<=4;i++) { |
- /* 2- test a short buffer - text the same size or shrinking */ |
- blen=(int32_t)strlen(kwSetTestCases[i].l)+1; |
- memset(buffer,'%',1023); |
- strcpy(buffer,kwSetTestCases[i].l); |
- status = U_ZERO_ERROR; |
- res = uloc_setKeywordValue(kwSetTestCases[i].k, kwSetTestCases[i].v, buffer, blen, &status); |
- if(status != U_ZERO_ERROR) { |
- log_err("expected zero error got %s\n", u_errorName(status)); |
- return; |
- } |
- if(buffer[blen+1]!='%') { |
- log_err("Buffer byte %d was modified: now %c\n", blen+1, buffer[blen+1]); |
- return; |
- } |
- if(res!=(int32_t)strlen(kwSetTestCases[i].x)) { |
- log_err("expected result %d got %d\n", strlen(kwSetTestCases[i].x), res); |
- return; |
- } |
- if(strcmp(buffer,kwSetTestCases[i].x) || ((int32_t)strlen(buffer)!=res)) { |
- log_err("FAIL: #%d: %s + [%s=%s] -> %s (%d) expected %s (%d)\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, |
- kwSetTestCases[i].v, buffer, res, kwSetTestCases[i].x, strlen(buffer)); |
- } else { |
- log_verbose("pass: #%d: %s + [%s=%s] -> %s\n", i, kwSetTestCases[i].l, kwSetTestCases[i].k, kwSetTestCases[i].v, |
- buffer); |
- } |
- log_verbose("2/%d-buffer modify OK\n",i); |
- } |
-} |
- |
-static int32_t _canonicalize(int32_t selector, /* 0==getName, 1==canonicalize */ |
- const char* localeID, |
- char* result, |
- int32_t resultCapacity, |
- UErrorCode* ec) { |
- /* YOU can change this to use function pointers if you like */ |
- switch (selector) { |
- case 0: |
- return uloc_getName(localeID, result, resultCapacity, ec); |
- case 1: |
- return uloc_canonicalize(localeID, result, resultCapacity, ec); |
- default: |
- return -1; |
- } |
-} |
- |
-static void TestCanonicalization(void) |
-{ |
- static const struct { |
- const char *localeID; /* input */ |
- const char *getNameID; /* expected getName() result */ |
- const char *canonicalID; /* expected canonicalize() result */ |
- } testCases[] = { |
- { "ca_ES_PREEURO-with-extra-stuff-that really doesn't make any sense-unless-you're trying to increase code coverage", |
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE", |
- "ca_ES_PREEURO_WITH_EXTRA_STUFF_THAT REALLY DOESN'T MAKE ANY SENSE_UNLESS_YOU'RE TRYING TO INCREASE CODE COVERAGE"}, |
- { "ca_ES_PREEURO", "ca_ES_PREEURO", "ca_ES@currency=ESP" }, |
- { "de_AT_PREEURO", "de_AT_PREEURO", "de_AT@currency=ATS" }, |
- { "de_DE_PREEURO", "de_DE_PREEURO", "de_DE@currency=DEM" }, |
- { "de_LU_PREEURO", "de_LU_PREEURO", "de_LU@currency=LUF" }, |
- { "el_GR_PREEURO", "el_GR_PREEURO", "el_GR@currency=GRD" }, |
- { "en_BE_PREEURO", "en_BE_PREEURO", "en_BE@currency=BEF" }, |
- { "en_IE_PREEURO", "en_IE_PREEURO", "en_IE@currency=IEP" }, |
- { "es_ES_PREEURO", "es_ES_PREEURO", "es_ES@currency=ESP" }, |
- { "eu_ES_PREEURO", "eu_ES_PREEURO", "eu_ES@currency=ESP" }, |
- { "fi_FI_PREEURO", "fi_FI_PREEURO", "fi_FI@currency=FIM" }, |
- { "fr_BE_PREEURO", "fr_BE_PREEURO", "fr_BE@currency=BEF" }, |
- { "fr_FR_PREEURO", "fr_FR_PREEURO", "fr_FR@currency=FRF" }, |
- { "fr_LU_PREEURO", "fr_LU_PREEURO", "fr_LU@currency=LUF" }, |
- { "ga_IE_PREEURO", "ga_IE_PREEURO", "ga_IE@currency=IEP" }, |
- { "gl_ES_PREEURO", "gl_ES_PREEURO", "gl_ES@currency=ESP" }, |
- { "it_IT_PREEURO", "it_IT_PREEURO", "it_IT@currency=ITL" }, |
- { "nl_BE_PREEURO", "nl_BE_PREEURO", "nl_BE@currency=BEF" }, |
- { "nl_NL_PREEURO", "nl_NL_PREEURO", "nl_NL@currency=NLG" }, |
- { "pt_PT_PREEURO", "pt_PT_PREEURO", "pt_PT@currency=PTE" }, |
- { "de__PHONEBOOK", "de__PHONEBOOK", "de@collation=phonebook" }, |
- { "en_GB_EURO", "en_GB_EURO", "en_GB@currency=EUR" }, |
- { "en_GB@EURO", "en_GB@EURO", "en_GB@currency=EUR" }, /* POSIX ID */ |
- { "es__TRADITIONAL", "es__TRADITIONAL", "es@collation=traditional" }, |
- { "hi__DIRECT", "hi__DIRECT", "hi@collation=direct" }, |
- { "ja_JP_TRADITIONAL", "ja_JP_TRADITIONAL", "ja_JP@calendar=japanese" }, |
- { "th_TH_TRADITIONAL", "th_TH_TRADITIONAL", "th_TH@calendar=buddhist" }, |
- { "zh_TW_STROKE", "zh_TW_STROKE", "zh_TW@collation=stroke" }, |
- { "zh__PINYIN", "zh__PINYIN", "zh@collation=pinyin" }, |
- { "zh@collation=pinyin", "zh@collation=pinyin", "zh@collation=pinyin" }, |
- { "zh_CN@collation=pinyin", "zh_CN@collation=pinyin", "zh_CN@collation=pinyin" }, |
- { "zh_CN_STROKE", "zh_CN_STROKE", "zh_CN@collation=stroke" }, |
- { "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin", "zh_CN_CA@collation=pinyin" }, |
- { "en_US_POSIX", "en_US_POSIX", "en_US_POSIX" }, |
- { "hy_AM_REVISED", "hy_AM_REVISED", "hy_AM_REVISED" }, |
- { "no_NO_NY", "no_NO_NY", "no_NO_NY" /* not: "nn_NO" [alan ICU3.0] */ }, |
- { "no@ny", "no@ny", "no__NY" /* not: "nn" [alan ICU3.0] */ }, /* POSIX ID */ |
- { "no-no.utf32@B", "no_NO.utf32@B", "no_NO_B" /* not: "nb_NO_B" [alan ICU3.0] */ }, /* POSIX ID */ |
- { "qz-qz@Euro", "qz_QZ@Euro", "qz_QZ@currency=EUR" }, /* qz-qz uses private use iso codes */ |
- { "en-BOONT", "en__BOONT", "en__BOONT" }, /* registered name */ |
- { "de-1901", "de__1901", "de__1901" }, /* registered name */ |
- { "de-1906", "de__1906", "de__1906" }, /* registered name */ |
- { "sr-SP-Cyrl", "sr_SP_CYRL", "sr_Cyrl_RS" }, /* .NET name */ |
- { "sr-SP-Latn", "sr_SP_LATN", "sr_Latn_RS" }, /* .NET name */ |
- { "sr_YU_CYRILLIC", "sr_YU_CYRILLIC", "sr_Cyrl_RS" }, /* Linux name */ |
- { "uz-UZ-Cyrl", "uz_UZ_CYRL", "uz_Cyrl_UZ" }, /* .NET name */ |
- { "uz-UZ-Latn", "uz_UZ_LATN", "uz_Latn_UZ" }, /* .NET name */ |
- { "zh-CHS", "zh_CHS", "zh_Hans" }, /* .NET name */ |
- { "zh-CHT", "zh_CHT", "zh_Hant" }, /* .NET name This may change back to zh_Hant */ |
- |
- /* posix behavior that used to be performed by getName */ |
- { "mr.utf8", "mr.utf8", "mr" }, |
- { "de-tv.koi8r", "de_TV.koi8r", "de_TV" }, |
- { "x-piglatin_ML.MBE", "x-piglatin_ML.MBE", "x-piglatin_ML" }, |
- { "i-cherokee_US.utf7", "i-cherokee_US.utf7", "i-cherokee_US" }, |
- { "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA" }, |
- { "no-no-ny.utf8@B", "no_NO_NY.utf8@B", "no_NO_NY_B" /* not: "nn_NO" [alan ICU3.0] */ }, /* @ ignored unless variant is empty */ |
- |
- /* fleshing out canonicalization */ |
- /* trim space and sort keywords, ';' is separator so not present at end in canonical form */ |
- { "en_Hant_IL_VALLEY_GIRL@ currency = EUR; calendar = Japanese ;", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, |
- /* already-canonical ids are not changed */ |
- { "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR", "en_Hant_IL_VALLEY_GIRL@calendar=Japanese;currency=EUR" }, |
- /* PRE_EURO and EURO conversions don't affect other keywords */ |
- { "es_ES_PREEURO@CALendar=Japanese", "es_ES_PREEURO@calendar=Japanese", "es_ES@calendar=Japanese;currency=ESP" }, |
- { "es_ES_EURO@SHOUT=zipeedeedoodah", "es_ES_EURO@shout=zipeedeedoodah", "es_ES@currency=EUR;shout=zipeedeedoodah" }, |
- /* currency keyword overrides PRE_EURO and EURO currency */ |
- { "es_ES_PREEURO@currency=EUR", "es_ES_PREEURO@currency=EUR", "es_ES@currency=EUR" }, |
- { "es_ES_EURO@currency=ESP", "es_ES_EURO@currency=ESP", "es_ES@currency=ESP" }, |
- /* norwegian is just too weird, if we handle things in their full generality */ |
- { "no-Hant-GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$", "no_Hant_GB_NY@currency=$$$" /* not: "nn_Hant_GB@currency=$$$" [alan ICU3.0] */ }, |
- |
- /* test cases reflecting internal resource bundle usage */ |
- { "root@kw=foo", "root@kw=foo", "root@kw=foo" }, |
- { "@calendar=gregorian", "@calendar=gregorian", "@calendar=gregorian" }, |
- { "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese", "ja_JP@calendar=Japanese" }, |
- { "ja_JP", "ja_JP", "ja_JP" }, |
- |
- /* test case for "i-default" */ |
- { "i-default", "en@x=i-default", "en@x=i-default" } |
- }; |
- |
- static const char* label[] = { "getName", "canonicalize" }; |
- |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t i, j, resultLen = 0, origResultLen; |
- char buffer[256]; |
- |
- for (i=0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- for (j=0; j<2; ++j) { |
- const char* expected = (j==0) ? testCases[i].getNameID : testCases[i].canonicalID; |
- *buffer = 0; |
- status = U_ZERO_ERROR; |
- |
- if (expected == NULL) { |
- expected = uloc_getDefault(); |
- } |
- |
- /* log_verbose("testing %s -> %s\n", testCases[i], testCases[i].canonicalID); */ |
- origResultLen = _canonicalize(j, testCases[i].localeID, NULL, 0, &status); |
- if (status != U_BUFFER_OVERFLOW_ERROR) { |
- log_err("FAIL: uloc_%s(%s) => %s, expected U_BUFFER_OVERFLOW_ERROR\n", |
- label[j], testCases[i].localeID, u_errorName(status)); |
- continue; |
- } |
- status = U_ZERO_ERROR; |
- resultLen = _canonicalize(j, testCases[i].localeID, buffer, sizeof(buffer), &status); |
- if (U_FAILURE(status)) { |
- log_err("FAIL: uloc_%s(%s) => %s, expected U_ZERO_ERROR\n", |
- label[j], testCases[i].localeID, u_errorName(status)); |
- continue; |
- } |
- if(uprv_strcmp(expected, buffer) != 0) { |
- log_err("FAIL: uloc_%s(%s) => \"%s\", expected \"%s\"\n", |
- label[j], testCases[i].localeID, buffer, expected); |
- } else { |
- log_verbose("Ok: uloc_%s(%s) => \"%s\"\n", |
- label[j], testCases[i].localeID, buffer); |
- } |
- if (resultLen != (int32_t)strlen(buffer)) { |
- log_err("FAIL: uloc_%s(%s) => len %d, expected len %d\n", |
- label[j], testCases[i].localeID, resultLen, strlen(buffer)); |
- } |
- if (origResultLen != resultLen) { |
- log_err("FAIL: uloc_%s(%s) => preflight len %d != actual len %d\n", |
- label[j], testCases[i].localeID, origResultLen, resultLen); |
- } |
- } |
- } |
-} |
- |
-static void TestDisplayKeywords(void) |
-{ |
- int32_t i; |
- |
- static const struct { |
- const char *localeID; |
- const char *displayLocale; |
- UChar displayKeyword[200]; |
- } testCases[] = { |
- { "ca_ES@currency=ESP", "de_AT", |
- {0x0057, 0x00e4, 0x0068, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000}, |
- }, |
- { "ja_JP@calendar=japanese", "de", |
- { 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000} |
- }, |
- { "de_DE@collation=traditional", "de_DE", |
- {0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000} |
- }, |
- }; |
- for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- UErrorCode status = U_ZERO_ERROR; |
- const char* keyword =NULL; |
- int32_t keywordLen = 0; |
- int32_t keywordCount = 0; |
- UChar *displayKeyword=NULL; |
- int32_t displayKeywordLen = 0; |
- UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status); |
- for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){ |
- if(U_FAILURE(status)){ |
- log_err("uloc_getKeywords failed for locale id: %s with error : %s \n", testCases[i].localeID, u_errorName(status)); |
- break; |
- } |
- /* the uenum_next returns NUL terminated string */ |
- keyword = uenum_next(keywordEnum, &keywordLen, &status); |
- /* fetch the displayKeyword */ |
- displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status = U_ZERO_ERROR; |
- displayKeywordLen++; /* for null termination */ |
- displayKeyword = (UChar*) malloc(displayKeywordLen * U_SIZEOF_UCHAR); |
- displayKeywordLen = uloc_getDisplayKeyword(keyword, testCases[i].displayLocale, displayKeyword, displayKeywordLen, &status); |
- if(U_FAILURE(status)){ |
- log_err("uloc_getDisplayKeyword filed for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); |
- break; |
- } |
- if(u_strncmp(displayKeyword, testCases[i].displayKeyword, displayKeywordLen)!=0){ |
- if (status == U_USING_DEFAULT_WARNING) { |
- log_data_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s . Got error: %s. Perhaps you are missing data?\n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); |
- } else { |
- log_err("uloc_getDisplayKeyword did not get the expected value for keyword : %s in locale id: %s for display locale: %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale); |
- } |
- break; |
- } |
- }else{ |
- log_err("uloc_getDisplayKeyword did not return the expected error. Error: %s\n", u_errorName(status)); |
- } |
- |
- free(displayKeyword); |
- |
- } |
- uenum_close(keywordEnum); |
- } |
-} |
- |
-static void TestDisplayKeywordValues(void){ |
- int32_t i; |
- |
- static const struct { |
- const char *localeID; |
- const char *displayLocale; |
- UChar displayKeywordValue[500]; |
- } testCases[] = { |
- { "ca_ES@currency=ESP", "de_AT", |
- {0x0053, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x0050, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0000} |
- }, |
- { "de_AT@currency=ATS", "fr_FR", |
- {0x0073, 0x0063, 0x0068, 0x0069, 0x006c, 0x006c, 0x0069, 0x006e, 0x0067, 0x0020, 0x0061, 0x0075, 0x0074, 0x0072, 0x0069, 0x0063, 0x0068, 0x0069, 0x0065, 0x006e, 0x0000} |
- }, |
- { "de_DE@currency=DEM", "it", |
- {0x006d, 0x0061, 0x0072, 0x0063, 0x006f, 0x0020, 0x0074, 0x0065, 0x0064, 0x0065, 0x0073, 0x0063, 0x006f, 0x0000} |
- }, |
- { "el_GR@currency=GRD", "en", |
- {0x0047, 0x0072, 0x0065, 0x0065, 0x006b, 0x0020, 0x0044, 0x0072, 0x0061, 0x0063, 0x0068, 0x006d, 0x0061, 0x0000} |
- }, |
- { "eu_ES@currency=ESP", "it_IT", |
- {0x0070, 0x0065, 0x0073, 0x0065, 0x0074, 0x0061, 0x0020, 0x0073, 0x0070, 0x0061, 0x0067, 0x006e, 0x006f, 0x006c, 0x0061, 0x0000} |
- }, |
- { "de@collation=phonebook", "es", |
- {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} |
- }, |
- |
- { "de_DE@collation=phonebook", "es", |
- {0x006F, 0x0072, 0x0064, 0x0065, 0x006E, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x0069, 0x0073, 0x0074, 0x00ED, 0x006E, 0x0020, 0x0074, 0x0065, 0x006C, 0x0065, 0x0066, 0x00F3, 0x006E, 0x0069, 0x0063, 0x006F, 0x0000} |
- }, |
- { "es_ES@collation=traditional","de", |
- {0x0054, 0x0072, 0x0061, 0x0064, 0x0069, 0x0074, 0x0069, 0x006f, 0x006e, 0x0065, 0x006c, 0x006c, 0x0065, 0x0020, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0072, 0x0065, 0x0067, 0x0065, 0x006c, 0x006e, 0x0000} |
- }, |
- { "ja_JP@calendar=japanese", "de", |
- {0x004a, 0x0061, 0x0070, 0x0061, 0x006e, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000} |
- }, |
- }; |
- for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- UErrorCode status = U_ZERO_ERROR; |
- const char* keyword =NULL; |
- int32_t keywordLen = 0; |
- int32_t keywordCount = 0; |
- UChar *displayKeywordValue = NULL; |
- int32_t displayKeywordValueLen = 0; |
- UEnumeration* keywordEnum = uloc_openKeywords(testCases[i].localeID, &status); |
- for(keywordCount = uenum_count(keywordEnum, &status); keywordCount > 0 ; keywordCount--){ |
- if(U_FAILURE(status)){ |
- log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", testCases[i].localeID, testCases[i].displayLocale, u_errorName(status)); |
- break; |
- } |
- /* the uenum_next returns NUL terminated string */ |
- keyword = uenum_next(keywordEnum, &keywordLen, &status); |
- |
- /* fetch the displayKeywordValue */ |
- displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status = U_ZERO_ERROR; |
- displayKeywordValueLen++; /* for null termination */ |
- displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR); |
- displayKeywordValueLen = uloc_getDisplayKeywordValue(testCases[i].localeID, keyword, testCases[i].displayLocale, displayKeywordValue, displayKeywordValueLen, &status); |
- if(U_FAILURE(status)){ |
- log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); |
- break; |
- } |
- if(u_strncmp(displayKeywordValue, testCases[i].displayKeywordValue, displayKeywordValueLen)!=0){ |
- if (status == U_USING_DEFAULT_WARNING) { |
- log_data_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s Perhaps you are missing data\n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); |
- } else { |
- log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s with error : %s \n", testCases[i].localeID, keyword, testCases[i].displayLocale, u_errorName(status)); |
- } |
- break; |
- } |
- }else{ |
- log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status)); |
- } |
- free(displayKeywordValue); |
- } |
- uenum_close(keywordEnum); |
- } |
- { |
- /* test a multiple keywords */ |
- UErrorCode status = U_ZERO_ERROR; |
- const char* keyword =NULL; |
- int32_t keywordLen = 0; |
- int32_t keywordCount = 0; |
- const char* localeID = "es@collation=phonebook;calendar=buddhist;currency=DEM"; |
- const char* displayLocale = "de"; |
- static const UChar expected[][50] = { |
- {0x0042, 0x0075, 0x0064, 0x0064, 0x0068, 0x0069, 0x0073, 0x0074, 0x0069, 0x0073, 0x0063, 0x0068, 0x0065, 0x0072, 0x0020, 0x004b, 0x0061, 0x006c, 0x0065, 0x006e, 0x0064, 0x0065, 0x0072, 0x0000}, |
- |
- {0x0054, 0x0065, 0x006c, 0x0065, 0x0066, 0x006f, 0x006e, 0x0062, 0x0075, 0x0063, 0x0068, 0x002d, 0x0053, 0x006f, 0x0072, 0x0074, 0x0069, 0x0065, 0x0072, 0x0075, 0x006e, 0x0067, 0x0000}, |
- {0x0044, 0x0065, 0x0075, 0x0074, 0x0073, 0x0063, 0x0068, 0x0065, 0x0020, 0x004d, 0x0061, 0x0072, 0x006b, 0x0000}, |
- }; |
- |
- UEnumeration* keywordEnum = uloc_openKeywords(localeID, &status); |
- |
- for(keywordCount = 0; keywordCount < uenum_count(keywordEnum, &status) ; keywordCount++){ |
- UChar *displayKeywordValue = NULL; |
- int32_t displayKeywordValueLen = 0; |
- if(U_FAILURE(status)){ |
- log_err("uloc_getKeywords failed for locale id: %s in display locale: % with error : %s \n", localeID, displayLocale, u_errorName(status)); |
- break; |
- } |
- /* the uenum_next returns NUL terminated string */ |
- keyword = uenum_next(keywordEnum, &keywordLen, &status); |
- |
- /* fetch the displayKeywordValue */ |
- displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); |
- if(status==U_BUFFER_OVERFLOW_ERROR){ |
- status = U_ZERO_ERROR; |
- displayKeywordValueLen++; /* for null termination */ |
- displayKeywordValue = (UChar*)malloc(displayKeywordValueLen * U_SIZEOF_UCHAR); |
- displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, keyword, displayLocale, displayKeywordValue, displayKeywordValueLen, &status); |
- if(U_FAILURE(status)){ |
- log_err("uloc_getDisplayKeywordValue failed for keyword : %s in locale id: %s for display locale: %s with error : %s \n", localeID, keyword, displayLocale, u_errorName(status)); |
- break; |
- } |
- if(u_strncmp(displayKeywordValue, expected[keywordCount], displayKeywordValueLen)!=0){ |
- if (status == U_USING_DEFAULT_WARNING) { |
- log_data_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s got error: %s. Perhaps you are missing data?\n", localeID, keyword, displayLocale, u_errorName(status)); |
- } else { |
- log_err("uloc_getDisplayKeywordValue did not return the expected value keyword : %s in locale id: %s for display locale: %s \n", localeID, keyword, displayLocale); |
- } |
- break; |
- } |
- }else{ |
- log_err("uloc_getDisplayKeywordValue did not return the expected error. Error: %s\n", u_errorName(status)); |
- } |
- free(displayKeywordValue); |
- } |
- uenum_close(keywordEnum); |
- |
- } |
- { |
- /* Test non existent keywords */ |
- UErrorCode status = U_ZERO_ERROR; |
- const char* localeID = "es"; |
- const char* displayLocale = "de"; |
- UChar *displayKeywordValue = NULL; |
- int32_t displayKeywordValueLen = 0; |
- |
- /* fetch the displayKeywordValue */ |
- displayKeywordValueLen = uloc_getDisplayKeywordValue(localeID, "calendar", displayLocale, displayKeywordValue, displayKeywordValueLen, &status); |
- if(U_FAILURE(status)) { |
- log_err("uloc_getDisplaykeywordValue returned error status %s\n", u_errorName(status)); |
- } else if(displayKeywordValueLen != 0) { |
- log_err("uloc_getDisplaykeywordValue returned %d should be 0 \n", displayKeywordValueLen); |
- } |
- } |
-} |
- |
- |
-static void TestGetBaseName(void) { |
- static const struct { |
- const char *localeID; |
- const char *baseName; |
- } testCases[] = { |
- { "de_DE@ C o ll A t i o n = Phonebook ", "de_DE" }, |
- { "de@currency = euro; CoLLaTion = PHONEBOOk", "de" }, |
- { "ja@calendar = buddhist", "ja" } |
- }; |
- |
- int32_t i = 0, baseNameLen = 0; |
- char baseName[256]; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- for(i = 0; i < sizeof(testCases)/sizeof(testCases[0]); i++) { |
- baseNameLen = uloc_getBaseName(testCases[i].localeID, baseName, 256, &status); |
- (void)baseNameLen; /* Suppress set but not used warning. */ |
- if(strcmp(testCases[i].baseName, baseName)) { |
- log_err("For locale \"%s\" expected baseName \"%s\", but got \"%s\"\n", |
- testCases[i].localeID, testCases[i].baseName, baseName); |
- return; |
- } |
- } |
-} |
- |
-static void TestTrailingNull(void) { |
- const char* localeId = "zh_Hans"; |
- UChar buffer[128]; /* sufficient for this test */ |
- int32_t len; |
- UErrorCode status = U_ZERO_ERROR; |
- int i; |
- |
- len = uloc_getDisplayName(localeId, localeId, buffer, 128, &status); |
- if (len > 128) { |
- log_err("buffer too small"); |
- return; |
- } |
- |
- for (i = 0; i < len; ++i) { |
- if (buffer[i] == 0) { |
- log_err("name contained null"); |
- return; |
- } |
- } |
-} |
- |
-/* Jitterbug 4115 */ |
-static void TestDisplayNameWarning(void) { |
- UChar name[256]; |
- int32_t size; |
- UErrorCode status = U_ZERO_ERROR; |
- |
- size = uloc_getDisplayLanguage("qqq", "kl", name, sizeof(name)/sizeof(name[0]), &status); |
- (void)size; /* Suppress set but not used warning. */ |
- if (status != U_USING_DEFAULT_WARNING) { |
- log_err("For language \"qqq\" in locale \"kl\", expecting U_USING_DEFAULT_WARNING, but got %s\n", |
- u_errorName(status)); |
- } |
-} |
- |
- |
-/** |
- * Compare two locale IDs. If they are equal, return 0. If `string' |
- * starts with `prefix' plus an additional element, that is, string == |
- * prefix + '_' + x, then return 1. Otherwise return a value < 0. |
- */ |
-static UBool _loccmp(const char* string, const char* prefix) { |
- int32_t slen = (int32_t)uprv_strlen(string), |
- plen = (int32_t)uprv_strlen(prefix); |
- int32_t c = uprv_strncmp(string, prefix, plen); |
- /* 'root' is less than everything */ |
- if (uprv_strcmp(prefix, "root") == 0) { |
- return (uprv_strcmp(string, "root") == 0) ? 0 : 1; |
- } |
- if (c) return -1; /* mismatch */ |
- if (slen == plen) return 0; |
- if (string[plen] == '_') return 1; |
- return -2; /* false match, e.g. "en_USX" cmp "en_US" */ |
-} |
- |
-static void _checklocs(const char* label, |
- const char* req, |
- const char* valid, |
- const char* actual) { |
- /* We want the valid to be strictly > the bogus requested locale, |
- and the valid to be >= the actual. */ |
- if (_loccmp(req, valid) > 0 && |
- _loccmp(valid, actual) >= 0) { |
- log_verbose("%s; req=%s, valid=%s, actual=%s\n", |
- label, req, valid, actual); |
- } else { |
- log_err("FAIL: %s; req=%s, valid=%s, actual=%s\n", |
- label, req, valid, actual); |
- } |
-} |
- |
-static void TestGetLocale(void) { |
- UErrorCode ec = U_ZERO_ERROR; |
- UParseError pe; |
- UChar EMPTY[1] = {0}; |
- |
- /* === udat === */ |
-#if !UCONFIG_NO_FORMATTING |
- { |
- UDateFormat *obj; |
- const char *req = "en_US_REDWOODSHORES", *valid, *actual; |
- obj = udat_open(UDAT_DEFAULT, UDAT_DEFAULT, |
- req, |
- NULL, 0, |
- NULL, 0, &ec); |
- if (U_FAILURE(ec)) { |
- log_data_err("udat_open failed.Error %s\n", u_errorName(ec)); |
- return; |
- } |
- valid = udat_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = udat_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("udat_getLocaleByType() failed\n"); |
- return; |
- } |
- _checklocs("udat", req, valid, actual); |
- udat_close(obj); |
- } |
-#endif |
- |
- /* === ucal === */ |
-#if !UCONFIG_NO_FORMATTING |
- { |
- UCalendar *obj; |
- const char *req = "fr_FR_PROVENCAL", *valid, *actual; |
- obj = ucal_open(NULL, 0, |
- req, |
- UCAL_GREGORIAN, |
- &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ucal_open failed with error: %s\n", u_errorName(ec)); |
- return; |
- } |
- valid = ucal_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = ucal_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ucal_getLocaleByType() failed\n"); |
- return; |
- } |
- _checklocs("ucal", req, valid, actual); |
- ucal_close(obj); |
- } |
-#endif |
- |
- /* === unum === */ |
-#if !UCONFIG_NO_FORMATTING |
- { |
- UNumberFormat *obj; |
- const char *req = "zh_Hant_TW_TAINAN", *valid, *actual; |
- obj = unum_open(UNUM_DECIMAL, |
- NULL, 0, |
- req, |
- &pe, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("unum_open failed\n"); |
- return; |
- } |
- valid = unum_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = unum_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("unum_getLocaleByType() failed\n"); |
- return; |
- } |
- _checklocs("unum", req, valid, actual); |
- unum_close(obj); |
- } |
-#endif |
- |
- /* === umsg === */ |
-#if 0 |
- /* commented out by weiv 01/12/2005. umsg_getLocaleByType is to be removed */ |
-#if !UCONFIG_NO_FORMATTING |
- { |
- UMessageFormat *obj; |
- const char *req = "ja_JP_TAKAYAMA", *valid, *actual; |
- UBool test; |
- obj = umsg_open(EMPTY, 0, |
- req, |
- &pe, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("umsg_open failed\n"); |
- return; |
- } |
- valid = umsg_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = umsg_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("umsg_getLocaleByType() failed\n"); |
- return; |
- } |
- /* We want the valid to be strictly > the bogus requested locale, |
- and the valid to be >= the actual. */ |
- /* TODO MessageFormat is currently just storing the locale it is given. |
- As a result, it will return whatever it was given, even if the |
- locale is invalid. */ |
- test = (_cmpversion("3.2") <= 0) ? |
- /* Here is the weakened test for 3.0: */ |
- (_loccmp(req, valid) >= 0) : |
- /* Here is what the test line SHOULD be: */ |
- (_loccmp(req, valid) > 0); |
- |
- if (test && |
- _loccmp(valid, actual) >= 0) { |
- log_verbose("umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual); |
- } else { |
- log_err("FAIL: umsg; req=%s, valid=%s, actual=%s\n", req, valid, actual); |
- } |
- umsg_close(obj); |
- } |
-#endif |
-#endif |
- |
- /* === ubrk === */ |
-#if !UCONFIG_NO_BREAK_ITERATION |
- { |
- UBreakIterator *obj; |
- const char *req = "ar_KW_ABDALI", *valid, *actual; |
- obj = ubrk_open(UBRK_WORD, |
- req, |
- EMPTY, |
- 0, |
- &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ubrk_open failed. Error: %s \n", u_errorName(ec)); |
- return; |
- } |
- valid = ubrk_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = ubrk_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ubrk_getLocaleByType() failed\n"); |
- return; |
- } |
- _checklocs("ubrk", req, valid, actual); |
- ubrk_close(obj); |
- } |
-#endif |
- |
- /* === ucol === */ |
-#if !UCONFIG_NO_COLLATION |
- { |
- UCollator *obj; |
- const char *req = "es_AR_BUENOSAIRES", *valid, *actual; |
- obj = ucol_open(req, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ucol_open failed - %s\n", u_errorName(ec)); |
- return; |
- } |
- valid = ucol_getLocaleByType(obj, ULOC_VALID_LOCALE, &ec); |
- actual = ucol_getLocaleByType(obj, ULOC_ACTUAL_LOCALE, &ec); |
- if (U_FAILURE(ec)) { |
- log_err("ucol_getLocaleByType() failed\n"); |
- return; |
- } |
- _checklocs("ucol", req, valid, actual); |
- ucol_close(obj); |
- } |
-#endif |
-} |
-static void TestEnglishExemplarCharacters(void) { |
- UErrorCode status = U_ZERO_ERROR; |
- int i; |
- USet *exSet = NULL; |
- UChar testChars[] = { |
- 0x61, /* standard */ |
- 0xE1, /* auxiliary */ |
- 0x41, /* index */ |
- 0x2D /* punctuation */ |
- }; |
- ULocaleData *uld = ulocdata_open("en", &status); |
- if (U_FAILURE(status)) { |
- log_data_err("ulocdata_open() failed : %s - (Are you missing data?)\n", u_errorName(status)); |
- return; |
- } |
- |
- for (i = 0; i < ULOCDATA_ES_COUNT; i++) { |
- exSet = ulocdata_getExemplarSet(uld, exSet, 0, (ULocaleDataExemplarSetType)i, &status); |
- if (U_FAILURE(status)) { |
- log_err_status(status, "ulocdata_getExemplarSet() for type %d failed\n", i); |
- status = U_ZERO_ERROR; |
- continue; |
- } |
- if (!uset_contains(exSet, (UChar32)testChars[i])) { |
- log_err("Character U+%04X is not included in exemplar type %d\n", testChars[i], i); |
- } |
- } |
- |
- uset_close(exSet); |
- ulocdata_close(uld); |
-} |
- |
-static void TestNonexistentLanguageExemplars(void) { |
- /* JB 4068 - Nonexistent language */ |
- UErrorCode ec = U_ZERO_ERROR; |
- ULocaleData *uld = ulocdata_open("qqq",&ec); |
- if (ec != U_USING_DEFAULT_WARNING) { |
- log_err_status(ec, "Exemplar set for \"qqq\", expecting U_USING_DEFAULT_WARNING, but got %s\n", |
- u_errorName(ec)); |
- } |
- uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec)); |
- ulocdata_close(uld); |
-} |
- |
-static void TestLocDataErrorCodeChaining(void) { |
- UErrorCode ec = U_USELESS_COLLATOR_ERROR; |
- ulocdata_open(NULL, &ec); |
- ulocdata_getExemplarSet(NULL, NULL, 0, ULOCDATA_ES_STANDARD, &ec); |
- ulocdata_getDelimiter(NULL, ULOCDATA_DELIMITER_COUNT, NULL, -1, &ec); |
- ulocdata_getMeasurementSystem(NULL, &ec); |
- ulocdata_getPaperSize(NULL, NULL, NULL, &ec); |
- if (ec != U_USELESS_COLLATOR_ERROR) { |
- log_err("ulocdata API changed the error code to %s\n", u_errorName(ec)); |
- } |
-} |
- |
-static void TestLanguageExemplarsFallbacks(void) { |
- /* Test that en_US fallsback, but en doesn't fallback. */ |
- UErrorCode ec = U_ZERO_ERROR; |
- ULocaleData *uld = ulocdata_open("en_US",&ec); |
- uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec)); |
- if (ec != U_USING_FALLBACK_WARNING) { |
- log_err_status(ec, "Exemplar set for \"en_US\", expecting U_USING_FALLBACK_WARNING, but got %s\n", |
- u_errorName(ec)); |
- } |
- ulocdata_close(uld); |
- ec = U_ZERO_ERROR; |
- uld = ulocdata_open("en",&ec); |
- uset_close(ulocdata_getExemplarSet(uld, NULL, 0, ULOCDATA_ES_STANDARD, &ec)); |
- if (ec != U_ZERO_ERROR) { |
- log_err_status(ec, "Exemplar set for \"en\", expecting U_ZERO_ERROR, but got %s\n", |
- u_errorName(ec)); |
- } |
- ulocdata_close(uld); |
-} |
- |
-static const char *acceptResult(UAcceptResult uar) { |
- return udbg_enumName(UDBG_UAcceptResult, uar); |
-} |
- |
-static void TestAcceptLanguage(void) { |
- UErrorCode status = U_ZERO_ERROR; |
- UAcceptResult outResult; |
- UEnumeration *available; |
- char tmp[200]; |
- int i; |
- int32_t rc = 0; |
- |
- struct { |
- int32_t httpSet; /**< Which of http[] should be used? */ |
- const char *icuSet; /**< ? */ |
- const char *expect; /**< The expected locale result */ |
- UAcceptResult res; /**< The expected error code */ |
- } tests[] = { |
- /*0*/{ 0, NULL, "mt_MT", ULOC_ACCEPT_VALID }, |
- /*1*/{ 1, NULL, "en", ULOC_ACCEPT_VALID }, |
- /*2*/{ 2, NULL, "en", ULOC_ACCEPT_FALLBACK }, |
- /*3*/{ 3, NULL, "", ULOC_ACCEPT_FAILED }, |
- /*4*/{ 4, NULL, "es", ULOC_ACCEPT_VALID }, |
- |
- /*5*/{ 5, NULL, "en", ULOC_ACCEPT_VALID }, /* XF */ |
- /*6*/{ 6, NULL, "ja", ULOC_ACCEPT_FALLBACK }, /* XF */ |
- /*7*/{ 7, NULL, "zh", ULOC_ACCEPT_FALLBACK }, /* XF */ |
- }; |
- const int32_t numTests = sizeof(tests)/sizeof(tests[0]); |
- static const char *http[] = { |
- /*0*/ "mt-mt, ja;q=0.76, en-us;q=0.95, en;q=0.92, en-gb;q=0.89, fr;q=0.87, iu-ca;q=0.84, iu;q=0.82, ja-jp;q=0.79, mt;q=0.97, de-de;q=0.74, de;q=0.71, es;q=0.68, it-it;q=0.66, it;q=0.63, vi-vn;q=0.61, vi;q=0.58, nl-nl;q=0.55, nl;q=0.53, th-th-traditional;q=.01", |
- /*1*/ "ja;q=0.5, en;q=0.8, tlh", |
- /*2*/ "en-wf, de-lx;q=0.8", |
- /*3*/ "mga-ie;q=0.9, tlh", |
- /*4*/ "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, " |
- "xxx-yyy;q=.01, xxx-yyy;q=.01, xxx-yyy;q=.01, xx-yy;q=.1, " |
- "es", |
- |
- /*5*/ "zh-xx;q=0.9, en;q=0.6", |
- /*6*/ "ja-JA", |
- /*7*/ "zh-xx;q=0.9", |
- }; |
- |
- for(i=0;i<numTests;i++) { |
- outResult = -3; |
- status=U_ZERO_ERROR; |
- log_verbose("test #%d: http[%s], ICU[%s], expect %s, %s\n", |
- i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res)); |
- |
- available = ures_openAvailableLocales(tests[i].icuSet, &status); |
- tmp[0]=0; |
- rc = uloc_acceptLanguageFromHTTP(tmp, 199, &outResult, http[tests[i].httpSet], available, &status); |
- (void)rc; /* Suppress set but not used warning. */ |
- uenum_close(available); |
- log_verbose(" got %s, %s [%s]\n", tmp[0]?tmp:"(EMPTY)", acceptResult(outResult), u_errorName(status)); |
- if(outResult != tests[i].res) { |
- log_err_status(status, "FAIL: #%d: expected outResult of %s but got %s\n", i, |
- acceptResult( tests[i].res), |
- acceptResult( outResult)); |
- log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n", |
- i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect,acceptResult(tests[i].res)); |
- } |
- if((outResult>0)&&uprv_strcmp(tmp, tests[i].expect)) { |
- log_err_status(status, "FAIL: #%d: expected %s but got %s\n", i, tests[i].expect, tmp); |
- log_info("test #%d: http[%s], ICU[%s], expect %s, %s\n", |
- i, http[tests[i].httpSet], tests[i].icuSet, tests[i].expect, acceptResult(tests[i].res)); |
- } |
- } |
-} |
- |
-static const char* LOCALE_ALIAS[][2] = { |
- {"in", "id"}, |
- {"in_ID", "id_ID"}, |
- {"iw", "he"}, |
- {"iw_IL", "he_IL"}, |
- {"ji", "yi"}, |
- {"en_BU", "en_MM"}, |
- {"en_DY", "en_BJ"}, |
- {"en_HV", "en_BF"}, |
- {"en_NH", "en_VU"}, |
- {"en_RH", "en_ZW"}, |
- {"en_TP", "en_TL"}, |
- {"en_ZR", "en_CD"} |
-}; |
-static UBool isLocaleAvailable(UResourceBundle* resIndex, const char* loc){ |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t len = 0; |
- ures_getStringByKey(resIndex, loc,&len, &status); |
- if(U_FAILURE(status)){ |
- return FALSE; |
- } |
- return TRUE; |
-} |
- |
-static void TestCalendar() { |
-#if !UCONFIG_NO_FORMATTING |
- int i; |
- UErrorCode status = U_ZERO_ERROR; |
- UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); |
- if(U_FAILURE(status)){ |
- log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status)); |
- return; |
- } |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- UCalendar* c1 = NULL; |
- UCalendar* c2 = NULL; |
- |
- /*Test function "getLocale(ULocale.VALID_LOCALE)"*/ |
- const char* l1 = ucal_getLocaleByType(c1, ULOC_VALID_LOCALE, &status); |
- const char* l2 = ucal_getLocaleByType(c2, ULOC_VALID_LOCALE, &status); |
- |
- if(!isLocaleAvailable(resIndex, newLoc)){ |
- continue; |
- } |
- c1 = ucal_open(NULL, -1, oldLoc, UCAL_GREGORIAN, &status); |
- c2 = ucal_open(NULL, -1, newLoc, UCAL_GREGORIAN, &status); |
- |
- if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0 || status!=U_ZERO_ERROR) { |
- log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc); |
- } |
- log_verbose("ucal_getLocaleByType old:%s new:%s\n", l1, l2); |
- ucal_close(c1); |
- ucal_close(c2); |
- } |
- ures_close(resIndex); |
-#endif |
-} |
- |
-static void TestDateFormat() { |
-#if !UCONFIG_NO_FORMATTING |
- int i; |
- UErrorCode status = U_ZERO_ERROR; |
- UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); |
- if(U_FAILURE(status)){ |
- log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status)); |
- return; |
- } |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- UDateFormat* df1 = NULL; |
- UDateFormat* df2 = NULL; |
- const char* l1 = NULL; |
- const char* l2 = NULL; |
- |
- if(!isLocaleAvailable(resIndex, newLoc)){ |
- continue; |
- } |
- df1 = udat_open(UDAT_FULL, UDAT_FULL,oldLoc, NULL, 0, NULL, -1, &status); |
- df2 = udat_open(UDAT_FULL, UDAT_FULL,newLoc, NULL, 0, NULL, -1, &status); |
- if(U_FAILURE(status)){ |
- log_err("Creation of date format failed %s\n", u_errorName(status)); |
- return; |
- } |
- /*Test function "getLocale"*/ |
- l1 = udat_getLocaleByType(df1, ULOC_VALID_LOCALE, &status); |
- l2 = udat_getLocaleByType(df2, ULOC_VALID_LOCALE, &status); |
- if(U_FAILURE(status)){ |
- log_err("Fetching the locale by type failed. %s\n", u_errorName(status)); |
- } |
- if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) { |
- log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc); |
- } |
- log_verbose("udat_getLocaleByType old:%s new:%s\n", l1, l2); |
- udat_close(df1); |
- udat_close(df2); |
- } |
- ures_close(resIndex); |
-#endif |
-} |
- |
-static void TestCollation() { |
-#if !UCONFIG_NO_COLLATION |
- int i; |
- UErrorCode status = U_ZERO_ERROR; |
- UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); |
- if(U_FAILURE(status)){ |
- log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status)); |
- return; |
- } |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- UCollator* c1 = NULL; |
- UCollator* c2 = NULL; |
- const char* l1 = NULL; |
- const char* l2 = NULL; |
- |
- status = U_ZERO_ERROR; |
- if(!isLocaleAvailable(resIndex, newLoc)){ |
- continue; |
- } |
- if(U_FAILURE(status)){ |
- log_err("Creation of collators failed %s\n", u_errorName(status)); |
- return; |
- } |
- c1 = ucol_open(oldLoc, &status); |
- c2 = ucol_open(newLoc, &status); |
- l1 = ucol_getLocaleByType(c1, ULOC_VALID_LOCALE, &status); |
- l2 = ucol_getLocaleByType(c2, ULOC_VALID_LOCALE, &status); |
- if(U_FAILURE(status)){ |
- log_err("Fetching the locale names failed failed %s\n", u_errorName(status)); |
- } |
- if (strcmp(newLoc,l1)!=0 || strcmp(l1,l2)!=0) { |
- log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc); |
- } |
- log_verbose("ucol_getLocaleByType old:%s new:%s\n", l1, l2); |
- ucol_close(c1); |
- ucol_close(c2); |
- } |
- ures_close(resIndex); |
-#endif |
-} |
- |
-typedef struct OrientationStructTag { |
- const char* localeId; |
- ULayoutType character; |
- ULayoutType line; |
-} OrientationStruct; |
- |
-static const char* ULayoutTypeToString(ULayoutType type) |
-{ |
- switch(type) |
- { |
- case ULOC_LAYOUT_LTR: |
- return "ULOC_LAYOUT_LTR"; |
- break; |
- case ULOC_LAYOUT_RTL: |
- return "ULOC_LAYOUT_RTL"; |
- break; |
- case ULOC_LAYOUT_TTB: |
- return "ULOC_LAYOUT_TTB"; |
- break; |
- case ULOC_LAYOUT_BTT: |
- return "ULOC_LAYOUT_BTT"; |
- break; |
- case ULOC_LAYOUT_UNKNOWN: |
- break; |
- } |
- |
- return "Unknown enum value for ULayoutType!"; |
-} |
- |
-static void TestOrientation() |
-{ |
- static const OrientationStruct toTest [] = { |
- { "ar", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "aR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "ar_Arab", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "Fa", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "he", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "ps", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "ur", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "UR", ULOC_LAYOUT_RTL, ULOC_LAYOUT_TTB }, |
- { "en", ULOC_LAYOUT_LTR, ULOC_LAYOUT_TTB } |
- }; |
- |
- size_t i = 0; |
- for (; i < sizeof(toTest) / sizeof(toTest[0]); ++i) { |
- UErrorCode statusCO = U_ZERO_ERROR; |
- UErrorCode statusLO = U_ZERO_ERROR; |
- const char* const localeId = toTest[i].localeId; |
- const ULayoutType co = uloc_getCharacterOrientation(localeId, &statusCO); |
- const ULayoutType expectedCO = toTest[i].character; |
- const ULayoutType lo = uloc_getLineOrientation(localeId, &statusLO); |
- const ULayoutType expectedLO = toTest[i].line; |
- if (U_FAILURE(statusCO)) { |
- log_err_status(statusCO, |
- " unexpected failure for uloc_getCharacterOrientation(), with localId \"%s\" and status %s\n", |
- localeId, |
- u_errorName(statusCO)); |
- } |
- else if (co != expectedCO) { |
- log_err( |
- " unexpected result for uloc_getCharacterOrientation(), with localeId \"%s\". Expected %s but got result %s\n", |
- localeId, |
- ULayoutTypeToString(expectedCO), |
- ULayoutTypeToString(co)); |
- } |
- if (U_FAILURE(statusLO)) { |
- log_err_status(statusLO, |
- " unexpected failure for uloc_getLineOrientation(), with localId \"%s\" and status %s\n", |
- localeId, |
- u_errorName(statusLO)); |
- } |
- else if (lo != expectedLO) { |
- log_err( |
- " unexpected result for uloc_getLineOrientation(), with localeId \"%s\". Expected %s but got result %s\n", |
- localeId, |
- ULayoutTypeToString(expectedLO), |
- ULayoutTypeToString(lo)); |
- } |
- } |
-} |
- |
-static void TestULocale() { |
- int i; |
- UErrorCode status = U_ZERO_ERROR; |
- UResourceBundle *resIndex = ures_open(NULL,"res_index", &status); |
- if(U_FAILURE(status)){ |
- log_err_status(status, "Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status)); |
- return; |
- } |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- UChar name1[256], name2[256]; |
- char names1[256], names2[256]; |
- int32_t capacity = 256; |
- |
- status = U_ZERO_ERROR; |
- if(!isLocaleAvailable(resIndex, newLoc)){ |
- continue; |
- } |
- uloc_getDisplayName(oldLoc, ULOC_US, name1, capacity, &status); |
- if(U_FAILURE(status)){ |
- log_err("uloc_getDisplayName(%s) failed %s\n", oldLoc, u_errorName(status)); |
- } |
- |
- uloc_getDisplayName(newLoc, ULOC_US, name2, capacity, &status); |
- if(U_FAILURE(status)){ |
- log_err("uloc_getDisplayName(%s) failed %s\n", newLoc, u_errorName(status)); |
- } |
- |
- if (u_strcmp(name1, name2)!=0) { |
- log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc); |
- } |
- u_austrcpy(names1, name1); |
- u_austrcpy(names2, name2); |
- log_verbose("uloc_getDisplayName old:%s new:%s\n", names1, names2); |
- } |
- ures_close(resIndex); |
- |
-} |
- |
-static void TestUResourceBundle() { |
- const char* us1; |
- const char* us2; |
- |
- UResourceBundle* rb1 = NULL; |
- UResourceBundle* rb2 = NULL; |
- UErrorCode status = U_ZERO_ERROR; |
- int i; |
- UResourceBundle *resIndex = NULL; |
- if(U_FAILURE(status)){ |
- log_err("Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status)); |
- return; |
- } |
- resIndex = ures_open(NULL,"res_index", &status); |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- if(!isLocaleAvailable(resIndex, newLoc)){ |
- continue; |
- } |
- rb1 = ures_open(NULL, oldLoc, &status); |
- if (U_FAILURE(status)) { |
- log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status)); |
- } |
- |
- us1 = ures_getLocaleByType(rb1, ULOC_ACTUAL_LOCALE, &status); |
- |
- status = U_ZERO_ERROR; |
- rb2 = ures_open(NULL, newLoc, &status); |
- if (U_FAILURE(status)) { |
- log_err("ures_open(%s) failed %s\n", oldLoc, u_errorName(status)); |
- } |
- us2 = ures_getLocaleByType(rb2, ULOC_ACTUAL_LOCALE, &status); |
- |
- if (strcmp(us1,newLoc)!=0 || strcmp(us1,us2)!=0 ) { |
- log_err("The locales are not equal!.Old: %s, New: %s \n", oldLoc, newLoc); |
- } |
- |
- log_verbose("ures_getStringByKey old:%s new:%s\n", us1, us2); |
- ures_close(rb1); |
- rb1 = NULL; |
- ures_close(rb2); |
- rb2 = NULL; |
- } |
- ures_close(resIndex); |
-} |
- |
-static void TestDisplayName() { |
- |
- UChar oldCountry[256] = {'\0'}; |
- UChar newCountry[256] = {'\0'}; |
- UChar oldLang[256] = {'\0'}; |
- UChar newLang[256] = {'\0'}; |
- char country[256] ={'\0'}; |
- char language[256] ={'\0'}; |
- int32_t capacity = 256; |
- int i =0; |
- int j=0; |
- for (i=0; i<UPRV_LENGTHOF(LOCALE_ALIAS); i++) { |
- const char* oldLoc = LOCALE_ALIAS[i][0]; |
- const char* newLoc = LOCALE_ALIAS[i][1]; |
- UErrorCode status = U_ZERO_ERROR; |
- int32_t available = uloc_countAvailable(); |
- |
- for(j=0; j<available; j++){ |
- |
- const char* dispLoc = uloc_getAvailable(j); |
- int32_t oldCountryLen = uloc_getDisplayCountry(oldLoc,dispLoc, oldCountry, capacity, &status); |
- int32_t newCountryLen = uloc_getDisplayCountry(newLoc, dispLoc, newCountry, capacity, &status); |
- int32_t oldLangLen = uloc_getDisplayLanguage(oldLoc, dispLoc, oldLang, capacity, &status); |
- int32_t newLangLen = uloc_getDisplayLanguage(newLoc, dispLoc, newLang, capacity, &status ); |
- |
- int32_t countryLen = uloc_getCountry(newLoc, country, capacity, &status); |
- int32_t langLen = uloc_getLanguage(newLoc, language, capacity, &status); |
- /* there is a display name for the current country ID */ |
- if(countryLen != newCountryLen ){ |
- if(u_strncmp(oldCountry,newCountry,oldCountryLen)!=0){ |
- log_err("uloc_getDisplayCountry() failed for %s in display locale %s \n", oldLoc, dispLoc); |
- } |
- } |
- /* there is a display name for the current lang ID */ |
- if(langLen!=newLangLen){ |
- if(u_strncmp(oldLang,newLang,oldLangLen)){ |
- log_err("uloc_getDisplayLanguage() failed for %s in display locale %s \n", oldLoc, dispLoc); } |
- } |
- } |
- } |
-} |
- |
-static void TestGetLocaleForLCID() { |
- int32_t i, length, lengthPre; |
- const char* testLocale = 0; |
- UErrorCode status = U_ZERO_ERROR; |
- char temp2[40], temp3[40]; |
- uint32_t lcid; |
- |
- lcid = uloc_getLCID("en_US"); |
- if (lcid != 0x0409) { |
- log_err(" uloc_getLCID(\"en_US\") = %d, expected 0x0409\n", lcid); |
- } |
- |
- lengthPre = uloc_getLocaleForLCID(lcid, temp2, 4, &status); |
- if (status != U_BUFFER_OVERFLOW_ERROR) { |
- log_err(" unexpected result from uloc_getLocaleForLCID with small buffer: %s\n", u_errorName(status)); |
- } |
- else { |
- status = U_ZERO_ERROR; |
- } |
- |
- length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char), &status); |
- if (U_FAILURE(status)) { |
- log_err(" unexpected result from uloc_getLocaleForLCID(0x0409): %s\n", u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- |
- if (length != lengthPre) { |
- log_err(" uloc_getLocaleForLCID(0x0409): returned length %d does not match preflight length %d\n", length, lengthPre); |
- } |
- |
- length = uloc_getLocaleForLCID(0x12345, temp2, sizeof(temp2)/sizeof(char), &status); |
- if (U_SUCCESS(status)) { |
- log_err(" unexpected result from uloc_getLocaleForLCID(0x12345): %s, status %s\n", temp2, u_errorName(status)); |
- } |
- status = U_ZERO_ERROR; |
- |
- log_verbose("Testing getLocaleForLCID vs. locale data\n"); |
- for (i = 0; i < LOCALE_SIZE; i++) { |
- |
- testLocale=rawData2[NAME][i]; |
- |
- log_verbose("Testing %s ......\n", testLocale); |
- |
- sscanf(rawData2[LCID][i], "%x", &lcid); |
- length = uloc_getLocaleForLCID(lcid, temp2, sizeof(temp2)/sizeof(char), &status); |
- if (U_FAILURE(status)) { |
- log_err(" unexpected failure of uloc_getLocaleForLCID(%#04x), status %s\n", lcid, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- continue; |
- } |
- |
- if (length != uprv_strlen(temp2)) { |
- log_err(" returned length %d not correct for uloc_getLocaleForLCID(%#04x), expected %d\n", length, lcid, uprv_strlen(temp2)); |
- } |
- |
- /* Compare language, country, script */ |
- length = uloc_getLanguage(temp2, temp3, sizeof(temp3)/sizeof(char), &status); |
- if (U_FAILURE(status)) { |
- log_err(" couldn't get language in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strcmp(temp3, rawData2[LANG][i]) && !(uprv_strcmp(temp3, "nn") == 0 && uprv_strcmp(rawData2[VAR][i], "NY") == 0)) { |
- log_err(" language doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[LANG][i], lcid, temp2); |
- } |
- |
- length = uloc_getScript(temp2, temp3, sizeof(temp3)/sizeof(char), &status); |
- if (U_FAILURE(status)) { |
- log_err(" couldn't get script in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strcmp(temp3, rawData2[SCRIPT][i])) { |
- log_err(" script doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[SCRIPT][i], lcid, temp2); |
- } |
- |
- length = uloc_getCountry(temp2, temp3, sizeof(temp3)/sizeof(char), &status); |
- if (U_FAILURE(status)) { |
- log_err(" couldn't get country in uloc_getLocaleForLCID(%#04x) = %s, status %s\n", lcid, temp2, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strlen(rawData2[CTRY][i]) && uprv_strcmp(temp3, rawData2[CTRY][i])) { |
- log_err(" country doesn't match expected %s in in uloc_getLocaleForLCID(%#04x) = %s\n", rawData2[CTRY][i], lcid, temp2); |
- } |
- } |
- |
-} |
- |
-const char* const basic_maximize_data[][2] = { |
- { |
- "zu_Zzzz_Zz", |
- "zu_Latn_ZA", |
- }, { |
- "ZU_Zz", |
- "zu_Latn_ZA" |
- }, { |
- "zu_LATN", |
- "zu_Latn_ZA" |
- }, { |
- "en_Zz", |
- "en_Latn_US" |
- }, { |
- "en_us", |
- "en_Latn_US" |
- }, { |
- "en_Kore", |
- "en_Kore_US" |
- }, { |
- "en_Kore_Zz", |
- "en_Kore_US" |
- }, { |
- "en_Kore_ZA", |
- "en_Kore_ZA" |
- }, { |
- "en_Kore_ZA_POSIX", |
- "en_Kore_ZA_POSIX" |
- }, { |
- "en_Gujr", |
- "en_Gujr_US" |
- }, { |
- "en_ZA", |
- "en_Latn_ZA" |
- }, { |
- "en_Gujr_Zz", |
- "en_Gujr_US" |
- }, { |
- "en_Gujr_ZA", |
- "en_Gujr_ZA" |
- }, { |
- "en_Gujr_ZA_POSIX", |
- "en_Gujr_ZA_POSIX" |
- }, { |
- "en_US_POSIX_1901", |
- "en_Latn_US_POSIX_1901" |
- }, { |
- "en_Latn__POSIX_1901", |
- "en_Latn_US_POSIX_1901" |
- }, { |
- "en__POSIX_1901", |
- "en_Latn_US_POSIX_1901" |
- }, { |
- "de__POSIX_1901", |
- "de_Latn_DE_POSIX_1901" |
- }, { |
- "en_US_BOSTON", |
- "en_Latn_US_BOSTON" |
- }, { |
- "th@calendar=buddhist", |
- "th_Thai_TH@calendar=buddhist" |
- }, { |
- "ar_ZZ", |
- "ar_Arab_EG" |
- }, { |
- "zh", |
- "zh_Hans_CN" |
- }, { |
- "zh_TW", |
- "zh_Hant_TW" |
- }, { |
- "zh_HK", |
- "zh_Hant_HK" |
- }, { |
- "zh_Hant", |
- "zh_Hant_TW" |
- }, { |
- "zh_Zzzz_CN", |
- "zh_Hans_CN" |
- }, { |
- "und_US", |
- "en_Latn_US" |
- }, { |
- "und_HK", |
- "zh_Hant_HK" |
- }, { |
- "zzz", |
- "" |
- }, { |
- "de_u_co_phonebk", |
- "de_Latn_DE_U_CO_PHONEBK" |
- }, { |
- "de_Latn_u_co_phonebk", |
- "de_Latn_DE_U_CO_PHONEBK" |
- }, { |
- "de_Latn_DE_u_co_phonebk", |
- "de_Latn_DE_U_CO_PHONEBK" |
- } |
-}; |
- |
-const char* const basic_minimize_data[][2] = { |
- { |
- "en_Latn_US", |
- "en" |
- }, { |
- "en_Latn_US_POSIX_1901", |
- "en__POSIX_1901" |
- }, { |
- "EN_Latn_US_POSIX_1901", |
- "en__POSIX_1901" |
- }, { |
- "en_Zzzz_US_POSIX_1901", |
- "en__POSIX_1901" |
- }, { |
- "de_Latn_DE_POSIX_1901", |
- "de__POSIX_1901" |
- }, { |
- "und", |
- "" |
- }, { |
- "en_Latn_US@calendar=gregorian", |
- "en@calendar=gregorian" |
- } |
-}; |
- |
-const char* const full_data[][3] = { |
- { |
- /* "FROM", */ |
- /* "ADD-LIKELY", */ |
- /* "REMOVE-LIKELY" */ |
- /* }, { */ |
- "aa", |
- "aa_Latn_ET", |
- "aa" |
- }, { |
- "af", |
- "af_Latn_ZA", |
- "af" |
- }, { |
- "ak", |
- "ak_Latn_GH", |
- "ak" |
- }, { |
- "am", |
- "am_Ethi_ET", |
- "am" |
- }, { |
- "ar", |
- "ar_Arab_EG", |
- "ar" |
- }, { |
- "as", |
- "as_Beng_IN", |
- "as" |
- }, { |
- "az", |
- "az_Latn_AZ", |
- "az" |
- }, { |
- "be", |
- "be_Cyrl_BY", |
- "be" |
- }, { |
- "bg", |
- "bg_Cyrl_BG", |
- "bg" |
- }, { |
- "bn", |
- "bn_Beng_BD", |
- "bn" |
- }, { |
- "bo", |
- "bo_Tibt_CN", |
- "bo" |
- }, { |
- "bs", |
- "bs_Latn_BA", |
- "bs" |
- }, { |
- "ca", |
- "ca_Latn_ES", |
- "ca" |
- }, { |
- "ch", |
- "ch_Latn_GU", |
- "ch" |
- }, { |
- "chk", |
- "chk_Latn_FM", |
- "chk" |
- }, { |
- "cs", |
- "cs_Latn_CZ", |
- "cs" |
- }, { |
- "cy", |
- "cy_Latn_GB", |
- "cy" |
- }, { |
- "da", |
- "da_Latn_DK", |
- "da" |
- }, { |
- "de", |
- "de_Latn_DE", |
- "de" |
- }, { |
- "dv", |
- "dv_Thaa_MV", |
- "dv" |
- }, { |
- "dz", |
- "dz_Tibt_BT", |
- "dz" |
- }, { |
- "ee", |
- "ee_Latn_GH", |
- "ee" |
- }, { |
- "el", |
- "el_Grek_GR", |
- "el" |
- }, { |
- "en", |
- "en_Latn_US", |
- "en" |
- }, { |
- "es", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "et", |
- "et_Latn_EE", |
- "et" |
- }, { |
- "eu", |
- "eu_Latn_ES", |
- "eu" |
- }, { |
- "fa", |
- "fa_Arab_IR", |
- "fa" |
- }, { |
- "fi", |
- "fi_Latn_FI", |
- "fi" |
- }, { |
- "fil", |
- "fil_Latn_PH", |
- "fil" |
- }, { |
- "fo", |
- "fo_Latn_FO", |
- "fo" |
- }, { |
- "fr", |
- "fr_Latn_FR", |
- "fr" |
- }, { |
- "fur", |
- "fur_Latn_IT", |
- "fur" |
- }, { |
- "ga", |
- "ga_Latn_IE", |
- "ga" |
- }, { |
- "gaa", |
- "gaa_Latn_GH", |
- "gaa" |
- }, { |
- "gl", |
- "gl_Latn_ES", |
- "gl" |
- }, { |
- "gn", |
- "gn_Latn_PY", |
- "gn" |
- }, { |
- "gu", |
- "gu_Gujr_IN", |
- "gu" |
- }, { |
- "ha", |
- "ha_Latn_NG", |
- "ha" |
- }, { |
- "haw", |
- "haw_Latn_US", |
- "haw" |
- }, { |
- "he", |
- "he_Hebr_IL", |
- "he" |
- }, { |
- "hi", |
- "hi_Deva_IN", |
- "hi" |
- }, { |
- "hr", |
- "hr_Latn_HR", |
- "hr" |
- }, { |
- "ht", |
- "ht_Latn_HT", |
- "ht" |
- }, { |
- "hu", |
- "hu_Latn_HU", |
- "hu" |
- }, { |
- "hy", |
- "hy_Armn_AM", |
- "hy" |
- }, { |
- "id", |
- "id_Latn_ID", |
- "id" |
- }, { |
- "ig", |
- "ig_Latn_NG", |
- "ig" |
- }, { |
- "ii", |
- "ii_Yiii_CN", |
- "ii" |
- }, { |
- "is", |
- "is_Latn_IS", |
- "is" |
- }, { |
- "it", |
- "it_Latn_IT", |
- "it" |
- }, { |
- "ja", |
- "ja_Jpan_JP", |
- "ja" |
- }, { |
- "ka", |
- "ka_Geor_GE", |
- "ka" |
- }, { |
- "kaj", |
- "kaj_Latn_NG", |
- "kaj" |
- }, { |
- "kam", |
- "kam_Latn_KE", |
- "kam" |
- }, { |
- "kk", |
- "kk_Cyrl_KZ", |
- "kk" |
- }, { |
- "kl", |
- "kl_Latn_GL", |
- "kl" |
- }, { |
- "km", |
- "km_Khmr_KH", |
- "km" |
- }, { |
- "kn", |
- "kn_Knda_IN", |
- "kn" |
- }, { |
- "ko", |
- "ko_Kore_KR", |
- "ko" |
- }, { |
- "kok", |
- "kok_Deva_IN", |
- "kok" |
- }, { |
- "kpe", |
- "kpe_Latn_LR", |
- "kpe" |
- }, { |
- "ku", |
- "ku_Latn_TR", |
- "ku" |
- }, { |
- "ky", |
- "ky_Cyrl_KG", |
- "ky" |
- }, { |
- "la", |
- "la_Latn_VA", |
- "la" |
- }, { |
- "ln", |
- "ln_Latn_CD", |
- "ln" |
- }, { |
- "lo", |
- "lo_Laoo_LA", |
- "lo" |
- }, { |
- "lt", |
- "lt_Latn_LT", |
- "lt" |
- }, { |
- "lv", |
- "lv_Latn_LV", |
- "lv" |
- }, { |
- "mg", |
- "mg_Latn_MG", |
- "mg" |
- }, { |
- "mh", |
- "mh_Latn_MH", |
- "mh" |
- }, { |
- "mk", |
- "mk_Cyrl_MK", |
- "mk" |
- }, { |
- "ml", |
- "ml_Mlym_IN", |
- "ml" |
- }, { |
- "mn", |
- "mn_Cyrl_MN", |
- "mn" |
- }, { |
- "mr", |
- "mr_Deva_IN", |
- "mr" |
- }, { |
- "ms", |
- "ms_Latn_MY", |
- "ms" |
- }, { |
- "mt", |
- "mt_Latn_MT", |
- "mt" |
- }, { |
- "my", |
- "my_Mymr_MM", |
- "my" |
- }, { |
- "na", |
- "na_Latn_NR", |
- "na" |
- }, { |
- "ne", |
- "ne_Deva_NP", |
- "ne" |
- }, { |
- "niu", |
- "niu_Latn_NU", |
- "niu" |
- }, { |
- "nl", |
- "nl_Latn_NL", |
- "nl" |
- }, { |
- "nn", |
- "nn_Latn_NO", |
- "nn" |
- }, { |
- "nr", |
- "nr_Latn_ZA", |
- "nr" |
- }, { |
- "nso", |
- "nso_Latn_ZA", |
- "nso" |
- }, { |
- "ny", |
- "ny_Latn_MW", |
- "ny" |
- }, { |
- "om", |
- "om_Latn_ET", |
- "om" |
- }, { |
- "or", |
- "or_Orya_IN", |
- "or" |
- }, { |
- "pa", |
- "pa_Guru_IN", |
- "pa" |
- }, { |
- "pa_Arab", |
- "pa_Arab_PK", |
- "pa_PK" |
- }, { |
- "pa_PK", |
- "pa_Arab_PK", |
- "pa_PK" |
- }, { |
- "pap", |
- "pap_Latn_AW", |
- "pap" |
- }, { |
- "pau", |
- "pau_Latn_PW", |
- "pau" |
- }, { |
- "pl", |
- "pl_Latn_PL", |
- "pl" |
- }, { |
- "ps", |
- "ps_Arab_AF", |
- "ps" |
- }, { |
- "pt", |
- "pt_Latn_BR", |
- "pt" |
- }, { |
- "rn", |
- "rn_Latn_BI", |
- "rn" |
- }, { |
- "ro", |
- "ro_Latn_RO", |
- "ro" |
- }, { |
- "ru", |
- "ru_Cyrl_RU", |
- "ru" |
- }, { |
- "rw", |
- "rw_Latn_RW", |
- "rw" |
- }, { |
- "sa", |
- "sa_Deva_IN", |
- "sa" |
- }, { |
- "se", |
- "se_Latn_NO", |
- "se" |
- }, { |
- "sg", |
- "sg_Latn_CF", |
- "sg" |
- }, { |
- "si", |
- "si_Sinh_LK", |
- "si" |
- }, { |
- "sid", |
- "sid_Latn_ET", |
- "sid" |
- }, { |
- "sk", |
- "sk_Latn_SK", |
- "sk" |
- }, { |
- "sl", |
- "sl_Latn_SI", |
- "sl" |
- }, { |
- "sm", |
- "sm_Latn_WS", |
- "sm" |
- }, { |
- "so", |
- "so_Latn_SO", |
- "so" |
- }, { |
- "sq", |
- "sq_Latn_AL", |
- "sq" |
- }, { |
- "sr", |
- "sr_Cyrl_RS", |
- "sr" |
- }, { |
- "ss", |
- "ss_Latn_ZA", |
- "ss" |
- }, { |
- "st", |
- "st_Latn_ZA", |
- "st" |
- }, { |
- "sv", |
- "sv_Latn_SE", |
- "sv" |
- }, { |
- "sw", |
- "sw_Latn_TZ", |
- "sw" |
- }, { |
- "ta", |
- "ta_Taml_IN", |
- "ta" |
- }, { |
- "te", |
- "te_Telu_IN", |
- "te" |
- }, { |
- "tet", |
- "tet_Latn_TL", |
- "tet" |
- }, { |
- "tg", |
- "tg_Cyrl_TJ", |
- "tg" |
- }, { |
- "th", |
- "th_Thai_TH", |
- "th" |
- }, { |
- "ti", |
- "ti_Ethi_ET", |
- "ti" |
- }, { |
- "tig", |
- "tig_Ethi_ER", |
- "tig" |
- }, { |
- "tk", |
- "tk_Latn_TM", |
- "tk" |
- }, { |
- "tkl", |
- "tkl_Latn_TK", |
- "tkl" |
- }, { |
- "tn", |
- "tn_Latn_ZA", |
- "tn" |
- }, { |
- "to", |
- "to_Latn_TO", |
- "to" |
- }, { |
- "tpi", |
- "tpi_Latn_PG", |
- "tpi" |
- }, { |
- "tr", |
- "tr_Latn_TR", |
- "tr" |
- }, { |
- "ts", |
- "ts_Latn_ZA", |
- "ts" |
- }, { |
- "tt", |
- "tt_Cyrl_RU", |
- "tt" |
- }, { |
- "tvl", |
- "tvl_Latn_TV", |
- "tvl" |
- }, { |
- "ty", |
- "ty_Latn_PF", |
- "ty" |
- }, { |
- "uk", |
- "uk_Cyrl_UA", |
- "uk" |
- }, { |
- "und", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_AD", |
- "ca_Latn_AD", |
- "ca_AD" |
- }, { |
- "und_AE", |
- "ar_Arab_AE", |
- "ar_AE" |
- }, { |
- "und_AF", |
- "fa_Arab_AF", |
- "fa_AF" |
- }, { |
- "und_AL", |
- "sq_Latn_AL", |
- "sq" |
- }, { |
- "und_AM", |
- "hy_Armn_AM", |
- "hy" |
- }, { |
- "und_AO", |
- "pt_Latn_AO", |
- "pt_AO" |
- }, { |
- "und_AR", |
- "es_Latn_AR", |
- "es_AR" |
- }, { |
- "und_AS", |
- "sm_Latn_AS", |
- "sm_AS" |
- }, { |
- "und_AT", |
- "de_Latn_AT", |
- "de_AT" |
- }, { |
- "und_AW", |
- "nl_Latn_AW", |
- "nl_AW" |
- }, { |
- "und_AX", |
- "sv_Latn_AX", |
- "sv_AX" |
- }, { |
- "und_AZ", |
- "az_Latn_AZ", |
- "az" |
- }, { |
- "und_Arab", |
- "ar_Arab_EG", |
- "ar" |
- }, { |
- "und_Arab_IN", |
- "ur_Arab_IN", |
- "ur_IN" |
- }, { |
- "und_Arab_PK", |
- "ur_Arab_PK", |
- "ur" |
- }, { |
- "und_Arab_SN", |
- "ar_Arab_SN", |
- "ar_SN" |
- }, { |
- "und_Armn", |
- "hy_Armn_AM", |
- "hy" |
- }, { |
- "und_BA", |
- "bs_Latn_BA", |
- "bs" |
- }, { |
- "und_BD", |
- "bn_Beng_BD", |
- "bn" |
- }, { |
- "und_BE", |
- "nl_Latn_BE", |
- "nl_BE" |
- }, { |
- "und_BF", |
- "fr_Latn_BF", |
- "fr_BF" |
- }, { |
- "und_BG", |
- "bg_Cyrl_BG", |
- "bg" |
- }, { |
- "und_BH", |
- "ar_Arab_BH", |
- "ar_BH" |
- }, { |
- "und_BI", |
- "rn_Latn_BI", |
- "rn" |
- }, { |
- "und_BJ", |
- "fr_Latn_BJ", |
- "fr_BJ" |
- }, { |
- "und_BN", |
- "ms_Latn_BN", |
- "ms_BN" |
- }, { |
- "und_BO", |
- "es_Latn_BO", |
- "es_BO" |
- }, { |
- "und_BR", |
- "pt_Latn_BR", |
- "pt" |
- }, { |
- "und_BT", |
- "dz_Tibt_BT", |
- "dz" |
- }, { |
- "und_BY", |
- "be_Cyrl_BY", |
- "be" |
- }, { |
- "und_Beng", |
- "bn_Beng_BD", |
- "bn" |
- }, { |
- "und_Beng_IN", |
- "bn_Beng_IN", |
- "bn_IN" |
- }, { |
- "und_CD", |
- "sw_Latn_CD", |
- "sw_CD" |
- }, { |
- "und_CF", |
- "fr_Latn_CF", |
- "fr_CF" |
- }, { |
- "und_CG", |
- "fr_Latn_CG", |
- "fr_CG" |
- }, { |
- "und_CH", |
- "de_Latn_CH", |
- "de_CH" |
- }, { |
- "und_CI", |
- "fr_Latn_CI", |
- "fr_CI" |
- }, { |
- "und_CL", |
- "es_Latn_CL", |
- "es_CL" |
- }, { |
- "und_CM", |
- "fr_Latn_CM", |
- "fr_CM" |
- }, { |
- "und_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_CO", |
- "es_Latn_CO", |
- "es_CO" |
- }, { |
- "und_CR", |
- "es_Latn_CR", |
- "es_CR" |
- }, { |
- "und_CU", |
- "es_Latn_CU", |
- "es_CU" |
- }, { |
- "und_CV", |
- "pt_Latn_CV", |
- "pt_CV" |
- }, { |
- "und_CY", |
- "el_Grek_CY", |
- "el_CY" |
- }, { |
- "und_CZ", |
- "cs_Latn_CZ", |
- "cs" |
- }, { |
- "und_Cher", |
- "chr_Cher_US", |
- "chr" |
- }, { |
- "und_Cyrl", |
- "ru_Cyrl_RU", |
- "ru" |
- }, { |
- "und_Cyrl_KZ", |
- "ru_Cyrl_KZ", |
- "ru_KZ" |
- }, { |
- "und_DE", |
- "de_Latn_DE", |
- "de" |
- }, { |
- "und_DJ", |
- "aa_Latn_DJ", |
- "aa_DJ" |
- }, { |
- "und_DK", |
- "da_Latn_DK", |
- "da" |
- }, { |
- "und_DO", |
- "es_Latn_DO", |
- "es_DO" |
- }, { |
- "und_DZ", |
- "ar_Arab_DZ", |
- "ar_DZ" |
- }, { |
- "und_Deva", |
- "hi_Deva_IN", |
- "hi" |
- }, { |
- "und_EC", |
- "es_Latn_EC", |
- "es_EC" |
- }, { |
- "und_EE", |
- "et_Latn_EE", |
- "et" |
- }, { |
- "und_EG", |
- "ar_Arab_EG", |
- "ar" |
- }, { |
- "und_EH", |
- "ar_Arab_EH", |
- "ar_EH" |
- }, { |
- "und_ER", |
- "ti_Ethi_ER", |
- "ti_ER" |
- }, { |
- "und_ES", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "und_ET", |
- "am_Ethi_ET", |
- "am" |
- }, { |
- "und_Ethi", |
- "am_Ethi_ET", |
- "am" |
- }, { |
- "und_Ethi_ER", |
- "am_Ethi_ER", |
- "am_ER" |
- }, { |
- "und_FI", |
- "fi_Latn_FI", |
- "fi" |
- }, { |
- "und_FM", |
- "en_Latn_FM", |
- "en_FM" |
- }, { |
- "und_FO", |
- "fo_Latn_FO", |
- "fo" |
- }, { |
- "und_FR", |
- "fr_Latn_FR", |
- "fr" |
- }, { |
- "und_GA", |
- "fr_Latn_GA", |
- "fr_GA" |
- }, { |
- "und_GE", |
- "ka_Geor_GE", |
- "ka" |
- }, { |
- "und_GF", |
- "fr_Latn_GF", |
- "fr_GF" |
- }, { |
- "und_GL", |
- "kl_Latn_GL", |
- "kl" |
- }, { |
- "und_GN", |
- "fr_Latn_GN", |
- "fr_GN" |
- }, { |
- "und_GP", |
- "fr_Latn_GP", |
- "fr_GP" |
- }, { |
- "und_GQ", |
- "es_Latn_GQ", |
- "es_GQ" |
- }, { |
- "und_GR", |
- "el_Grek_GR", |
- "el" |
- }, { |
- "und_GT", |
- "es_Latn_GT", |
- "es_GT" |
- }, { |
- "und_GU", |
- "en_Latn_GU", |
- "en_GU" |
- }, { |
- "und_GW", |
- "pt_Latn_GW", |
- "pt_GW" |
- }, { |
- "und_Geor", |
- "ka_Geor_GE", |
- "ka" |
- }, { |
- "und_Grek", |
- "el_Grek_GR", |
- "el" |
- }, { |
- "und_Gujr", |
- "gu_Gujr_IN", |
- "gu" |
- }, { |
- "und_Guru", |
- "pa_Guru_IN", |
- "pa" |
- }, { |
- "und_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "und_HN", |
- "es_Latn_HN", |
- "es_HN" |
- }, { |
- "und_HR", |
- "hr_Latn_HR", |
- "hr" |
- }, { |
- "und_HT", |
- "ht_Latn_HT", |
- "ht" |
- }, { |
- "und_HU", |
- "hu_Latn_HU", |
- "hu" |
- }, { |
- "und_Hani", |
- "zh_Hani_CN", |
- "zh_Hani" |
- }, { |
- "und_Hans", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_Hant", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Hebr", |
- "he_Hebr_IL", |
- "he" |
- }, { |
- "und_IL", |
- "he_Hebr_IL", |
- "he" |
- }, { |
- "und_IN", |
- "hi_Deva_IN", |
- "hi" |
- }, { |
- "und_IQ", |
- "ar_Arab_IQ", |
- "ar_IQ" |
- }, { |
- "und_IR", |
- "fa_Arab_IR", |
- "fa" |
- }, { |
- "und_IS", |
- "is_Latn_IS", |
- "is" |
- }, { |
- "und_IT", |
- "it_Latn_IT", |
- "it" |
- }, { |
- "und_JO", |
- "ar_Arab_JO", |
- "ar_JO" |
- }, { |
- "und_JP", |
- "ja_Jpan_JP", |
- "ja" |
- }, { |
- "und_Jpan", |
- "ja_Jpan_JP", |
- "ja" |
- }, { |
- "und_KG", |
- "ky_Cyrl_KG", |
- "ky" |
- }, { |
- "und_KH", |
- "km_Khmr_KH", |
- "km" |
- }, { |
- "und_KM", |
- "ar_Arab_KM", |
- "ar_KM" |
- }, { |
- "und_KP", |
- "ko_Kore_KP", |
- "ko_KP" |
- }, { |
- "und_KR", |
- "ko_Kore_KR", |
- "ko" |
- }, { |
- "und_KW", |
- "ar_Arab_KW", |
- "ar_KW" |
- }, { |
- "und_KZ", |
- "ru_Cyrl_KZ", |
- "ru_KZ" |
- }, { |
- "und_Khmr", |
- "km_Khmr_KH", |
- "km" |
- }, { |
- "und_Knda", |
- "kn_Knda_IN", |
- "kn" |
- }, { |
- "und_Kore", |
- "ko_Kore_KR", |
- "ko" |
- }, { |
- "und_LA", |
- "lo_Laoo_LA", |
- "lo" |
- }, { |
- "und_LB", |
- "ar_Arab_LB", |
- "ar_LB" |
- }, { |
- "und_LI", |
- "de_Latn_LI", |
- "de_LI" |
- }, { |
- "und_LK", |
- "si_Sinh_LK", |
- "si" |
- }, { |
- "und_LS", |
- "st_Latn_LS", |
- "st_LS" |
- }, { |
- "und_LT", |
- "lt_Latn_LT", |
- "lt" |
- }, { |
- "und_LU", |
- "fr_Latn_LU", |
- "fr_LU" |
- }, { |
- "und_LV", |
- "lv_Latn_LV", |
- "lv" |
- }, { |
- "und_LY", |
- "ar_Arab_LY", |
- "ar_LY" |
- }, { |
- "und_Laoo", |
- "lo_Laoo_LA", |
- "lo" |
- }, { |
- "und_Latn_ES", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "und_Latn_ET", |
- "en_Latn_ET", |
- "en_ET" |
- }, { |
- "und_Latn_GB", |
- "en_Latn_GB", |
- "en_GB" |
- }, { |
- "und_Latn_GH", |
- "ak_Latn_GH", |
- "ak" |
- }, { |
- "und_Latn_ID", |
- "id_Latn_ID", |
- "id" |
- }, { |
- "und_Latn_IT", |
- "it_Latn_IT", |
- "it" |
- }, { |
- "und_Latn_NG", |
- "en_Latn_NG", |
- "en_NG" |
- }, { |
- "und_Latn_TR", |
- "tr_Latn_TR", |
- "tr" |
- }, { |
- "und_Latn_ZA", |
- "en_Latn_ZA", |
- "en_ZA" |
- }, { |
- "und_MA", |
- "ar_Arab_MA", |
- "ar_MA" |
- }, { |
- "und_MC", |
- "fr_Latn_MC", |
- "fr_MC" |
- }, { |
- "und_MD", |
- "ro_Latn_MD", |
- "ro_MD" |
- }, { |
- "und_ME", |
- "sr_Latn_ME", |
- "sr_ME" |
- }, { |
- "und_MG", |
- "mg_Latn_MG", |
- "mg" |
- }, { |
- "und_MH", |
- "en_Latn_MH", |
- "en_MH" |
- }, { |
- "und_MK", |
- "mk_Cyrl_MK", |
- "mk" |
- }, { |
- "und_ML", |
- "bm_Latn_ML", |
- "bm" |
- }, { |
- "und_MM", |
- "my_Mymr_MM", |
- "my" |
- }, { |
- "und_MN", |
- "mn_Cyrl_MN", |
- "mn" |
- }, { |
- "und_MO", |
- "zh_Hant_MO", |
- "zh_MO" |
- }, { |
- "und_MQ", |
- "fr_Latn_MQ", |
- "fr_MQ" |
- }, { |
- "und_MR", |
- "ar_Arab_MR", |
- "ar_MR" |
- }, { |
- "und_MT", |
- "mt_Latn_MT", |
- "mt" |
- }, { |
- "und_MV", |
- "dv_Thaa_MV", |
- "dv" |
- }, { |
- "und_MW", |
- "en_Latn_MW", |
- "en_MW" |
- }, { |
- "und_MX", |
- "es_Latn_MX", |
- "es_MX" |
- }, { |
- "und_MY", |
- "ms_Latn_MY", |
- "ms" |
- }, { |
- "und_MZ", |
- "pt_Latn_MZ", |
- "pt_MZ" |
- }, { |
- "und_Mlym", |
- "ml_Mlym_IN", |
- "ml" |
- }, { |
- "und_Mymr", |
- "my_Mymr_MM", |
- "my" |
- }, { |
- "und_NC", |
- "fr_Latn_NC", |
- "fr_NC" |
- }, { |
- "und_NE", |
- "ha_Latn_NE", |
- "ha_NE" |
- }, { |
- "und_NG", |
- "en_Latn_NG", |
- "en_NG" |
- }, { |
- "und_NI", |
- "es_Latn_NI", |
- "es_NI" |
- }, { |
- "und_NL", |
- "nl_Latn_NL", |
- "nl" |
- }, { |
- "und_NO", |
- "nb_Latn_NO", |
- "nb" |
- }, { |
- "und_NP", |
- "ne_Deva_NP", |
- "ne" |
- }, { |
- "und_NR", |
- "en_Latn_NR", |
- "en_NR" |
- }, { |
- "und_NU", |
- "en_Latn_NU", |
- "en_NU" |
- }, { |
- "und_OM", |
- "ar_Arab_OM", |
- "ar_OM" |
- }, { |
- "und_Orya", |
- "or_Orya_IN", |
- "or" |
- }, { |
- "und_PA", |
- "es_Latn_PA", |
- "es_PA" |
- }, { |
- "und_PE", |
- "es_Latn_PE", |
- "es_PE" |
- }, { |
- "und_PF", |
- "fr_Latn_PF", |
- "fr_PF" |
- }, { |
- "und_PG", |
- "tpi_Latn_PG", |
- "tpi" |
- }, { |
- "und_PH", |
- "fil_Latn_PH", |
- "fil" |
- }, { |
- "und_PL", |
- "pl_Latn_PL", |
- "pl" |
- }, { |
- "und_PM", |
- "fr_Latn_PM", |
- "fr_PM" |
- }, { |
- "und_PR", |
- "es_Latn_PR", |
- "es_PR" |
- }, { |
- "und_PS", |
- "ar_Arab_PS", |
- "ar_PS" |
- }, { |
- "und_PT", |
- "pt_Latn_PT", |
- "pt_PT" |
- }, { |
- "und_PW", |
- "pau_Latn_PW", |
- "pau" |
- }, { |
- "und_PY", |
- "gn_Latn_PY", |
- "gn" |
- }, { |
- "und_QA", |
- "ar_Arab_QA", |
- "ar_QA" |
- }, { |
- "und_RE", |
- "fr_Latn_RE", |
- "fr_RE" |
- }, { |
- "und_RO", |
- "ro_Latn_RO", |
- "ro" |
- }, { |
- "und_RS", |
- "sr_Cyrl_RS", |
- "sr" |
- }, { |
- "und_RU", |
- "ru_Cyrl_RU", |
- "ru" |
- }, { |
- "und_RW", |
- "rw_Latn_RW", |
- "rw" |
- }, { |
- "und_SA", |
- "ar_Arab_SA", |
- "ar_SA" |
- }, { |
- "und_SD", |
- "ar_Arab_SD", |
- "ar_SD" |
- }, { |
- "und_SE", |
- "sv_Latn_SE", |
- "sv" |
- }, { |
- "und_SG", |
- "en_Latn_SG", |
- "en_SG" |
- }, { |
- "und_SI", |
- "sl_Latn_SI", |
- "sl" |
- }, { |
- "und_SJ", |
- "nb_Latn_SJ", |
- "nb_SJ" |
- }, { |
- "und_SK", |
- "sk_Latn_SK", |
- "sk" |
- }, { |
- "und_SM", |
- "it_Latn_SM", |
- "it_SM" |
- }, { |
- "und_SN", |
- "fr_Latn_SN", |
- "fr_SN" |
- }, { |
- "und_SO", |
- "so_Latn_SO", |
- "so" |
- }, { |
- "und_SR", |
- "nl_Latn_SR", |
- "nl_SR" |
- }, { |
- "und_ST", |
- "pt_Latn_ST", |
- "pt_ST" |
- }, { |
- "und_SV", |
- "es_Latn_SV", |
- "es_SV" |
- }, { |
- "und_SY", |
- "ar_Arab_SY", |
- "ar_SY" |
- }, { |
- "und_Sinh", |
- "si_Sinh_LK", |
- "si" |
- }, { |
- "und_TD", |
- "fr_Latn_TD", |
- "fr_TD" |
- }, { |
- "und_TG", |
- "fr_Latn_TG", |
- "fr_TG" |
- }, { |
- "und_TH", |
- "th_Thai_TH", |
- "th" |
- }, { |
- "und_TJ", |
- "tg_Cyrl_TJ", |
- "tg" |
- }, { |
- "und_TK", |
- "tkl_Latn_TK", |
- "tkl" |
- }, { |
- "und_TL", |
- "pt_Latn_TL", |
- "pt_TL" |
- }, { |
- "und_TM", |
- "tk_Latn_TM", |
- "tk" |
- }, { |
- "und_TN", |
- "ar_Arab_TN", |
- "ar_TN" |
- }, { |
- "und_TO", |
- "to_Latn_TO", |
- "to" |
- }, { |
- "und_TR", |
- "tr_Latn_TR", |
- "tr" |
- }, { |
- "und_TV", |
- "tvl_Latn_TV", |
- "tvl" |
- }, { |
- "und_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Taml", |
- "ta_Taml_IN", |
- "ta" |
- }, { |
- "und_Telu", |
- "te_Telu_IN", |
- "te" |
- }, { |
- "und_Thaa", |
- "dv_Thaa_MV", |
- "dv" |
- }, { |
- "und_Thai", |
- "th_Thai_TH", |
- "th" |
- }, { |
- "und_Tibt", |
- "bo_Tibt_CN", |
- "bo" |
- }, { |
- "und_UA", |
- "uk_Cyrl_UA", |
- "uk" |
- }, { |
- "und_UY", |
- "es_Latn_UY", |
- "es_UY" |
- }, { |
- "und_UZ", |
- "uz_Latn_UZ", |
- "uz" |
- }, { |
- "und_VA", |
- "it_Latn_VA", |
- "it_VA" |
- }, { |
- "und_VE", |
- "es_Latn_VE", |
- "es_VE" |
- }, { |
- "und_VN", |
- "vi_Latn_VN", |
- "vi" |
- }, { |
- "und_VU", |
- "bi_Latn_VU", |
- "bi" |
- }, { |
- "und_WF", |
- "fr_Latn_WF", |
- "fr_WF" |
- }, { |
- "und_WS", |
- "sm_Latn_WS", |
- "sm" |
- }, { |
- "und_YE", |
- "ar_Arab_YE", |
- "ar_YE" |
- }, { |
- "und_YT", |
- "fr_Latn_YT", |
- "fr_YT" |
- }, { |
- "und_Yiii", |
- "ii_Yiii_CN", |
- "ii" |
- }, { |
- "ur", |
- "ur_Arab_PK", |
- "ur" |
- }, { |
- "uz", |
- "uz_Latn_UZ", |
- "uz" |
- }, { |
- "uz_AF", |
- "uz_Arab_AF", |
- "uz_AF" |
- }, { |
- "uz_Arab", |
- "uz_Arab_AF", |
- "uz_AF" |
- }, { |
- "ve", |
- "ve_Latn_ZA", |
- "ve" |
- }, { |
- "vi", |
- "vi_Latn_VN", |
- "vi" |
- }, { |
- "wal", |
- "wal_Ethi_ET", |
- "wal" |
- }, { |
- "wo", |
- "wo_Latn_SN", |
- "wo" |
- }, { |
- "xh", |
- "xh_Latn_ZA", |
- "xh" |
- }, { |
- "yo", |
- "yo_Latn_NG", |
- "yo" |
- }, { |
- "zh", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "zh_Hani", |
- "zh_Hani_CN", /* changed due to cldrbug 6204, may be an error */ |
- "zh_Hani", /* changed due to cldrbug 6204, may be an error */ |
- }, { |
- "zh_Hant", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zh_MO", |
- "zh_Hant_MO", |
- "zh_MO" |
- }, { |
- "zh_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zu", |
- "zu_Latn_ZA", |
- "zu" |
- }, { |
- "und", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_ZZ", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "und_AQ", |
- "und_Latn_AQ", |
- "und_AQ" |
- }, { |
- "und_Zzzz", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_Zzzz_ZZ", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_Zzzz_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_Zzzz_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Zzzz_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "und_Zzzz_AQ", |
- "und_Latn_AQ", |
- "und_AQ" |
- }, { |
- "und_Latn", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_Latn_ZZ", |
- "en_Latn_US", |
- "en" |
- }, { |
- "und_Latn_CN", |
- "za_Latn_CN", |
- "za" |
- }, { |
- "und_Latn_TW", |
- "trv_Latn_TW", |
- "trv" |
- }, { |
- "und_Latn_HK", |
- "zh_Latn_HK", |
- "zh_Latn_HK" |
- }, { |
- "und_Latn_AQ", |
- "und_Latn_AQ", |
- "und_AQ" |
- }, { |
- "und_Hans", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_Hans_ZZ", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_Hans_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "und_Hans_TW", |
- "zh_Hans_TW", |
- "zh_Hans_TW" |
- }, { |
- "und_Hans_HK", |
- "zh_Hans_HK", |
- "zh_Hans_HK" |
- }, { |
- "und_Hans_AQ", |
- "zh_Hans_AQ", |
- "zh_AQ" |
- }, { |
- "und_Hant", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Hant_ZZ", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Hant_CN", |
- "zh_Hant_CN", |
- "zh_Hant_CN" |
- }, { |
- "und_Hant_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "und_Hant_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "und_Hant_AQ", |
- "zh_Hant_AQ", |
- "zh_Hant_AQ" |
- }, { |
- "und_Moon", |
- "en_Moon_US", |
- "en_Moon" |
- }, { |
- "und_Moon_ZZ", |
- "en_Moon_US", |
- "en_Moon" |
- }, { |
- "und_Moon_CN", |
- "zh_Moon_CN", |
- "zh_Moon" |
- }, { |
- "und_Moon_TW", |
- "zh_Moon_TW", |
- "zh_Moon_TW" |
- }, { |
- "und_Moon_HK", |
- "zh_Moon_HK", |
- "zh_Moon_HK" |
- }, { |
- "und_Moon_AQ", |
- "und_Moon_AQ", |
- "und_Moon_AQ" |
- }, { |
- "es", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_ZZ", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_CN", |
- "es_Latn_CN", |
- "es_CN" |
- }, { |
- "es_TW", |
- "es_Latn_TW", |
- "es_TW" |
- }, { |
- "es_HK", |
- "es_Latn_HK", |
- "es_HK" |
- }, { |
- "es_AQ", |
- "es_Latn_AQ", |
- "es_AQ" |
- }, { |
- "es_Zzzz", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_Zzzz_ZZ", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_Zzzz_CN", |
- "es_Latn_CN", |
- "es_CN" |
- }, { |
- "es_Zzzz_TW", |
- "es_Latn_TW", |
- "es_TW" |
- }, { |
- "es_Zzzz_HK", |
- "es_Latn_HK", |
- "es_HK" |
- }, { |
- "es_Zzzz_AQ", |
- "es_Latn_AQ", |
- "es_AQ" |
- }, { |
- "es_Latn", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_Latn_ZZ", |
- "es_Latn_ES", |
- "es" |
- }, { |
- "es_Latn_CN", |
- "es_Latn_CN", |
- "es_CN" |
- }, { |
- "es_Latn_TW", |
- "es_Latn_TW", |
- "es_TW" |
- }, { |
- "es_Latn_HK", |
- "es_Latn_HK", |
- "es_HK" |
- }, { |
- "es_Latn_AQ", |
- "es_Latn_AQ", |
- "es_AQ" |
- }, { |
- "es_Hans", |
- "es_Hans_ES", |
- "es_Hans" |
- }, { |
- "es_Hans_ZZ", |
- "es_Hans_ES", |
- "es_Hans" |
- }, { |
- "es_Hans_CN", |
- "es_Hans_CN", |
- "es_Hans_CN" |
- }, { |
- "es_Hans_TW", |
- "es_Hans_TW", |
- "es_Hans_TW" |
- }, { |
- "es_Hans_HK", |
- "es_Hans_HK", |
- "es_Hans_HK" |
- }, { |
- "es_Hans_AQ", |
- "es_Hans_AQ", |
- "es_Hans_AQ" |
- }, { |
- "es_Hant", |
- "es_Hant_ES", |
- "es_Hant" |
- }, { |
- "es_Hant_ZZ", |
- "es_Hant_ES", |
- "es_Hant" |
- }, { |
- "es_Hant_CN", |
- "es_Hant_CN", |
- "es_Hant_CN" |
- }, { |
- "es_Hant_TW", |
- "es_Hant_TW", |
- "es_Hant_TW" |
- }, { |
- "es_Hant_HK", |
- "es_Hant_HK", |
- "es_Hant_HK" |
- }, { |
- "es_Hant_AQ", |
- "es_Hant_AQ", |
- "es_Hant_AQ" |
- }, { |
- "es_Moon", |
- "es_Moon_ES", |
- "es_Moon" |
- }, { |
- "es_Moon_ZZ", |
- "es_Moon_ES", |
- "es_Moon" |
- }, { |
- "es_Moon_CN", |
- "es_Moon_CN", |
- "es_Moon_CN" |
- }, { |
- "es_Moon_TW", |
- "es_Moon_TW", |
- "es_Moon_TW" |
- }, { |
- "es_Moon_HK", |
- "es_Moon_HK", |
- "es_Moon_HK" |
- }, { |
- "es_Moon_AQ", |
- "es_Moon_AQ", |
- "es_Moon_AQ" |
- }, { |
- "zh", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_ZZ", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zh_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "zh_AQ", |
- "zh_Hans_AQ", |
- "zh_AQ" |
- }, { |
- "zh_Zzzz", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_Zzzz_ZZ", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_Zzzz_CN", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_Zzzz_TW", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zh_Zzzz_HK", |
- "zh_Hant_HK", |
- "zh_HK" |
- }, { |
- "zh_Zzzz_AQ", |
- "zh_Hans_AQ", |
- "zh_AQ" |
- }, { |
- "zh_Latn", |
- "zh_Latn_CN", |
- "zh_Latn" |
- }, { |
- "zh_Latn_ZZ", |
- "zh_Latn_CN", |
- "zh_Latn" |
- }, { |
- "zh_Latn_CN", |
- "zh_Latn_CN", |
- "zh_Latn" |
- }, { |
- "zh_Latn_TW", |
- "zh_Latn_TW", |
- "zh_Latn_TW" |
- }, { |
- "zh_Latn_HK", |
- "zh_Latn_HK", |
- "zh_Latn_HK" |
- }, { |
- "zh_Latn_AQ", |
- "zh_Latn_AQ", |
- "zh_Latn_AQ" |
- }, { |
- "zh_Hans", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_Hans_ZZ", |
- "zh_Hans_CN", |
- "zh" |
- }, { |
- "zh_Hans_TW", |
- "zh_Hans_TW", |
- "zh_Hans_TW" |
- }, { |
- "zh_Hans_HK", |
- "zh_Hans_HK", |
- "zh_Hans_HK" |
- }, { |
- "zh_Hans_AQ", |
- "zh_Hans_AQ", |
- "zh_AQ" |
- }, { |
- "zh_Hant", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zh_Hant_ZZ", |
- "zh_Hant_TW", |
- "zh_TW" |
- }, { |
- "zh_Hant_CN", |
- "zh_Hant_CN", |
- "zh_Hant_CN" |
- }, { |
- "zh_Hant_AQ", |
- "zh_Hant_AQ", |
- "zh_Hant_AQ" |
- }, { |
- "zh_Moon", |
- "zh_Moon_CN", |
- "zh_Moon" |
- }, { |
- "zh_Moon_ZZ", |
- "zh_Moon_CN", |
- "zh_Moon" |
- }, { |
- "zh_Moon_CN", |
- "zh_Moon_CN", |
- "zh_Moon" |
- }, { |
- "zh_Moon_TW", |
- "zh_Moon_TW", |
- "zh_Moon_TW" |
- }, { |
- "zh_Moon_HK", |
- "zh_Moon_HK", |
- "zh_Moon_HK" |
- }, { |
- "zh_Moon_AQ", |
- "zh_Moon_AQ", |
- "zh_Moon_AQ" |
- }, { |
- "art", |
- "", |
- "" |
- }, { |
- "art_ZZ", |
- "", |
- "" |
- }, { |
- "art_CN", |
- "", |
- "" |
- }, { |
- "art_TW", |
- "", |
- "" |
- }, { |
- "art_HK", |
- "", |
- "" |
- }, { |
- "art_AQ", |
- "", |
- "" |
- }, { |
- "art_Zzzz", |
- "", |
- "" |
- }, { |
- "art_Zzzz_ZZ", |
- "", |
- "" |
- }, { |
- "art_Zzzz_CN", |
- "", |
- "" |
- }, { |
- "art_Zzzz_TW", |
- "", |
- "" |
- }, { |
- "art_Zzzz_HK", |
- "", |
- "" |
- }, { |
- "art_Zzzz_AQ", |
- "", |
- "" |
- }, { |
- "art_Latn", |
- "", |
- "" |
- }, { |
- "art_Latn_ZZ", |
- "", |
- "" |
- }, { |
- "art_Latn_CN", |
- "", |
- "" |
- }, { |
- "art_Latn_TW", |
- "", |
- "" |
- }, { |
- "art_Latn_HK", |
- "", |
- "" |
- }, { |
- "art_Latn_AQ", |
- "", |
- "" |
- }, { |
- "art_Hans", |
- "", |
- "" |
- }, { |
- "art_Hans_ZZ", |
- "", |
- "" |
- }, { |
- "art_Hans_CN", |
- "", |
- "" |
- }, { |
- "art_Hans_TW", |
- "", |
- "" |
- }, { |
- "art_Hans_HK", |
- "", |
- "" |
- }, { |
- "art_Hans_AQ", |
- "", |
- "" |
- }, { |
- "art_Hant", |
- "", |
- "" |
- }, { |
- "art_Hant_ZZ", |
- "", |
- "" |
- }, { |
- "art_Hant_CN", |
- "", |
- "" |
- }, { |
- "art_Hant_TW", |
- "", |
- "" |
- }, { |
- "art_Hant_HK", |
- "", |
- "" |
- }, { |
- "art_Hant_AQ", |
- "", |
- "" |
- }, { |
- "art_Moon", |
- "", |
- "" |
- }, { |
- "art_Moon_ZZ", |
- "", |
- "" |
- }, { |
- "art_Moon_CN", |
- "", |
- "" |
- }, { |
- "art_Moon_TW", |
- "", |
- "" |
- }, { |
- "art_Moon_HK", |
- "", |
- "" |
- }, { |
- "art_Moon_AQ", |
- "", |
- "" |
- }, { |
- "de@collation=phonebook", |
- "de_Latn_DE@collation=phonebook", |
- "de@collation=phonebook" |
- } |
-}; |
- |
-typedef struct errorDataTag { |
- const char* tag; |
- const char* expected; |
- UErrorCode uerror; |
- int32_t bufferSize; |
-} errorData; |
- |
-const errorData maximizeErrors[] = { |
- { |
- "enfueiujhytdf", |
- NULL, |
- U_ILLEGAL_ARGUMENT_ERROR, |
- -1 |
- }, |
- { |
- "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", |
- NULL, |
- U_ILLEGAL_ARGUMENT_ERROR, |
- -1 |
- }, |
- { |
- "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", |
- NULL, |
- U_ILLEGAL_ARGUMENT_ERROR, |
- -1 |
- }, |
- { |
- "en_Latn_US_POSIX@currency=EURO", |
- "en_Latn_US_POSIX@currency=EURO", |
- U_BUFFER_OVERFLOW_ERROR, |
- 29 |
- }, |
- { |
- "en_Latn_US_POSIX@currency=EURO", |
- "en_Latn_US_POSIX@currency=EURO", |
- U_STRING_NOT_TERMINATED_WARNING, |
- 30 |
- } |
-}; |
- |
-const errorData minimizeErrors[] = { |
- { |
- "enfueiujhytdf", |
- NULL, |
- U_ILLEGAL_ARGUMENT_ERROR, |
- -1 |
- }, |
- { |
- "en_THUJIOGIURJHGJFURYHFJGURYYYHHGJURHG", |
- NULL, |
- U_ILLEGAL_ARGUMENT_ERROR, |
- -1 |
- }, |
- { |
- "en_Latn_US_POSIX@currency=EURO", |
- "en__POSIX@currency=EURO", |
- U_BUFFER_OVERFLOW_ERROR, |
- 22 |
- }, |
- { |
- "en_Latn_US_POSIX@currency=EURO", |
- "en__POSIX@currency=EURO", |
- U_STRING_NOT_TERMINATED_WARNING, |
- 23 |
- } |
-}; |
- |
-static int32_t getExpectedReturnValue(const errorData* data) |
-{ |
- if (data->uerror == U_BUFFER_OVERFLOW_ERROR || |
- data->uerror == U_STRING_NOT_TERMINATED_WARNING) |
- { |
- return strlen(data->expected); |
- } |
- else |
- { |
- return -1; |
- } |
-} |
- |
-static int32_t getBufferSize(const errorData* data, int32_t actualSize) |
-{ |
- if (data->expected == NULL) |
- { |
- return actualSize; |
- } |
- else if (data->bufferSize < 0) |
- { |
- return strlen(data->expected) + 1; |
- } |
- else |
- { |
- return data->bufferSize; |
- } |
-} |
- |
-static void TestLikelySubtags() |
-{ |
- char buffer[ULOC_FULLNAME_CAPACITY + ULOC_KEYWORD_AND_VALUES_CAPACITY + 1]; |
- int32_t i = 0; |
- |
- for (; i < sizeof(basic_maximize_data) / sizeof(basic_maximize_data[0]); ++i) |
- { |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const minimal = basic_maximize_data[i][0]; |
- const char* const maximal = basic_maximize_data[i][1]; |
- |
- /* const int32_t length = */ |
- uloc_addLikelySubtags( |
- minimal, |
- buffer, |
- sizeof(buffer), |
- &status); |
- if (U_FAILURE(status)) { |
- log_err_status(status, " unexpected failure of uloc_addLikelySubtags(), minimal \"%s\" status %s\n", minimal, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strlen(maximal) == 0) { |
- if (uprv_stricmp(minimal, buffer) != 0) { |
- log_err(" unexpected maximal value \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); |
- } |
- } |
- else if (uprv_stricmp(maximal, buffer) != 0) { |
- log_err(" maximal doesn't match expected %s in uloc_addLikelySubtags(), minimal \"%s\" = %s\n", maximal, minimal, buffer); |
- } |
- } |
- |
- for (i = 0; i < sizeof(basic_minimize_data) / sizeof(basic_minimize_data[0]); ++i) { |
- |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const maximal = basic_minimize_data[i][0]; |
- const char* const minimal = basic_minimize_data[i][1]; |
- |
- /* const int32_t length = */ |
- uloc_minimizeSubtags( |
- maximal, |
- buffer, |
- sizeof(buffer), |
- &status); |
- |
- if (U_FAILURE(status)) { |
- log_err_status(status, " unexpected failure of uloc_MinimizeSubtags(), maximal \"%s\" status %s\n", maximal, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strlen(minimal) == 0) { |
- if (uprv_stricmp(maximal, buffer) != 0) { |
- log_err(" unexpected minimal value \"%s\" in uloc_minimizeSubtags(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer); |
- } |
- } |
- else if (uprv_stricmp(minimal, buffer) != 0) { |
- log_err(" minimal doesn't match expected %s in uloc_MinimizeSubtags(), maximal \"%s\" = %s\n", minimal, maximal, buffer); |
- } |
- } |
- |
- for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) { |
- |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const minimal = full_data[i][0]; |
- const char* const maximal = full_data[i][1]; |
- |
- /* const int32_t length = */ |
- uloc_addLikelySubtags( |
- minimal, |
- buffer, |
- sizeof(buffer), |
- &status); |
- if (U_FAILURE(status)) { |
- log_err_status(status, " unexpected failure of uloc_addLikelySubtags(), minimal \"%s\" status \"%s\"\n", minimal, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strlen(maximal) == 0) { |
- if (uprv_stricmp(minimal, buffer) != 0) { |
- log_err(" unexpected maximal value \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); |
- } |
- } |
- else if (uprv_stricmp(maximal, buffer) != 0) { |
- log_err(" maximal doesn't match expected \"%s\" in uloc_addLikelySubtags(), minimal \"%s\" = \"%s\"\n", maximal, minimal, buffer); |
- } |
- } |
- |
- for (i = 0; i < sizeof(full_data) / sizeof(full_data[0]); ++i) { |
- |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const maximal = full_data[i][1]; |
- const char* const minimal = full_data[i][2]; |
- |
- if (strlen(maximal) > 0) { |
- |
- /* const int32_t length = */ |
- uloc_minimizeSubtags( |
- maximal, |
- buffer, |
- sizeof(buffer), |
- &status); |
- |
- if (U_FAILURE(status)) { |
- log_err_status(status, " unexpected failure of uloc_minimizeSubtags(), maximal \"%s\" status %s\n", maximal, u_errorName(status)); |
- status = U_ZERO_ERROR; |
- } |
- else if (uprv_strlen(minimal) == 0) { |
- if (uprv_stricmp(maximal, buffer) != 0) { |
- log_err(" unexpected minimal value \"%s\" in uloc_minimizeSubtags(), maximal \"%s\" = \"%s\"\n", minimal, maximal, buffer); |
- } |
- } |
- else if (uprv_stricmp(minimal, buffer) != 0) { |
- log_err(" minimal doesn't match expected %s in uloc_MinimizeSubtags(), maximal \"%s\" = %s\n", minimal, maximal, buffer); |
- } |
- } |
- } |
- |
- for (i = 0; i < sizeof(maximizeErrors) / sizeof(maximizeErrors[0]); ++i) { |
- |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const minimal = maximizeErrors[i].tag; |
- const char* const maximal = maximizeErrors[i].expected; |
- const UErrorCode expectedStatus = maximizeErrors[i].uerror; |
- const int32_t expectedLength = getExpectedReturnValue(&maximizeErrors[i]); |
- const int32_t bufferSize = getBufferSize(&maximizeErrors[i], sizeof(buffer)); |
- |
- const int32_t length = |
- uloc_addLikelySubtags( |
- minimal, |
- buffer, |
- bufferSize, |
- &status); |
- |
- if (status == U_ZERO_ERROR) { |
- log_err(" unexpected U_ZERO_ERROR for uloc_addLikelySubtags(), minimal \"%s\" expected status %s\n", minimal, u_errorName(expectedStatus)); |
- status = U_ZERO_ERROR; |
- } |
- else if (status != expectedStatus) { |
- log_err_status(status, " unexpected status for uloc_addLikelySubtags(), minimal \"%s\" expected status %s, but got %s\n", minimal, u_errorName(expectedStatus), u_errorName(status)); |
- } |
- else if (length != expectedLength) { |
- log_err(" unexpected length for uloc_addLikelySubtags(), minimal \"%s\" expected length %d, but got %d\n", minimal, expectedLength, length); |
- } |
- else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) { |
- if (uprv_strnicmp(maximal, buffer, bufferSize) != 0) { |
- log_err(" maximal doesn't match expected %s in uloc_addLikelySubtags(), minimal \"%s\" = %*s\n", |
- maximal, minimal, (int)sizeof(buffer), buffer); |
- } |
- } |
- } |
- |
- for (i = 0; i < sizeof(minimizeErrors) / sizeof(minimizeErrors[0]); ++i) { |
- |
- UErrorCode status = U_ZERO_ERROR; |
- const char* const maximal = minimizeErrors[i].tag; |
- const char* const minimal = minimizeErrors[i].expected; |
- const UErrorCode expectedStatus = minimizeErrors[i].uerror; |
- const int32_t expectedLength = getExpectedReturnValue(&minimizeErrors[i]); |
- const int32_t bufferSize = getBufferSize(&minimizeErrors[i], sizeof(buffer)); |
- |
- const int32_t length = |
- uloc_minimizeSubtags( |
- maximal, |
- buffer, |
- bufferSize, |
- &status); |
- |
- if (status == U_ZERO_ERROR) { |
- log_err(" unexpected U_ZERO_ERROR for uloc_minimizeSubtags(), maximal \"%s\" expected status %s\n", maximal, u_errorName(expectedStatus)); |
- status = U_ZERO_ERROR; |
- } |
- else if (status != expectedStatus) { |
- log_err_status(status, " unexpected status for uloc_minimizeSubtags(), maximal \"%s\" expected status %s, but got %s\n", maximal, u_errorName(expectedStatus), u_errorName(status)); |
- } |
- else if (length != expectedLength) { |
- log_err(" unexpected length for uloc_minimizeSubtags(), maximal \"%s\" expected length %d, but got %d\n", maximal, expectedLength, length); |
- } |
- else if (status == U_BUFFER_OVERFLOW_ERROR || status == U_STRING_NOT_TERMINATED_WARNING) { |
- if (uprv_strnicmp(minimal, buffer, bufferSize) != 0) { |
- log_err(" minimal doesn't match expected \"%s\" in uloc_minimizeSubtags(), minimal \"%s\" = \"%*s\"\n", |
- minimal, maximal, (int)sizeof(buffer), buffer); |
- } |
- } |
- } |
-} |
- |
-const char* const locale_to_langtag[][3] = { |
- {"", "und", "und"}, |
- {"en", "en", "en"}, |
- {"en_US", "en-US", "en-US"}, |
- {"iw_IL", "he-IL", "he-IL"}, |
- {"sr_Latn_SR", "sr-Latn-SR", "sr-Latn-SR"}, |
- {"en__POSIX", "en-u-va-posix", "en-u-va-posix"}, |
- {"en_POSIX", "en-u-va-posix", "en-u-va-posix"}, |
- {"en_US_POSIX_VAR", "en-US-posix-x-lvariant-var", NULL}, /* variant POSIX_VAR is processed as regular variant */ |
- {"en_US_VAR_POSIX", "en-US-x-lvariant-var-posix", NULL}, /* variant VAR_POSIX is processed as regular variant */ |
- {"en_US_POSIX@va=posix2", "en-US-u-va-posix2", "en-US-u-va-posix2"}, /* if keyword va=xxx already exists, variant POSIX is simply dropped */ |
- {"en_US_POSIX@ca=japanese", "en-US-u-ca-japanese-va-posix", "en-US-u-ca-japanese-va-posix"}, |
- {"und_555", "und-555", "und-555"}, |
- {"123", "und", NULL}, |
- {"%$#&", "und", NULL}, |
- {"_Latn", "und-Latn", "und-Latn"}, |
- {"_DE", "und-DE", "und-DE"}, |
- {"und_FR", "und-FR", "und-FR"}, |
- {"th_TH_TH", "th-TH-x-lvariant-th", NULL}, |
- {"bogus", "bogus", "bogus"}, |
- {"foooobarrr", "und", NULL}, |
- {"az_AZ_CYRL", "az-Cyrl-AZ", "az-Cyrl-AZ"}, |
- {"aa_BB_CYRL", "aa-BB-x-lvariant-cyrl", NULL}, |
- {"en_US_1234", "en-US-1234", "en-US-1234"}, |
- {"en_US_VARIANTA_VARIANTB", "en-US-varianta-variantb", "en-US-varianta-variantb"}, |
- {"ja__9876_5432", "ja-9876-5432", "ja-9876-5432"}, |
- {"zh_Hant__VAR", "zh-Hant-x-lvariant-var", NULL}, |
- {"es__BADVARIANT_GOODVAR", "es-goodvar", NULL}, |
- {"en@calendar=gregorian", "en-u-ca-gregory", "en-u-ca-gregory"}, |
- {"de@collation=phonebook;calendar=gregorian", "de-u-ca-gregory-co-phonebk", "de-u-ca-gregory-co-phonebk"}, |
- {"th@numbers=thai;z=extz;x=priv-use;a=exta", "th-a-exta-u-nu-thai-z-extz-x-priv-use", "th-a-exta-u-nu-thai-z-extz-x-priv-use"}, |
- {"en@timezone=America/New_York;calendar=japanese", "en-u-ca-japanese-tz-usnyc", "en-u-ca-japanese-tz-usnyc"}, |
- {"en@timezone=US/Eastern", "en-u-tz-usnyc", "en-u-tz-usnyc"}, |
- {"en@x=x-y-z;a=a-b-c", "en-x-x-y-z", NULL}, |
- {"it@collation=badcollationtype;colStrength=identical;cu=usd-eur", "it-u-cu-usd-eur-ks-identic", NULL}, |
- {"en_US_POSIX", "en-US-u-va-posix", "en-US-u-va-posix"}, |
- {"en_US_POSIX@calendar=japanese;currency=EUR","en-US-u-ca-japanese-cu-eur-va-posix", "en-US-u-ca-japanese-cu-eur-va-posix"}, |
- {"@x=elmer", "x-elmer", "x-elmer"}, |
- {"en@x=elmer", "en-x-elmer", "en-x-elmer"}, |
- {"@x=elmer;a=exta", "und-a-exta-x-elmer", "und-a-exta-x-elmer"}, |
- {"en_US@attribute=attr1-attr2;calendar=gregorian", "en-US-u-attr1-attr2-ca-gregory", "en-US-u-attr1-attr2-ca-gregory"}, |
- {NULL, NULL, NULL} |
-}; |
- |
-static void TestToLanguageTag(void) { |
- char langtag[256]; |
- int32_t i; |
- UErrorCode status; |
- int32_t len; |
- const char *inloc; |
- const char *expected; |
- |
- for (i = 0; locale_to_langtag[i][0] != NULL; i++) { |
- inloc = locale_to_langtag[i][0]; |
- |
- /* testing non-strict mode */ |
- status = U_ZERO_ERROR; |
- langtag[0] = 0; |
- expected = locale_to_langtag[i][1]; |
- |
- len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), FALSE, &status); |
- (void)len; /* Suppress set but not used warning. */ |
- if (U_FAILURE(status)) { |
- if (expected != NULL) { |
- log_err("Error returned by uloc_toLanguageTag for locale id [%s] - error: %s\n", |
- inloc, u_errorName(status)); |
- } |
- } else { |
- if (expected == NULL) { |
- log_err("Error should be returned by uloc_toLanguageTag for locale id [%s], but [%s] is returned without errors\n", |
- inloc, langtag); |
- } else if (uprv_strcmp(langtag, expected) != 0) { |
- log_data_err("uloc_toLanguageTag returned language tag [%s] for input locale [%s] - expected: [%s]. Are you missing data?\n", |
- langtag, inloc, expected); |
- } |
- } |
- |
- /* testing strict mode */ |
- status = U_ZERO_ERROR; |
- langtag[0] = 0; |
- expected = locale_to_langtag[i][2]; |
- |
- len = uloc_toLanguageTag(inloc, langtag, sizeof(langtag), TRUE, &status); |
- if (U_FAILURE(status)) { |
- if (expected != NULL) { |
- log_data_err("Error returned by uloc_toLanguageTag {strict} for locale id [%s] - error: %s Are you missing data?\n", |
- inloc, u_errorName(status)); |
- } |
- } else { |
- if (expected == NULL) { |
- log_err("Error should be returned by uloc_toLanguageTag {strict} for locale id [%s], but [%s] is returned without errors\n", |
- inloc, langtag); |
- } else if (uprv_strcmp(langtag, expected) != 0) { |
- log_err("uloc_toLanguageTag {strict} returned language tag [%s] for input locale [%s] - expected: [%s]\n", |
- langtag, inloc, expected); |
- } |
- } |
- } |
-} |
- |
-#define FULL_LENGTH -1 |
-static const struct { |
- const char *bcpID; |
- const char *locID; |
- int32_t len; |
-} langtag_to_locale[] = { |
- {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn", "ja@attribute=abcd-efgh-ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz", FULL_LENGTH}, |
- {"en", "en", FULL_LENGTH}, |
- {"en-us", "en_US", FULL_LENGTH}, |
- {"und-US", "_US", FULL_LENGTH}, |
- {"und-latn", "_Latn", FULL_LENGTH}, |
- {"en-US-posix", "en_US_POSIX", FULL_LENGTH}, |
- {"de-de_euro", "de", 2}, |
- {"kok-IN", "kok_IN", FULL_LENGTH}, |
- {"123", "", 0}, |
- {"en_us", "", 0}, |
- {"en-latn-x", "en_Latn", 7}, |
- {"art-lojban", "jbo", FULL_LENGTH}, |
- {"zh-hakka", "hak", FULL_LENGTH}, |
- {"zh-cmn-CH", "cmn_CH", FULL_LENGTH}, |
- {"xxx-yy", "xxx_YY", FULL_LENGTH}, |
- {"fr-234", "fr_234", FULL_LENGTH}, |
- {"i-default", "en@x=i-default", FULL_LENGTH}, |
- {"i-test", "", 0}, |
- {"ja-jp-jp", "ja_JP", 5}, |
- {"bogus", "bogus", FULL_LENGTH}, |
- {"boguslang", "", 0}, |
- {"EN-lATN-us", "en_Latn_US", FULL_LENGTH}, |
- {"und-variant-1234", "__VARIANT_1234", FULL_LENGTH}, |
- {"und-varzero-var1-vartwo", "__VARZERO", 11}, |
- {"en-u-ca-gregory", "en@calendar=gregorian", FULL_LENGTH}, |
- {"en-U-cu-USD", "en@currency=usd", FULL_LENGTH}, |
- {"en-US-u-va-posix", "en_US_POSIX", FULL_LENGTH}, |
- {"en-us-u-ca-gregory-va-posix", "en_US_POSIX@calendar=gregorian", FULL_LENGTH}, |
- {"en-us-posix-u-va-posix", "en_US_POSIX@va=posix", FULL_LENGTH}, |
- {"en-us-u-va-posix2", "en_US@va=posix2", FULL_LENGTH}, |
- {"en-us-vari1-u-va-posix", "en_US_VARI1@va=posix", FULL_LENGTH}, |
- {"ar-x-1-2-3", "ar@x=1-2-3", FULL_LENGTH}, |
- {"fr-u-nu-latn-cu-eur", "fr@currency=eur;numbers=latn", FULL_LENGTH}, |
- {"de-k-kext-u-co-phonebk-nu-latn", "de@collation=phonebook;k=kext;numbers=latn", FULL_LENGTH}, |
- {"ja-u-cu-jpy-ca-jp", "ja@calendar=yes;currency=jpy;jp=yes", FULL_LENGTH}, |
- {"en-us-u-tz-usnyc", "en_US@timezone=America/New_York", FULL_LENGTH}, |
- {"und-a-abc-def", "und@a=abc-def", FULL_LENGTH}, |
- {"zh-u-ca-chinese-x-u-ca-chinese", "zh@calendar=chinese;x=u-ca-chinese", FULL_LENGTH}, |
- {"x-elmer", "@x=elmer", FULL_LENGTH}, |
- {"en-US-u-attr1-attr2-ca-gregory", "en_US@attribute=attr1-attr2;calendar=gregorian", FULL_LENGTH}, |
- {"sr-u-kn", "sr@colnumeric=yes", FULL_LENGTH}, |
- {"de-u-kn-co-phonebk", "de@collation=phonebook;colnumeric=yes", FULL_LENGTH}, |
- {"en-u-attr2-attr1-kn-kb", "en@attribute=attr1-attr2;colbackwards=yes;colnumeric=yes", FULL_LENGTH}, |
- {"ja-u-ijkl-efgh-abcd-ca-japanese-xx-yyy-zzz-kn", "ja@attribute=abcd-efgh-ijkl;calendar=japanese;colnumeric=yes;xx=yyy-zzz", FULL_LENGTH}, |
- |
- {"de-u-xc-xphonebk-co-phonebk-ca-buddhist-mo-very-lo-extensi-xd-that-de-should-vc-probably-xz-killthebuffer", |
- "de@calendar=buddhist;collation=phonebook;de=should;lo=extensi;mo=very;vc=probably;xc=xphonebk;xd=that;xz=yes", 91}, |
- {NULL, NULL, 0} |
-}; |
- |
-static void TestForLanguageTag(void) { |
- char locale[256]; |
- int32_t i; |
- UErrorCode status; |
- int32_t parsedLen; |
- int32_t expParsedLen; |
- |
- for (i = 0; langtag_to_locale[i].bcpID != NULL; i++) { |
- status = U_ZERO_ERROR; |
- locale[0] = 0; |
- expParsedLen = langtag_to_locale[i].len; |
- if (expParsedLen == FULL_LENGTH) { |
- expParsedLen = uprv_strlen(langtag_to_locale[i].bcpID); |
- } |
- uloc_forLanguageTag(langtag_to_locale[i].bcpID, locale, sizeof(locale), &parsedLen, &status); |
- if (U_FAILURE(status)) { |
- log_err_status(status, "Error returned by uloc_forLanguageTag for language tag [%s] - error: %s\n", |
- langtag_to_locale[i].bcpID, u_errorName(status)); |
- } else { |
- if (uprv_strcmp(langtag_to_locale[i].locID, locale) != 0) { |
- log_data_err("uloc_forLanguageTag returned locale [%s] for input language tag [%s] - expected: [%s]\n", |
- locale, langtag_to_locale[i].bcpID, langtag_to_locale[i].locID); |
- } |
- if (parsedLen != expParsedLen) { |
- log_err("uloc_forLanguageTag parsed length of %d for input language tag [%s] - expected parsed length: %d\n", |
- parsedLen, langtag_to_locale[i].bcpID, expParsedLen); |
- } |
- } |
- } |
-} |
- |
-static void TestToUnicodeLocaleKey(void) |
-{ |
- /* $IN specifies the result should be the input pointer itself */ |
- static const char* DATA[][2] = { |
- {"calendar", "ca"}, |
- {"CALEndar", "ca"}, /* difference casing */ |
- {"ca", "ca"}, /* bcp key itself */ |
- {"kv", "kv"}, /* no difference between legacy and bcp */ |
- {"foo", NULL}, /* unknown, bcp ill-formed */ |
- {"ZZ", "$IN"}, /* unknown, bcp well-formed - */ |
- {NULL, NULL} |
- }; |
- |
- int32_t i; |
- for (i = 0; DATA[i][0] != NULL; i++) { |
- const char* keyword = DATA[i][0]; |
- const char* expected = DATA[i][1]; |
- const char* bcpKey = NULL; |
- |
- bcpKey = uloc_toUnicodeLocaleKey(keyword); |
- if (expected == NULL) { |
- if (bcpKey != NULL) { |
- log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=NULL\n", keyword, bcpKey); |
- } |
- } else if (bcpKey == NULL) { |
- log_data_err("toUnicodeLocaleKey: keyword=%s => NULL, expected=%s\n", keyword, expected); |
- } else if (uprv_strcmp(expected, "$IN") == 0) { |
- if (bcpKey != keyword) { |
- log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s(input pointer)\n", keyword, bcpKey, keyword); |
- } |
- } else if (uprv_strcmp(bcpKey, expected) != 0) { |
- log_err("toUnicodeLocaleKey: keyword=%s => %s, expected=%s\n", keyword, bcpKey, expected); |
- } |
- } |
-} |
- |
-static void TestToLegacyKey(void) |
-{ |
- /* $IN specifies the result should be the input pointer itself */ |
- static const char* DATA[][2] = { |
- {"kb", "colbackwards"}, |
- {"kB", "colbackwards"}, /* different casing */ |
- {"Collation", "collation"}, /* keyword itself with different casing */ |
- {"kv", "kv"}, /* no difference between legacy and bcp */ |
- {"foo", "$IN"}, /* unknown, bcp ill-formed */ |
- {"ZZ", "$IN"}, /* unknown, bcp well-formed */ |
- {"e=mc2", NULL}, /* unknown, bcp/legacy ill-formed */ |
- {NULL, NULL} |
- }; |
- |
- int32_t i; |
- for (i = 0; DATA[i][0] != NULL; i++) { |
- const char* keyword = DATA[i][0]; |
- const char* expected = DATA[i][1]; |
- const char* legacyKey = NULL; |
- |
- legacyKey = uloc_toLegacyKey(keyword); |
- if (expected == NULL) { |
- if (legacyKey != NULL) { |
- log_err("toLegacyKey: keyword=%s => %s, expected=NULL\n", keyword, legacyKey); |
- } |
- } else if (legacyKey == NULL) { |
- log_err("toLegacyKey: keyword=%s => NULL, expected=%s\n", keyword, expected); |
- } else if (uprv_strcmp(expected, "$IN") == 0) { |
- if (legacyKey != keyword) { |
- log_err("toLegacyKey: keyword=%s => %s, expected=%s(input pointer)\n", keyword, legacyKey, keyword); |
- } |
- } else if (uprv_strcmp(legacyKey, expected) != 0) { |
- log_data_err("toUnicodeLocaleKey: keyword=%s, %s, expected=%s\n", keyword, legacyKey, expected); |
- } |
- } |
-} |
- |
-static void TestToUnicodeLocaleType(void) |
-{ |
- /* $IN specifies the result should be the input pointer itself */ |
- static const char* DATA[][3] = { |
- {"tz", "Asia/Kolkata", "inccu"}, |
- {"calendar", "gregorian", "gregory"}, |
- {"ca", "gregorian", "gregory"}, |
- {"ca", "Gregorian", "gregory"}, |
- {"ca", "buddhist", "buddhist"}, |
- {"Calendar", "Japanese", "japanese"}, |
- {"calendar", "Islamic-Civil", "islamic-civil"}, |
- {"calendar", "islamicc", "islamic-civil"}, /* bcp type alias */ |
- {"colalternate", "NON-IGNORABLE", "noignore"}, |
- {"colcaselevel", "yes", "true"}, |
- {"tz", "america/new_york", "usnyc"}, |
- {"tz", "Asia/Kolkata", "inccu"}, |
- {"timezone", "navajo", "usden"}, |
- {"ca", "aaaa", "$IN"}, /* unknown type, well-formed type */ |
- {"ca", "gregory-japanese-islamic", "$IN"}, /* unknown type, well-formed type */ |
- {"zz", "gregorian", NULL}, /* unknown key, ill-formed type */ |
- {"co", "foo-", NULL}, /* unknown type, ill-formed type */ |
- {"variableTop", "00A0", "$IN"}, /* valid codepoints type */ |
- {"variableTop", "wxyz", "$IN"}, /* invalid codepoints type - return as is for now */ |
- {"kr", "space-punct", "space-punct"}, /* valid reordercode type */ |
- {"kr", "digit-spacepunct", NULL}, /* invalid (bcp ill-formed) reordercode type */ |
- {NULL, NULL, NULL} |
- }; |
- |
- int32_t i; |
- for (i = 0; DATA[i][0] != NULL; i++) { |
- const char* keyword = DATA[i][0]; |
- const char* value = DATA[i][1]; |
- const char* expected = DATA[i][2]; |
- const char* bcpType = NULL; |
- |
- bcpType = uloc_toUnicodeLocaleType(keyword, value); |
- if (expected == NULL) { |
- if (bcpType != NULL) { |
- log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=NULL\n", keyword, value, bcpType); |
- } |
- } else if (bcpType == NULL) { |
- log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => NULL, expected=%s\n", keyword, value, expected); |
- } else if (uprv_strcmp(expected, "$IN") == 0) { |
- if (bcpType != value) { |
- log_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=%s(input pointer)\n", keyword, value, bcpType, value); |
- } |
- } else if (uprv_strcmp(bcpType, expected) != 0) { |
- log_data_err("toUnicodeLocaleType: keyword=%s, value=%s => %s, expected=%s\n", keyword, value, bcpType, expected); |
- } |
- } |
-} |
- |
-static void TestToLegacyType(void) |
-{ |
- /* $IN specifies the result should be the input pointer itself */ |
- static const char* DATA[][3] = { |
- {"calendar", "gregory", "gregorian"}, |
- {"ca", "gregory", "gregorian"}, |
- {"ca", "Gregory", "gregorian"}, |
- {"ca", "buddhist", "buddhist"}, |
- {"Calendar", "Japanese", "japanese"}, |
- {"calendar", "Islamic-Civil", "islamic-civil"}, |
- {"calendar", "islamicc", "islamic-civil"}, /* bcp type alias */ |
- {"colalternate", "noignore", "non-ignorable"}, |
- {"colcaselevel", "true", "yes"}, |
- {"tz", "usnyc", "America/New_York"}, |
- {"tz", "inccu", "Asia/Calcutta"}, |
- {"timezone", "usden", "America/Denver"}, |
- {"timezone", "usnavajo", "America/Denver"}, /* bcp type alias */ |
- {"colstrength", "quarternary", "quaternary"}, /* type alias */ |
- {"ca", "aaaa", "$IN"}, /* unknown type */ |
- {"calendar", "gregory-japanese-islamic", "$IN"}, /* unknown type, well-formed type */ |
- {"zz", "gregorian", "$IN"}, /* unknown key, bcp ill-formed type */ |
- {"ca", "gregorian-calendar", "$IN"}, /* known key, bcp ill-formed type */ |
- {"co", "e=mc2", NULL}, /* known key, ill-formed bcp/legacy type */ |
- {"variableTop", "00A0", "$IN"}, /* valid codepoints type */ |
- {"variableTop", "wxyz", "$IN"}, /* invalid codepoints type - return as is for now */ |
- {"kr", "space-punct", "space-punct"}, /* valid reordercode type */ |
- {"kr", "digit-spacepunct", "digit-spacepunct"}, /* invalid reordercode type, but ok for legacy syntax */ |
- {NULL, NULL, NULL} |
- }; |
- |
- int32_t i; |
- for (i = 0; DATA[i][0] != NULL; i++) { |
- const char* keyword = DATA[i][0]; |
- const char* value = DATA[i][1]; |
- const char* expected = DATA[i][2]; |
- const char* legacyType = NULL; |
- |
- legacyType = uloc_toLegacyType(keyword, value); |
- if (expected == NULL) { |
- if (legacyType != NULL) { |
- log_err("toLegacyType: keyword=%s, value=%s => %s, expected=NULL\n", keyword, value, legacyType); |
- } |
- } else if (legacyType == NULL) { |
- log_err("toLegacyType: keyword=%s, value=%s => NULL, expected=%s\n", keyword, value, expected); |
- } else if (uprv_strcmp(expected, "$IN") == 0) { |
- if (legacyType != value) { |
- log_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s(input pointer)\n", keyword, value, legacyType, value); |
- } |
- } else if (uprv_strcmp(legacyType, expected) != 0) { |
- log_data_err("toLegacyType: keyword=%s, value=%s => %s, expected=%s\n", keyword, value, legacyType, expected); |
- } |
- } |
-} |
- |
- |
- |
-static void test_unicode_define(const char *namech, char ch, const char *nameu, UChar uch) |
-{ |
- UChar asUch[1]; |
- asUch[0]=0; |
- log_verbose("Testing whether %s[\\x%02x,'%c'] == %s[U+%04X]\n", namech, ch,(int)ch, nameu, (int) uch); |
- u_charsToUChars(&ch, asUch, 1); |
- if(asUch[0] != uch) { |
- log_err("FAIL: %s[\\x%02x,'%c'] maps to U+%04X, but %s = U+%04X\n", namech, ch, (int)ch, (int)asUch[0], nameu, (int)uch); |
- } else { |
- log_verbose(" .. OK, == U+%04X\n", (int)asUch[0]); |
- } |
-} |
- |
-#define TEST_UNICODE_DEFINE(x,y) test_unicode_define(#x, (char)(x), #y, (UChar)(y)) |
- |
-static void TestUnicodeDefines(void) { |
- TEST_UNICODE_DEFINE(ULOC_KEYWORD_SEPARATOR, ULOC_KEYWORD_SEPARATOR_UNICODE); |
- TEST_UNICODE_DEFINE(ULOC_KEYWORD_ASSIGN, ULOC_KEYWORD_ASSIGN_UNICODE); |
- TEST_UNICODE_DEFINE(ULOC_KEYWORD_ITEM_SEPARATOR, ULOC_KEYWORD_ITEM_SEPARATOR_UNICODE); |
-} |
- |
-static void TestIsRightToLeft() { |
- // API test only. More test cases in intltest/LocaleTest. |
- if(uloc_isRightToLeft("root") || !uloc_isRightToLeft("EN-HEBR")) { |
- log_err("uloc_isRightToLeft() failed"); |
- } |
-} |