1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // 2016 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 /* 5 ******************************************************************************* 6 * Copyright (C) 2015, International Business Machines Corporation and * 7 * others. All Rights Reserved. * 8 ******************************************************************************* 9 */ 10 package android.icu.dev.test.format; 11 12 import java.lang.reflect.Field; 13 import java.lang.reflect.InvocationTargetException; 14 import java.lang.reflect.Method; 15 import java.util.HashMap; 16 import java.util.HashSet; 17 import java.util.Map; 18 19 import android.icu.math.BigDecimal; 20 import android.icu.text.DecimalFormat; 21 import android.icu.text.NumberFormat; 22 import android.icu.util.Currency; 23 import android.icu.util.ULocale; 24 25 /** 26 * A representation of a single NumberFormat specification test from a data driven test file. 27 * <p> 28 * The purpose of this class is to hide the details of the data driven test file from the 29 * main testing code. 30 * <p> 31 * This class contains fields describing an attribute of the test that may or may 32 * not be set. The name of each attribute corresponds to the name used in the 33 * data driven test file. 34 * <p> 35 * <b>Adding new attributes</b> 36 * <p> 37 * Each attribute name is lower case. Moreover, for each attribute there is also a 38 * setXXX method for that attribute that is used to initialize the attribute from a 39 * String value read from the data file. For example, there is a setLocale(String) method 40 * for the locale attribute and a setCurrency(String) method for the currency attribute. 41 * In general, for an attribute named abcd, the setter will be setAbcd(String). 42 * This naming rule must be strictly followed or else the test runner will not know how to 43 * initialize instances of this class. 44 * <p> 45 * In addition each attribute is listed in the fieldOrdering static array which specifies 46 * The order that attributes are printed whenever there is a test failure. 47 * <p> 48 * To add a new attribute, first create a public field for it. 49 * Next, add the attribute name to the fieldOrdering array. 50 * Finally, create a setter method for it. 51 * 52 * @author rocketman 53 */ 54 public class NumberFormatTestData { 55 56 /** 57 * The locale. 58 */ 59 public ULocale locale = null; 60 61 /** 62 * The currency. 63 */ 64 public Currency currency = null; 65 66 /** 67 * The pattern to initialize the formatter, for example 0.00" 68 */ 69 public String pattern = null; 70 71 /** 72 * The value to format as a string. For example 1234.5 would be "1234.5" 73 */ 74 public String format = null; 75 76 /** 77 * The formatted value. 78 */ 79 public String output = null; 80 81 /** 82 * Field for arbitrary comments. 83 */ 84 public String comment = null; 85 86 public Integer minIntegerDigits = null; 87 public Integer maxIntegerDigits = null; 88 public Integer minFractionDigits = null; 89 public Integer maxFractionDigits = null; 90 public Integer minGroupingDigits = null; 91 public Integer useSigDigits = null; 92 public Integer minSigDigits = null; 93 public Integer maxSigDigits = null; 94 public Integer useGrouping = null; 95 public Integer multiplier = null; 96 public Double roundingIncrement = null; 97 public Integer formatWidth = null; 98 public String padCharacter = null; 99 public Integer useScientific = null; 100 public Integer grouping = null; 101 public Integer grouping2 = null; 102 public Integer roundingMode = null; 103 public Currency.CurrencyUsage currencyUsage = null; 104 public Integer minimumExponentDigits = null; 105 public Integer exponentSignAlwaysShown = null; 106 public Integer decimalSeparatorAlwaysShown = null; 107 public Integer padPosition = null; 108 public String positivePrefix = null; 109 public String positiveSuffix = null; 110 public String negativePrefix = null; 111 public String negativeSuffix = null; 112 public String localizedPattern = null; 113 public String toPattern = null; 114 public String toLocalizedPattern = null; 115 public Integer style = null; 116 public String parse = null; 117 public Integer lenient = null; 118 public String plural = null; 119 public Integer parseIntegerOnly = null; 120 public Integer decimalPatternMatchRequired = null; 121 public Integer parseNoExponent = null; 122 public String outputCurrency = null; 123 124 125 126 /** 127 * nothing or empty means that test ought to work for both C and JAVA; 128 * "C" means test is known to fail in C. "J" means test is known to fail in JAVA. 129 * "CJ" means test is known to fail for both languages. 130 */ 131 public String breaks = null; 132 133 private static Map<String, Integer> roundingModeMap = 134 new HashMap<String, Integer>(); 135 136 static { 137 roundingModeMap.put("ceiling", BigDecimal.ROUND_CEILING); 138 roundingModeMap.put("floor", BigDecimal.ROUND_FLOOR); 139 roundingModeMap.put("down", BigDecimal.ROUND_DOWN); 140 roundingModeMap.put("up", BigDecimal.ROUND_UP); 141 roundingModeMap.put("halfEven", BigDecimal.ROUND_HALF_EVEN); 142 roundingModeMap.put("halfDown", BigDecimal.ROUND_HALF_DOWN); 143 roundingModeMap.put("halfUp", BigDecimal.ROUND_HALF_UP); 144 roundingModeMap.put("unnecessary", BigDecimal.ROUND_UNNECESSARY); 145 } 146 147 private static Map<String, Currency.CurrencyUsage> currencyUsageMap = 148 new HashMap<String, Currency.CurrencyUsage>(); 149 150 static { 151 currencyUsageMap.put("standard", Currency.CurrencyUsage.STANDARD); 152 currencyUsageMap.put("cash", Currency.CurrencyUsage.CASH); 153 } 154 155 private static Map<String, Integer> padPositionMap = 156 new HashMap<String, Integer>(); 157 158 static { 159 // TODO: Fix so that it doesn't depend on DecimalFormat. 160 padPositionMap.put("beforePrefix", DecimalFormat.PAD_BEFORE_PREFIX); 161 padPositionMap.put("afterPrefix", DecimalFormat.PAD_AFTER_PREFIX); 162 padPositionMap.put("beforeSuffix", DecimalFormat.PAD_BEFORE_SUFFIX); 163 padPositionMap.put("afterSuffix", DecimalFormat.PAD_AFTER_SUFFIX); 164 } 165 166 private static Map<String, Integer> formatStyleMap = 167 new HashMap<String, Integer>(); 168 169 static { 170 formatStyleMap.put("decimal", NumberFormat.NUMBERSTYLE); 171 formatStyleMap.put("currency", NumberFormat.CURRENCYSTYLE); 172 formatStyleMap.put("percent", NumberFormat.PERCENTSTYLE); 173 formatStyleMap.put("scientific", NumberFormat.SCIENTIFICSTYLE); 174 formatStyleMap.put("currencyIso", NumberFormat.ISOCURRENCYSTYLE); 175 formatStyleMap.put("currencyPlural", NumberFormat.PLURALCURRENCYSTYLE); 176 formatStyleMap.put("currencyAccounting", NumberFormat.ACCOUNTINGCURRENCYSTYLE); 177 formatStyleMap.put("cashCurrency", NumberFormat.CASHCURRENCYSTYLE); 178 } 179 180 // Add any new fields here. On test failures, fields are printed in the same order they 181 // appear here. 182 private static String[] fieldOrdering = { 183 "locale", 184 "currency", 185 "pattern", 186 "format", 187 "output", 188 "comment", 189 "minIntegerDigits", 190 "maxIntegerDigits", 191 "minFractionDigits", 192 "maxFractionDigits", 193 "minGroupingDigits", 194 "breaks", 195 "useSigDigits", 196 "minSigDigits", 197 "maxSigDigits", 198 "useGrouping", 199 "multiplier", 200 "roundingIncrement", 201 "formatWidth", 202 "padCharacter", 203 "useScientific", 204 "grouping", 205 "grouping2", 206 "roundingMode", 207 "currencyUsage", 208 "minimumExponentDigits", 209 "exponentSignAlwaysShown", 210 "decimalSeparatorAlwaysShown", 211 "padPosition", 212 "positivePrefix", 213 "positiveSuffix", 214 "negativePrefix", 215 "negativeSuffix", 216 "localizedPattern", 217 "toPattern", 218 "toLocalizedPattern", 219 "style", 220 "parse", 221 "lenient", 222 "plural", 223 "parseIntegerOnly", 224 "decimalPatternMatchRequired", 225 "parseNoExponent", 226 "outputCurrency" 227 }; 228 229 static { 230 HashSet<String> set = new HashSet<String>(); 231 for (String s : fieldOrdering) { 232 if (!set.add(s)) { 233 throw new ExceptionInInitializerError(s + "is a duplicate field."); 234 } 235 } 236 } 237 238 private static <T> T fromString(Map<String, T> map, String key) { 239 T value = map.get(key); 240 if (value == null) { 241 throw new IllegalArgumentException("Bad value: "+ key); 242 } 243 return value; 244 } 245 246 // start field setters. 247 // add setter for each new field in this block. 248 249 public void setLocale(String value) { 250 locale = new ULocale(value); 251 } 252 253 public void setCurrency(String value) { 254 currency = Currency.getInstance(value); 255 } 256 257 public void setPattern(String value) { 258 pattern = value; 259 } 260 261 public void setFormat(String value) { 262 format = value; 263 } 264 265 public void setOutput(String value) { 266 output = value; 267 } 268 269 public void setComment(String value) { 270 comment = value; 271 } 272 273 public void setMinIntegerDigits(String value) { 274 minIntegerDigits = Integer.valueOf(value); 275 } 276 277 public void setMaxIntegerDigits(String value) { 278 maxIntegerDigits = Integer.valueOf(value); 279 } 280 281 public void setMinFractionDigits(String value) { 282 minFractionDigits = Integer.valueOf(value); 283 } 284 285 public void setMaxFractionDigits(String value) { 286 maxFractionDigits = Integer.valueOf(value); 287 } 288 289 public void setMinGroupingDigits(String value) { 290 minGroupingDigits = Integer.valueOf(value); 291 } 292 293 public void setBreaks(String value) { 294 breaks = value; 295 } 296 297 public void setUseSigDigits(String value) { 298 useSigDigits = Integer.valueOf(value); 299 } 300 301 public void setMinSigDigits(String value) { 302 minSigDigits = Integer.valueOf(value); 303 } 304 305 public void setMaxSigDigits(String value) { 306 maxSigDigits = Integer.valueOf(value); 307 } 308 309 public void setUseGrouping(String value) { 310 useGrouping = Integer.valueOf(value); 311 } 312 313 public void setMultiplier(String value) { 314 multiplier = Integer.valueOf(value); 315 } 316 317 public void setRoundingIncrement(String value) { 318 roundingIncrement = Double.valueOf(value); 319 } 320 321 public void setFormatWidth(String value) { 322 formatWidth = Integer.valueOf(value); 323 } 324 325 public void setPadCharacter(String value) { 326 padCharacter = value; 327 } 328 329 public void setUseScientific(String value) { 330 useScientific = Integer.valueOf(value); 331 } 332 333 public void setGrouping(String value) { 334 grouping = Integer.valueOf(value); 335 } 336 337 public void setGrouping2(String value) { 338 grouping2 = Integer.valueOf(value); 339 } 340 341 public void setRoundingMode(String value) { 342 roundingMode = fromString(roundingModeMap, value); 343 } 344 345 public void setCurrencyUsage(String value) { 346 currencyUsage = fromString(currencyUsageMap, value); 347 } 348 349 public void setMinimumExponentDigits(String value) { 350 minimumExponentDigits = Integer.valueOf(value); 351 } 352 353 public void setExponentSignAlwaysShown(String value) { 354 exponentSignAlwaysShown = Integer.valueOf(value); 355 } 356 357 public void setDecimalSeparatorAlwaysShown(String value) { 358 decimalSeparatorAlwaysShown = Integer.valueOf(value); 359 } 360 361 public void setPadPosition(String value) { 362 padPosition = fromString(padPositionMap, value); 363 } 364 365 public void setPositivePrefix(String value) { 366 positivePrefix = value; 367 } 368 369 public void setPositiveSuffix(String value) { 370 positiveSuffix = value; 371 } 372 373 public void setNegativePrefix(String value) { 374 negativePrefix = value; 375 } 376 377 public void setNegativeSuffix(String value) { 378 negativeSuffix = value; 379 } 380 381 public void setLocalizedPattern(String value) { 382 localizedPattern = value; 383 } 384 385 public void setToPattern(String value) { 386 toPattern = value; 387 } 388 389 public void setToLocalizedPattern(String value) { 390 toLocalizedPattern = value; 391 } 392 393 public void setStyle(String value) { 394 style = fromString(formatStyleMap, value); 395 } 396 397 public void setParse(String value) { 398 parse = value; 399 } 400 401 public void setLenient(String value) { 402 lenient = Integer.valueOf(value); 403 } 404 405 public void setPlural(String value) { 406 plural = value; 407 } 408 409 public void setParseIntegerOnly(String value) { 410 parseIntegerOnly = Integer.valueOf(value); 411 } 412 413 public void setDecimalPatternMatchRequired(String value) { 414 decimalPatternMatchRequired = Integer.valueOf(value); 415 } 416 417 public void setParseNoExponent(String value) { 418 parseNoExponent = Integer.valueOf(value); 419 } 420 421 public void setOutputCurrency(String value) { 422 outputCurrency = value; 423 } 424 425 // end field setters. 426 427 // start of field clearers 428 // Add clear methods that can be set in one test and cleared 429 // in the next i.e the breaks field. 430 431 public void clearBreaks() { 432 breaks = null; 433 } 434 435 public void clearUseGrouping() { 436 useGrouping = null; 437 } 438 439 public void clearGrouping2() { 440 grouping2 = null; 441 } 442 443 public void clearGrouping() { 444 grouping = null; 445 } 446 447 public void clearMinGroupingDigits() { 448 minGroupingDigits = null; 449 } 450 451 public void clearUseScientific() { 452 useScientific = null; 453 } 454 455 public void clearDecimalSeparatorAlwaysShown() { 456 decimalSeparatorAlwaysShown = null; 457 } 458 459 // end field clearers 460 461 public void setField(String fieldName, String valueString) 462 throws NoSuchMethodException { 463 Method m = getClass().getMethod( 464 fieldToSetter(fieldName), String.class); 465 try { 466 m.invoke(this, valueString); 467 } catch (IllegalAccessException e) { 468 throw new RuntimeException(e); 469 } catch (InvocationTargetException e) { 470 throw new RuntimeException(e); 471 } 472 } 473 474 public void clearField(String fieldName) 475 throws NoSuchMethodException { 476 Method m = getClass().getMethod(fieldToClearer(fieldName)); 477 try { 478 m.invoke(this); 479 } catch (IllegalAccessException e) { 480 throw new RuntimeException(e); 481 } catch (InvocationTargetException e) { 482 throw new RuntimeException(e); 483 } 484 } 485 486 public String toString() { 487 StringBuilder result = new StringBuilder(); 488 result.append("{"); 489 boolean first = true; 490 for (String fieldName : fieldOrdering) { 491 try { 492 Field field = getClass().getField(fieldName); 493 Object optionalValue = field.get(this); 494 if (optionalValue == null) { 495 continue; 496 } 497 if (!first) { 498 result.append(", "); 499 } 500 first = false; 501 result.append(fieldName); 502 result.append(": "); 503 result.append(optionalValue); 504 } catch (NoSuchFieldException e) { 505 throw new RuntimeException(e); 506 } catch (SecurityException e) { 507 throw new RuntimeException(e); 508 } catch (IllegalAccessException e) { 509 throw new RuntimeException(e); 510 } 511 } 512 result.append("}"); 513 return result.toString(); 514 } 515 516 private static String fieldToSetter(String fieldName) { 517 return "set" 518 + Character.toUpperCase(fieldName.charAt(0)) 519 + fieldName.substring(1); 520 } 521 522 private static String fieldToClearer(String fieldName) { 523 return "clear" 524 + Character.toUpperCase(fieldName.charAt(0)) 525 + fieldName.substring(1); 526 } 527 528 } 529