/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-1999, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** * * File CLOCTST.C * * Modification History: * Name Description * Madhu Katragadda Ported for C API ********************************************************************************* */ #include "unicode/utypes.h" #include "unicode/utypes.h" #include "cloctst.h" #include "unicode/uloc.h" #include #include #include "unicode/ustring.h" #include "cintltst.h" #include "ccolltst.h" void PrintDataTable(); static char* rawData2[23][5]; 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) { setUpDataTable(); addTest(root, &TestBasicGetters, "tsutil/cloctst/TestBasicGetters"); addTest(root, &TestDisplayNames, "tsutil/cloctst/TestDisplayNames"); addTest(root, &TestGetAvailableLocales, "tsutil/cloctst/TestGetAvailableLocales"); addTest(root, &TestDataDirectory, "tsutil/cloctst/TestDataDirectory"); addTest(root, &TestISOFunctions, "tsutil/cloctst/TestISOFunctions"); } /* testing uloc(), uloc_getName(), uloc_getLanguage(), uloc_getVariant(), uloc_getCountry() */ 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); } 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); } } /* testing uloc_getISO3Language(), uloc_getISO3Country(), */ void TestSimpleResourceInfo() { int32_t i; char* testLocale = 0; UChar* expected = 0; const char* temp; testLocale=(char*)malloc(sizeof(char) * 1); expected=(UChar*)malloc(sizeof(UChar) * 1); 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])); } } free(expected); free(testLocale); } 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()*/ 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