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 |