• 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 ) override;
41     void TestNumberFormatTestTuple();
42     void TestDataDrivenICU4C();
43 
44   protected:
45     UBool isFormatPass(
46             const NumberFormatTestTuple &tuple,
47             UnicodeString &appendErrorMessage,
48             UErrorCode &status) override;
49     UBool isToPatternPass(
50             const NumberFormatTestTuple &tuple,
51             UnicodeString &appendErrorMessage,
52             UErrorCode &status) override;
53     UBool isParsePass(
54             const NumberFormatTestTuple &tuple,
55             UnicodeString &appendErrorMessage,
56             UErrorCode &status) override;
57     UBool isParseCurrencyPass(
58             const NumberFormatTestTuple &tuple,
59             UnicodeString &appendErrorMessage,
60             UErrorCode &status) override;
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 ) override;
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 Test20425_IntegerIncrement();
307     void Test20425_FractionWithIntegerIncrement();
308     void Test21232_ParseTimeout();
309     void Test10997_FormatCurrency();
310     void Test21556_CurrencyAsDecimal();
311     void Test22088_Ethiopic();
312 
313  private:
314     UBool testFormattableAsUFormattable(const char *file, int line, Formattable &f);
315 
316     void expectParseCurrency(const NumberFormat &fmt, const UChar* currency, double amount, const char *text);
317 
318     static UBool equalValue(const Formattable& a, const Formattable& b);
319 
320     void expectPositions(FieldPositionIterator& iter, int32_t *values, int32_t tupleCount,
321                          const UnicodeString& str);
322 
323     void expectPosition(FieldPosition& pos, int32_t id, int32_t start, int32_t limit,
324                         const UnicodeString& str);
325 
326     void expect2(NumberFormat& fmt, const Formattable& n, const UnicodeString& str);
327 
328     void expect3(NumberFormat& fmt, const Formattable& n, const UnicodeString& str);
329 
expect2(NumberFormat & fmt,const Formattable & n,const char * str)330     void expect2(NumberFormat& fmt, const Formattable& n, const char* str) {
331         expect2(fmt, n, UnicodeString(str, ""));
332     }
333 
334     void expect2(NumberFormat* fmt, const Formattable& n, const UnicodeString& str, UErrorCode ec);
335 
expect2(NumberFormat * fmt,const Formattable & n,const char * str,UErrorCode ec)336     void expect2(NumberFormat* fmt, const Formattable& n, const char* str, UErrorCode ec) {
337         expect2(fmt, n, UnicodeString(str, ""), ec);
338     }
339 
340     void expect(NumberFormat& fmt, const UnicodeString& str, const Formattable& n);
341 
expect(NumberFormat & fmt,const char * str,const Formattable & n)342     void expect(NumberFormat& fmt, const char *str, const Formattable& n) {
343         expect(fmt, UnicodeString(str, ""), n);
344     }
345 
346     void expect(NumberFormat& fmt, const Formattable& n,
347                 const UnicodeString& exp, UBool rt=true);
348 
349     void expect(NumberFormat& fmt, const Formattable& n,
350                 const char *exp, UBool rt=true) {
351         expect(fmt, n, UnicodeString(exp, ""), rt);
352     }
353 
354     void expect(NumberFormat* fmt, const Formattable& n,
355                 const UnicodeString& exp, UBool rt, UErrorCode errorCode);
356 
expect(NumberFormat * fmt,const Formattable & n,const char * exp,UBool rt,UErrorCode errorCode)357     void expect(NumberFormat* fmt, const Formattable& n,
358                 const char *exp, UBool rt, UErrorCode errorCode) {
359         expect(fmt, n, UnicodeString(exp, ""), rt, errorCode);
360     }
361 
expect(NumberFormat * fmt,const Formattable & n,const UnicodeString & exp,UErrorCode errorCode)362     void expect(NumberFormat* fmt, const Formattable& n,
363                 const UnicodeString& exp, UErrorCode errorCode) {
364         expect(fmt, n, exp, true, errorCode);
365     }
366 
expect(NumberFormat * fmt,const Formattable & n,const char * exp,UErrorCode errorCode)367     void expect(NumberFormat* fmt, const Formattable& n,
368                 const char *exp, UErrorCode errorCode) {
369         expect(fmt, n, UnicodeString(exp, ""), true, errorCode);
370     }
371 
372     void expectCurrency(NumberFormat& nf, const Locale& locale,
373                         double value, const UnicodeString& string);
374 
375     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
376                    int32_t pos, int32_t width, UChar pad);
377 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos,int32_t width,UChar pad)378     void expectPad(DecimalFormat& fmt, const char *pat,
379                    int32_t pos, int32_t width, UChar pad) {
380         expectPad(fmt, UnicodeString(pat, ""), pos, width, pad);
381     }
382 
383     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
384                    int32_t pos, int32_t width, const UnicodeString& pad);
385 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos,int32_t width,const UnicodeString & pad)386     void expectPad(DecimalFormat& fmt, const char *pat,
387                    int32_t pos, int32_t width, const UnicodeString& pad) {
388         expectPad(fmt, UnicodeString(pat, ""), pos, width, pad);
389     }
390 
391     void expectPat(DecimalFormat& fmt, const UnicodeString& exp);
392 
expectPat(DecimalFormat & fmt,const char * exp)393     void expectPat(DecimalFormat& fmt, const char *exp) {
394         expectPat(fmt, UnicodeString(exp, ""));
395     }
396 
397     void expectPad(DecimalFormat& fmt, const UnicodeString& pat,
398                    int32_t pos);
399 
expectPad(DecimalFormat & fmt,const char * pat,int32_t pos)400     void expectPad(DecimalFormat& fmt, const char *pat,
401                    int32_t pos) {
402         expectPad(fmt, pat, pos, 0, (UChar)0);
403     }
404 
405     void expect_rbnf(NumberFormat& fmt, const UnicodeString& str, const Formattable& n);
406 
407     void expect_rbnf(NumberFormat& fmt, const Formattable& n,
408                 const UnicodeString& exp, UBool rt=true);
409 
410     // internal utility routine
411     static UnicodeString& escape(UnicodeString& s);
412 
413     enum { ILLEGAL = -1 };
414 
415     // internal subtest used by TestRounding487
416     void roundingTest(NumberFormat& nf, double x, int32_t maxFractionDigits, const char* expected);
417 
418     // internal rounding checking for TestRounding
419     void checkRounding(DecimalFormat* df, double base, int iterations, double increment);
420 
421     double checkRound(DecimalFormat* df, double iValue, double lastParsed);
422 
423     void verifyRounding(
424         DecimalFormat& format,
425         const double *values,
426         const char * const *expected,
427         const DecimalFormat::ERoundingMode *roundingModes,
428         const char * const *descriptions,
429         int32_t valueSize,
430         int32_t roundingModeSize);
431 
432     void verifyFieldPositionIterator(
433             NumberFormatTest_Attributes *expected,
434             FieldPositionIterator &iter);
435 
436 };
437 
438 #endif /* #if !UCONFIG_NO_FORMATTING */
439 
440 #endif // _NUMBERFORMATTEST_
441