• Home
  • History
  • Annotate
  • 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