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