]>
Commit | Line | Data |
---|---|---|
0f5d89e8 A |
1 | // © 2018 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 "static_unicode_sets.h" | |
10 | #include "unicode/dcfmtsym.h" | |
11 | ||
12 | using icu::unisets::get; | |
13 | ||
14 | class StaticUnicodeSetsTest : public IntlTest { | |
15 | public: | |
16 | void testSetCoverage(); | |
17 | void testNonEmpty(); | |
18 | ||
19 | void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); | |
20 | ||
21 | private: | |
22 | void assertInSet(const UnicodeString& localeName, const UnicodeString &setName, | |
23 | const UnicodeSet& set, const UnicodeString& str); | |
24 | void assertInSet(const UnicodeString& localeName, const UnicodeString &setName, | |
25 | const UnicodeSet& set, UChar32 cp); | |
26 | }; | |
27 | ||
28 | extern IntlTest *createStaticUnicodeSetsTest() { | |
29 | return new StaticUnicodeSetsTest(); | |
30 | } | |
31 | ||
32 | void StaticUnicodeSetsTest::runIndexedTest(int32_t index, UBool exec, const char*&name, char*) { | |
33 | if (exec) { | |
34 | logln("TestSuite StaticUnicodeSetsTest: "); | |
35 | } | |
36 | TESTCASE_AUTO_BEGIN; | |
3d1f044b A |
37 | if (!quick) { |
38 | // Slow test: run in exhaustive mode only | |
39 | TESTCASE_AUTO(testSetCoverage); | |
40 | } | |
0f5d89e8 A |
41 | TESTCASE_AUTO(testNonEmpty); |
42 | TESTCASE_AUTO_END; | |
43 | } | |
44 | ||
45 | void StaticUnicodeSetsTest::testSetCoverage() { | |
46 | UErrorCode status = U_ZERO_ERROR; | |
47 | ||
48 | // Lenient comma/period should be supersets of strict comma/period; | |
49 | // it also makes the coverage logic cheaper. | |
50 | assertTrue( | |
51 | "COMMA should be superset of STRICT_COMMA", | |
52 | get(unisets::COMMA)->containsAll(*get(unisets::STRICT_COMMA))); | |
53 | assertTrue( | |
54 | "PERIOD should be superset of STRICT_PERIOD", | |
55 | get(unisets::PERIOD)->containsAll(*get(unisets::STRICT_PERIOD))); | |
56 | ||
57 | UnicodeSet decimals; | |
58 | decimals.addAll(*get(unisets::STRICT_COMMA)); | |
59 | decimals.addAll(*get(unisets::STRICT_PERIOD)); | |
60 | decimals.freeze(); | |
61 | UnicodeSet grouping; | |
62 | grouping.addAll(decimals); | |
63 | grouping.addAll(*get(unisets::OTHER_GROUPING_SEPARATORS)); | |
64 | decimals.freeze(); | |
65 | ||
66 | const UnicodeSet &plusSign = *get(unisets::PLUS_SIGN); | |
67 | const UnicodeSet &minusSign = *get(unisets::MINUS_SIGN); | |
68 | const UnicodeSet &percent = *get(unisets::PERCENT_SIGN); | |
69 | const UnicodeSet &permille = *get(unisets::PERMILLE_SIGN); | |
3d1f044b | 70 | const UnicodeSet &infinity = *get(unisets::INFINITY_SIGN); |
0f5d89e8 A |
71 | |
72 | int32_t localeCount; | |
73 | const Locale* allAvailableLocales = Locale::getAvailableLocales(localeCount); | |
74 | for (int32_t i = 0; i < localeCount; i++) { | |
75 | Locale locale = allAvailableLocales[i]; | |
76 | DecimalFormatSymbols dfs(locale, status); | |
77 | UnicodeString localeName; | |
78 | locale.getDisplayName(localeName); | |
79 | assertSuccess(UnicodeString("Making DFS for ") + localeName, status); | |
80 | ||
81 | #define ASSERT_IN_SET(name, foo) assertInSet(localeName, UnicodeString("" #name ""), name, foo) | |
82 | ASSERT_IN_SET(decimals, dfs.getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)); | |
83 | ASSERT_IN_SET(grouping, dfs.getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); | |
84 | ASSERT_IN_SET(plusSign, dfs.getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol)); | |
85 | ASSERT_IN_SET(minusSign, dfs.getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)); | |
86 | ASSERT_IN_SET(percent, dfs.getConstSymbol(DecimalFormatSymbols::kPercentSymbol)); | |
87 | ASSERT_IN_SET(permille, dfs.getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)); | |
88 | ASSERT_IN_SET(infinity, dfs.getConstSymbol(DecimalFormatSymbols::kInfinitySymbol)); | |
89 | } | |
90 | } | |
91 | ||
92 | void StaticUnicodeSetsTest::testNonEmpty() { | |
3d1f044b | 93 | for (int32_t i=0; i<unisets::UNISETS_KEY_COUNT; i++) { |
0f5d89e8 A |
94 | if (i == unisets::EMPTY) { |
95 | continue; | |
96 | } | |
97 | const UnicodeSet* uset = get(static_cast<unisets::Key>(i)); | |
98 | // Can fail if no data: | |
99 | assertFalse(UnicodeString("Set should not be empty: ") + i, uset->isEmpty(), FALSE, TRUE); | |
100 | } | |
101 | } | |
102 | ||
103 | void StaticUnicodeSetsTest::assertInSet(const UnicodeString &localeName, const UnicodeString &setName, | |
104 | const UnicodeSet &set, const UnicodeString &str) { | |
105 | if (str.countChar32(0, str.length()) != 1) { | |
106 | // Ignore locale strings with more than one code point (usually a bidi mark) | |
107 | return; | |
108 | } | |
109 | assertInSet(localeName, setName, set, str.char32At(0)); | |
110 | } | |
111 | ||
112 | void StaticUnicodeSetsTest::assertInSet(const UnicodeString &localeName, const UnicodeString &setName, | |
113 | const UnicodeSet &set, UChar32 cp) { | |
114 | // If this test case fails, add the specified code point to the corresponding set in | |
115 | // UnicodeSetStaticCache.java and numparse_unisets.cpp | |
116 | assertTrue( | |
117 | localeName + UnicodeString(u" ") + UnicodeString(cp) + UnicodeString(u" is missing in ") + | |
118 | setName, set.contains(cp)); | |
119 | } | |
120 | ||
121 | ||
122 | #endif |