/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2009, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #include "unicode/utypes.h" #if !UCONFIG_NO_FORMATTING #include "pptest.h" #include "unicode/numfmt.h" #include "unicode/decimfmt.h" // ***************************************************************************** // class ParsePositionTest // ***************************************************************************** #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break; void ParsePositionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) { // if (exec) logln((UnicodeString)"TestSuite ParsePositionTest"); switch (index) { CASE(0, TestParsePosition) CASE(1, TestFieldPosition) CASE(2, TestFieldPosition_example) CASE(3, Test4109023) default: name = ""; break; } } UBool ParsePositionTest::failure(UErrorCode status, const char* msg, UBool possibleDataError) { if(U_FAILURE(status)) { if (possibleDataError) { dataerrln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status)); } else { errln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status)); } return TRUE; } return FALSE; } void ParsePositionTest::TestParsePosition() { ParsePosition pp1(0); if (pp1.getIndex() == 0) { logln("PP constructor() tested."); }else{ errln("*** PP getIndex or constructor() result"); } { int to = 5; ParsePosition pp2( to ); if (pp2.getIndex() == 5) { logln("PP getIndex and constructor(int32_t) tested."); }else{ errln("*** PP getIndex or constructor(int32_t) result"); } pp2.setIndex( 3 ); if (pp2.getIndex() == 3) { logln("PP setIndex tested."); }else{ errln("*** PP getIndex or setIndex result"); } } ParsePosition pp2(3), pp3(5); //pp2 = new ParsePosition( 3 ); //pp3 = new ParsePosition( 5 ); ParsePosition pp4(5); if ( pp2 != pp3) { logln("PP not equals tested."); }else{ errln("*** PP not equals fails"); } if (pp3 == pp4) { logln("PP equals tested."); }else{ errln(UnicodeString("*** PP equals fails (") + pp3.getIndex() + " != " + pp4.getIndex() + ")"); } ParsePosition pp5; pp5 = pp4; if (pp4 == pp5) { logln("PP operator= tested."); }else{ errln("*** PP operator= operator== or operator != result"); } ParsePosition *ppp = pp5.clone(); if(ppp == &pp5 || *ppp != pp5) { errln("ParsePosition.clone() failed"); } delete ppp; } void ParsePositionTest::TestFieldPosition() { FieldPosition fp( 7 ); if (fp.getField() == 7) { logln("FP constructor(int) and getField tested."); }else{ errln("*** FP constructor(int) or getField"); } FieldPosition fpc(fp); if (fpc.getField() == 7) { logln("FP Constructor(FP&) passed"); } else { errln("*** FP Constructor(FP&)"); } FieldPosition fph( 3 ); if ( fph.getField() != 3) errln("*** FP getField or heap constr."); UBool err1 = FALSE; UBool err2 = FALSE; UBool err3 = FALSE; // for (long i = -50; i < 50; i++ ) { // fp.setField( i+8 ); // fp.setBeginIndex( i+6 ); // fp.setEndIndex( i+7 ); // if (fp.getField() != i+8) err1 = TRUE; // if (fp.getBeginIndex() != i+6) err2 = TRUE; // if (fp.getEndIndex() != i+7) err3 = TRUE; // } if (!err1) { logln("FP setField and getField tested."); }else{ errln("*** FP setField or getField"); } if (!err2) { logln("FP setBeginIndex and getBeginIndex tested."); }else{ errln("*** FP setBeginIndex or getBeginIndex"); } if (!err3) { logln("FP setEndIndex and getEndIndex tested."); }else{ errln("*** FP setEndIndex or getEndIndex"); } logln(""); FieldPosition *pfp = fp.clone(); if(pfp == &fp || *pfp != fp) { errln("FieldPosition.clone() failed"); } delete pfp; } void ParsePositionTest::TestFieldPosition_example() { //***** no error detection yet !!!!!!! //***** this test is for compiler checks and visual verification only. double doubleNum[] = { 123456789.0, -12345678.9, 1234567.89, -123456.789, 12345.6789, -1234.56789, 123.456789, -12.3456789, 1.23456789}; int dNumSize = 9; UErrorCode status = U_ZERO_ERROR; NumberFormat *nf = NumberFormat::createInstance(status); if (failure(status, "NumberFormat::createInstance", TRUE)){ delete nf; return; }; if(nf->getDynamicClassID() != DecimalFormat::getStaticClassID()) { errln("NumberFormat::createInstance returned unexpected class type"); return; } DecimalFormat *fmt = (DecimalFormat*) nf; fmt->setDecimalSeparatorAlwaysShown(TRUE); const int tempLen = 20; UnicodeString temp; for (int i=0; i < dNumSize; i++) { temp.remove(); //temp = new StringBuffer(); // Get new buffer FieldPosition pos(NumberFormat::INTEGER_FIELD); UnicodeString buf;// = new StringBuffer(); //char fmtText[tempLen]; //ToCharString(fmt->format(doubleNum[i], buf, pos), fmtText); UnicodeString res; res = fmt->format(doubleNum[i], buf, pos); int tempOffset = (tempLen <= (tempLen - pos.getEndIndex())) ? tempLen : (tempLen - pos.getEndIndex()); for (int j=0; j