1 /************************************************************************
2  * COPYRIGHT:
3  * Copyright (c) 2015, International Business Machines Corporation
4  * and others. All Rights Reserved.
5  ************************************************************************/
6 
7 #ifndef _DATADRIVENNUMBERFORMATTESTSUITE_H__
8 #define _DATADRIVENNUMBERFORMATTESTSUITE_H__
9 
10 #include "unicode/utypes.h"
11 
12 #if !UCONFIG_NO_FORMATTING
13 
14 #include "unicode/uobject.h"
15 #include "unicode/unistr.h"
16 #include "numberformattesttuple.h"
17 #include "intltest.h"
18 
19 struct UCHARBUF;
20 class IntlTest;
21 
22 /**
23  * Performs various in-depth test on NumberFormat
24  **/
25 class DataDrivenNumberFormatTestSuite : public IntlTest {
26 
27  public:
DataDrivenNumberFormatTestSuite()28      DataDrivenNumberFormatTestSuite() {
29          for (int32_t i = 0; i < UPRV_LENGTHOF(fPreviousFormatters); ++i) {
30              fPreviousFormatters[i] = NULL;
31          }
32      }
33 
34      /**
35       * Runs the data driven test suite.
36       *
37       * @param fileName is the name of the file in the source/test/testdata.
38       *  This should be just a filename such as "numberformattest.txt"
39       * @param runAllTests If TRUE, runs every test in fileName. if FALSE,
40       *  skips the tests that are known to break for ICU4C.
41       */
42      void run(const char *fileName, UBool runAllTests);
43      virtual ~DataDrivenNumberFormatTestSuite();
44  protected:
45     /**
46      * Subclasses override this method to test formatting numbers.
47      * Subclasses must not override both isFormatPass methods.
48      * @param tuple the test data for current test. The format method can
49      *   assume that the format and output fields are populated.
50      * @param appendErrorMessage any message describing failures appended
51      *   here.
52      * @param status any error returned here.
53      * @return TRUE if test passed or FALSE if test failed.
54      */
55     virtual UBool isFormatPass(
56             const NumberFormatTestTuple &tuple,
57             UnicodeString &appendErrorMessage,
58             UErrorCode &status);
59 
60 
61     /**
62      * Subclasses override this method to test formatting numbers.
63      * Along with copy and assignment operators.
64      * @param tuple the test data for current test. The format method can
65      *   assume that the format and output fields are populated.
66      * @param somePreviousFormatter A pointer to a previous formatter
67      *  that the test framework owns. This formatter changes as tests
68      *  are run. Subclasses should initialize a formatter and assign
69      *  the newly initialized formatter to this formatter. In this way,
70      *  assignment gets tested with multiple previous states.
71      * @param appendErrorMessage any message describing failures appended
72      *   here.
73      * @param status any error returned here.
74      * @return TRUE if test passed or FALSE if test failed.
75      */
76     virtual UBool isFormatPass(
77             const NumberFormatTestTuple &tuple,
78             UObject *somePreviousFormatter,
79             UnicodeString &appendErrorMessage,
80             UErrorCode &status);
81     /**
82      * If subclass is testing formatting with copy and assignmet, it
83      * needs to override this method to return a newly allocated formatter.
84      */
85     virtual UObject *newFormatter(UErrorCode &status);
86 
87     /**
88      * Tests toPattern method.
89      */
90     virtual UBool isToPatternPass(
91             const NumberFormatTestTuple &tuple,
92             UnicodeString &appendErrorMessage,
93             UErrorCode &status);
94     /**
95      * Test parsing.
96      */
97     virtual UBool isParsePass(
98             const NumberFormatTestTuple &tuple,
99             UnicodeString &appendErrorMessage,
100             UErrorCode &status);
101 
102     /**
103      * Test parsing with currency.
104      */
105     virtual UBool isParseCurrencyPass(
106             const NumberFormatTestTuple &tuple,
107             UnicodeString &appendErrorMessage,
108             UErrorCode &status);
109 
110     /**
111      * Test plural selection.
112      */
113     virtual UBool isSelectPass(
114             const NumberFormatTestTuple &tuple,
115             UnicodeString &appendErrorMessage,
116             UErrorCode &status);
117  private:
118     UnicodeString fFileLine;
119     int32_t fFileLineNumber;
120     UnicodeString fFileTestName;
121     NumberFormatTestTuple fTuple;
122     int32_t fFormatTestNumber;
123     UObject *fPreviousFormatters[13];
124 
125     void setTupleField(UErrorCode &);
126     int32_t splitBy(
127             UnicodeString *columnValues,
128             int32_t columnValueCount,
129             UChar delimiter);
130     void showError(const char *message);
131     void showFailure(const UnicodeString &message);
132     void showLineInfo();
133     UBool breaksC();
134     UBool readLine(UCHARBUF *f, UErrorCode &);
135     UBool isPass(
136             const NumberFormatTestTuple &tuple,
137             UnicodeString &appendErrorMessage,
138             UErrorCode &status);
139 };
140 #endif /* !UCONFIG_NO_FORMATTING */
141 #endif // _DATADRIVENNUMBERFORMATTESTSUITE_
142