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 #pragma once 8 9 #include "number_stringbuilder.h" 10 #include "intltest.h" 11 #include "number_affixutils.h" 12 13 using namespace icu::number; 14 using namespace icu::number::impl; 15 16 //////////////////////////////////////////////////////////////////////////////////////// 17 // INSTRUCTIONS: // 18 // To add new NumberFormat unit test classes, create a new class like the ones below, // 19 // and then add it as a switch statement in NumberTest at the bottom of this file. ///////// 20 // To add new methods to existing unit test classes, add the method to the class declaration // 21 // below, and also add it to the class's implementation of runIndexedTest(). // 22 /////////////////////////////////////////////////////////////////////////////////////////////// 23 24 class AffixUtilsTest : public IntlTest { 25 public: 26 void testEscape(); 27 void testUnescape(); 28 void testContainsReplaceType(); 29 void testInvalid(); 30 void testUnescapeWithSymbolProvider(); 31 32 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 33 34 private: 35 UnicodeString unescapeWithDefaults(const SymbolProvider &defaultProvider, UnicodeString input, 36 UErrorCode &status); 37 }; 38 39 class NumberFormatterApiTest : public IntlTest { 40 public: 41 NumberFormatterApiTest(); 42 NumberFormatterApiTest(UErrorCode &status); 43 44 void notationSimple(); 45 void notationScientific(); 46 void notationCompact(); 47 void unitMeasure(); 48 void unitCurrency(); 49 void unitPercent(); 50 void roundingFraction(); 51 void roundingFigures(); 52 void roundingFractionFigures(); 53 void roundingOther(); 54 void grouping(); 55 void padding(); 56 void integerWidth(); 57 void symbols(); 58 // TODO: Add this method if currency symbols override support is added. 59 //void symbolsOverride(); 60 void sign(); 61 void decimal(); 62 void locale(); 63 void formatTypes(); 64 void errors(); 65 66 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 67 68 private: 69 CurrencyUnit USD; 70 CurrencyUnit GBP; 71 CurrencyUnit CZK; 72 CurrencyUnit CAD; 73 74 MeasureUnit METER; 75 MeasureUnit DAY; 76 MeasureUnit SQUARE_METER; 77 MeasureUnit FAHRENHEIT; 78 79 NumberingSystem MATHSANB; 80 NumberingSystem LATN; 81 82 DecimalFormatSymbols FRENCH_SYMBOLS; 83 DecimalFormatSymbols SWISS_SYMBOLS; 84 DecimalFormatSymbols MYANMAR_SYMBOLS; 85 86 void assertFormatDescending(const UnicodeString &message, const UnlocalizedNumberFormatter &f, 87 Locale locale, ...); 88 89 void assertFormatDescendingBig(const UnicodeString &message, const UnlocalizedNumberFormatter &f, 90 Locale locale, ...); 91 92 void assertFormatSingle(const UnicodeString &message, const UnlocalizedNumberFormatter &f, 93 Locale locale, double input, const UnicodeString &expected); 94 }; 95 96 class DecimalQuantityTest : public IntlTest { 97 public: 98 void testDecimalQuantityBehaviorStandalone(); 99 void testSwitchStorage(); 100 void testAppend(); 101 void testConvertToAccurateDouble(); 102 void testUseApproximateDoubleWhenAble(); 103 104 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 105 106 private: 107 void assertDoubleEquals(UnicodeString message, double a, double b); 108 void assertHealth(const DecimalQuantity &fq); 109 void assertToStringAndHealth(const DecimalQuantity &fq, const UnicodeString &expected); 110 void checkDoubleBehavior(double d, bool explicitRequired); 111 }; 112 113 class ModifiersTest : public IntlTest { 114 public: 115 void testConstantAffixModifier(); 116 void testConstantMultiFieldModifier(); 117 void testSimpleModifier(); 118 void testCurrencySpacingEnabledModifier(); 119 120 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 121 122 private: 123 void assertModifierEquals(const Modifier &mod, int32_t expectedPrefixLength, bool expectedStrong, 124 UnicodeString expectedChars, UnicodeString expectedFields, 125 UErrorCode &status); 126 127 void assertModifierEquals(const Modifier &mod, NumberStringBuilder &sb, int32_t expectedPrefixLength, 128 bool expectedStrong, UnicodeString expectedChars, 129 UnicodeString expectedFields, UErrorCode &status); 130 }; 131 132 class PatternModifierTest : public IntlTest { 133 public: 134 void testBasic(); 135 void testMutableEqualsImmutable(); 136 137 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 138 139 private: 140 UnicodeString getPrefix(const MutablePatternModifier &mod, UErrorCode &status); 141 UnicodeString getSuffix(const MutablePatternModifier &mod, UErrorCode &status); 142 }; 143 144 class PatternStringTest : public IntlTest { 145 public: 146 void testToPatternSimple(); 147 void testExceptionOnInvalid(); 148 void testBug13117(); 149 150 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 151 152 private: 153 }; 154 155 class NumberStringBuilderTest : public IntlTest { 156 public: 157 void testInsertAppendUnicodeString(); 158 void testInsertAppendCodePoint(); 159 void testCopy(); 160 void testFields(); 161 void testUnlimitedCapacity(); 162 void testCodePoints(); 163 164 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0); 165 166 private: 167 void assertEqualsImpl(const UnicodeString &a, const NumberStringBuilder &b); 168 }; 169 170 171 // NOTE: This macro is identical to the one in itformat.cpp 172 #define TESTCLASS(id, TestClass) \ 173 case id: \ 174 name = #TestClass; \ 175 if (exec) { \ 176 logln(#TestClass " test---"); \ 177 logln((UnicodeString)""); \ 178 TestClass test; \ 179 callTest(test, par); \ 180 } \ 181 break 182 183 class NumberTest : public IntlTest { 184 public: 185 void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) { 186 if (exec) { 187 logln("TestSuite NumberTest: "); 188 } 189 190 switch (index) { 191 TESTCLASS(0, AffixUtilsTest); 192 TESTCLASS(1, NumberFormatterApiTest); 193 TESTCLASS(2, DecimalQuantityTest); 194 TESTCLASS(3, ModifiersTest); 195 TESTCLASS(4, PatternModifierTest); 196 TESTCLASS(5, PatternStringTest); 197 TESTCLASS(6, NumberStringBuilderTest); 198 default: name = ""; break; // needed to end loop 199 } 200 } 201 }; 202 203 #endif /* #if !UCONFIG_NO_FORMATTING */ 204