// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
* 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 */