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 && !UPRV_INCOMPLETE_CPP11_SUPPORT
7
8#include "numbertest.h"
9#include "number_patternstring.h"
10
11void 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(testToPatternSimple);
17        TESTCASE_AUTO(testExceptionOnInvalid);
18        TESTCASE_AUTO(testBug13117);
19    TESTCASE_AUTO_END;
20}
21
22void PatternStringTest::testToPatternSimple() {
23    const char16_t *cases[][2] = {{u"#", u"0"},
24                                  {u"0", u"0"},
25                                  {u"#0", u"0"},
26                                  {u"###", u"0"},
27                                  {u"0.##", u"0.##"},
28                                  {u"0.00", u"0.00"},
29                                  {u"0.00#", u"0.00#"},
30                                  {u"#E0", u"#E0"},
31                                  {u"0E0", u"0E0"},
32                                  {u"#00E00", u"#00E00"},
33                                  {u"#,##0", u"#,##0"},
34                                  {u"#;#", u"0;0"},
35            // ignore a negative prefix pattern of '-' since that is the default:
36                                  {u"#;-#", u"0"},
37                                  {u"**##0", u"**##0"},
38                                  {u"*'x'##0", u"*x##0"},
39                                  {u"a''b0", u"a''b0"},
40                                  {u"*''##0", u"*''##0"},
41                                  {u"*��##0", u"*'��'##0"},
42                                  {u"*'நி'##0", u"*'நி'##0"},};
43
44    UErrorCode status = U_ZERO_ERROR;
45    for (const char16_t **cas : cases) {
46        UnicodeString input(cas[0]);
47        UnicodeString output(cas[1]);
48
49        DecimalFormatProperties properties = PatternParser::parseToProperties(
50                input, PatternParser::IGNORE_ROUNDING_NEVER, status);
51        assertSuccess(input, status);
52        UnicodeString actual = PatternStringUtils::propertiesToPatternString(properties, status);
53        assertEquals(input, output, actual);
54    }
55}
56
57void PatternStringTest::testExceptionOnInvalid() {
58    static const char16_t *invalidPatterns[] = {
59            u"#.#.#",
60            u"0#",
61            u"0#.",
62            u".#0",
63            u"0#.#0",
64            u"@0",
65            u"0@",
66            u"0,",
67            u"0,,",
68            u"0,,0",
69            u"0,,0,",
70            u"#,##0E0"};
71
72    for (auto pattern : invalidPatterns) {
73        UErrorCode status = U_ZERO_ERROR;
74        ParsedPatternInfo patternInfo;
75        PatternParser::parseToPatternInfo(pattern, patternInfo, status);
76        assertTrue(pattern, U_FAILURE(status));
77    }
78}
79
80void PatternStringTest::testBug13117() {
81    UErrorCode status = U_ZERO_ERROR;
82    DecimalFormatProperties expected = PatternParser::parseToProperties(
83            u"0",
84            PatternParser::IGNORE_ROUNDING_NEVER,
85            status);
86    DecimalFormatProperties actual = PatternParser::parseToProperties(
87            u"0;",
88            PatternParser::IGNORE_ROUNDING_NEVER,
89            status);
90    assertSuccess("Spot 1", status);
91    assertTrue("Should not consume negative subpattern", expected == actual);
92}
93
94#endif /* #if !UCONFIG_NO_FORMATTING */
95