]>
Commit | Line | Data |
---|---|---|
0f5d89e8 A |
1 | // © 2017 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html | |
3 | ||
4 | #include "unicode/utypes.h" | |
5 | ||
6 | #if !UCONFIG_NO_FORMATTING | |
7 | ||
8 | #include "numbertest.h" | |
9 | #include "number_patternstring.h" | |
10 | ||
11 | void PatternStringTest::runIndexedTest(int32_t index, UBool exec, const char*& name, char*) { | |
12 | if (exec) { | |
13 | logln("TestSuite PatternStringTest: "); | |
14 | } | |
15 | TESTCASE_AUTO_BEGIN; | |
16 | TESTCASE_AUTO(testLocalized); | |
17 | TESTCASE_AUTO(testToPatternSimple); | |
18 | TESTCASE_AUTO(testExceptionOnInvalid); | |
19 | TESTCASE_AUTO(testBug13117); | |
20 | TESTCASE_AUTO_END; | |
21 | } | |
22 | ||
23 | void PatternStringTest::testLocalized() { | |
24 | IcuTestErrorCode status(*this, "testLocalized"); | |
25 | DecimalFormatSymbols symbols(Locale::getEnglish(), status); | |
26 | if (status.isFailure()) { return; } | |
27 | symbols.setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, u"a", status); | |
28 | symbols.setSymbol(DecimalFormatSymbols::kPercentSymbol, u"b", status); | |
29 | symbols.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, u".", status); | |
30 | symbols.setSymbol(DecimalFormatSymbols::kPlusSignSymbol, u"'", status); | |
31 | ||
32 | UnicodeString standard = u"+-abcb''a''#,##0.0%'a%'"; | |
33 | UnicodeString localized = u"’.'ab'c'b''a'''#,##0a0b'a%'"; | |
34 | UnicodeString toStandard = u"+-'ab'c'b''a'''#,##0.0%'a%'"; | |
35 | ||
36 | assertEquals( | |
37 | "standard to localized", | |
38 | localized, | |
39 | PatternStringUtils::convertLocalized(standard, symbols, true, status)); | |
40 | assertEquals( | |
41 | "localized to standard", | |
42 | toStandard, | |
43 | PatternStringUtils::convertLocalized(localized, symbols, false, status)); | |
44 | } | |
45 | ||
46 | void PatternStringTest::testToPatternSimple() { | |
47 | const char16_t* cases[][2] = {{u"#", u"0"}, | |
48 | {u"0", u"0"}, | |
49 | {u"#0", u"0"}, | |
50 | {u"###", u"0"}, | |
51 | {u"0.##", u"0.##"}, | |
52 | {u"0.00", u"0.00"}, | |
53 | {u"0.00#", u"0.00#"}, | |
54 | {u"0.05", u"0.05"}, | |
55 | {u"#E0", u"#E0"}, | |
56 | {u"0E0", u"0E0"}, | |
57 | {u"#00E00", u"#00E00"}, | |
58 | {u"#,##0", u"#,##0"}, | |
59 | {u"#;#", u"0;0"}, | |
60 | // ignore a negative prefix pattern of '-' since that is the default: | |
61 | {u"#;-#", u"0"}, | |
62 | {u"pp#,000;(#)", u"pp#,000;(#,000)"}, | |
63 | {u"**##0", u"**##0"}, | |
64 | {u"*'x'##0", u"*x##0"}, | |
65 | {u"a''b0", u"a''b0"}, | |
66 | {u"*''##0", u"*''##0"}, | |
67 | {u"*📺##0", u"*'📺'##0"}, | |
68 | {u"*'நி'##0", u"*'நி'##0"},}; | |
69 | ||
70 | UErrorCode status = U_ZERO_ERROR; | |
71 | for (const char16_t** cas : cases) { | |
72 | UnicodeString input(cas[0]); | |
73 | UnicodeString output(cas[1]); | |
74 | ||
75 | DecimalFormatProperties properties = PatternParser::parseToProperties( | |
76 | input, IGNORE_ROUNDING_NEVER, status); | |
77 | assertSuccess(input, status); | |
78 | UnicodeString actual = PatternStringUtils::propertiesToPatternString(properties, status); | |
79 | assertEquals(input, output, actual); | |
80 | } | |
81 | } | |
82 | ||
83 | void PatternStringTest::testExceptionOnInvalid() { | |
84 | static const char16_t* invalidPatterns[] = { | |
85 | u"#.#.#", | |
86 | u"0#", | |
87 | u"0#.", | |
88 | u".#0", | |
89 | u"0#.#0", | |
90 | u"@0", | |
91 | u"0@", | |
92 | u"0,", | |
93 | u"0,,", | |
94 | u"0,,0", | |
95 | u"0,,0,", | |
96 | u"#,##0E0"}; | |
97 | ||
98 | for (auto pattern : invalidPatterns) { | |
99 | UErrorCode status = U_ZERO_ERROR; | |
100 | ParsedPatternInfo patternInfo; | |
101 | PatternParser::parseToPatternInfo(pattern, patternInfo, status); | |
102 | assertTrue(pattern, U_FAILURE(status)); | |
103 | } | |
104 | } | |
105 | ||
106 | void PatternStringTest::testBug13117() { | |
107 | UErrorCode status = U_ZERO_ERROR; | |
108 | DecimalFormatProperties expected = PatternParser::parseToProperties( | |
109 | u"0", IGNORE_ROUNDING_NEVER, status); | |
110 | DecimalFormatProperties actual = PatternParser::parseToProperties( | |
111 | u"0;", IGNORE_ROUNDING_NEVER, status); | |
112 | assertSuccess("Spot 1", status); | |
113 | assertTrue("Should not consume negative subpattern", expected == actual); | |
114 | } | |
115 | ||
116 | #endif /* #if !UCONFIG_NO_FORMATTING */ |