diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2010-12-03 09:05:05 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2010-12-03 09:05:05 +0000 |
commit | e04c6a878f5044d36eaa95d4c2318e0381a32998 (patch) | |
tree | 5b7c36578140e48c0114863004c8375ea55db21d /Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp | |
parent | fa438554bd1a061515cd8f5f46fbe311ff08dcd6 (diff) |
icu 4.6
git-svn-id: svn://tug.org/texlive/trunk@20645 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp')
-rw-r--r-- | Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp b/Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp new file mode 100644 index 00000000000..87c227d5382 --- /dev/null +++ b/Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp @@ -0,0 +1,364 @@ +/* + ******************************************************************************* + * Copyright (C) 1996-2009, International Business Machines Corporation and * + * others. All Rights Reserved. * + ******************************************************************************* + */ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "itrbnfrt.h" + +#include "unicode/fmtable.h" +#include <math.h> // fabs +#include <stdio.h> + +// current macro not in icu1.8.1 +#define TESTCASE(id,test) \ + case id: \ + name = #test; \ + if (exec) { \ + logln(#test "---"); \ + logln(); \ + test(); \ + } \ + break + +void RbnfRoundTripTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) +{ + if (exec) logln("TestSuite RuleBasedNumberFormatRT"); + switch (index) { +#if U_HAVE_RBNF + TESTCASE(0, TestEnglishSpelloutRT); + TESTCASE(1, TestDurationsRT); + TESTCASE(2, TestSpanishSpelloutRT); + TESTCASE(3, TestFrenchSpelloutRT); + TESTCASE(4, TestSwissFrenchSpelloutRT); + TESTCASE(5, TestItalianSpelloutRT); + TESTCASE(6, TestGermanSpelloutRT); + TESTCASE(7, TestSwedishSpelloutRT); + TESTCASE(8, TestDutchSpelloutRT); + TESTCASE(9, TestJapaneseSpelloutRT); + TESTCASE(10, TestRussianSpelloutRT); + TESTCASE(11, TestPortugueseSpelloutRT); +#else + TESTCASE(0, TestRBNFDisabled); +#endif + default: + name = ""; + break; + } +} + +#if U_HAVE_RBNF + +/** + * Perform an exhaustive round-trip test on the English spellout rules + */ +void +RbnfRoundTripTest::TestEnglishSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getUS(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the duration-formatting rules + */ +void +RbnfRoundTripTest::TestDurationsRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_DURATION, Locale::getUS(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, 0, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Spanish spellout rules + */ +void +RbnfRoundTripTest::TestSpanishSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("es", "es"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the French spellout rules + */ +void +RbnfRoundTripTest::TestFrenchSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getFrance(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Swiss French spellout rules + */ +void +RbnfRoundTripTest::TestSwissFrenchSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("fr", "CH"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Italian spellout rules + */ +void +RbnfRoundTripTest::TestItalianSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getItalian(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -999999, 999999); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the German spellout rules + */ +void +RbnfRoundTripTest::TestGermanSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getGermany(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, 0, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Swedish spellout rules + */ +void +RbnfRoundTripTest::TestSwedishSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("sv", "SE"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, 0, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Dutch spellout rules + */ +void +RbnfRoundTripTest::TestDutchSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("nl", "NL"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Japanese spellout rules + */ +void +RbnfRoundTripTest::TestJapaneseSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale::getJapan(), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, 0, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Russian spellout rules + */ +void +RbnfRoundTripTest::TestRussianSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("ru", "RU"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, 0, 12345678); + } + delete formatter; +} + +/** + * Perform an exhaustive round-trip test on the Portuguese spellout rules + */ +void +RbnfRoundTripTest::TestPortugueseSpelloutRT() +{ + UErrorCode status = U_ZERO_ERROR; + RuleBasedNumberFormat* formatter + = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale("pt", "BR"), status); + + if (U_FAILURE(status)) { + errcheckln(status, "failed to construct formatter - %s", u_errorName(status)); + } else { + doTest(formatter, -12345678, 12345678); + } + delete formatter; +} + +void +RbnfRoundTripTest::doTest(const RuleBasedNumberFormat* formatter, + double lowLimit, + double highLimit) +{ + char buf[128]; + + uint32_t count = 0; + double increment = 1; + for (double i = lowLimit; i <= highLimit; i += increment) { + if (count % 1000 == 0) { + sprintf(buf, "%.12g", i); + logln(buf); + } + + if (fabs(i) < 5000) + increment = 1; + else if (fabs(i) < 500000) + increment = 2737; + else + increment = 267437; + + UnicodeString formatResult; + formatter->format(i, formatResult); + UErrorCode status = U_ZERO_ERROR; + Formattable parseResult; + formatter->parse(formatResult, parseResult, status); + if (U_FAILURE(status)) { + sprintf(buf, "Round-trip status failure: %.12g, status: %d", i, status); + errln(buf); + return; + } else { + double rt = (parseResult.getType() == Formattable::kDouble) ? + parseResult.getDouble() : + (double)parseResult.getLong(); + + if (rt != i) { + sprintf(buf, "Round-trip failed: %.12g -> %.12g", i, rt); + errln(buf); + return; + } + } + + ++count; + } + + if (lowLimit < 0) { + double d = 1.234; + while (d < 1000) { + UnicodeString formatResult; + formatter->format(d, formatResult); + UErrorCode status = U_ZERO_ERROR; + Formattable parseResult; + formatter->parse(formatResult, parseResult, status); + if (U_FAILURE(status)) { + sprintf(buf, "Round-trip status failure: %.12g, status: %d", d, status); + errln(buf); + return; + } else { + double rt = (parseResult.getType() == Formattable::kDouble) ? + parseResult.getDouble() : + (double)parseResult.getLong(); + + if (rt != d) { + UnicodeString msg; + sprintf(buf, "Round-trip failed: %.12g -> ", d); + msg.append(buf); + msg.append(formatResult); + sprintf(buf, " -> %.12g", rt); + msg.append(buf); + errln(msg); + return; + } + } + + d *= 10; + } + } +} + +/* U_HAVE_RBNF */ +#else + +void +RbnfRoundTripTest::TestRBNFDisabled() { + errln("*** RBNF currently disabled on this platform ***\n"); +} + +/* U_HAVE_RBNF */ +#endif + +#endif /* #if !UCONFIG_NO_FORMATTING */ |