/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2009, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /** * IntlTestUtilities is the medium level test class for everything in the directory "utility". */ #include "unicode/utypes.h" #include "unicode/errorcode.h" #include "itutil.h" #include "strtest.h" #include "loctest.h" #include "citrtest.h" #include "ustrtest.h" #include "ucdtest.h" #include "restest.h" #include "restsnew.h" #include "tsmthred.h" #include "tsputil.h" #include "uobjtest.h" #include "utxttest.h" #include "v32test.h" #include "uvectest.h" #include "aliastst.h" #include "usettest.h" #define CASE(id, test) case id: \ name = #test; \ if (exec) { \ logln(#test "---"); logln(); \ test t; \ callTest(t, par); \ } \ break void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) { if (exec) logln("TestSuite Utilities: "); switch (index) { CASE(0, MultithreadTest); CASE(1, StringTest); CASE(2, UnicodeStringTest); CASE(3, LocaleTest); CASE(4, CharIterTest); CASE(5, UnicodeTest); CASE(6, ResourceBundleTest); CASE(7, NewResourceBundleTest); CASE(8, PUtilTest); CASE(9, UObjectTest); CASE(10, UVector32Test); CASE(11, UVectorTest); CASE(12, UTextTest); CASE(13, LocaleAliasTest); CASE(14, UnicodeSetTest); CASE(15, ErrorCodeTest); default: name = ""; break; //needed to end loop } } void ErrorCodeTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { if (exec) logln("TestSuite Utilities: "); switch (index) { case 0: name = "TestErrorCode"; if (exec) TestErrorCode(); break; case 1: name = "TestSubclass"; if (exec) TestSubclass(); break; default: name = ""; break; //needed to end loop } } static void RefPlusOne(UErrorCode &code) { code=(UErrorCode)(code+1); } static void PtrPlusTwo(UErrorCode *code) { *code=(UErrorCode)(*code+2); } void ErrorCodeTest::TestErrorCode() { ErrorCode errorCode; if(errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure()) { errln("ErrorCode did not initialize properly"); return; } errorCode.check(); RefPlusOne(errorCode); if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode did not yield a writable reference"); } PtrPlusTwo(errorCode); if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode did not yield a writable pointer"); } errorCode.set(U_PARSE_ERROR); if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode.set() failed"); } if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure() ) { errln("ErrorCode did not reset properly"); } } class MyErrorCode: public ErrorCode { public: MyErrorCode(int32_t &countChecks, int32_t &countDests) : checks(countChecks), dests(countDests) {} ~MyErrorCode() { if(isFailure()) { ++dests; } } private: virtual void handleFailure() const { ++checks; } int32_t &checks; int32_t &dests; }; void ErrorCodeTest::TestSubclass() { int32_t countChecks=0; int32_t countDests=0; { MyErrorCode errorCode(countChecks, countDests); if( errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure() || countChecks!=0 || countDests!=0 ) { errln("ErrorCode did not initialize properly"); return; } errorCode.check(); if(countChecks!=0) { errln("ErrorCode.check() called handleFailure(kCheck) despite success"); } RefPlusOne(errorCode); if(errorCode.get()!=U_ILLEGAL_ARGUMENT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode did not yield a writable reference"); } errorCode.check(); if(countChecks!=1) { errln("ErrorCode.check() did not handleFailure(kCheck)"); } PtrPlusTwo(errorCode); if(errorCode.get()!=U_INVALID_FORMAT_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode did not yield a writable pointer"); } errorCode.check(); if(countChecks!=2) { errln("ErrorCode.check() did not handleFailure(kCheck)"); } errorCode.set(U_PARSE_ERROR); if(errorCode.get()!=U_PARSE_ERROR || errorCode.isSuccess() || !errorCode.isFailure()) { errln("ErrorCode.set() failed"); } if( errorCode.reset()!=U_PARSE_ERROR || errorCode.get()!=U_ZERO_ERROR || !errorCode.isSuccess() || errorCode.isFailure() ) { errln("ErrorCode did not reset properly"); } errorCode.check(); if(countChecks!=2) { errln("ErrorCode.check() called handleFailure(kCheck) despite success"); } } if(countDests!=0) { errln("ErrorCode.check() called handleFailure(kDestructor) despite success"); } countChecks=countDests=0; { MyErrorCode errorCode(countChecks, countDests); errorCode.set(U_PARSE_ERROR); } if(countDests!=1) { errln("ErrorCode destructor did not handleFailure(kDestructor)"); } }