|
|
// © 2017 and later: Unicode, Inc. and others.
|
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
|
|
#include "unicode/utypes.h"
|
|
|
|
|
|
#if !UCONFIG_NO_FORMATTING
|
|
|
|
|
|
#include "numbertest.h"
|
|
|
#include "number_patternstring.h"
|
|
|
|
|
|
void PatternStringTest::runIndexedTest(int32_t index, UBool exec, const char*& name, char*) {
|
|
|
if (exec) {
|
|
|
logln("TestSuite PatternStringTest: ");
|
|
|
}
|
|
|
TESTCASE_AUTO_BEGIN;
|
|
|
TESTCASE_AUTO(testLocalized);
|
|
|
TESTCASE_AUTO(testToPatternSimple);
|
|
|
TESTCASE_AUTO(testExceptionOnInvalid);
|
|
|
TESTCASE_AUTO(testBug13117);
|
|
|
TESTCASE_AUTO_END;
|
|
|
}
|
|
|
|
|
|
void PatternStringTest::testLocalized() {
|
|
|
IcuTestErrorCode status(*this, "testLocalized");
|
|
|
DecimalFormatSymbols symbols(Locale::getEnglish(), status);
|
|
|
if (status.isFailure()) { return; }
|
|
|
symbols.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, u"a", status);
|
|
|
symbols.setSymbol(DecimalFormatSymbols::kPercentSymbol, u"b", status);
|
|
|
symbols.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, u".", status);
|
|
|
symbols.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, u"'", status);
|
|
|
|
|
|
UnicodeString standard = u"+-abcb''a''#,##0.0%'a%'";
|
|
|
UnicodeString localized = u"’.'ab'c'b''a'''#,##0a0b'a%'";
|
|
|
UnicodeString toStandard = u"+-'ab'c'b''a'''#,##0.0%'a%'";
|
|
|
|
|
|
assertEquals(
|
|
|
"standard to localized",
|
|
|
localized,
|
|
|
PatternStringUtils::convertLocalized(standard, symbols, true, status));
|
|
|
assertEquals(
|
|
|
"localized to standard",
|
|
|
toStandard,
|
|
|
PatternStringUtils::convertLocalized(localized, symbols, false, status));
|
|
|
}
|
|
|
|
|
|
void PatternStringTest::testToPatternSimple() {
|
|
|
const char16_t* cases[][2] = {{u"#", u"0"},
|
|
|
{u"0", u"0"},
|
|
|
{u"#0", u"0"},
|
|
|
{u"###", u"0"},
|
|
|
{u"0.##", u"0.##"},
|
|
|
{u"0.00", u"0.00"},
|
|
|
{u"0.00#", u"0.00#"},
|
|
|
{u"0.05", u"0.05"},
|
|
|
{u"#E0", u"#E0"},
|
|
|
{u"0E0", u"0E0"},
|
|
|
{u"#00E00", u"#00E00"},
|
|
|
{u"#,##0", u"#,##0"},
|
|
|
{u"#;#", u"0;0"},
|
|
|
// ignore a negative prefix pattern of '-' since that is the default:
|
|
|
{u"#;-#", u"0"},
|
|
|
{u"pp#,000;(#)", u"pp#,000;(#,000)"},
|
|
|
{u"**##0", u"**##0"},
|
|
|
{u"*'x'##0", u"*x##0"},
|
|
|
{u"a''b0", u"a''b0"},
|
|
|
{u"*''##0", u"*''##0"},
|
|
|
{u"*📺##0", u"*'📺'##0"},
|
|
|
{u"*'நி'##0", u"*'நி'##0"},};
|
|
|
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
|
for (const char16_t** cas : cases) {
|
|
|
UnicodeString input(cas[0]);
|
|
|
UnicodeString output(cas[1]);
|
|
|
|
|
|
DecimalFormatProperties properties = PatternParser::parseToProperties(
|
|
|
input, IGNORE_ROUNDING_NEVER, status);
|
|
|
assertSuccess(input, status);
|
|
|
UnicodeString actual = PatternStringUtils::propertiesToPatternString(properties, status);
|
|
|
assertEquals(input, output, actual);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void PatternStringTest::testExceptionOnInvalid() {
|
|
|
static const char16_t* invalidPatterns[] = {
|
|
|
u"#.#.#",
|
|
|
u"0#",
|
|
|
u"0#.",
|
|
|
u".#0",
|
|
|
u"0#.#0",
|
|
|
u"@0",
|
|
|
u"0@",
|
|
|
u"0,",
|
|
|
u"0,,",
|
|
|
u"0,,0",
|
|
|
u"0,,0,",
|
|
|
u"#,##0E0"};
|
|
|
|
|
|
for (auto pattern : invalidPatterns) {
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
|
ParsedPatternInfo patternInfo;
|
|
|
PatternParser::parseToPatternInfo(pattern, patternInfo, status);
|
|
|
assertTrue(pattern, U_FAILURE(status));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void PatternStringTest::testBug13117() {
|
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
|
DecimalFormatProperties expected = PatternParser::parseToProperties(
|
|
|
u"0", IGNORE_ROUNDING_NEVER, status);
|
|
|
DecimalFormatProperties actual = PatternParser::parseToProperties(
|
|
|
u"0;", IGNORE_ROUNDING_NEVER, status);
|
|
|
assertSuccess("Spot 1", status);
|
|
|
assertTrue("Should not consume negative subpattern", expected == actual);
|
|
|
}
|
|
|
|
|
|
#endif /* #if !UCONFIG_NO_FORMATTING */
|