| Index: icu46/source/test/intltest/itrbnfrt.cpp
|
| ===================================================================
|
| --- icu46/source/test/intltest/itrbnfrt.cpp (revision 0)
|
| +++ icu46/source/test/intltest/itrbnfrt.cpp (revision 0)
|
| @@ -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 */
|
|
|
| Property changes on: icu46/source/test/intltest/itrbnfrt.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|