Home | History | Annotate | Download | only in format
      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