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