| // © 2018 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 "static_unicode_sets.h" |
| #include "unicode/dcfmtsym.h" |
| |
| using icu::unisets::get; |
| |
| class StaticUnicodeSetsTest : public IntlTest { |
| public: |
| void testSetCoverage(); |
| void testNonEmpty(); |
| |
| void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); |
| |
| private: |
| void assertInSet(const UnicodeString& localeName, const UnicodeString &setName, |
| const UnicodeSet& set, const UnicodeString& str); |
| void assertInSet(const UnicodeString& localeName, const UnicodeString &setName, |
| const UnicodeSet& set, UChar32 cp); |
| }; |
| |
| extern IntlTest *createStaticUnicodeSetsTest() { |
| return new StaticUnicodeSetsTest(); |
| } |
| |
| void StaticUnicodeSetsTest::runIndexedTest(int32_t index, UBool exec, const char*&name, char*) { |
| if (exec) { |
| logln("TestSuite StaticUnicodeSetsTest: "); |
| } |
| TESTCASE_AUTO_BEGIN; |
| if (!quick) { |
| // Slow test: run in exhaustive mode only |
| TESTCASE_AUTO(testSetCoverage); |
| } |
| TESTCASE_AUTO(testNonEmpty); |
| TESTCASE_AUTO_END; |
| } |
| |
| void StaticUnicodeSetsTest::testSetCoverage() { |
| UErrorCode status = U_ZERO_ERROR; |
| |
| // Lenient comma/period should be supersets of strict comma/period; |
| // it also makes the coverage logic cheaper. |
| assertTrue( |
| "COMMA should be superset of STRICT_COMMA", |
| get(unisets::COMMA)->containsAll(*get(unisets::STRICT_COMMA))); |
| assertTrue( |
| "PERIOD should be superset of STRICT_PERIOD", |
| get(unisets::PERIOD)->containsAll(*get(unisets::STRICT_PERIOD))); |
| |
| UnicodeSet decimals; |
| decimals.addAll(*get(unisets::STRICT_COMMA)); |
| decimals.addAll(*get(unisets::STRICT_PERIOD)); |
| decimals.freeze(); |
| UnicodeSet grouping; |
| grouping.addAll(decimals); |
| grouping.addAll(*get(unisets::OTHER_GROUPING_SEPARATORS)); |
| decimals.freeze(); |
| |
| const UnicodeSet &plusSign = *get(unisets::PLUS_SIGN); |
| const UnicodeSet &minusSign = *get(unisets::MINUS_SIGN); |
| const UnicodeSet &percent = *get(unisets::PERCENT_SIGN); |
| const UnicodeSet &permille = *get(unisets::PERMILLE_SIGN); |
| const UnicodeSet &infinity = *get(unisets::INFINITY_SIGN); |
| |
| int32_t localeCount; |
| const Locale* allAvailableLocales = Locale::getAvailableLocales(localeCount); |
| for (int32_t i = 0; i < localeCount; i++) { |
| Locale locale = allAvailableLocales[i]; |
| DecimalFormatSymbols dfs(locale, status); |
| UnicodeString localeName; |
| locale.getDisplayName(localeName); |
| assertSuccess(UnicodeString("Making DFS for ") + localeName, status); |
| |
| #define ASSERT_IN_SET(name, foo) assertInSet(localeName, UnicodeString("" #name ""), name, foo) |
| ASSERT_IN_SET(decimals, dfs.getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)); |
| ASSERT_IN_SET(grouping, dfs.getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); |
| ASSERT_IN_SET(plusSign, dfs.getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol)); |
| ASSERT_IN_SET(minusSign, dfs.getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)); |
| ASSERT_IN_SET(percent, dfs.getConstSymbol(DecimalFormatSymbols::kPercentSymbol)); |
| ASSERT_IN_SET(permille, dfs.getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)); |
| ASSERT_IN_SET(infinity, dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol)); |
| } |
| } |
| |
| void StaticUnicodeSetsTest::testNonEmpty() { |
| for (int32_t i=0; i<unisets::UNISETS_KEY_COUNT; i++) { |
| if (i == unisets::EMPTY) { |
| continue; |
| } |
| const UnicodeSet* uset = get(static_cast<unisets::Key>(i)); |
| // Can fail if no data: |
| assertFalse(UnicodeString("Set should not be empty: ") + i, uset->isEmpty(), FALSE, TRUE); |
| } |
| } |
| |
| void StaticUnicodeSetsTest::assertInSet(const UnicodeString &localeName, const UnicodeString &setName, |
| const UnicodeSet &set, const UnicodeString &str) { |
| if (str.countChar32(0, str.length()) != 1) { |
| // Ignore locale strings with more than one code point (usually a bidi mark) |
| return; |
| } |
| assertInSet(localeName, setName, set, str.char32At(0)); |
| } |
| |
| void StaticUnicodeSetsTest::assertInSet(const UnicodeString &localeName, const UnicodeString &setName, |
| const UnicodeSet &set, UChar32 cp) { |
| // If this test case fails, add the specified code point to the corresponding set in either: |
| // - parseLenients in CLDR root.xml |
| // - harded-coded sets in StaticUnicodeSets.java and static_unicode_sets.cpp |
| assertTrue( |
| localeName + UnicodeString(u" ") + UnicodeString(cp) + UnicodeString(u" is missing in ") + |
| setName, set.contains(cp)); |
| } |
| |
| |
| #endif |