X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/374ca955a76ecab1204ca8bfa63ff9238d998416..f3c0d7a59d99c2a94c6b8822291f0e42be3773c9:/icuSources/test/intltest/restsnew.cpp diff --git a/icuSources/test/intltest/restsnew.cpp b/icuSources/test/intltest/restsnew.cpp index abeca616..5483cddb 100644 --- a/icuSources/test/intltest/restsnew.cpp +++ b/icuSources/test/intltest/restsnew.cpp @@ -1,11 +1,13 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** - * COPYRIGHT: - * Copyright (c) 1997-2003, International Business Machines Corporation and - * others. All Rights Reserved. + * Copyright (c) 1997-2016, International Business Machines + * Corporation and others. All Rights Reserved. ********************************************************************/ #include "unicode/utypes.h" +#include "cmemory.h" #include "cstring.h" #include "unicode/unistr.h" #include "unicode/resbund.h" @@ -34,11 +36,11 @@ enum E_Where //*************************************************************************************** -#define CONFIRM_EQ(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected) + (UnicodeString)"\n"); } -#define CONFIRM_GE(actual,expected) if ((actual)>=(expected)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected) + (UnicodeString)"\n"); } -#define CONFIRM_NE(actual,expected) if ((expected)!=(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected) + (UnicodeString)"\n"); } +#define CONFIRM_EQ(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of " + (expected)); } +#define CONFIRM_GE(actual,expected) if ((actual)>=(expected)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x >= " + (expected)); } +#define CONFIRM_NE(actual,expected) if ((expected)!=(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (actual) + (UnicodeString)" instead of x != " + (expected)); } -#define CONFIRM_UErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (UnicodeString)u_errorName(actual) + (UnicodeString)" instead of " + (UnicodeString)u_errorName(expected) + (UnicodeString)"\n"); } +#define CONFIRM_UErrorCode(actual,expected) if ((expected)==(actual)) { record_pass(); } else { record_fail(); errln(action + (UnicodeString)" returned " + (UnicodeString)u_errorName(actual) + (UnicodeString)" instead of " + (UnicodeString)u_errorName(expected)); } //*************************************************************************************** @@ -107,7 +109,7 @@ param[] = { "ne", 0, U_USING_DEFAULT_WARNING, e_Root, { TRUE, FALSE, FALSE }, { TRUE, FALSE, FALSE } } }; -static int32_t bundles_count = sizeof(param) / sizeof(param[0]); +static int32_t bundles_count = UPRV_LENGTHOF(param); //*************************************************************************************** @@ -171,7 +173,7 @@ NewResourceBundleTest::~NewResourceBundleTest() { if (param[5].locale) { int idx; - for (idx = 0; idx < (int)(sizeof(param)/sizeof(param[0])); idx++) { + for (idx = 0; idx < UPRV_LENGTHOF(param); idx++) { delete param[idx].locale; param[idx].locale = NULL; } @@ -182,11 +184,17 @@ void NewResourceBundleTest::runIndexedTest( int32_t index, UBool exec, const cha { if (exec) logln("TestSuite ResourceBundleTest: "); switch (index) { +#if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION case 0: name = "TestResourceBundles"; if (exec) TestResourceBundles(); break; case 1: name = "TestConstruction"; if (exec) TestConstruction(); break; case 2: name = "TestIteration"; if (exec) TestIteration(); break; case 3: name = "TestOtherAPI"; if(exec) TestOtherAPI(); break; case 4: name = "TestNewTypes"; if(exec) TestNewTypes(); break; +#else + case 0: case 1: case 2: case 3: case 4: name = "skip"; break; +#endif + + case 5: name = "TestGetByFallback"; if(exec) TestGetByFallback(); break; default: name = ""; break; //needed to end loop } } @@ -196,6 +204,20 @@ void NewResourceBundleTest::runIndexedTest( int32_t index, UBool exec, const cha void NewResourceBundleTest::TestResourceBundles() { + UErrorCode status = U_ZERO_ERROR; + loadTestData(status); + if(U_FAILURE(status)) + { + dataerrln("Could not load testdata.dat %s " + UnicodeString(u_errorName(status))); + return; + } + + /* Make sure that users using te_IN for the default locale don't get test failures. */ + Locale originalDefault; + if (Locale::getDefault() == Locale("te_IN")) { + Locale::setDefault(Locale("en_US"), status); + } + testTag("only_in_Root", TRUE, FALSE, FALSE); testTag("only_in_te", FALSE, TRUE, FALSE); testTag("only_in_te_IN", FALSE, FALSE, TRUE); @@ -205,62 +227,78 @@ NewResourceBundleTest::TestResourceBundles() testTag("in_te_te_IN", FALSE, TRUE, TRUE); testTag("nonexistent", FALSE, FALSE, FALSE); logln("Passed: %d\nFailed: %d", pass, fail); + + /* Restore the default locale for the other tests. */ + Locale::setDefault(originalDefault, status); } void NewResourceBundleTest::TestConstruction() { + UErrorCode err = U_ZERO_ERROR; + Locale locale("te", "IN"); + + const char* testdatapath; + testdatapath=loadTestData(err); + if(U_FAILURE(err)) { - UErrorCode err = U_ZERO_ERROR; - const char* testdatapath; - Locale locale("te", "IN"); - testdatapath=loadTestData(err); - if(U_FAILURE(err)) - { - errln("Could not load testdata.dat %s " + UnicodeString(u_errorName(err))); - return; - } + dataerrln("Could not load testdata.dat %s " + UnicodeString(u_errorName(err))); + return; + } - ResourceBundle test1((UnicodeString)testdatapath, err); - ResourceBundle test2(testdatapath, locale, err); - - UnicodeString result1; - UnicodeString result2; - - result1 = test1.getStringEx("string_in_Root_te_te_IN", err); - result2 = test2.getStringEx("string_in_Root_te_te_IN", err); - if (U_FAILURE(err)) { - errln("Something threw an error in TestConstruction()"); - return; - } + /* Make sure that users using te_IN for the default locale don't get test failures. */ + Locale originalDefault; + if (Locale::getDefault() == Locale("te_IN")) { + Locale::setDefault(Locale("en_US"), err); + } - logln("for string_in_Root_te_te_IN, root.txt had " + result1); - logln("for string_in_Root_te_te_IN, te_IN.txt had " + result2); + ResourceBundle test1((UnicodeString)testdatapath, err); + ResourceBundle test2(testdatapath, locale, err); + + UnicodeString result1; + UnicodeString result2; - if (result1 != "ROOT" || result2 != "TE_IN") - errln("Construction test failed; run verbose for more information"); + result1 = test1.getStringEx("string_in_Root_te_te_IN", err); + result2 = test2.getStringEx("string_in_Root_te_te_IN", err); + if (U_FAILURE(err)) { + errln("Something threw an error in TestConstruction()"); + return; + } - const char* version1; - const char* version2; + logln("for string_in_Root_te_te_IN, root.txt had " + result1); + logln("for string_in_Root_te_te_IN, te_IN.txt had " + result2); - version1 = test1.getVersionNumber(); - version2 = test2.getVersionNumber(); + if (result1 != "ROOT" || result2 != "TE_IN") { + errln("Construction test failed; run verbose for more information"); + } + + const char* version1; + const char* version2; - char *versionID1 = new char[1 + strlen(U_ICU_VERSION) + strlen(version1)]; // + 1 for zero byte - char *versionID2 = new char[1 + strlen(U_ICU_VERSION) + strlen(version2)]; // + 1 for zero byte + version1 = test1.getVersionNumber(); + version2 = test2.getVersionNumber(); - strcpy(versionID1, "44.0"); // hardcoded, please change if the default.txt file or ResourceBundle::kVersionSeparater is changed. + char *versionID1 = new char[1 + strlen(U_ICU_VERSION) + strlen(version1)]; // + 1 for zero byte + char *versionID2 = new char[1 + strlen(U_ICU_VERSION) + strlen(version2)]; // + 1 for zero byte - strcpy(versionID2, "55.0"); // hardcoded, please change if the te_IN.txt file or ResourceBundle::kVersionSeparater is changed. + strcpy(versionID1, "44.0"); // hardcoded, please change if the default.txt file or ResourceBundle::kVersionSeparater is changed. - logln(UnicodeString("getVersionNumber on default.txt returned ") + version1 + UnicodeString(" Expect: " ) + versionID1); - logln(UnicodeString("getVersionNumber on te_IN.txt returned ") + version2 + UnicodeString(" Expect: " ) + versionID2); + strcpy(versionID2, "55.0"); // hardcoded, please change if the te_IN.txt file or ResourceBundle::kVersionSeparater is changed. - if (strcmp(version1, versionID1) != 0 || strcmp(version2, versionID2) != 0) - errln("getVersionNumber() failed"); - delete[] versionID1; - delete[] versionID2; + logln(UnicodeString("getVersionNumber on default.txt returned ") + version1 + UnicodeString(" Expect: " ) + versionID1); + logln(UnicodeString("getVersionNumber on te_IN.txt returned ") + version2 + UnicodeString(" Expect: " ) + versionID2); + + if (strcmp(version1, versionID1) != 0) { + errln("getVersionNumber(version1) failed. %s != %s", version1, versionID1); + } + if (strcmp(version2, versionID2) != 0) { + errln("getVersionNumber(version2) failed. %s != %s", version2, versionID2); } + delete[] versionID1; + delete[] versionID2; + + /* Restore the default locale for the other tests. */ + Locale::setDefault(originalDefault, err); } void @@ -279,7 +317,7 @@ NewResourceBundleTest::TestIteration() testdatapath=loadTestData(err); if(U_FAILURE(err)) { - errln("Could not load testdata.dat %s " + UnicodeString(u_errorName(err))); + dataerrln("Could not load testdata.dat %s " + UnicodeString(u_errorName(err))); return; } @@ -295,7 +333,7 @@ NewResourceBundleTest::TestIteration() UnicodeString action; - for(i=0; i 1){ - CONFIRM_EQ(ures_getType(bundle), URES_ARRAY); - expected+=itoa(row, buf); - rowbundle=ures_getByIndex(bundle, row, rowbundle, &err); - if(!U_FAILURE(err) && ures_getSize(rowbundle)>1){ - col=0; - while(ures_hasNext(rowbundle)){ - expected=element; - got=ures_getNextUnicodeString(rowbundle, &key, &err); - temp = ures_getByIndex(rowbundle, col, temp, &err); - UnicodeString bla = ures_getUnicodeString(temp, &err); - UnicodeString bla2 = ures_getUnicodeStringByIndex(rowbundle, col, &err); - if(!U_FAILURE(err)){ - expected+=itoa(row, buf); - expected+=itoa(col, buf); - col++; - CONFIRM_EQ(got, expected); - CONFIRM_EQ(bla, expected); - CONFIRM_EQ(bla2, expected); - } - } - CONFIRM_EQ(col, ures_getSize(rowbundle)); - } - } - else{ - CONFIRM_EQ(ures_getType(bundle), (int32_t)URES_STRING); - } - } - CONFIRM_EQ(got, expected); - count++; - } - } - } - ures_close(temp); - ures_close(rowbundle); - ures_close(bundle); - ures_close(testCAPI); - } else { - errln("failed to open a resource bundle\n"); - } - - + // Do the testing + // first iteration + uint32_t i; + int32_t count, row=0, col=0; + char buf[5]; + UnicodeString expected; + UnicodeString element("TE_IN"); + UnicodeString action; + for(i=0; i 1){ + CONFIRM_EQ(ures_getType(bundle), URES_ARRAY); + expected+=itoa(row, buf); + rowbundle=ures_getByIndex(bundle, row, rowbundle, &err); + if(!U_FAILURE(err) && ures_getSize(rowbundle)>1){ + col=0; + while(ures_hasNext(rowbundle)){ + expected=element; + got=ures_getNextUnicodeString(rowbundle, &key, &err); + temp = ures_getByIndex(rowbundle, col, temp, &err); + UnicodeString bla = ures_getUnicodeString(temp, &err); + UnicodeString bla2 = ures_getUnicodeStringByIndex(rowbundle, col, &err); + if(!U_FAILURE(err)){ + expected+=itoa(row, buf); + expected+=itoa(col, buf); + col++; + CONFIRM_EQ(got, expected); + CONFIRM_EQ(bla, expected); + CONFIRM_EQ(bla2, expected); + } + } + CONFIRM_EQ(col, ures_getSize(rowbundle)); + } + } + else{ + CONFIRM_EQ(ures_getType(bundle), (int32_t)URES_STRING); + } + } + CONFIRM_EQ(got, expected); + count++; + } + } + } - + // Check that ures_getUnicodeString() & variants return a bogus string if failure. + // Same relevant code path whether the failure code is passed in + // or comes from a lookup error. + UErrorCode failure = U_INTERNAL_PROGRAM_ERROR; + assertTrue("ures_getUnicodeString(failure).isBogus()", + ures_getUnicodeString(testCAPI, &failure).isBogus()); + assertTrue("ures_getNextUnicodeString(failure).isBogus()", + ures_getNextUnicodeString(testCAPI, NULL, &failure).isBogus()); + assertTrue("ures_getUnicodeStringByIndex(failure).isBogus()", + ures_getUnicodeStringByIndex(testCAPI, 999, &failure).isBogus()); + assertTrue("ures_getUnicodeStringByKey(failure).isBogus()", + ures_getUnicodeStringByKey(testCAPI, "bogus key", &failure).isBogus()); + + ures_close(temp); + ures_close(rowbundle); + ures_close(bundle); + ures_close(testCAPI); + } else { + errln("failed to open a resource bundle\n"); + } + /* Restore the default locale for the other tests. */ + Locale::setDefault(originalDefault, err); } - - //*************************************************************************************** UBool @@ -606,7 +658,7 @@ NewResourceBundleTest::testTag(const char* frag, testdatapath=loadTestData(status); if(U_FAILURE(status)) { - errln("Could not load testdata.dat %s " + UnicodeString(u_errorName(status))); + dataerrln("Could not load testdata.dat %s " + UnicodeString(u_errorName(status))); return FALSE; } @@ -987,7 +1039,7 @@ NewResourceBundleTest::TestNewTypes() { if(U_FAILURE(status)) { - logln("Could not load testdata.dat %s \n",u_errorName(status)); + dataerrln("Could not load testdata.dat %s \n",u_errorName(status)); return; } @@ -995,7 +1047,7 @@ NewResourceBundleTest::TestNewTypes() { ResourceBundle bundle(testdatapath, Locale("te_IN"),status); UnicodeString emptyStr = theBundle.getStringEx("emptystring", status); - if(!emptyStr.length()==0) { + if(emptyStr.length() != 0) { logln("Empty string returned invalid value\n"); } @@ -1118,6 +1170,33 @@ NewResourceBundleTest::TestNewTypes() { } +} + +void +NewResourceBundleTest::TestGetByFallback() { + UErrorCode status = U_ZERO_ERROR; + + ResourceBundle heRes(NULL, "he", status); + + heRes.getWithFallback("calendar", status).getWithFallback("islamic-civil", status).getWithFallback("DateTime", status); + if(U_SUCCESS(status)) { + errln("he locale's Islamic-civil DateTime resource exists. How did it get here?\n"); + } + status = U_ZERO_ERROR; + + heRes.getWithFallback("calendar", status).getWithFallback("islamic-civil", status).getWithFallback("eras", status); + if(U_FAILURE(status)) { + dataerrln("Didn't get Islamic Eras. I know they are there! - %s", u_errorName(status)); + } + status = U_ZERO_ERROR; + + ResourceBundle rootRes(NULL, "root", status); + rootRes.getWithFallback("calendar", status).getWithFallback("islamic-civil", status).getWithFallback("DateTime", status); + if(U_SUCCESS(status)) { + errln("Root's Islamic-civil's DateTime resource exists. How did it get here?\n"); + } + status = U_ZERO_ERROR; + } //eof