You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
9.5 KiB
367 lines
9.5 KiB
// © 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 */
|