// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
* Copyright (C) 2015, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
#ifndef _NUMBER_FORMAT_TEST_TUPLE
#define _NUMBER_FORMAT_TEST_TUPLE
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/decimfmt.h"
#include "unicode/ucurr.h"
#define NFTT_GET_FIELD(tuple, fieldName, defaultValue) ((tuple).fieldName##Flag ? (tuple).fieldName : (defaultValue))
U_NAMESPACE_USE
enum ENumberFormatTestTupleField {
kLocale,
kCurrency,
kPattern,
kFormat,
kOutput,
kComment,
kMinIntegerDigits,
kMaxIntegerDigits,
kMinFractionDigits,
kMaxFractionDigits,
kMinGroupingDigits,
kBreaks,
kUseSigDigits,
kMinSigDigits,
kMaxSigDigits,
kUseGrouping,
kMultiplier,
kRoundingIncrement,
kFormatWidth,
kPadCharacter,
kUseScientific,
kGrouping,
kGrouping2,
kRoundingMode,
kCurrencyUsage,
kMinimumExponentDigits,
kExponentSignAlwaysShown,
kDecimalSeparatorAlwaysShown,
kPadPosition,
kPositivePrefix,
kPositiveSuffix,
kNegativePrefix,
kNegativeSuffix,
kSignAlwaysShown,
kLocalizedPattern,
kToPattern,
kToLocalizedPattern,
kStyle,
kParse,
kLenient,
kPlural,
kParseIntegerOnly,
kDecimalPatternMatchRequired,
kParseCaseSensitive,
kParseNoExponent,
kOutputCurrency,
kNumberFormatTestTupleFieldCount
};
/**
* NumberFormatTestTuple represents the data for a single data driven test.
* It consist of named fields each of which may or may not be set. Each field
* has a particular meaning in the test. For more information on what each
* field means and how the data drive tests work, please see
* https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
* Each field is optional. That is, a certain field may be unset for a given
* test. The UBool fields ending in "Flag" indicate whether the corrresponding
* field is set or not. TRUE means set; FALSE means unset. An unset field
* generally means that the corresponding setter method is not called on
* the NumberFormat object.
*/
class NumberFormatTestTuple {
public:
Locale locale;
UnicodeString currency;
UnicodeString pattern;
UnicodeString format;
UnicodeString output;
UnicodeString comment;
int32_t minIntegerDigits;
int32_t maxIntegerDigits;
int32_t minFractionDigits;
int32_t maxFractionDigits;
int32_t minGroupingDigits;
UnicodeString breaks;
int32_t useSigDigits;
int32_t minSigDigits;
int32_t maxSigDigits;
int32_t useGrouping;
int32_t multiplier;
double roundingIncrement;
int32_t formatWidth;
UnicodeString padCharacter;
int32_t useScientific;
int32_t grouping;
int32_t grouping2;
DecimalFormat::ERoundingMode roundingMode;
UCurrencyUsage currencyUsage;
int32_t minimumExponentDigits;
int32_t exponentSignAlwaysShown;
int32_t decimalSeparatorAlwaysShown;
DecimalFormat::EPadPosition padPosition;
UnicodeString positivePrefix;
UnicodeString positiveSuffix;
UnicodeString negativePrefix;
UnicodeString negativeSuffix;
int32_t signAlwaysShown;
UnicodeString localizedPattern;
UnicodeString toPattern;
UnicodeString toLocalizedPattern;
UNumberFormatStyle style;
UnicodeString parse;
int32_t lenient;
UnicodeString plural;
int32_t parseIntegerOnly;
int32_t decimalPatternMatchRequired;
int32_t parseNoExponent;
int32_t parseCaseSensitive;
UnicodeString outputCurrency;
UBool localeFlag;
UBool currencyFlag;
UBool patternFlag;
UBool formatFlag;
UBool outputFlag;
UBool commentFlag;
UBool minIntegerDigitsFlag;
UBool maxIntegerDigitsFlag;
UBool minFractionDigitsFlag;
UBool maxFractionDigitsFlag;
UBool minGroupingDigitsFlag;
UBool breaksFlag;
UBool useSigDigitsFlag;
UBool minSigDigitsFlag;
UBool maxSigDigitsFlag;
UBool useGroupingFlag;
UBool multiplierFlag;
UBool roundingIncrementFlag;
UBool formatWidthFlag;
UBool padCharacterFlag;
UBool useScientificFlag;
UBool groupingFlag;
UBool grouping2Flag;
UBool roundingModeFlag;
UBool currencyUsageFlag;
UBool minimumExponentDigitsFlag;
UBool exponentSignAlwaysShownFlag;
UBool decimalSeparatorAlwaysShownFlag;
UBool padPositionFlag;
UBool positivePrefixFlag;
UBool positiveSuffixFlag;
UBool negativePrefixFlag;
UBool negativeSuffixFlag;
UBool signAlwaysShownFlag;
UBool localizedPatternFlag;
UBool toPatternFlag;
UBool toLocalizedPatternFlag;
UBool styleFlag;
UBool parseFlag;
UBool lenientFlag;
UBool pluralFlag;
UBool parseIntegerOnlyFlag;
UBool decimalPatternMatchRequiredFlag;
UBool parseNoExponentFlag;
UBool parseCaseSensitiveFlag;
UBool outputCurrencyFlag;
NumberFormatTestTuple() {
clear();
}
/**
* Sets a particular field using the string representation of that field.
* @param field the field to set.
* @param fieldValue the string representation of the field value.
* @param status error returned here such as when the string representation
* of the field value cannot be parsed.
* @return TRUE on success or FALSE if an error was set in status.
*/
UBool setField(
ENumberFormatTestTupleField field,
const UnicodeString &fieldValue,
UErrorCode &status);
/**
* Clears a particular field.
* @param field the field to clear.
* @param status error set here.
* @return TRUE on success or FALSE if error was set.
*/
UBool clearField(
ENumberFormatTestTupleField field,
UErrorCode &status);
/**
* Clears every field.
*/
void clear();
/**
* Returns the string representation of the test case this object
* currently represents.
* @param appendTo the result appended here.
* @return appendTo
*/
UnicodeString &toString(UnicodeString &appendTo) const;
/**
* Converts the name of a field to the corresponding enum value.
* @param name the name of the field as a string.
* @return the corresponding enum value or kNumberFormatTestFieldCount
* if name does not map to any recognized field name.
*/
static ENumberFormatTestTupleField getFieldByName(const UnicodeString &name);
private:
const void *getFieldAddress(int32_t fieldId) const;
void *getMutableFieldAddress(int32_t fieldId);
void setFlag(int32_t fieldId, UBool value);
UBool isFlag(int32_t fieldId) const;
};
#endif /* !UCONFIG_NO_FORMATTING */
#endif