summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-4.6/test/intltest/itrbnfrt.cpp
diff options
context:
space:
mode:
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.cpp364
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 */