MeasureUnitTest.java revision f716bda031dccdec5e47bb40e758c5901d209729
17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
3f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Copyright (C) 2013-2015, International Business Machines Corporation and         *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayOutputStream;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectOutputStream;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.Serializable;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Comparator;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashMap;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashSet;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.TreeMap;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.serializable.SerializableTest;
28f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubertimport com.ibm.icu.impl.Pair;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility;
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal;
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat;
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat.FormatWidth;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Measure;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.MeasureUnit;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeUnit;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeUnitAmount;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See https://sites.google.com/site/icusite/processes/release/tasks/standards?pli=1
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for information on how to update with each new release.
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author markdavis
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class MeasureUnitTest extends TestFmwk {
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
48f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    static class OrderedPair<F extends Comparable, S extends Comparable> extends Pair<F, S> implements Comparable<OrderedPair<F, S>> {
49f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
50f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        OrderedPair(F first, S second) {
51f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            super(first, second);
52f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
53f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
54f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        public static <F extends Comparable, S extends Comparable> OrderedPair<F, S> of(F first, S second) {
55f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (first == null || second == null) {
56f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                throw new IllegalArgumentException("OrderedPair.of requires non null values.");
57f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
58f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            return new OrderedPair<F, S>(first, second);
59f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
60f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
61f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        public int compareTo(OrderedPair<F, S> other) {
62f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int result = first.compareTo(other.first);
63f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (result != 0) {
64f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                return result;
65f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
66f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            return second.compareTo(other.second);
67f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
68f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
69f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
70f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    private static final String[] DRAFT_VERSIONS = {"54"};
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashSet<String> DRAFT_VERSION_SET = new HashSet<String>();
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashSet<String> TIME_CODES = new HashSet<String>();
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String[][] JAVA_VERSIONS = {
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"G_FORCE", "53"},
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DEGREE", "53"},
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ARC_MINUTE", "53"},
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ARC_SECOND", "53"},
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ACRE", "53"},
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTARE", "53"},
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_FOOT", "53"},
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_KILOMETER", "53"},
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_METER", "53"},
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_MILE", "53"},
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLISECOND", "53"},
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CENTIMETER", "53"},
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FOOT", "53"},
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"INCH", "53"},
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOMETER", "53"},
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LIGHT_YEAR", "53"},
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER", "53"},
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE", "53"},
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIMETER", "53"},
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PICOMETER", "53"},
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"YARD", "53"},
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GRAM", "53"},
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOGRAM", "53"},
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OUNCE", "53"},
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"POUND", "53"},
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HORSEPOWER", "53"},
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOWATT", "53"},
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"WATT", "53"},
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTOPASCAL", "53"},
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"INCH_HG", "53"},
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIBAR", "53"},
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOMETER_PER_HOUR", "53"},
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER_PER_SECOND", "53"},
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE_PER_HOUR", "53"},
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CELSIUS", "53"},
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FAHRENHEIT", "53"},
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_KILOMETER", "53"},
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_MILE", "53"},
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LITER", "53"},
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"YEAR", "53"},
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MONTH", "53"},
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"WEEK", "53"},
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DAY", "53"},
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HOUR", "53"},
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MINUTE", "53"},
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SECOND", "53"},
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER_PER_SECOND_SQUARED", "54"},
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"RADIAN", "54"},
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_CENTIMETER", "54"},
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_INCH", "54"},
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_YARD", "54"},
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LITER_PER_KILOMETER", "54"},
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE_PER_GALLON", "54"},
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BIT", "54"},
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BYTE", "54"},
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGABIT", "54"},
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGABYTE", "54"},
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOBIT", "54"},
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOBYTE", "54"},
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGABIT", "54"},
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGABYTE", "54"},
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TERABIT", "54"},
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TERABYTE", "54"},
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROSECOND", "54"},
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NANOSECOND", "54"},
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"AMPERE", "54"},
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIAMPERE", "54"},
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OHM", "54"},
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"VOLT", "54"},
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CALORIE", "54"},
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FOODCALORIE", "54"},
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"JOULE", "54"},
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOCALORIE", "54"},
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOJOULE", "54"},
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOWATT_HOUR", "54"},
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGAHERTZ", "54"},
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HERTZ", "54"},
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOHERTZ", "54"},
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGAHERTZ", "54"},
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ASTRONOMICAL_UNIT", "54"},
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DECIMETER", "54"},
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FATHOM", "54"},
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FURLONG", "54"},
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROMETER", "54"},
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NANOMETER", "54"},
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NAUTICAL_MILE", "54"},
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PARSEC", "54"},
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LUX", "54"},
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CARAT", "54"},
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METRIC_TON", "54"},
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROGRAM", "54"},
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIGRAM", "54"},
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OUNCE_TROY", "54"},
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"STONE", "54"},
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TON", "54"},
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGAWATT", "54"},
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGAWATT", "54"},
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIWATT", "54"},
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIMETER_OF_MERCURY", "54"},
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"POUND_PER_SQUARE_INCH", "54"},
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KARAT", "54"},
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KELVIN", "54"},
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ACRE_FOOT", "54"},
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BUSHEL", "54"},
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CENTILITER", "54"},
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_CENTIMETER", "54"},
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_FOOT", "54"},
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_INCH", "54"},
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_METER", "54"},
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_YARD", "54"},
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUP", "54"},
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DECILITER", "54"},
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FLUID_OUNCE", "54"},
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GALLON", "54"},
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTOLITER", "54"},
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGALITER", "54"},
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLILITER", "54"},
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PINT", "54"},
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"QUART", "54"},
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TABLESPOON", "54"},
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TEASPOON", "54"},
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashMap<String, String> JAVA_VERSION_MAP = new HashMap<String, String>();
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("year");
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("month");
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("week");
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("day");
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("hour");
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("minute");
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("second");
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String verNum : DRAFT_VERSIONS) {
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DRAFT_VERSION_SET.add(verNum);
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] funcNameAndVersion : JAVA_VERSIONS) {
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            JAVA_VERSION_MAP.put(funcNameAndVersion[0], funcNameAndVersion[1]);
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @author markdavis
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) {
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //generateConstants(); if (true) return;
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new MeasureUnitTest().run(args);
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatible53_1() {
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureUnit[] units = {
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.G_FORCE,
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DEGREE,
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_MINUTE,
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_SECOND,
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE,
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTARE,
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_FOOT,
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_METER,
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_MILE,
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLISECOND,
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTIMETER,
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOOT,
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH,
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER,
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LIGHT_YEAR,
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER,
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE,
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER,
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PICOMETER,
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YARD,
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GRAM,
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOGRAM,
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE,
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND,
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HORSEPOWER,
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT,
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WATT,
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOPASCAL,
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH_HG,
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIBAR,
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND,
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_HOUR,
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CELSIUS,
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FAHRENHEIT,
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_MILE,
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER,
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR,
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", 46, units.length);
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatible54_1() {
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureUnit[] units = {
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.G_FORCE,
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_MINUTE,
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_SECOND,
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DEGREE,
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.RADIAN,
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE,
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTARE,
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_FOOT,
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_INCH,
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_METER,
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_MILE,
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_YARD,
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_GALLON,
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BIT,
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BYTE,
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGABIT,
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGABYTE,
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOBIT,
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOBYTE,
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGABIT,
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGABYTE,
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TERABIT,
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TERABYTE,
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROSECOND,
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLISECOND,
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NANOSECOND,
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR,
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.AMPERE,
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIAMPERE,
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OHM,
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.VOLT,
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CALORIE,
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOODCALORIE,
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.JOULE,
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOCALORIE,
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOJOULE,
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT_HOUR,
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGAHERTZ,
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HERTZ,
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOHERTZ,
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGAHERTZ,
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTIMETER,
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DECIMETER,
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FATHOM,
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOOT,
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FURLONG,
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH,
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER,
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LIGHT_YEAR,
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER,
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROMETER,
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE,
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER,
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NANOMETER,
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NAUTICAL_MILE,
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PARSEC,
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PICOMETER,
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YARD,
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LUX,
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CARAT,
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GRAM,
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOGRAM,
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METRIC_TON,
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROGRAM,
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIGRAM,
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE,
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE_TROY,
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND,
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.STONE,
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TON,
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGAWATT,
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HORSEPOWER,
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT,
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGAWATT,
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIWATT,
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WATT,
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOPASCAL,
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH_HG,
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIBAR,
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KARAT,
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND,
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_HOUR,
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CELSIUS,
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FAHRENHEIT,
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KELVIN,
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE_FOOT,
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BUSHEL,
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTILITER,
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_FOOT,
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_INCH,
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_METER,
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_MILE,
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_YARD,
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUP,
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DECILITER,
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FLUID_OUNCE,
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GALLON,
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOLITER,
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER,
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGALITER,
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLILITER,
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PINT,
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.QUART,
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TABLESPOON,
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TEASPOON,
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("",  121, units.length);
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExamplesInDocs() {
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFr = MeasureFormat.getInstance(
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.SHORT);
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure measure = new Measure(23, MeasureUnit.CELSIUS);
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("23 °C", "23 °C", fmtFr.format(measure));
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("70 °F", "70 °F", fmtFr.format(measureF));
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFrFull = MeasureFormat.getInstance(
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.WIDE);
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 pied et 5,3 pouces",
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 pieds et 5,3 pouces",
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrFull.formatMeasures(
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(70, MeasureUnit.FOOT),
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(5.3, MeasureUnit.INCH)));
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 pied et 1 pouce",
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 pied et 1 pouce",
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrFull.formatMeasures(
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.FOOT),
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH)));
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.NARROW);
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1′ 1″",
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1′ 1″",
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrNarrow.formatMeasures(
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.FOOT),
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH)));
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 inch, 2 feet",
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 inch, 2 feet",
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtEn.formatMeasures(
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH),
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(2, MeasureUnit.FOOT)));
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormatPeriodEn() {
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _19m = {new TimeUnitAmount(19.0, TimeUnit.MINUTE)};
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_23_5s = {
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.5, TimeUnit.SECOND)};
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_23_5m = {
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.5, TimeUnit.MINUTE)};
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_0m_23s = {
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.0, TimeUnit.SECOND)};
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _2y_5M_3w_4d = {
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(2.0, TimeUnit.YEAR),
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.MONTH),
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.WEEK),
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(4.0, TimeUnit.DAY)};
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1m_59_9996s = {
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.MINUTE),
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(59.9996, TimeUnit.SECOND)};
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _5h_17m = {
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.HOUR),
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.MINUTE)};
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _neg5h_17m = {
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(-5.0, TimeUnit.HOUR),
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.MINUTE)};
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _19m_28s = {
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(19.0, TimeUnit.MINUTE),
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(28.0, TimeUnit.SECOND)};
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _0h_0m_9s = {
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.HOUR),
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(9.0, TimeUnit.SECOND)};
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _0h_0m_17s = {
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.HOUR),
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.SECOND)};
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _6h_56_92m = {
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(6.0, TimeUnit.HOUR),
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(56.92, TimeUnit.MINUTE)};
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _3h_4s_5m = {
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.HOUR),
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(4.0, TimeUnit.SECOND),
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.MINUTE)};
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _6_7h_56_92m = {
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(6.7, TimeUnit.HOUR),
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(56.92, TimeUnit.MINUTE)};
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _3h_5h = {
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.HOUR),
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.HOUR)};
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] fullData = {
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1 minute, 59.9996 seconds"},
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 minutes"},
4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1 hour, 23.5 seconds"},
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1 hour, 23.5 minutes"},
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1 hour, 0 minutes, 23 seconds"},
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 years, 5 months, 3 weeks, 4 days"}};
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] abbrevData = {
503f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1m_59_9996s, "1 min, 59.9996 sec"},
504f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_19m, "19 min"},
505f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_23_5s, "1 hr, 23.5 sec"},
506f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_23_5m, "1 hr, 23.5 min"},
507f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_0m_23s, "1 hr, 0 min, 23 sec"},
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 yrs, 5 mths, 3 wks, 4 days"}};
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] narrowData = {
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1m 59.9996s"},
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19m"},
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1h 23.5s"},
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1h 23.5m"},
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1h 0m 23s"},
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2y 5m 3w 4d"}};
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] numericData = {
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1:59.9996"},
5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19m"},
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1:00:23.5"},
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1:00:23"},
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1:23.5"},
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_5h_17m, "5:17"},
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_neg5h_17m, "-5h 17m"},
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m_28s, "19:28"},
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2y 5m 3w 4d"},
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_0h_0m_9s, "0:00:09"},
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6h_56_92m, "6:56.92"},
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6_7h_56_92m, "6:56.92"},
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_4s_5m, "3h 4s 5m"},
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_5h, "3h 5h"}};
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] fullDataDe = {
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1 Minute und 59,9996 Sekunden"},
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 Minuten"},
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1 Stunde und 23,5 Sekunden"},
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1 Stunde und 23,5 Minuten"},
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1 Stunde, 0 Minuten und 23 Sekunden"},
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] numericDataDe = {
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1:59,9996"},
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 Min."},
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1:00:23,5"},
5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1:00:23"},
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1:23,5"},
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_5h_17m, "5:17"},
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m_28s, "19:28"},
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 J, 5 M, 3 W und 4 T"},
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_0h_0m_17s, "0:00:17"},
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6h_56_92m, "6:56,92"},
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_5h, "3 Std., 5 Std."}};
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getNumberInstance(ULocale.ENGLISH);
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE, nf);
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en FULL", mf, fullData);
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT, nf);
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en SHORT", mf, abbrevData);
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NARROW, nf);
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en NARROW", mf, narrowData);
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NUMERIC, nf);
5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en NUMERIC", mf, numericData);
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = NumberFormat.getNumberInstance(ULocale.GERMAN);
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.WIDE, nf);
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de FULL", mf, fullDataDe);
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.NUMERIC, nf);
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de NUMERIC", mf, numericDataDe);
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Same tests, with Java Locale
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = NumberFormat.getNumberInstance(Locale.GERMAN);
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.WIDE, nf);
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de FULL(Java Locale)", mf, fullDataDe);
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.NUMERIC, nf);
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de NUMERIC(Java Locale)", mf, numericDataDe);
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void verifyFormatPeriod(String desc, MeasureFormat mf, Object[][] testData) {
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder builder = new StringBuilder();
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean failure = false;
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] testCase : testData) {
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String actual = mf.format((Measure[]) testCase[0]);
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!testCase[1].equals(actual)) {
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                builder.append(String.format("%s: Expected: '%s', got: '%s'\n", desc, testCase[1], actual));
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                failure = true;
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (failure) {
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(builder.toString());
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test10219FractionalPlurals() {
5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] values = {1.588, 1.011};
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] expected = {
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1 minute", "1.5 minutes", "1.58 minutes"},
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1 minute", "1.0 minutes", "1.01 minutes"}
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < values.length; j++) {
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < expected[j].length; i++) {
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat nf = NumberFormat.getNumberInstance(ULocale.ENGLISH);
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setRoundingMode(BigDecimal.ROUND_DOWN);
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMinimumFractionDigits(i);
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMaximumFractionDigits(i);
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureFormat mf = MeasureFormat.getInstance(
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ULocale.ENGLISH, FormatWidth.WIDE, nf);
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test10219", expected[j][i], mf.format(new Measure(values[j], MeasureUnit.MINUTE)));
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGreek() {
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] locales = {"el_GR", "el"};
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final MeasureUnit[] units = new MeasureUnit[]{
6187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR};
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatWidth[] styles = new FormatWidth[] {FormatWidth.WIDE, FormatWidth.SHORT};
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] numbers = new int[] {1, 7};
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] expected = {
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 1 wide
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτερόλεπτο",
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπτό",
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδομάδα",
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήνας",
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτος",
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 1 short
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτ.",
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπ.",
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδ.",
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήν.",
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτ.",	        // year (one)
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 7 wide
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτερόλεπτα",
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπτά",
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρες",
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδομάδες",
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήνες",
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτη",
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 7 short
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτ.",
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπ.",
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρ.",		    // hour (other)
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδ.",
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήν.",
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτ.",            // year (other)
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 1 wide
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτερόλεπτο",
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπτό",
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδομάδα",
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήνας",
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτος",
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 1 short
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτ.",
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπ.",
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
6727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδ.",
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήν.",
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτ.",	        // year (one)
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 7 wide
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτερόλεπτα",
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπτά",
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρες",
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδομάδες",
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήνες",
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτη",
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 7 short
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτ.",
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπ.",
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρ.",		    // hour (other)
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδ.",
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήν.",
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτ."};           // year (other
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int counter = 0;
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formatted;
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for ( int locIndex = 0; locIndex < locales.length; ++locIndex ) {
6957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for( int numIndex = 0; numIndex < numbers.length; ++numIndex ) {
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for ( int styleIndex = 0; styleIndex < styles.length; ++styleIndex ) {
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for ( int unitIndex = 0; unitIndex < units.length; ++unitIndex ) {
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Measure m = new Measure(numbers[numIndex], units[unitIndex]);
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        MeasureFormat fmt = MeasureFormat.getInstance(new ULocale(locales[locIndex]), styles[styleIndex]);
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted = fmt.format(m);
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "locale: " + locales[locIndex]
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        + ", style: " + styles[styleIndex]
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                + ", units: " + units[unitIndex]
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        + ", value: " + numbers[numIndex],
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                expected[counter], formatted);
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ++counter;
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testAUnit() {
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String lastType = null;
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (MeasureUnit expected : MeasureUnit.getAvailable()) {
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = expected.getType();
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String code = expected.getSubtype();
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!type.equals(lastType)) {
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(type);
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                lastType = type;
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit actual = MeasureUnit.internalGetInstance(type, code);
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertSame("Identity check", expected, actual);
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatSingleArg() {
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 meters", mf.format(new Measure(5, MeasureUnit.METER)));
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatMeasuresZeroArg() {
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "", mf.formatMeasures());
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatMeasuresOneArg() {
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 meters", mf.formatMeasures(new Measure(5, MeasureUnit.METER)));
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testMultiples() {
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale russia = new ULocale("ru");
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.WIDE, "2 miles, 1 foot, 2.3 inches"},
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.SHORT, "2 mi, 1 ft, 2.3 in"},
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.NARROW, "2mi 1\u2032 2.3\u2033"},
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {russia, FormatWidth.WIDE, "2 \u043C\u0438\u043B\u0438, 1 \u0444\u0443\u0442 \u0438 2,3 \u0434\u044E\u0439\u043C\u0430"},
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {russia, FormatWidth.SHORT, "2 \u043C\u0438\u043B\u0438, 1 \u0444\u0443\u0442, 2,3 \u0434\u044E\u0439\u043C."},
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {russia, FormatWidth.NARROW, "2 \u043C\u0438\u043B\u044C 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (ULocale) row[0], (FormatWidth) row[1]);
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "testMultiples",
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    row[2],
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    mf.formatMeasures(
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new Measure(2, MeasureUnit.MILE),
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new Measure(1, MeasureUnit.FOOT),
7647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new Measure(2.3, MeasureUnit.INCH)));
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testSimplePer() {
769f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Object DONT_CARE = null;
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
771f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit pattern
772f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 1.0, MeasureUnit.SECOND, "1 pound per second", DONT_CARE, 0, 0},
773f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 2.0, MeasureUnit.SECOND, "2 pounds per second", DONT_CARE, 0, 0},
774f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound pattern
775f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 1.0, MeasureUnit.MINUTE, "1 pound per minute", DONT_CARE, 0, 0},
776f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 2.0, MeasureUnit.MINUTE, "2 pounds per minute", DONT_CARE, 0, 0},
777f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit
778f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 1.0, MeasureUnit.SECOND, "1 lbps", DONT_CARE, 0, 0},
779f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 2.0, MeasureUnit.SECOND, "2 lbps", DONT_CARE, 0, 0},
780f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound
781f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 1.0, MeasureUnit.MINUTE, "1 lb/min", DONT_CARE, 0, 0},
782f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 2.0, MeasureUnit.MINUTE, "2 lb/min", DONT_CARE, 0, 0},
783f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit
784f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 1.0, MeasureUnit.SECOND, "1#/s", DONT_CARE, 0, 0},
785f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 2.0, MeasureUnit.SECOND, "2#/s", DONT_CARE, 0, 0},
786f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound
787f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 1.0, MeasureUnit.MINUTE, "1#/m", DONT_CARE, 0, 0},
788f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 2.0, MeasureUnit.MINUTE, "2#/m", DONT_CARE, 0, 0},
789f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // field positions
790f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.SECOND, "23.3 lbps", NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3},
791f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.SECOND, "23.3 lbps", NumberFormat.Field.INTEGER, 0, 2},
792f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.MINUTE, "23.3 lb/min", NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3},
793f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.MINUTE, "23.3 lb/min", NumberFormat.Field.INTEGER, 0, 2},
794f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
798f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            FormatWidth formatWidth = (FormatWidth) row[0];
799f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Number amount = (Number) row[1];
800f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit perUnit = (MeasureUnit) row[2];
801f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String expected = row[3].toString();
802f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            NumberFormat.Field field = (NumberFormat.Field) row[4];
803f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int startOffset = ((Integer) row[5]).intValue();
804f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int endOffset = ((Integer) row[6]).intValue();
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(
806f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    ULocale.ENGLISH, formatWidth);
807f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            FieldPosition pos = field != null ? new FieldPosition(field) : new FieldPosition(0);
808f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String prefix = "Prefix: ";
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "",
811f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    prefix + expected,
812f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    mf.formatMeasurePerUnit(
813f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new Measure(amount, MeasureUnit.POUND),
814f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            perUnit,
815f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new StringBuilder(prefix),
816f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            pos).toString());
817f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (field != DONT_CARE) {
818f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                assertEquals("startOffset", startOffset, pos.getBeginIndex() - prefix.length());
819f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                assertEquals("endOffset", endOffset, pos.getEndIndex() - prefix.length());
820f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testNumeratorPlurals() {
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale polish = new ULocale("pl");
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {1, "1 stopa na sekundę"},
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {2, "2 stopy na sekundę"},
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {5, "5 stóp na sekundę"},
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {1.5, "1,5 stopy na sekundę"}};
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(polish, FormatWidth.WIDE);
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "",
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    row[1],
837f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    mf.formatMeasurePerUnit(
838f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new Measure((Number) row[0], MeasureUnit.FOOT),
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            MeasureUnit.SECOND,
840f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new StringBuilder(),
841f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new FieldPosition(0)).toString());
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testGram() {
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "testGram",
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 g",
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.format(new Measure(1, MeasureUnit.GRAM)));
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "testGram",
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 G",
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.format(new Measure(1, MeasureUnit.G_FORCE)));
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencies() {
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_1 = new Measure(1.0, Currency.getInstance("USD"));
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_2 = new Measure(2.0, Currency.getInstance("USD"));
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_NEG_1 = new Measure(-1.0, Currency.getInstance("USD"));
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "-1.00 US dollars", mf.format(USD_NEG_1));
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "1.00 US dollars", mf.format(USD_1));
8647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "2.00 US dollars", mf.format(USD_2));
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "-USD1.00", mf.format(USD_NEG_1));
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "USD1.00", mf.format(USD_1));
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "USD2.00", mf.format(USD_2));
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NARROW);
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "-$1.00", mf.format(USD_NEG_1));
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "$1.00", mf.format(USD_1));
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "$2.00", mf.format(USD_2));
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NUMERIC);
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "-$1.00", mf.format(USD_NEG_1));
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "$1.00", mf.format(USD_1));
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "$2.00", mf.format(USD_2));
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.JAPAN, FormatWidth.WIDE);
879f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "-1.00\u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
880f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "1.00\u7C73\u30C9\u30EB", mf.format(USD_1));
881f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "2.00\u7C73\u30C9\u30EB", mf.format(USD_2));
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFieldPosition() {
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.SHORT);
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(new Measure(43.5, MeasureUnit.FOOT), new StringBuffer("123456: "), pos);
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 10, pos.getBeginIndex());
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 11, pos.getEndIndex());
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(new Measure(43, MeasureUnit.FOOT), new StringBuffer(), pos);
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 0, pos.getEndIndex());
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFieldPositionMultiple() {
8997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.SHORT);
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(NumberFormat.Field.INTEGER);
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = fmt.formatMeasures(
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder(),
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(354, MeasureUnit.METER),
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER)).toString();
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "354 m, 23 cm", result);
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // According to javadocs for {@link Format#format} FieldPosition is set to
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // beginning and end of first such field encountered instead of the last
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // such field encountered.
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 3, pos.getEndIndex());
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
9187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(354, MeasureUnit.METER),
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5.4, MeasureUnit.MILLIMETER)).toString();
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 354 m, 23 cm, 5.4 mm", result);
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 23, pos.getBeginIndex());
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 24, pos.getEndIndex());
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder(),
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(3, MeasureUnit.METER),
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5.4, MeasureUnit.MILLIMETER)).toString();
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "3 m, 23 cm, 5.4 mm", result);
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 13, pos.getBeginIndex());
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 14, pos.getEndIndex());
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(3, MeasureUnit.METER),
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5, MeasureUnit.MILLIMETER)).toString();
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 3 m, 23 cm, 5 mm", result);
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 0, pos.getEndIndex());
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.INTEGER);
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(57, MeasureUnit.MILLIMETER)).toString();
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 57 mm", result);
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 8, pos.getBeginIndex());
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 10, pos.getEndIndex());
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatWithList() {
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<Measure> measures = new ArrayList<Measure>(2);
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        measures.add(new Measure(5, MeasureUnit.ACRE));
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        measures.add(new Measure(3000, MeasureUnit.SQUARE_FOOT));
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres, 3,000 square feet", fmt.format(measures));
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres", fmt.format(measures.subList(0, 1)));
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<String> badList = new ArrayList<String>();
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        badList.add("be");
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        badList.add("you");
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.format(badList);
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fail("Expected IllegalArgumentException.");
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException expected) {
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert           // Expected
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatWithArray() {
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure[] measures = new Measure[] {
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5, MeasureUnit.ACRE),
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(3000, MeasureUnit.SQUARE_FOOT),
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres, 3,000 square feet", fmt.format(measures));
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatBadArg() {
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.format("be");
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fail("Expected IllegalArgumentExceptino.");
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Expected
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
998f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    public void testUnitPerUnitResolution() {
999f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // Ticket 11274
1000f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(Locale.ENGLISH, FormatWidth.SHORT);
1001f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1002f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // This fails unless we resolve to MeasureUnit.POUND_PER_SQUARE_INCH
1003f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("", "50 psi",
1004f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                fmt.formatMeasurePerUnit(
1005f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new Measure(50, MeasureUnit.POUND),
1006f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        MeasureUnit.SQUARE_INCH,
1007f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new StringBuilder(),
1008f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new FieldPosition(0)).toString());
1009f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
1010f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testEqHashCode() {
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfeq = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfne = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.WIDE);
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfne2 = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyEqualsHashCode(mf, mfeq, mfne);
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyEqualsHashCode(mf, mfeq, mfne2);
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1019f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1020f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    public void testEqHashCodeOfMeasure() {
1021f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _3feetDouble = new Measure(3.0, MeasureUnit.FOOT);
1022f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _3feetInt = new Measure(3, MeasureUnit.FOOT);
1023f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _4feetInt = new Measure(4, MeasureUnit.FOOT);
1024f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        verifyEqualsHashCode(_3feetDouble, _3feetInt, _4feetInt);
1025f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testGetLocale() {
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.SHORT);
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", ULocale.GERMAN, mf.getLocale(ULocale.VALID_LOCALE));
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerial() {
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureUnit.CELSIUS);
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getInstance(ULocale.FRANCE, FormatWidth.NARROW));
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(Currency.getInstance("EUR"));
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.SHORT));
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getCurrencyFormat(ULocale.ITALIAN));
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerialFormatWidthEnum() {
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // FormatWidth enum values must map to the same ordinal values for all time in order for
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // serialization to work.
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.WIDE", 0, FormatWidth.WIDE.ordinal());
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.SHORT", 1, FormatWidth.SHORT.ordinal());
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.NARROW", 2, FormatWidth.NARROW.ordinal());
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.NUMERIC", 3, FormatWidth.NUMERIC.ordinal());
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyFormatStandInForMeasureFormat() {
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getCurrencyFormat(ULocale.ENGLISH);
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 feet, 5.3 inches",
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 feet, 5.3 inches",
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(70, MeasureUnit.FOOT),
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(5.3, MeasureUnit.INCH)));
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getLocale", ULocale.ENGLISH, mf.getLocale());
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getNumberFormat", ULocale.ENGLISH, mf.getNumberFormat().getLocale(ULocale.VALID_LOCALE));
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getWidth", MeasureFormat.FormatWidth.WIDE, mf.getWidth());
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyFormatLocale() {
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfu = MeasureFormat.getCurrencyFormat(ULocale.FRANCE);
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfj = MeasureFormat.getCurrencyFormat(Locale.FRANCE);
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getCurrencyFormat ULocale/Locale", mfu, mfj);
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testDoubleZero() {
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale en = new ULocale("en");
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance(en);
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMinimumFractionDigits(2);
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(2);
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(en, FormatWidth.WIDE, nf);
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Positive Rounding",
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "4 hours, 23 minutes, 16.00 seconds",
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(4.7, MeasureUnit.HOUR),
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(23, MeasureUnit.MINUTE),
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(16, MeasureUnit.SECOND)));
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Negative Rounding",
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-4 hours, 23 minutes, 16.00 seconds",
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(-4.7, MeasureUnit.HOUR),
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(23, MeasureUnit.MINUTE),
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(16, MeasureUnit.SECOND)));
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
1094f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    static Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> getUnitsToPerParts() {
1095f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
1096f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<String, String>> unitsToPerStrings =
1097f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<String, String>>();
1098f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<String, MeasureUnit> namesToUnits = new HashMap<String, MeasureUnit>();
1099f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
1100f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String type = entry.getKey();
1101f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            // Currency types are always atomic units, so we can skip these
1102f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (type.equals("currency")) {
1103f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                continue;
1104f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1105f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
1106f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                String javaName = toJAVAName(unit);
1107f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                String[] nameParts = javaName.split("_PER_");
1108f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                if (nameParts.length == 1) {
1109f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    namesToUnits.put(nameParts[0], unit);
1110f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                } else if (nameParts.length == 2) {
1111f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitsToPerStrings.put(unit, Pair.of(nameParts[0], nameParts[1]));
1112f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                }
1113f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1114f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1115f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> unitsToPerUnits =
1116f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<MeasureUnit, MeasureUnit>>();
1117f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<String, String>> entry : unitsToPerStrings.entrySet()) {
1118f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<String, String> perStrings = entry.getValue();
1119f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit unit = namesToUnits.get(perStrings.first);
1120f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit perUnit = namesToUnits.get(perStrings.second);
1121f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (unit != null && perUnit != null) {
1122f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                unitsToPerUnits.put(entry.getKey(), Pair.of(unit, perUnit));
1123f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1124f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1125f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        return unitsToPerUnits;
1126f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
1127f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1128f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
1129f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    // for MeasureFormat during the release process.
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXHConstants(String thisVersion) {
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String code = unit.getSubtype();
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toCamelCase(unit);
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, name, unit);
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("#ifndef U_HIDE_DRAFT_API");
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    /**");
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Returns unit of " + type + ": " + code + ".");
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Caller owns returned value and must free it.");
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * @param status ICU error code.");
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @draft ICU " + getVersion(javaName, thisVersion));
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU " + getVersion(javaName, thisVersion));
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     */");
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("    static MeasureUnit *create%s(UErrorCode &status);\n\n", name);
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("#endif /* U_HIDE_DRAFT_API */");
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void checkForDup(
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Map<String, MeasureUnit> seen, String name, MeasureUnit unit) {
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (seen.containsKey(name)) {
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException("\nCollision!!" + unit + ", " + seen.get(name));
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            seen.put(name, unit);
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void updateJAVAVersions(String thisVersion) {
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, javaName, unit);
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!JAVA_VERSION_MAP.containsKey(javaName)) {
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.printf("        {\"%s\", \"%s\"},\n", javaName, thisVersion);
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static TreeMap<String, List<MeasureUnit>> getAllUnits() {
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = new TreeMap<String, List<MeasureUnit>>();
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String type : MeasureUnit.getAvailableTypes()) {
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArrayList<MeasureUnit> units = new ArrayList<MeasureUnit>(MeasureUnit.getAvailable(type));
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Collections.sort(
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    units,
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    new Comparator<MeasureUnit>() {
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        public int compare(MeasureUnit o1, MeasureUnit o2) {
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            return o1.getSubtype().compareTo(o2.getSubtype());
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    });
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            allUnits.put(type, units);
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return allUnits;
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXConstants() {
1216f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("");
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
1218f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const int32_t gOffsets[] = {");
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int index = 0;
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.printf("    %d,\n", index);
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            index += entry.getValue().size();
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    %d\n", index);
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const int32_t gIndexes[] = {");
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        index = 0;
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.printf("    %d,\n", index);
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!entry.getKey().equals("currency")) {
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                index += entry.getValue().size();
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    %d\n", index);
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
1239f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be sorted alphabetically.");
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const char * const gTypes[] = {");
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean first = true;
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!first) {
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(",");
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.print("    \"" + entry.getKey() + "\"");
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = false;
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
1252f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be grouped by type and sorted alphabetically within each type.");
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const char * const gSubTypes[] = {");
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        first = true;
1255f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        int offset = 0;
1256f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        int typeIdx = 0;
1257f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Integer> measureUnitToOffset = new HashMap<MeasureUnit, Integer>();
1258f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<Integer, Integer>> measureUnitToTypeSubType =
1259f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<Integer, Integer>>();
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
1261f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int subTypeIdx = 0;
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!first) {
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println(",");
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.print("    \"" + unit.getSubtype() + "\"");
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                first = false;
1268f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                measureUnitToOffset.put(unit, offset);
1269f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                measureUnitToTypeSubType.put(unit, Pair.of(typeIdx, subTypeIdx));
1270f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                offset++;
1271f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                subTypeIdx++;
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1273f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            typeIdx++;
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1279f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // Build unit per unit offsets to corresponding type sub types sorted by
1280f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // unit first and then per unit.
1281f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>> unitPerUnitOffsetsToTypeSubType
1282f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                = new TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>>();
1283f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> entry
1284f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : getUnitsToPerParts().entrySet()) {
1285f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<MeasureUnit, MeasureUnit> unitPerUnit = entry.getValue();
1286f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            unitPerUnitOffsetsToTypeSubType.put(
1287f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    OrderedPair.of(
1288f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            measureUnitToOffset.get(unitPerUnit.first),
1289f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            measureUnitToOffset.get(unitPerUnit.second)),
1290f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    measureUnitToTypeSubType.get(entry.getKey()));
1291f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1292f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1293f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be sorted by first value and then second value.");
1294f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("static int32_t unitPerUnitToSingleUnit[][4] = {");
1295f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        first = true;
1296f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<OrderedPair<Integer, Integer>, Pair<Integer, Integer>> entry
1297f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : unitPerUnitOffsetsToTypeSubType.entrySet()) {
1298f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (!first) {
1299f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                System.out.println(",");
1300f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1301f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            first = false;
1302f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            OrderedPair<Integer, Integer> unitPerUnitOffsets = entry.getKey();
1303f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<Integer, Integer> typeSubType = entry.getValue();
1304f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            System.out.printf("        {%d, %d, %d, %d}",
1305f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitPerUnitOffsets.first,
1306f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitPerUnitOffsets.second,
1307f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    typeSubType.first,
1308f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    typeSubType.second);
1309f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1310f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
1311f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("};");
1312f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
1313f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1314f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
1316f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toCamelCase(unit);
1323f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                Pair<Integer, Integer> typeSubType = measureUnitToTypeSubType.get(unit);
1324f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                if (typeSubType == null) {
1325f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    throw new IllegalStateException();
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
1327f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                checkForDup(seen, name, unit);
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name);
1329f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                System.out.printf("    return MeasureUnit::create(%d, %d, status);\n",
1330f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        typeSubType.first, typeSubType.second);
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("}");
1332f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                System.out.println();
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1334f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String toCamelCase(MeasureUnit unit) {
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder result = new StringBuilder();
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean caps = true;
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String code = unit.getSubtype();
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len = code.length();
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < len; i++) {
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char ch = code.charAt(i);
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch == '-') {
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                caps = true;
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (caps) {
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result.append(Character.toUpperCase(ch));
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                caps = false;
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result.append(ch);
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result.toString();
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static boolean isTypeHidden(String type) {
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return "currency".equals(type);
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateBackwardCompatibilityTest(String version) {
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    public void TestCompatible%s() {\n", version.replace(".", "_"));
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("        MeasureUnit[] units = {");
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count = 0;
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(entry.getKey())) {
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, javaName, unit);
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("                MeasureUnit.%s,\n", javaName);
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                count++;
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("        };");
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("        assertEquals(\"\",  %d, units.length);\n", count);
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    }");
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXBackwardCompatibilityTest(String version) {
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
13897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("void MeasureFormatTest::TestCompatible%s() {\n", version.replace(".", "_"));
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    UErrorCode status = U_ZERO_ERROR;");
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    LocalPointer<MeasureUnit> measureUnit;");
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(entry.getKey())) {
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String camelCase = toCamelCase(unit);
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, camelCase, unit);
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("    measureUnit.adoptInstead(MeasureUnit::create%s(status));\n", camelCase);
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    assertSuccess(\"\", status);");
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("}");
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static String toJAVAName(MeasureUnit unit) {
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String code = unit.getSubtype();
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String type = unit.getType();
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String name = code.toUpperCase(Locale.ENGLISH).replace("-", "_");
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (type.equals("angle")) {
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (code.equals("minute") || code.equals("second")) {
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                name = "ARC_" + name;
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return name;
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateConstants(String thisVersion) {
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(type)) {
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toJAVAName(unit);
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String code = unit.getSubtype();
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, name, unit);
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    /**");
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Constant for unit of " + type +
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ": " +
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        code);
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Special case JAVA had old constants for time from before.
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ("duration".equals(type) && TIME_CODES.contains(code)) {
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU 4.0");
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else if (isDraft(name)) {
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @draft ICU " + getVersion(name, thisVersion));
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @provisional This API might change or be removed in a future release.");
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU " + getVersion(name, thisVersion));
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    */");
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ("duration".equals(type) && TIME_CODES.contains(code)) {
14517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("    public static final TimeUnit " + name + " = (TimeUnit) MeasureUnit.internalGetInstance(\"" +
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            type +
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\", \"" +
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            code +
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\");");
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("    public static final MeasureUnit " + name + " = MeasureUnit.internalGetInstance(\"" +
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            type +
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\", \"" +
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            code +
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\");");
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println();
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1466f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    private static HashMap<Pair<MeasureUnit, MeasureUnit>, MeasureUnit>unitPerUnitToSingleUnit =");
1467f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("            new HashMap<Pair<MeasureUnit, MeasureUnit>, MeasureUnit>();");
1468f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
1469f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    static {");
1470f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> unitPerUnitEntry
1471f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : getUnitsToPerParts().entrySet()) {
1472f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<MeasureUnit, MeasureUnit> unitPerUnit = unitPerUnitEntry.getValue();
1473f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            System.out.println("        unitPerUnitToSingleUnit.put(Pair.<MeasureUnit, MeasureUnit>of(MeasureUnit." + toJAVAName(unitPerUnit.first) + ", MeasureUnit." + toJAVAName(unitPerUnit.second) + "), MeasureUnit." + toJAVAName(unitPerUnitEntry.getKey()) + ");");
1474f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1475f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    }");
14767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String getVersion(String javaName, String thisVersion) {
14797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String version = JAVA_VERSION_MAP.get(javaName);
14807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (version == null) {
14817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return thisVersion;
14827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return version;
14847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static boolean isDraft(String javaName) {
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String version = JAVA_VERSION_MAP.get(javaName);
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (version == null) {
14897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return true;
14907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return DRAFT_VERSION_SET.contains(version);
14927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
14937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public <T extends Serializable> void checkStreamingEquality(T item) {
14957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
14967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
14977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOut);
14987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          objectOutputStream.writeObject(item);
14997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          objectOutputStream.close();
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          byte[] contents = byteOut.toByteArray();
15017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          logln("bytes: " + contents.length + "; " + item.getClass() + ": " + showBytes(contents));
15027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ByteArrayInputStream byteIn = new ByteArrayInputStream(contents);
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ObjectInputStream objectInputStream = new ObjectInputStream(byteIn);
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          Object obj = objectInputStream.readObject();
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertEquals("Streamed Object equals ", item, obj);
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IOException e) {
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          e.printStackTrace();
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertNull("Test Serialization " + item.getClass(), e);
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ClassNotFoundException e) {
15107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertNull("Test Serialization " + item.getClass(), e);
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param contents
15167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return
15177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private String showBytes(byte[] contents) {
15197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      StringBuilder b = new StringBuilder('[');
15207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      for (int i = 0; i < contents.length; ++i) {
15217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int item = contents[i] & 0xFF;
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (item >= 0x20 && item <= 0x7F) {
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          b.append((char) item);
15247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          b.append('(').append(Utility.hex(item, 2)).append(')');
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return b.append(']').toString();
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void verifyEqualsHashCode(Object o, Object eq, Object ne) {
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeSame", o, o);
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeEq", o, eq);
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeNe", o, ne);
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeEqTrans", eq, ne);
15367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeHashEq", o.hashCode(), eq.hashCode());
15377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // May be a flaky test, but generally should be true.
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // May need to comment this out later.
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeHashNe", o.hashCode(), ne.hashCode());
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static class MeasureUnitHandler implements SerializableTest.Handler
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Object[] getTestObjects()
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit items[] = {
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureUnit.CELSIUS,
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    Currency.getInstance("EUR")
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return items;
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public boolean hasSameBehavior(Object a, Object b)
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit a1 = (MeasureUnit) a;
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit b1 = (MeasureUnit) b;
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return a1.getType().equals(b1.getType())
15587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getSubtype().equals(b1.getSubtype());
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static class MeasureFormatHandler  implements SerializableTest.Handler
15637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
15647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Object[] getTestObjects()
15657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
15667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat items[] = {
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureFormat.getInstance(ULocale.FRANCE, FormatWidth.SHORT),
15687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureFormat.getInstance(
15697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ULocale.FRANCE,
15707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            FormatWidth.WIDE,
15717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            NumberFormat.getIntegerInstance(ULocale.CANADA_FRENCH)),
15727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
15737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return items;
15747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public boolean hasSameBehavior(Object a, Object b)
15767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
15777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat a1 = (MeasureFormat) a;
15787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat b1 = (MeasureFormat) b;
15797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return a1.getLocale().equals(b1.getLocale())
15807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getWidth().equals(b1.getWidth())
15817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getNumberFormat().equals(b1.getNumberFormat())
15827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ;
15837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
15847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1586