scuffed-code/icu4c/source/test/cintltst/cloctst.c
Markus Scherer 40694d1edc ICU-1109 change NUL-termination semantics
X-SVN-Rev: 6002
2001-10-02 23:53:16 +00:00

1004 lines
33 KiB
C

/********************************************************************
* 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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#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+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);
}
}
/* 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<PREFIXBUFSIZ;len++) {
buf[len] = '%'; /* Set a tripwire.. */
}
len = 0;
switch(n) {
case LANG:
len = uloc_getLanguage(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;
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]);
}
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<locCount;i++){
locList=uloc_getAvailable(i);
log_verbose(" %s\n", locList);
}
}
/* test for u_getDataDirectory, u_setDataDirectory, uloc_getISO3Language */
static void TestDataDirectory()
{
char oldDirectory[80];
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* inLocale,
int32_t compareIndex,
int32_t defaultIsFrench)
{
UErrorCode status = U_ZERO_ERROR;
int32_t i;
int32_t maxresultsize;
char* testLocale;
UChar *testLang = 0;
UChar *testCtry = 0;
UChar *testVar = 0;
UChar *testName = 0;
UChar* expectedLang = 0;
UChar* expectedCtry = 0;
UChar* expectedVar = 0;
UChar* expectedName = 0;
char temp[5];
const char* defaultDefaultLocale=" ";
setUpDataTable();
uloc_getLanguage(uloc_getDefault(), temp, 5, &status);
if(U_FAILURE(status)){
log_err("ERROR: in getDefault %s \n", myErrorName(status));
}
if (defaultIsFrench && 0 != strcmp(temp, "fr")) {
log_err("Default locale should be French, but it's really %s\n", temp);
}
else if (!defaultIsFrench && 0 != strcmp(temp, "en")){
log_err("Default locale should be English, but it's really %s\n", temp);
}
testLocale = (char*)malloc(sizeof(char) * 1);
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);
if (strcmp(inLocale, defaultDefaultLocale)==0) {
maxresultsize=0;
maxresultsize=uloc_getDisplayLanguage(testLocale, NULL, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testLang=(UChar*)malloc(sizeof(UChar) * (maxresultsize + 1));
uloc_getDisplayLanguage(testLocale, NULL, testLang, maxresultsize + 1, &status);
}
else
{
testLang=&_NUL;
}
if(U_FAILURE(status)){
log_err("Error in getDisplayLanguage() %s\n", myErrorName(status));
}
maxresultsize=0;
maxresultsize=uloc_getDisplayCountry(testLocale, NULL, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testCtry=(UChar*)malloc(sizeof(UChar) * (maxresultsize + 1));
uloc_getDisplayCountry(testLocale, NULL, 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, NULL, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testVar=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayVariant(testLocale, NULL, 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, NULL, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testName=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayName(testLocale, NULL, testName, maxresultsize + 1, &status);
}
else
{
testName=&_NUL;
}
if(U_FAILURE(status)){
log_err("Error in getDisplayName() %s\n", myErrorName(status));
}
}
else {
maxresultsize=0;
maxresultsize=uloc_getDisplayLanguage(testLocale, inLocale, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testLang=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayLanguage(testLocale, inLocale, testLang, maxresultsize + 1, &status);
}
else
{
testLang=&_NUL;
}
if(U_FAILURE(status)){
log_err("Error in getDisplayLanguage() %s\n", myErrorName(status));
}
maxresultsize=0;
maxresultsize=uloc_getDisplayCountry(testLocale, inLocale, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testCtry=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayCountry(testLocale, inLocale, 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, inLocale, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testVar=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayVariant(testLocale, inLocale, 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, inLocale, NULL, maxresultsize, &status);
if(status==U_BUFFER_OVERFLOW_ERROR)
{
status=U_ZERO_ERROR;
testName=(UChar*)malloc(sizeof(UChar) * (maxresultsize+1));
uloc_getDisplayName(testLocale, inLocale, 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 && defaultIsFrench)
expectedLang=dataTable[DLANG_FR][i];
if(u_strlen(expectedLang)== 0)
expectedLang=dataTable[DLANG_EN][i];
expectedCtry=dataTable[compareIndex + 1][i];
if(u_strlen(expectedCtry) == 0 && defaultIsFrench)
expectedCtry=dataTable[DCTRY_FR][i];
if(u_strlen(expectedCtry)== 0)
expectedCtry=dataTable[DCTRY_EN][i];
expectedVar=dataTable[compareIndex + 2][i];
if(u_strlen(expectedVar) == 0 && defaultIsFrench)
expectedVar=dataTable[DVAR_FR][i];
if(u_strlen(expectedCtry)== 0)
expectedVar=dataTable[DVAR_EN][i];
expectedName=dataTable[compareIndex + 3][i];
if(u_strlen(expectedName) ==0 && defaultIsFrench)
expectedName=dataTable[DNAME_FR][i];
if(u_strlen(expectedName) == 0)
expectedName=dataTable[DNAME_EN][i];
if (0 !=u_strcmp(testLang,expectedLang)) {
log_err(" Display Language mismatch: %s versus %s\n", austrdup(testLang), austrdup(expectedLang));
}
if (0 != u_strcmp(testCtry,expectedCtry)) {
log_err(" Display Country mismatch: %s versus %s\n", austrdup(testCtry), austrdup(expectedCtry));
}
if (0 != u_strcmp(testVar,expectedVar)) {
log_err(" Display Variant mismatch: %s versus %s\n", austrdup(testVar), austrdup(expectedVar));
}
if(0 != u_strcmp(testName, expectedName)) {
log_err(" Display Name mismatch: %s versus %s\n", austrdup(testName), austrdup(expectedName));
}
if(testName!=&_NUL) {
free(testName);
}
if(testLang!=&_NUL) {
free(testLang);
}
if(testCtry!=&_NUL) {
free(testCtry);
}
if(testVar!=&_NUL) {
free(testVar);
}
}
free(testLocale);
cleanUpDataTable();
}
/* test for uloc_getISOLanguages, uloc_getISOCountries */
static void TestISOFunctions()
{
const char* const* str=uloc_getISOLanguages();
const char* const* str1=uloc_getISOCountries();
int32_t count = 0;
UBool done = FALSE;
/* test getISOLanguages*/
/*str=uloc_getISOLanguages(); */
log_verbose("Testing ISO Languages: \n");
while(!done)
{
if(*(str+count++) == 0)
{
done = TRUE;
}
}
count--;
if(count!=142) {
log_err("There is an error in getISOLanguages %d\n", count);
}
log_verbose("Testing ISO Countries");
count=0;
done=FALSE;
while(!done)
{
if(*(str1 + count++)==0)
{
done=TRUE;
}
}
count--;
if(count!=239)
{
log_err("There is an error in getISOCountries %d \n", count);
}
}
static void setUpDataTable()
{
int32_t i,j;
dataTable = (UChar***)(calloc(sizeof(UChar**),LOCALE_INFO_SIZE));
for (i = 0; i < 23; i++) {
dataTable[i] = (UChar**)(calloc(sizeof(UChar*),LOCALE_SIZE));
for (j = 0; j < 5; 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" };
const char* languageNames [] = { "Hebrew", "Indonesian", "Inukitut", "Uighur", "Yiddish",
"Zhuang" };
UErrorCode status=U_ZERO_ERROR;
int32_t i;
for (i = 0; i < 6; i++) {
UChar *testLang=0;
UChar *expectedLang=0;
int size=0;
size=uloc_getDisplayLanguage(languageCodes[i], "en_US", NULL, size, &status);
if(status==U_BUFFER_OVERFLOW_ERROR) {
status=U_ZERO_ERROR;
testLang=(UChar*)malloc(sizeof(UChar) * (size + 1));
uloc_getDisplayLanguage(languageCodes[i], "en_US", 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_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. */
const char iso2Languages [][4] = { "am", "ba", "fy", "mr", "rn",
"ss", "tw", "zu" };
const char iso3Languages [][5] = { "amh", "bak", "fry", "mar", "run",
"ssw", "twi", "zul" };
char iso2Countries [][6] = { "am_AF", "ba_BW", "fy_KZ", "mr_MO", "rn_MN",
"ss_SB", "tw_TC", "zu_ZW" };
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()
{
const char* en_US_custom="en_US_De Anza_Cupertino_California_United States_Earth";
const char* dispName="English (United States, DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH)";
const char* dispVar="DE ANZA_CUPERTINO_CALIFORNIA_UNITED STATES_EARTH";
const char* shortVariant="fr_FR_foo";
const char* bogusVariant="fr_FR__foo";
const char* bogusVariant2="fr_FR_foo_";
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);
}
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);
}
u_uastrcpy(displayName, dispName);
if(u_strcmp(got,displayName)!=0) {
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);
}
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);
}
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);
}
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);
}
if(strcmp(austrdup(got),"_FOO_")!=0) {
log_err("FAIL: getDisplayVariant() Wanted: _FOO_ Got: %s\n", austrdup(got));
}
free(got);
}