/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2001, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** * * File CLOCTST.C * * Modification History: * Name Description * Madhu Katragadda Ported for C API ********************************************************************************* */ #include #include #include #include "unicode/utypes.h" #include "unicode/putil.h" #include "cloctst.h" #include "unicode/uloc.h" #include "unicode/ustring.h" #include "cintltst.h" #include "ccolltst.h" void PrintDataTable(); /*--------------------------------------------------- table of valid data --------------------------------------------------- */ #define LOCALE_SIZE 5 #define LOCALE_INFO_SIZE 23 static const char* rawData2[LOCALE_INFO_SIZE][LOCALE_SIZE] = { /* language code */ { "en", "fr", "hr", "el", "no" }, /* country code */ { "US", "FR", "HR", "GR", "NO" }, /* variant code */ { "", "", "", "", "NY" }, /* full name */ { "en_US", "fr_FR", "hr_HR", "el_GR", "no_NO_NY" }, /* ISO-3 language */ { "eng", "fra", "hrv", "ell", "nor" }, /* ISO-3 country */ { "USA", "FRA", "HRV", "GRC", "NOR" }, /* LCID (not currently public) */ { "409", "40c", "41a", "408", "814" }, /* display langage (English) */ { "English", "French", "Croatian", "Greek", "Norwegian" }, /* display country (English) */ { "United States", "France", "Croatia", "Greece", "Norway" }, /* display variant (English) */ { "", "", "", "", "Nynorsk" }, /* display name (English) */ { "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway, Nynorsk)" }, /* display langage (French) */ { "anglais", "fran\\u00E7ais", "croate", "grec", "norv\\u00E9gien" }, /* display country (French) */ { "\\u00C9tats-Unis", "France", "Croatie", "Gr\\u00E8ce", "Norv\\u00E8ge" }, /* display variant (French) */ { "", "", "", "", "Nynorsk" }, /* display name (French) */ { "anglais (\\u00C9tats-Unis)", "fran\\u00E7ais (France)", "croate (Croatie)", "grec (Gr\\u00E8ce)", "norv\\u00E9gien (Norv\\u00E8ge, Nynorsk)" }, /* display langage (Croatian) */ { "", "", "hrvatski", "", "" }, /* display country (Croatian) */ { "", "", "Hrvatska", "", "" }, /* display variant (Croatian) */ { "", "", "", "", "" }, /* display name (Croatian) */ { "", "", "hrvatski (Hrvatska)", "", "" }, /* display langage (Greek) */ { "", "", "", "\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac", "" }, /* display country (Greek) */ { "", "", "", "\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1", "" }, /* display variant (Greek) */ { "", "", "", "", "" }, /* display name (Greek) */ { "", "", "", "\\u03b5\\u03bb\\u03bb\\u03b7\\u03bd\\u03b9\\u03ba\\u03ac (\\u0395\\u03bb\\u03bb\\u03ac\\u03b4\\u03b1)", "" } }; static UChar*** dataTable=0; enum { ENGLISH = 0, FRENCH = 1, CROATIAN = 2, GREEKS = 3, NORWEGIAN = 4, MAX_LOCALES = 4 }; enum { LANG = 0, CTRY = 1, VAR = 2, NAME = 3, LANG3 = 4, CTRY3 = 5, LCID = 6, DLANG_EN = 7, DCTRY_EN = 8, DVAR_EN = 9, DNAME_EN = 10, DLANG_FR = 11, DCTRY_FR = 12, DVAR_FR = 13, DNAME_FR = 14, DLANG_HR = 15, DCTRY_HR = 16, DVAR_HR = 17, DNAME_HR = 18, DLANG_EL = 19, DCTRY_EL = 20, DVAR_EL = 21, DNAME_EL = 22 }; void addLocaleTest(TestNode** root); void addLocaleTest(TestNode** root) { addTest(root, &TestBasicGetters, "tsutil/cloctst/TestBasicGetters"); addTest(root, &TestPrefixes, "tsutil/cloctst/TestPrefixes"); addTest(root, &TestSimpleResourceInfo, "tsutil/cloctst/TestSimpleResourceInfo"); addTest(root, &TestDisplayNames, "tsutil/cloctst/TestDisplayNames"); addTest(root, &TestGetAvailableLocales, "tsutil/cloctst/TestGetAvailableLocales"); addTest(root, &TestDataDirectory, "tsutil/cloctst/TestDataDirectory"); addTest(root, &TestISOFunctions, "tsutil/cloctst/TestISOFunctions"); addTest(root, &TestISO3Fallback, "tsutil/cloctst/TestISO3Fallback"); addTest(root, &TestUninstalledISO3Names, "tsutil/cloctst/TestUninstalledISO3Names"); addTest(root, &TestSimpleDisplayNames, "tsutil/cloctst/TestSimpleDisplayNames"); addTest(root, &TestVariantParsing, "tsutil/cloctst/TestVariantParsing"); } /* 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 <= MAX_LOCALES; 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, &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, &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, &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, &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); } } /* Test the i- and x- and @ and . functionality */ #define PREFIXBUFSIZ 128 static void TestPrefixes() { int row = 0; int n; const char *loc; const char *testData[][5] = { {"sv", "FI", "AL", "sv-fi-al", "sv_FI_AL" }, {"en", "GB", "", "en-gb", "en_GB" }, {"i-hakka", "MT", "XEMXIJA", "i-hakka_MT_XEMXIJA", "i-hakka_MT_XEMXIJA"}, {"i-hakka", "CN", "", "i-hakka_CN", "i-hakka_CN"}, {"i-hakka", "MX", "", "I-hakka_MX", "i-hakka_MX"}, {"x-klingon", "US", "SANJOSE", "X-KLINGON_us_SANJOSE", "x-klingon_US_SANJOSE"}, {"mr", "", "", "mr.utf8", "mr"}, {"de", "TV", "", "de-tv.koi8r", "de_TV"}, {"x-piglatin", "ML", "", "x-piglatin_ML.MBE", "x-piglatin_ML"}, /* Multibyte English */ {"i-cherokee","US", "", "i-Cherokee_US.utf7", "i-cherokee_US"}, {"x-filfli", "MT", "FILFLA", "x-filfli_MT_FILFLA.gb-18030", "x-filfli_MT_FILFLA"}, {"no", "NO", "NY", "no-no-ny.utf32@B", "no_NO_NY"}, /* @ ignored unless variant is empty */ {"no", "NO", "B", "no-no.utf32@B", "no_NO_B" }, {"no", "", "NY", "no__ny", "no__NY" }, {"no", "", "NY", "no@ny", "no__NY" }, { "","","","",""} }; const char *testTitles[] = { "uloc_getLanguage()", "uloc_getCountry()", "uloc_getVariant()", "name", "uloc_getName()", "country3", "lcid" }; char buf[PREFIXBUFSIZ]; int32_t len; UErrorCode err; for(row=0;testData[row][0][0] != 0;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+1);n++) { if(n==NAME) continue; for(len=0;len [%s] (length %d)\n", row, testTitles[n], loc, buf, len); if(len != (int32_t)strlen(buf)+1) { 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]); } if(strcmp(buf, testData[row][n])) { log_err("#%d: %s on %s: -> [%s] (expected '%s'!)\n", row, testTitles[n], loc, buf, testData[row][n]); } } } } } /* 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 <= MAX_LOCALES; 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", 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(); } static void TestDisplayNames() { /* sfb 990721 Can't just save a pointer to the default locale. Although the pointer won't change, the contents will, so the restore at the end doesn't actually restore the original. */ const char *saveDefault; char *defaultLocale; UErrorCode err = U_ZERO_ERROR; saveDefault = uloc_getDefault(); defaultLocale = (char*) malloc(strlen(saveDefault) + 1); if(defaultLocale == 0) { log_err("out of memory"); return; } strcpy(defaultLocale, saveDefault); uloc_setDefault("en_US", &err); if (U_FAILURE(err)) { log_err("uloc_setDefault returned error code "); return; } log_verbose("Testing getDisplayName for different locales\n"); log_verbose("With default = en_US...\n"); log_verbose(" In default locale...\n"); doTestDisplayNames(" ", DLANG_EN, FALSE); log_verbose(" In locale = en_US...\n"); doTestDisplayNames("en_US", DLANG_EN, FALSE); log_verbose(" In locale = fr_FR....\n"); doTestDisplayNames("fr_FR", DLANG_FR, FALSE); log_verbose(" In locale = hr_HR...\n"); doTestDisplayNames("hr_HR", DLANG_HR, FALSE); log_verbose(" In locale = gr_EL..\n"); doTestDisplayNames("el_GR", DLANG_EL, FALSE); uloc_setDefault("fr_FR", &err); if (U_FAILURE(err)) { log_err("Locale::setDefault returned error code %s\n", myErrorName(err)); return; } log_verbose("With default = fr_FR...\n"); log_verbose(" In default locale...\n"); doTestDisplayNames(" ", DLANG_FR, TRUE); log_verbose(" In locale = en_US...\n"); doTestDisplayNames("en_US", DLANG_EN, TRUE); log_verbose(" In locale = fr_FR....\n"); doTestDisplayNames("fr_FR", DLANG_FR, TRUE); log_verbose(" In locale = hr_HR...\n"); doTestDisplayNames("hr_HR", DLANG_HR, TRUE); log_verbose(" In locale = el_GR...\n"); doTestDisplayNames("el_GR", DLANG_EL, TRUE); uloc_setDefault(defaultLocale, &err); if (U_FAILURE(err)) { log_err("Locale::setDefault returned error code %s\n", myErrorName(err)); return; } free(defaultLocale); } /* 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_err("countAvailable() returned an empty list!\n"); /* use something sensible w/o hardcoding the count */ else if(locCount < 0){ log_err("countAvailable() returned a wrong value!= %d\n", locCount); } else{ log_info("Number of locales returned = %d\n", locCount); } for(i=0;i