// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/************************************************************************
* COPYRIGHT:
* Copyright (c) 2015, International Business Machines Corporation
* and others. All Rights Reserved.
************************************************************************/
#ifndef _DATADRIVENNUMBERFORMATTESTSUITE_H__
#define _DATADRIVENNUMBERFORMATTESTSUITE_H__
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/uobject.h"
#include "unicode/unistr.h"
#include "numberformattesttuple.h"
#include "intltest.h"
#include "cmemory.h"
struct UCHARBUF;
class IntlTest;
/**
* Performs various in-depth test on NumberFormat
**/
class DataDrivenNumberFormatTestSuite : public IntlTest {
public:
DataDrivenNumberFormatTestSuite() {
for (int32_t i = 0; i < UPRV_LENGTHOF(fPreviousFormatters); ++i) {
fPreviousFormatters[i] = NULL;
}
}
/**
* Runs the data driven test suite.
*
* @param fileName is the name of the file in the source/test/testdata.
* This should be just a filename such as "numberformattest.txt"
* @param runAllTests If TRUE, runs every test in fileName. if FALSE,
* skips the tests that are known to break for ICU4C.
*/
void run(const char *fileName, UBool runAllTests);
virtual ~DataDrivenNumberFormatTestSuite();
protected:
/**
* Subclasses override this method to test formatting numbers.
* Subclasses must not override both isFormatPass methods.
* @param tuple the test data for current test. The format method can
* assume that the format and output fields are populated.
* @param appendErrorMessage any message describing failures appended
* here.
* @param status any error returned here.
* @return TRUE if test passed or FALSE if test failed.
*/
virtual UBool isFormatPass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
/**
* Subclasses override this method to test formatting numbers.
* Along with copy and assignment operators.
* @param tuple the test data for current test. The format method can
* assume that the format and output fields are populated.
* @param somePreviousFormatter A pointer to a previous formatter
* that the test framework owns. This formatter changes as tests
* are run. Subclasses should initialize a formatter and assign
* the newly initialized formatter to this formatter. In this way,
* assignment gets tested with multiple previous states.
* @param appendErrorMessage any message describing failures appended
* here.
* @param status any error returned here.
* @return TRUE if test passed or FALSE if test failed.
*/
virtual UBool isFormatPass(
const NumberFormatTestTuple &tuple,
UObject *somePreviousFormatter,
UnicodeString &appendErrorMessage,
UErrorCode &status);
/**
* If subclass is testing formatting with copy and assignmet, it
* needs to override this method to return a newly allocated formatter.
*/
virtual UObject *newFormatter(UErrorCode &status);
/**
* Tests toPattern method.
*/
virtual UBool isToPatternPass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
/**
* Test parsing.
*/
virtual UBool isParsePass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
/**
* Test parsing with currency.
*/
virtual UBool isParseCurrencyPass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
/**
* Test plural selection.
*/
virtual UBool isSelectPass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
private:
UnicodeString fFileLine;
int32_t fFileLineNumber;
UnicodeString fFileTestName;
NumberFormatTestTuple fTuple;
int32_t fFormatTestNumber;
UObject *fPreviousFormatters[13];
void setTupleField(UErrorCode &);
int32_t splitBy(
UnicodeString *columnValues,
int32_t columnValueCount,
UChar delimiter);
void showError(const char *message);
void showFailure(const UnicodeString &message);
void showLineInfo();
UBool breaksC();
UBool readLine(UCHARBUF *f, UErrorCode &);
UBool isPass(
const NumberFormatTestTuple &tuple,
UnicodeString &appendErrorMessage,
UErrorCode &status);
};
#endif /* !UCONFIG_NO_FORMATTING */
#endif // _DATADRIVENNUMBERFORMATTESTSUITE_