• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /************************************************************************
4  * COPYRIGHT:
5  * Copyright (c) 1997-2016, International Business Machines Corporation
6  * and others. All Rights Reserved.
7  ************************************************************************/
8 
9 #ifndef _NUMBERFORMATTEST_
10 #define _NUMBERFORMATTEST_
11 
12 #include "unicode/utypes.h"
13 
14 #if !UCONFIG_NO_FORMATTING
15 
16 #include "unicode/numfmt.h"
17 #include "unicode/decimfmt.h"
18 #include "caltztst.h"
19 #include "datadrivennumberformattestsuite.h"
20 
21 /**
22  * Expected field positions from field position iterator. Tests should
23  * stack allocate an array of these making sure that the last element is
24  * {0, -1, 0} (The sentinel element indicating end of iterator). Then test
25  * should call verifyFieldPositionIterator() passing both this array of
26  * expected results and the field position iterator from the format method.
27  */
28 struct NumberFormatTest_Attributes {
29     int32_t id;
30     int32_t spos;
31     int32_t epos;
32 };
33 
34 
35 /**
36  * Header for the data-driven test, powered by numberformattestspecification.txt
37  */
38 class NumberFormatDataDrivenTest : public DataDrivenNumberFormatTestSuite {
39   public:
40     void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
41     void TestNumberFormatTestTuple();
42     void TestDataDrivenICU4C();
43 
44   protected:
45     UBool isFormatPass(
46             const NumberFormatTestTuple &tuple,
47             UnicodeString &appendErrorMessage,
48             UErrorCode &status);
49     UBool isToPatternPass(
50             const NumberFormatTestTuple &tuple,
51             UnicodeString &appendErrorMessage,
52             UErrorCode &status);
53     UBool isParsePass(
54             const NumberFormatTestTuple &tuple,
55             UnicodeString &appendErrorMessage,
56             UErrorCode &status);
57     UBool isParseCurrencyPass(
58             const NumberFormatTestTuple &tuple,
59             UnicodeString &appendErrorMessage,
60             UErrorCode &status);
61 };
62 
63 /**
64  * Performs various in-depth test on NumberFormat
65  **/
66 class NumberFormatTest: public CalendarTimeZoneTest {
67 
68     // IntlTest override
69     void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
70  public:
71 
72     /**
73      * Test APIs (to increase code coverage)
74      */
75     void TestAPI(void);
76 
77     void TestCoverage(void);
78     void TestLocalizedPatternSymbolCoverage();
79 
80     /**
81      * Test the handling of quotes
82      **/
83     void TestQuotes(void);
84     /**
85      * Test patterns with exponential representation
86      **/
87     void TestExponential(void);
88     /**
89      * Test handling of patterns with currency symbols
90      **/
91     void TestCurrencySign(void);
92     /**
93      * Test different format patterns
94      **/
95     void TestPatterns(void);
96     /**
97      * API coverage for DigitList
98      **/
99     //void TestDigitList(void);
100 
101     void Test20186_SpacesAroundSemicolon(void);
102 
103     /**
104      * Test localized currency patterns.
105      */
106     void TestCurrency(void);
107 
108     /**
109      * Test the Currency object handling, new as of ICU 2.2.
110      */
111     void TestCurrencyObject(void);
112 
113     void TestCurrencyPatterns(void);
114 
115     /**
116      * Do rudimentary testing of parsing.
117      */
118     void TestParse(void);
119     /**
120      * Test proper rounding by the format method.
121      */
122     void TestRounding487(void);
123 
124     // New tests for alphaWorks upgrade
125     void TestExponent(void);
126 
127     void TestScientific(void);
128 
129     void TestScientific2(void);
130 
131     void TestScientificGrouping(void);
132 
133     void TestInt64(void);
134 
135     void TestSurrogateSupport(void);
136 
137     /**
138      * Test the functioning of the secondary grouping value.
139      */
140     void TestSecondaryGrouping(void);
141 
142     void TestWhiteSpaceParsing(void);
143 
144     void TestComplexCurrency(void);
145 
146     void TestPad(void);
147     void TestPatterns2(void);
148 
149     /**
150      * Test currency registration.
151      */
152     void TestRegCurrency(void);
153 
154     void TestCurrencyNames(void);
155 
156     void TestCurrencyVariants(void);
157 
158     void TestCurrencyAmount(void);
159 
160     void TestCurrencyUnit(void);
161 
162     void TestSymbolsWithBadLocale(void);
163 
164     void TestAdoptDecimalFormatSymbols(void);
165 
166     void TestPerMill(void);
167 
168     void TestIllegalPatterns(void);
169 
170     void TestCases(void);
171 
172     void TestJB3832(void);
173 
174     void TestHost(void);
175 
176     void TestHostClone(void);
177 
178     void TestCurrencyFormat(void);
179 
180     /* Port of ICU4J rounding test. */
181     void TestRounding(void);
182 
183     void TestRoundingPattern(void);
184 
185     void TestNonpositiveMultiplier(void);
186 
187     void TestNumberingSystems();
188 
189 
190     void TestSpaceParsing();
191     void TestMultiCurrencySign();
192     void TestCurrencyFormatForMixParsing();
193     void TestMismatchedCurrencyFormatFail();
194     void TestDecimalFormatCurrencyParse();
195     void TestCurrencyIsoPluralFormat();
196     void TestCurrencyParsing();
197     void TestParseCurrencyInUCurr();
198     void TestFormatAttributes();
199     void TestFieldPositionIterator();
200 
201     void TestLenientParse();
202 
203     void TestDecimal();
204     void TestCurrencyFractionDigits();
205 
206     void TestExponentParse();
207     void TestExplicitParents();
208     void TestAvailableNumberingSystems();
209     void Test9087();
210     void TestFormatFastpaths();
211 
212     void TestFormattableSize();
213 
214     void TestUFormattable();
215 
216     void TestEnumSet();
217 
218     void TestSignificantDigits();
219     void TestShowZero();
220 
221     void TestCompatibleCurrencies();
222     void TestBug9936();
223     void TestParseNegativeWithFaLocale();
224     void TestParseNegativeWithAlternateMinusSign();
225 
226     void TestCustomCurrencySignAndSeparator();
227 
228     void TestParseSignsAndMarks();
229     void Test10419RoundingWith0FractionDigits();
230     void Test10468ApplyPattern();
231     void TestRoundingScientific10542();
232     void TestZeroScientific10547();
233     void TestAccountingCurrency();
234     void TestCurrencyFormatForMissingLocale();
235     void TestEquality();
236 
237     void TestCurrencyUsage();
238 
239     void TestDoubleLimit11439();
240     void TestFastPathConsistent11524();
241     void TestGetAffixes();
242     void TestToPatternScientific11648();
243     void TestBenchmark();
244     void TestCtorApplyPatternDifference();
245     void TestFractionalDigitsForCurrency();
246     void TestFormatCurrencyPlural();
247     void Test11868();
248     void Test11739_ParseLongCurrency();
249     void Test13035_MultiCodePointPaddingInPattern();
250     void Test13737_ParseScientificStrict();
251     void Test10727_RoundingZero();
252     void Test11376_getAndSetPositivePrefix();
253     void Test11475_signRecognition();
254     void Test11640_getAffixes();
255     void Test11649_toPatternWithMultiCurrency();
256     void Test13327_numberingSystemBufferOverflow();
257     void Test13391_chakmaParsing();
258 
259     void Test11735_ExceptionIssue();
260     void Test11035_FormatCurrencyAmount();
261     void Test11318_DoubleConversion();
262     void TestParsePercentRegression();
263     void TestMultiplierWithScale();
264     void TestFastFormatInt32();
265     void Test11646_Equality();
266     void TestParseNaN();
267     void TestFormatFailIfMoreThanMaxDigits();
268     void TestParseCaseSensitive();
269     void TestParseNoExponent();
270     void TestSignAlwaysShown();
271     void TestMinimumGroupingDigits();
272     void Test11897_LocalizedPatternSeparator();
273     void Test13055_PercentageRounding();
274     void Test11839();
275     void Test10354();
276     void Test11645_ApplyPatternEquality();
277     void Test12567();
278     void Test11626_CustomizeCurrencyPluralInfo();
279     void Test20073_StrictPercentParseErrorIndex();
280     void Test13056_GroupingSize();
281     void Test11025_CurrencyPadding();
282     void Test11648_ExpDecFormatMalPattern();
283     void Test11649_DecFmtCurrencies();
284     void Test13148_ParseGroupingSeparators();
285     void Test12753_PatternDecimalPoint();
286     void Test11647_PatternCurrencySymbols();
287     void Test11913_BigDecimal();
288     void Test11020_RoundingInScientificNotation();
289     void Test11640_TripleCurrencySymbol();
290     void Test13763_FieldPositionIteratorOffset();
291     void Test13777_ParseLongNameNonCurrencyMode();
292     void Test13804_EmptyStringsWhenParsing();
293     void Test20037_ScientificIntegerOverflow();
294     void Test13840_ParseLongStringCrash();
295     void Test13850_EmptyStringCurrency();
296     void Test20348_CurrencyPrefixOverride();
297     void Test20956_MonetarySymbolGetters();
298     void Test20358_GroupingInPattern();
299     void Test13731_DefaultCurrency();
300     void Test20499_CurrencyVisibleDigitsPlural();
301     void Test13735_GroupingSizeGetter();
302     void Test13734_StrictFlexibleWhitespace();
303     void Test20961_CurrencyPluralPattern();
304     void Test21134_ToNumberFormatter();
305     void Test13733_StrictAndLenient();
306     void Test21232_ParseTimeout();
307     void Test10997_FormatCurrency();
308 
309  private:
310     UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f);
311 
312     void expectParseCurrency(const NumberFormat &fmt, const UChar* currency, double amount, const char *text);
313 
314     static UBool equalValue(const Formattable& a, const Formattable& b);
315 
316     void expectPositions(FieldPositionIterator& iter, int32_t *values, int32_t tupleCount,
317                          const UnicodeString& str);
318 
319     void expectPosition(FieldPosition& pos, int32_t id, int32_t start, int32_t limit,
320                         const UnicodeString& str);
321 
322     void expect2(NumberFormat& fmt, const Formattable& n, const UnicodeString& str);
323 
324     void expect3(NumberFormat& fmt, const Formattable& n, const UnicodeString& str);
325 
expect2(NumberFormat & fmt,const Formattable & n,const char * str)326     void expect2(NumberFormat& fmt, const Formattable& n, const char* str) {
327         expect2(fmt, n, UnicodeString(str, ""));
328     }
329 
330     void expect2(NumberFormat* fmt, const Formattable& n, const UnicodeString& str, UErrorCode ec);
331 
expect2(NumberFormat * fmt,const Formattable & n,const char * str,UErrorCode ec)332     void expect2(NumberFormat* fmt, const Formattable& n, const char* str, UErrorCode ec) {
333         expect2(fmt, n, UnicodeString(str, ""), ec);
334     }
335 
336     void expect(NumberFormat& fmt, const UnicodeString& str, const Formattable& n);
337 
expect(NumberFormat & fmt,const char * str,const Formattable & n)338     void expect(NumberFormat& fmt, const char *str, const Formattable& n) {
339         expect(fmt, UnicodeString(str, ""), n);
340     }
341 
342     void expect(NumberFormat& fmt, const Formattable& n,
343                 const UnicodeString& exp, UBool rt=TRUE);
344 
345     void expect(NumberFormat& fmt, const Formattable& n,
346                 const char *exp, UBool rt=TRUE) {
347         expect(fmt, n, UnicodeString(exp, ""), rt);
348     }
349 
350     void expect(NumberFormat* fmt, const Formattable& n,
351                 const UnicodeString& exp, UBool rt, UErrorCode errorCode);
352 
expect(NumberFormat * fmt,const Formattable & n,const char * exp,UBool rt,UErrorCode errorCode)353     void expect(NumberFormat* fmt, const Formattable& n,
354                 const char *exp, UBool rt, UErrorCode errorCode) {
355         expect(fmt, n, UnicodeString(exp, ""), rt, errorCode);
356     }
357 
expect(NumberFormat * fmt,const Formattable & n,const UnicodeString & exp,UErrorCode errorCode)358     void expect(NumberFormat* fmt, const Formattable& n,
359                 const UnicodeString& exp, UErrorCode errorCode) {
360         expect(fmt, n, exp, TRUE, errorCode);
361     }
362 
expect(NumberFormat * fmt,const Formattable & n,const char * exp,UErrorCode errorCode)363     void expect(NumberFormat* fmt, const Formattable& n,
364                 const char *exp, UErrorCode errorCode) {
365         expect(fmt, n, UnicodeString(exp, ""), TRUE, errorCode);
366     }
367 
368     void expectCurrency(NumberFormat& nf, const Locale& locale,
369                         double value, const UnicodeString& string);
370 
371     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
372                    int32_t pos, int32_t width, UChar pad);
373 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos,int32_t width,UChar pad)374     void expectPad(DecimalFormat& fmt, const char *pat,
375                    int32_t pos, int32_t width, UChar pad) {
376         expectPad(fmt, UnicodeString(pat, ""), pos, width, pad);
377     }
378 
379     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
380                    int32_t pos, int32_t width, const UnicodeString& pad);
381 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos,int32_t width,const UnicodeString & pad)382     void expectPad(DecimalFormat& fmt, const char *pat,
383                    int32_t pos, int32_t width, const UnicodeString& pad) {
384         expectPad(fmt, UnicodeString(pat, ""), pos, width, pad);
385     }
386 
387     void expectPat(DecimalFormat& fmt, const UnicodeString& exp);
388 
expectPat(DecimalFormat & fmt,const char * exp)389     void expectPat(DecimalFormat& fmt, const char *exp) {
390         expectPat(fmt, UnicodeString(exp, ""));
391     }
392 
393     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
394                    int32_t pos);
395 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos)396     void expectPad(DecimalFormat& fmt, const char *pat,
397                    int32_t pos) {
398         expectPad(fmt, pat, pos, 0, (UChar)0);
399     }
400 
401     void expect_rbnf(NumberFormat& fmt, const UnicodeString& str, const Formattable& n);
402 
403     void expect_rbnf(NumberFormat& fmt, const Formattable& n,
404                 const UnicodeString& exp, UBool rt=TRUE);
405 
406     // internal utility routine
407     static UnicodeString& escape(UnicodeString& s);
408 
409     enum { ILLEGAL = -1 };
410 
411     // internal subtest used by TestRounding487
412     void roundingTest(NumberFormat& nf, double x, int32_t maxFractionDigits, const char* expected);
413 
414     // internal rounding checking for TestRounding
415     void checkRounding(DecimalFormat* df, double base, int iterations, double increment);
416 
417     double checkRound(DecimalFormat* df, double iValue, double lastParsed);
418 
419     void verifyRounding(
420         DecimalFormat& format,
421         const double *values,
422         const char * const *expected,
423         const DecimalFormat::ERoundingMode *roundingModes,
424         const char * const *descriptions,
425         int32_t valueSize,
426         int32_t roundingModeSize);
427 
428     void verifyFieldPositionIterator(
429             NumberFormatTest_Attributes *expected,
430             FieldPositionIterator &iter);
431 
432 };
433 
434 #endif /* #if !UCONFIG_NO_FORMATTING */
435 
436 #endif // _NUMBERFORMATTEST_
437