scuffed-code/icu4c/source/test/intltest/compactdecimalformattest.cpp

573 lines
23 KiB
C++

// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
* Copyright (C) 1997-2015, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* File COMPACTDECIMALFORMATTEST.CPP
*
********************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include "intltest.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/compactdecimalformat.h"
#include "unicode/unum.h"
#include "cmemory.h"
typedef struct ExpectedResult {
double value;
// Invariant characters, will be converted to UTF-16 and then unescaped.
const char *expected;
} ExpectedResult;
static const char *kShortStr = "Short";
static const char *kLongStr = "Long";
static ExpectedResult kEnglishShort[] = {
{0.0, "0"},
{0.17, "0.17"},
{1.0, "1"},
{1234.0, "1.2K"},
{12345.0, "12K"},
{123456.0, "120K"},
{1234567.0, "1.2M"},
{12345678.0, "12M"},
{123456789.0, "120M"},
{1.23456789E9, "1.2B"},
{1.23456789E10, "12B"},
{1.23456789E11, "120B"},
{1.23456789E12, "1.2T"},
{1.23456789E13, "12T"},
{1.23456789E14, "120T"},
{1.23456789E15, "1200T"}};
static ExpectedResult kSerbianShort[] = {
{1234.0, "1,2\\u00a0\\u0445\\u0438\\u0459."},
{12345.0, "12\\u00a0\\u0445\\u0438\\u0459."},
{20789.0, "21\\u00a0\\u0445\\u0438\\u0459."},
{123456.0, "120\\u00a0\\u0445\\u0438\\u0459."},
{1234567.0, "1,2\\u00A0\\u043C\\u0438\\u043B."},
{12345678.0, "12\\u00A0\\u043C\\u0438\\u043B."},
{123456789.0, "120\\u00A0\\u043C\\u0438\\u043B."},
{1.23456789E9, "1,2\\u00A0\\u043C\\u043B\\u0440\\u0434."},
{1.23456789E10, "12\\u00A0\\u043C\\u043B\\u0440\\u0434."},
{1.23456789E11, "120\\u00A0\\u043C\\u043B\\u0440\\u0434."},
{1.23456789E12, "1,2\\u00A0\\u0431\\u0438\\u043B."},
{1.23456789E13, "12\\u00A0\\u0431\\u0438\\u043B."},
{1.23456789E14, "120\\u00A0\\u0431\\u0438\\u043B."},
{1.23456789E15, "1200\\u00A0\\u0431\\u0438\\u043B."}};
static ExpectedResult kSerbianLong[] = {
{1234.0, "1,2 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0435"}, // 10^3 few
{12345.0, "12 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0430"}, // 10^3 other
{21789.0, "22 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0435"}, // 10^3 few
{123456.0, "120 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0430"}, // 10^3 other
{999999.0, "1 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D"}, // 10^6 one
{1234567.0, "1,2 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^6 few
{12345678.0, "12 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^6 other
{123456789.0, "120 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^6 other
{1.23456789E9, "1,2 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0435"}, // 10^9 few
{1.23456789E10, "12 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0438"}, // 10^9 other
{2.08901234E10, "21 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0430"}, // 10^9 one
{2.18901234E10, "22 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0435"}, // 10^9 few
{1.23456789E11, "120 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0438"}, // 10^9 other
{1.23456789E12, "1,2 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^12 few
{1.23456789E13, "12 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^12 other
{1.23456789E14, "120 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}, // 10^12 other
{1.23456789E15, "1200 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}}; // 10^12 other
static ExpectedResult kSerbianLongNegative[] = {
{-1234.0, "-1,2 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0435"},
{-12345.0, "-12 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0430"},
{-21789.0, "-22 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0435"},
{-123456.0, "-120 \\u0445\\u0438\\u0459\\u0430\\u0434\\u0430"},
{-999999.0, "-1 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D"},
{-1234567.0, "-1,2 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-12345678.0, "-12 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-123456789.0, "-120 \\u043C\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-1.23456789E9, "-1,2 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0435"},
{-1.23456789E10, "-12 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0438"},
{-2.08901234E10, "-21 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0430"},
{-2.18901234E10, "-22 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0435"},
{-1.23456789E11, "-120 \\u043C\\u0438\\u043B\\u0438\\u0458\\u0430\\u0440\\u0434\\u0438"},
{-1.23456789E12, "-1,2 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-1.23456789E13, "-12 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-1.23456789E14, "-120 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"},
{-1.23456789E15, "-1200 \\u0431\\u0438\\u043B\\u0438\\u043E\\u043D\\u0430"}};
static ExpectedResult kJapaneseShort[] = {
{1234.0, "1200"},
{12345.0, "1.2\\u4E07"},
{123456.0, "12\\u4E07"},
{1234567.0, "120\\u4E07"},
{12345678.0, "1200\\u4E07"},
{123456789.0, "1.2\\u5104"},
{1.23456789E9, "12\\u5104"},
{1.23456789E10, "120\\u5104"},
{1.23456789E11, "1200\\u5104"},
{1.23456789E12, "1.2\\u5146"},
{1.23456789E13, "12\\u5146"},
{1.23456789E14, "120\\u5146"}};
static ExpectedResult kSwahiliShort[] = {
{1234.0, "elfu\\u00a01.2"},
{12345.0, "elfu\\u00a012"},
{123456.0, "elfu\\u00a0120"},
{1234567.0, "1.2M"},
{12345678.0, "12M"},
{123456789.0, "120M"},
{1.23456789E9, "1.2B"},
{1.23456789E10, "12B"},
{1.23456789E11, "120B"},
{1.23456789E12, "1.2T"},
{1.23456789E13, "12T"},
{1.23456789E15, "1200T"}};
static ExpectedResult kCsShort[] = {
{1000.0, "1\\u00a0tis."},
{1500.0, "1,5\\u00a0tis."},
{5000.0, "5\\u00a0tis."},
{23000.0, "23\\u00a0tis."},
{127123.0, "130\\u00a0tis."},
{1271234.0, "1,3\\u00a0mil."},
{12712345.0, "13\\u00a0mil."},
{127123456.0, "130\\u00a0mil."},
{1.27123456E9, "1,3\\u00a0mld."},
{1.27123456E10, "13\\u00a0mld."},
{1.27123456E11, "130\\u00a0mld."},
{1.27123456E12, "1,3\\u00a0bil."},
{1.27123456E13, "13\\u00a0bil."},
{1.27123456E14, "130\\u00a0bil."}};
static ExpectedResult kSkLong[] = {
{1000.0, "1 tis\\u00edc"},
{1572.0, "1,6 tis\\u00edca"},
{5184.0, "5,2 tis\\u00edca"}};
static ExpectedResult kSwahiliShortNegative[] = {
{-1234.0, "elfu\\u00a0-1.2"},
{-12345.0, "elfu\\u00a0-12"},
{-123456.0, "elfu\\u00a0-120"},
{-1234567.0, "-1.2M"},
{-12345678.0, "-12M"},
{-123456789.0, "-120M"},
{-1.23456789E9, "-1.2B"},
{-1.23456789E10, "-12B"},
{-1.23456789E11, "-120B"},
{-1.23456789E12, "-1.2T"},
{-1.23456789E13, "-12T"},
{-1.23456789E15, "-1200T"}};
static ExpectedResult kArabicLong[] = {
{-5300.0, "\\u061C-\\u0665\\u066B\\u0663 \\u0623\\u0644\\u0641"}};
static ExpectedResult kChineseCurrencyTestData[] = {
{1.0, "\\u00A51"},
{12.0, "\\u00A512"},
{123.0, "\\u00A5120"},
{1234.0, "\\u00A51200"},
{12345.0, "\\u00A51.2\\u4E07"},
{123456.0, "\\u00A512\\u4E07"},
{1234567.0, "\\u00A5120\\u4E07"},
{12345678.0, "\\u00A51200\\u4E07"},
{123456789.0, "\\u00A51.2\\u4EBF"},
{1234567890.0, "\\u00A512\\u4EBF"},
{12345678901.0, "\\u00A5120\\u4EBF"},
{123456789012.0, "\\u00A51200\\u4EBF"},
{1234567890123.0, "\\u00A51.2\\u4E07\\u4EBF"},
{12345678901234.0, "\\u00A512\\u4E07\\u4EBF"},
{123456789012345.0, "\\u00A5120\\u4E07\\u4EBF"},
};
static ExpectedResult kGermanCurrencyTestData[] = {
{1.0, "1\\u00A0\\u20AC"},
{12.0, "12\\u00A0\\u20AC"},
{123.0, "120\\u00A0\\u20AC"},
{1234.0, "1200\\u00A0\\u20AC"},
{12345.0, "12.000\\u00A0\\u20AC"},
{123456.0, "120.000\\u00A0\\u20AC"},
{1234567.0, "1,2\\u00A0Mio.\\u00A0\\u20AC"},
{12345678.0, "12\\u00A0Mio.\\u00A0\\u20AC"},
{123456789.0, "120\\u00A0Mio.\\u00A0\\u20AC"},
{1234567890.0, "1,2\\u00A0Mrd.\\u00A0\\u20AC"},
{12345678901.0, "12\\u00A0Mrd.\\u00A0\\u20AC"},
{123456789012.0, "120\\u00A0Mrd.\\u00A0\\u20AC"},
{1234567890123.0, "1,2\\u00A0Bio.\\u00A0\\u20AC"},
{12345678901234.0, "12\\u00A0Bio.\\u00A0\\u20AC"},
{123456789012345.0, "120\\u00A0Bio.\\u00A0\\u20AC"},
};
static ExpectedResult kEnglishCurrencyTestData[] = {
{1.0, "$1"},
{12.0, "$12"},
{123.0, "$120"},
{1234.0, "$1.2K"},
{12345.0, "$12K"},
{123456.0, "$120K"},
{1234567.0, "$1.2M"},
{12345678.0, "$12M"},
{123456789.0, "$120M"},
{1234567890.0, "$1.2B"},
{12345678901.0, "$12B"},
{123456789012.0, "$120B"},
{1234567890123.0, "$1.2T"},
{12345678901234.0, "$12T"},
{123456789012345.0, "$120T"},
};
class CompactDecimalFormatTest : public IntlTest {
public:
CompactDecimalFormatTest() {
}
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
private:
void TestEnglishShort();
void TestSerbianShort();
void TestSerbianLong();
void TestSerbianLongNegative();
void TestJapaneseShort();
void TestSwahiliShort();
void TestCsShort();
void TestSkLong();
void TestSwahiliShortNegative();
void TestEnglishCurrency();
void TestGermanCurrency();
void TestChineseCurrency();
void TestArabicLong();
void TestFieldPosition();
void TestDefaultSignificantDigits();
void TestAPIVariants();
void TestBug12975();
void CheckLocale(
const Locale& locale, UNumberCompactStyle style,
const ExpectedResult* expectedResults, int32_t expectedResultLength);
void CheckLocaleWithCurrency(const Locale& locale, UNumberCompactStyle style, const UChar* currency,
const ExpectedResult* expectedResults, int32_t expectedResultLength);
void CheckExpectedResult(
const CompactDecimalFormat* cdf, const ExpectedResult* expectedResult,
const char* description);
CompactDecimalFormat* createCDFInstance(const Locale& locale, UNumberCompactStyle style, UErrorCode& status);
static const char *StyleStr(UNumberCompactStyle style);
};
void CompactDecimalFormatTest::runIndexedTest(
int32_t index, UBool exec, const char *&name, char *) {
if (exec) {
logln("TestSuite CompactDecimalFormatTest: ");
}
TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestEnglishShort);
TESTCASE_AUTO(TestSerbianShort);
TESTCASE_AUTO(TestSerbianLong);
TESTCASE_AUTO(TestSerbianLongNegative);
TESTCASE_AUTO(TestJapaneseShort);
TESTCASE_AUTO(TestSwahiliShort);
TESTCASE_AUTO(TestEnglishCurrency);
TESTCASE_AUTO(TestGermanCurrency);
TESTCASE_AUTO(TestChineseCurrency);
TESTCASE_AUTO(TestCsShort);
TESTCASE_AUTO(TestSkLong);
TESTCASE_AUTO(TestSwahiliShortNegative);
TESTCASE_AUTO(TestArabicLong);
TESTCASE_AUTO(TestFieldPosition);
TESTCASE_AUTO(TestDefaultSignificantDigits);
TESTCASE_AUTO(TestAPIVariants);
TESTCASE_AUTO(TestBug12975);
TESTCASE_AUTO_END;
}
void CompactDecimalFormatTest::TestEnglishShort() {
CheckLocale("en", UNUM_SHORT, kEnglishShort, UPRV_LENGTHOF(kEnglishShort));
}
void CompactDecimalFormatTest::TestSerbianShort() {
CheckLocale("sr", UNUM_SHORT, kSerbianShort, UPRV_LENGTHOF(kSerbianShort));
}
void CompactDecimalFormatTest::TestSerbianLong() {
CheckLocale("sr", UNUM_LONG, kSerbianLong, UPRV_LENGTHOF(kSerbianLong));
}
void CompactDecimalFormatTest::TestSerbianLongNegative() {
CheckLocale("sr", UNUM_LONG, kSerbianLongNegative, UPRV_LENGTHOF(kSerbianLongNegative));
}
void CompactDecimalFormatTest::TestJapaneseShort() {
CheckLocale(Locale::getJapan(), UNUM_SHORT, kJapaneseShort, UPRV_LENGTHOF(kJapaneseShort));
}
void CompactDecimalFormatTest::TestSwahiliShort() {
CheckLocale("sw", UNUM_SHORT, kSwahiliShort, UPRV_LENGTHOF(kSwahiliShort));
}
void CompactDecimalFormatTest::TestEnglishCurrency() {
CheckLocaleWithCurrency(
"en", UNUM_SHORT, u"USD", kEnglishCurrencyTestData, UPRV_LENGTHOF(kEnglishCurrencyTestData));
}
void CompactDecimalFormatTest::TestGermanCurrency() {
CheckLocaleWithCurrency(
"de", UNUM_SHORT, u"EUR", kGermanCurrencyTestData, UPRV_LENGTHOF(kGermanCurrencyTestData));
}
void CompactDecimalFormatTest::TestChineseCurrency() {
CheckLocaleWithCurrency(
"zh", UNUM_SHORT, u"CNY", kChineseCurrencyTestData, UPRV_LENGTHOF(kChineseCurrencyTestData));
}
void CompactDecimalFormatTest::TestFieldPosition() {
// Swahili uses prefixes which forces offsets in field position to change
UErrorCode status = U_ZERO_ERROR;
LocalPointer<CompactDecimalFormat> cdf(createCDFInstance("sw", UNUM_SHORT, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
}
FieldPosition fp(UNUM_INTEGER_FIELD);
UnicodeString result;
cdf->format(1234567.0, result, fp);
UnicodeString subString = result.tempSubString(fp.getBeginIndex(), fp.getEndIndex() - fp.getBeginIndex());
if (subString != UnicodeString("1", -1, US_INV)) {
errln(UnicodeString("Expected 1, got ") + subString);
}
}
void CompactDecimalFormatTest::TestCsShort() {
CheckLocale("cs", UNUM_SHORT, kCsShort, UPRV_LENGTHOF(kCsShort));
}
void CompactDecimalFormatTest::TestSkLong() {
// In CLDR we have:
// 1000 {
// few{"0"}
// one{"0"}
// other{"0"}
CheckLocale("sk", UNUM_LONG, kSkLong, UPRV_LENGTHOF(kSkLong));
}
void CompactDecimalFormatTest::TestSwahiliShortNegative() {
CheckLocale("sw", UNUM_SHORT, kSwahiliShortNegative, UPRV_LENGTHOF(kSwahiliShortNegative));
}
void CompactDecimalFormatTest::TestArabicLong() {
CheckLocale("ar-EG", UNUM_LONG, kArabicLong, UPRV_LENGTHOF(kArabicLong));
}
void CompactDecimalFormatTest::TestDefaultSignificantDigits() {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<CompactDecimalFormat> cdf(CompactDecimalFormat::createInstance("en", UNUM_SHORT, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
}
// We are expecting two significant digits for compact formats with one or two zeros,
// and rounded to the unit for compact formats with three or more zeros.
UnicodeString actual;
assertEquals("Default significant digits", u"123K", cdf->format(123456, actual.remove()));
assertEquals("Default significant digits", u"12K", cdf->format(12345, actual.remove()));
assertEquals("Default significant digits", u"1.2K", cdf->format(1234, actual.remove()));
assertEquals("Default significant digits", u"123", cdf->format(123, actual.remove()));
}
void CompactDecimalFormatTest::TestAPIVariants() {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<CompactDecimalFormat> cdf(CompactDecimalFormat::createInstance("en", UNUM_SHORT, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
}
UnicodeString actual;
FieldPosition pos;
FieldPositionIterator posIter;
UnicodeString expected("123K", -1, US_INV);
pos.setField(UNUM_INTEGER_FIELD);
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
cdf->format((double)123456.0, actual, pos);
if (actual != expected || pos.getEndIndex() != 3) {
errln(UnicodeString("Fail format(double,UnicodeString&,FieldPosition&): Expected: \"") + expected + "\", pos 3; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex());
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((double)123456.0, actual, pos, status);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(double,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((double)123456.0, actual, &posIter, status);
posIter.next(pos);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(int32_t,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", first pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
cdf->format((int32_t)123456, actual, pos);
if (actual != expected || pos.getEndIndex() != 3) {
errln(UnicodeString("Fail format(int32_t,UnicodeString&,FieldPosition&): Expected: \"") + expected + "\", pos 3; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex());
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((int32_t)123456, actual, pos, status);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(int32_t,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((int32_t)123456, actual, &posIter, status);
posIter.next(pos);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(int32_t,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", first pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
cdf->format((int64_t)123456, actual, pos);
if (actual != expected || pos.getEndIndex() != 3) {
errln(UnicodeString("Fail format(int64_t,UnicodeString&,FieldPosition&): Expected: \"") + expected + "\", pos 3; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex());
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((int64_t)123456, actual, pos, status);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(int64_t,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
actual.remove();
pos.setBeginIndex(0);
pos.setEndIndex(0);
status = U_ZERO_ERROR;
cdf->format((int64_t)123456, actual, &posIter, status);
posIter.next(pos);
if (actual != expected || pos.getEndIndex() != 3 || status != U_ZERO_ERROR) {
errln(UnicodeString("Fail format(int32_t,UnicodeString&,FieldPosition&,UErrorCode&): Expected: \"") + expected + "\", first pos 3, status U_ZERO_ERROR; " +
"Got: \"" + actual + "\", pos " + pos.getEndIndex() + ", status " + u_errorName(status));
}
}
void CompactDecimalFormatTest::TestBug12975() {
IcuTestErrorCode status(*this, "TestBug12975");
Locale locale("it");
LocalPointer<CompactDecimalFormat> cdf(CompactDecimalFormat::createInstance(locale, UNUM_SHORT, status));
if (assertSuccess("", status, true, __FILE__, __LINE__)) {
UnicodeString resultCdf;
cdf->format(12000, resultCdf);
LocalPointer<DecimalFormat> df((DecimalFormat*) DecimalFormat::createInstance(locale, status));
UnicodeString resultDefault;
df->format(12000, resultDefault);
assertEquals("CompactDecimalFormat should use default pattern when compact pattern is unavailable",
resultDefault, resultCdf);
}
}
// End test cases. Helpers:
void CompactDecimalFormatTest::CheckLocale(const Locale& locale, UNumberCompactStyle style, const ExpectedResult* expectedResults, int32_t expectedResultLength) {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<CompactDecimalFormat> cdf(createCDFInstance(locale, style, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
}
char description[256];
sprintf(description,"%s - %s", locale.getName(), StyleStr(style));
for (int32_t i = 0; i < expectedResultLength; i++) {
CheckExpectedResult(cdf.getAlias(), &expectedResults[i], description);
}
}
void CompactDecimalFormatTest::CheckLocaleWithCurrency(const Locale& locale, UNumberCompactStyle style,
const UChar* currency,
const ExpectedResult* expectedResults,
int32_t expectedResultLength) {
UErrorCode status = U_ZERO_ERROR;
LocalPointer<CompactDecimalFormat> cdf(createCDFInstance(locale, style, status));
if (U_FAILURE(status)) {
dataerrln("Unable to create format object - %s", u_errorName(status));
return;
}
cdf->setCurrency(currency, status);
assertSuccess("Failed to set currency", status);
char description[256];
sprintf(description,"%s - %s", locale.getName(), StyleStr(style));
for (int32_t i = 0; i < expectedResultLength; i++) {
CheckExpectedResult(cdf.getAlias(), &expectedResults[i], description);
}
}
void CompactDecimalFormatTest::CheckExpectedResult(
const CompactDecimalFormat* cdf, const ExpectedResult* expectedResult, const char* description) {
UnicodeString actual;
cdf->format(expectedResult->value, actual);
UnicodeString expected(expectedResult->expected, -1, US_INV);
expected = expected.unescape();
if (actual != expected) {
errln(UnicodeString("Fail: Expected: ") + expected
+ UnicodeString(" Got: ") + actual
+ UnicodeString(" for: ") + UnicodeString(description));
}
}
CompactDecimalFormat*
CompactDecimalFormatTest::createCDFInstance(const Locale& locale, UNumberCompactStyle style, UErrorCode& status) {
CompactDecimalFormat* result = CompactDecimalFormat::createInstance(locale, style, status);
if (U_FAILURE(status)) {
return NULL;
}
// All tests are written for two significant digits, so we explicitly set here
// in case default significant digits change.
result->setMaximumSignificantDigits(2);
return result;
}
const char *CompactDecimalFormatTest::StyleStr(UNumberCompactStyle style) {
if (style == UNUM_SHORT) {
return kShortStr;
}
return kLongStr;
}
extern IntlTest *createCompactDecimalFormatTest() {
return new CompactDecimalFormatTest();
}
#endif