• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 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     kParseNoExponent,
68     kOutputCurrency,
69     kNumberFormatTestTupleFieldCount
70 };
71 
72 /**
73  * NumberFormatTestTuple represents the data for a single data driven test.
74  * It consist of named fields each of which may or may not be set. Each field
75  * has a particular meaning in the test. For more information on what each
76  * field means and how the data drive tests work, please see
77  * https://docs.google.com/document/d/1T2P0p953_Lh1pRwo-5CuPVrHlIBa_wcXElG-Hhg_WHM/edit?usp=sharing
78  * Each field is optional. That is, a certain field may be unset for a given
79  * test. The UBool fields ending in "Flag" indicate whether the corrresponding
80  * field is set or not. TRUE means set; FALSE means unset. An unset field
81  * generally means that the corresponding setter method is not called on
82  * the NumberFormat object.
83  */
84 
85 class NumberFormatTestTuple {
86 public:
87     Locale locale;
88     UnicodeString currency;
89     UnicodeString pattern;
90     UnicodeString format;
91     UnicodeString output;
92     UnicodeString comment;
93     int32_t minIntegerDigits;
94     int32_t maxIntegerDigits;
95     int32_t minFractionDigits;
96     int32_t maxFractionDigits;
97     int32_t minGroupingDigits;
98     UnicodeString breaks;
99     int32_t useSigDigits;
100     int32_t minSigDigits;
101     int32_t maxSigDigits;
102     int32_t useGrouping;
103     int32_t multiplier;
104     double roundingIncrement;
105     int32_t formatWidth;
106     UnicodeString padCharacter;
107     int32_t useScientific;
108     int32_t grouping;
109     int32_t grouping2;
110     DecimalFormat::ERoundingMode roundingMode;
111     UCurrencyUsage currencyUsage;
112     int32_t minimumExponentDigits;
113     int32_t exponentSignAlwaysShown;
114     int32_t decimalSeparatorAlwaysShown;
115     DecimalFormat::EPadPosition padPosition;
116     UnicodeString positivePrefix;
117     UnicodeString positiveSuffix;
118     UnicodeString negativePrefix;
119     UnicodeString negativeSuffix;
120     UnicodeString localizedPattern;
121     UnicodeString toPattern;
122     UnicodeString toLocalizedPattern;
123     UNumberFormatStyle style;
124     UnicodeString parse;
125     int32_t lenient;
126     UnicodeString plural;
127     int32_t parseIntegerOnly;
128     int32_t decimalPatternMatchRequired;
129     int32_t parseNoExponent;
130     UnicodeString outputCurrency;
131 
132     UBool localeFlag;
133     UBool currencyFlag;
134     UBool patternFlag;
135     UBool formatFlag;
136     UBool outputFlag;
137     UBool commentFlag;
138     UBool minIntegerDigitsFlag;
139     UBool maxIntegerDigitsFlag;
140     UBool minFractionDigitsFlag;
141     UBool maxFractionDigitsFlag;
142     UBool minGroupingDigitsFlag;
143     UBool breaksFlag;
144     UBool useSigDigitsFlag;
145     UBool minSigDigitsFlag;
146     UBool maxSigDigitsFlag;
147     UBool useGroupingFlag;
148     UBool multiplierFlag;
149     UBool roundingIncrementFlag;
150     UBool formatWidthFlag;
151     UBool padCharacterFlag;
152     UBool useScientificFlag;
153     UBool groupingFlag;
154     UBool grouping2Flag;
155     UBool roundingModeFlag;
156     UBool currencyUsageFlag;
157     UBool minimumExponentDigitsFlag;
158     UBool exponentSignAlwaysShownFlag;
159     UBool decimalSeparatorAlwaysShownFlag;
160     UBool padPositionFlag;
161     UBool positivePrefixFlag;
162     UBool positiveSuffixFlag;
163     UBool negativePrefixFlag;
164     UBool negativeSuffixFlag;
165     UBool localizedPatternFlag;
166     UBool toPatternFlag;
167     UBool toLocalizedPatternFlag;
168     UBool styleFlag;
169     UBool parseFlag;
170     UBool lenientFlag;
171     UBool pluralFlag;
172     UBool parseIntegerOnlyFlag;
173     UBool decimalPatternMatchRequiredFlag;
174     UBool parseNoExponentFlag;
175     UBool outputCurrencyFlag;
176 
NumberFormatTestTuple()177     NumberFormatTestTuple() {
178         clear();
179     }
180 
181     /**
182      * Sets a particular field using the string representation of that field.
183      * @param field the field to set.
184      * @param fieldValue the string representation of the field value.
185      * @param status error returned here such as when the string representation
186      *  of the field value cannot be parsed.
187      * @return TRUE on success or FALSE if an error was set in status.
188      */
189     UBool setField(
190             ENumberFormatTestTupleField field,
191             const UnicodeString &fieldValue,
192             UErrorCode &status);
193     /**
194      * Clears a particular field.
195      * @param field the field to clear.
196      * @param status error set here.
197      * @return TRUE on success or FALSE if error was set.
198      */
199     UBool clearField(
200             ENumberFormatTestTupleField field,
201             UErrorCode &status);
202     /**
203      * Clears every field.
204      */
205     void clear();
206 
207     /**
208      * Returns the string representation of the test case this object
209      * currently represents.
210      * @param appendTo the result appended here.
211      * @return appendTo
212      */
213     UnicodeString &toString(UnicodeString &appendTo) const;
214 
215     /**
216      * Converts the name of a field to the corresponding enum value.
217      * @param name the name of the field as a string.
218      * @return the corresponding enum value or kNumberFormatTestFieldCount
219      *   if name does not map to any recognized field name.
220      */
221     static ENumberFormatTestTupleField getFieldByName(const UnicodeString &name);
222 private:
223     const void *getFieldAddress(int32_t fieldId) const;
224     void *getMutableFieldAddress(int32_t fieldId);
225     void setFlag(int32_t fieldId, UBool value);
226     UBool isFlag(int32_t fieldId) const;
227 };
228 
229 #endif /* !UCONFIG_NO_FORMATTING */
230 #endif
231