• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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