1/*
2*******************************************************************************
3* Copyright (C) 2015, International Business Machines Corporation and         *
4* others. All Rights Reserved.                                                *
5*******************************************************************************
6*/
7#ifndef _NUMBER_FORMAT_TEST_TUPLE
8#define _NUMBER_FORMAT_TEST_TUPLE
9
10#include "unicode/utypes.h"
11
12#if !UCONFIG_NO_FORMATTING
13
14#include "decimalformatpattern.h"
15#include "unicode/decimfmt.h"
16#include "unicode/ucurr.h"
17
18#define NFTT_GET_FIELD(tuple, fieldName, defaultValue) ((tuple).fieldName##Flag ? (tuple).fieldName : (defaultValue))
19
20U_NAMESPACE_USE
21
22enum ENumberFormatTestTupleField {
23    kLocale,
24    kCurrency,
25    kPattern,
26    kFormat,
27    kOutput,
28    kComment,
29    kMinIntegerDigits,
30    kMaxIntegerDigits,
31    kMinFractionDigits,
32    kMaxFractionDigits,
33    kMinGroupingDigits,
34    kBreaks,
35    kUseSigDigits,
36    kMinSigDigits,
37    kMaxSigDigits,
38    kUseGrouping,
39    kMultiplier,
40    kRoundingIncrement,
41    kFormatWidth,
42    kPadCharacter,
43    kUseScientific,
44    kGrouping,
45    kGrouping2,
46    kRoundingMode,
47    kCurrencyUsage,
48    kMinimumExponentDigits,
49    kExponentSignAlwaysShown,
50    kDecimalSeparatorAlwaysShown,
51    kPadPosition,
52    kPositivePrefix,
53    kPositiveSuffix,
54    kNegativePrefix,
55    kNegativeSuffix,
56    kLocalizedPattern,
57    kToPattern,
58    kToLocalizedPattern,
59    kStyle,
60    kParse,
61    kLenient,
62    kPlural,
63    kParseIntegerOnly,
64    kDecimalPatternMatchRequired,
65    kParseNoExponent,
66    kOutputCurrency,
67    kNumberFormatTestTupleFieldCount
68};
69
70/**
71 * NumberFormatTestTuple represents the data for a single data driven test.
72 * It consist of named fields each of which may or may not be set. Each field
73 * has a particular meaning in the test. For more information on what each
74 * field means and how the data drive tests work, please see
75 * https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
76 * Each field is optional. That is, a certain field may be unset for a given
77 * test. The UBool fields ending in "Flag" indicate whether the corrresponding
78 * field is set or not. TRUE means set; FALSE means unset. An unset field
79 * generally means that the corresponding setter method is not called on
80 * the NumberFormat object.
81 */
82
83class NumberFormatTestTuple {
84public:
85    Locale locale;
86    UnicodeString currency;
87    UnicodeString pattern;
88    UnicodeString format;
89    UnicodeString output;
90    UnicodeString comment;
91    int32_t minIntegerDigits;
92    int32_t maxIntegerDigits;
93    int32_t minFractionDigits;
94    int32_t maxFractionDigits;
95    int32_t minGroupingDigits;
96    UnicodeString breaks;
97    int32_t useSigDigits;
98    int32_t minSigDigits;
99    int32_t maxSigDigits;
100    int32_t useGrouping;
101    int32_t multiplier;
102    double roundingIncrement;
103    int32_t formatWidth;
104    UnicodeString padCharacter;
105    int32_t useScientific;
106    int32_t grouping;
107    int32_t grouping2;
108    DecimalFormat::ERoundingMode roundingMode;
109    UCurrencyUsage currencyUsage;
110    int32_t minimumExponentDigits;
111    int32_t exponentSignAlwaysShown;
112    int32_t decimalSeparatorAlwaysShown;
113    DecimalFormat::EPadPosition padPosition;
114    UnicodeString positivePrefix;
115    UnicodeString positiveSuffix;
116    UnicodeString negativePrefix;
117    UnicodeString negativeSuffix;
118    UnicodeString localizedPattern;
119    UnicodeString toPattern;
120    UnicodeString toLocalizedPattern;
121    UNumberFormatStyle style;
122    UnicodeString parse;
123    int32_t lenient;
124    UnicodeString plural;
125    int32_t parseIntegerOnly;
126    int32_t decimalPatternMatchRequired;
127    int32_t parseNoExponent;
128    UnicodeString outputCurrency;
129
130    UBool localeFlag;
131    UBool currencyFlag;
132    UBool patternFlag;
133    UBool formatFlag;
134    UBool outputFlag;
135    UBool commentFlag;
136    UBool minIntegerDigitsFlag;
137    UBool maxIntegerDigitsFlag;
138    UBool minFractionDigitsFlag;
139    UBool maxFractionDigitsFlag;
140    UBool minGroupingDigitsFlag;
141    UBool breaksFlag;
142    UBool useSigDigitsFlag;
143    UBool minSigDigitsFlag;
144    UBool maxSigDigitsFlag;
145    UBool useGroupingFlag;
146    UBool multiplierFlag;
147    UBool roundingIncrementFlag;
148    UBool formatWidthFlag;
149    UBool padCharacterFlag;
150    UBool useScientificFlag;
151    UBool groupingFlag;
152    UBool grouping2Flag;
153    UBool roundingModeFlag;
154    UBool currencyUsageFlag;
155    UBool minimumExponentDigitsFlag;
156    UBool exponentSignAlwaysShownFlag;
157    UBool decimalSeparatorAlwaysShownFlag;
158    UBool padPositionFlag;
159    UBool positivePrefixFlag;
160    UBool positiveSuffixFlag;
161    UBool negativePrefixFlag;
162    UBool negativeSuffixFlag;
163    UBool localizedPatternFlag;
164    UBool toPatternFlag;
165    UBool toLocalizedPatternFlag;
166    UBool styleFlag;
167    UBool parseFlag;
168    UBool lenientFlag;
169    UBool pluralFlag;
170    UBool parseIntegerOnlyFlag;
171    UBool decimalPatternMatchRequiredFlag;
172    UBool parseNoExponentFlag;
173    UBool outputCurrencyFlag;
174
175    NumberFormatTestTuple() {
176        clear();
177    }
178
179    /**
180     * Sets a particular field using the string representation of that field.
181     * @param field the field to set.
182     * @param fieldValue the string representation of the field value.
183     * @param status error returned here such as when the string representation
184     *  of the field value cannot be parsed.
185     * @return TRUE on success or FALSE if an error was set in status.
186     */
187    UBool setField(
188            ENumberFormatTestTupleField field,
189            const UnicodeString &fieldValue,
190            UErrorCode &status);
191    /**
192     * Clears a particular field.
193     * @param field the field to clear.
194     * @param status error set here.
195     * @return TRUE on success or FALSE if error was set.
196     */
197    UBool clearField(
198            ENumberFormatTestTupleField field,
199            UErrorCode &status);
200    /**
201     * Clears every field.
202     */
203    void clear();
204
205    /**
206     * Returns the string representation of the test case this object
207     * currently represents.
208     * @param appendTo the result appended here.
209     * @return appendTo
210     */
211    UnicodeString &toString(UnicodeString &appendTo) const;
212
213    /**
214     * Converts the name of a field to the corresponding enum value.
215     * @param name the name of the field as a string.
216     * @return the corresponding enum value or kNumberFormatTestFieldCount
217     *   if name does not map to any recognized field name.
218     */
219    static ENumberFormatTestTupleField getFieldByName(const UnicodeString &name);
220private:
221    const void *getFieldAddress(int32_t fieldId) const;
222    void *getMutableFieldAddress(int32_t fieldId);
223    void setFlag(int32_t fieldId, UBool value);
224    UBool isFlag(int32_t fieldId) const;
225};
226
227#endif /* !UCONFIG_NO_FORMATTING */
228#endif
229