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: 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