12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert * Copyright (C) 2013-2016, International Business Machines Corporation and
6db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer * others. All Rights Reserved.
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayOutputStream;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectOutputStream;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.Serializable;
172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.lang.reflect.Field;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.ArrayList;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Comparator;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashMap;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashSet;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
2787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubertimport java.util.Set;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.TreeMap;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.serializable.SerializableTestUtility;
34f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubertimport com.ibm.icu.impl.Pair;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Utility;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.math.BigDecimal;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.MeasureFormat.FormatWidth;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Measure;
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.MeasureUnit;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeUnit;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeUnitAmount;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * See https://sites.google.com/site/icusite/processes/release/tasks/standards?pli=1
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for information on how to update with each new release.
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author markdavis
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class MeasureUnitTest extends TestFmwk {
53441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
54f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    static class OrderedPair<F extends Comparable, S extends Comparable> extends Pair<F, S> implements Comparable<OrderedPair<F, S>> {
55f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
56f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        OrderedPair(F first, S second) {
57f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            super(first, second);
58f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
59441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
60f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        public static <F extends Comparable, S extends Comparable> OrderedPair<F, S> of(F first, S second) {
61f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (first == null || second == null) {
62f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                throw new IllegalArgumentException("OrderedPair.of requires non null values.");
63f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
64441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            return new OrderedPair<F, S>(first, second);
65f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
66f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
68f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        public int compareTo(OrderedPair<F, S> other) {
69f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int result = first.compareTo(other.first);
70f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (result != 0) {
71f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                return result;
72f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
73f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            return second.compareTo(other.second);
74f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
75f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
76441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    private static final String[] DRAFT_VERSIONS = {"57", "58"};
78441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashSet<String> DRAFT_VERSION_SET = new HashSet<String>();
80441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashSet<String> TIME_CODES = new HashSet<String>();
82441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final String[][] JAVA_VERSIONS = {
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"G_FORCE", "53"},
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DEGREE", "53"},
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ARC_MINUTE", "53"},
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ARC_SECOND", "53"},
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ACRE", "53"},
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTARE", "53"},
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_FOOT", "53"},
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_KILOMETER", "53"},
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_METER", "53"},
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_MILE", "53"},
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLISECOND", "53"},
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CENTIMETER", "53"},
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FOOT", "53"},
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"INCH", "53"},
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOMETER", "53"},
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LIGHT_YEAR", "53"},
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER", "53"},
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE", "53"},
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIMETER", "53"},
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PICOMETER", "53"},
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"YARD", "53"},
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GRAM", "53"},
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOGRAM", "53"},
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OUNCE", "53"},
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"POUND", "53"},
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HORSEPOWER", "53"},
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOWATT", "53"},
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"WATT", "53"},
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTOPASCAL", "53"},
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"INCH_HG", "53"},
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIBAR", "53"},
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOMETER_PER_HOUR", "53"},
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER_PER_SECOND", "53"},
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE_PER_HOUR", "53"},
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CELSIUS", "53"},
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FAHRENHEIT", "53"},
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_KILOMETER", "53"},
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_MILE", "53"},
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LITER", "53"},
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"YEAR", "53"},
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MONTH", "53"},
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"WEEK", "53"},
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DAY", "53"},
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HOUR", "53"},
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MINUTE", "53"},
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SECOND", "53"},
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METER_PER_SECOND_SQUARED", "54"},
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"RADIAN", "54"},
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_CENTIMETER", "54"},
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_INCH", "54"},
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"SQUARE_YARD", "54"},
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LITER_PER_KILOMETER", "54"},
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILE_PER_GALLON", "54"},
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BIT", "54"},
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BYTE", "54"},
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGABIT", "54"},
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGABYTE", "54"},
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOBIT", "54"},
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOBYTE", "54"},
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGABIT", "54"},
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGABYTE", "54"},
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TERABIT", "54"},
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TERABYTE", "54"},
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROSECOND", "54"},
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NANOSECOND", "54"},
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"AMPERE", "54"},
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIAMPERE", "54"},
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OHM", "54"},
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"VOLT", "54"},
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CALORIE", "54"},
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FOODCALORIE", "54"},
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"JOULE", "54"},
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOCALORIE", "54"},
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOJOULE", "54"},
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOWATT_HOUR", "54"},
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGAHERTZ", "54"},
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HERTZ", "54"},
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KILOHERTZ", "54"},
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGAHERTZ", "54"},
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ASTRONOMICAL_UNIT", "54"},
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DECIMETER", "54"},
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FATHOM", "54"},
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FURLONG", "54"},
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROMETER", "54"},
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NANOMETER", "54"},
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"NAUTICAL_MILE", "54"},
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PARSEC", "54"},
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"LUX", "54"},
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CARAT", "54"},
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"METRIC_TON", "54"},
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MICROGRAM", "54"},
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIGRAM", "54"},
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"OUNCE_TROY", "54"},
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"STONE", "54"},
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TON", "54"},
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GIGAWATT", "54"},
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGAWATT", "54"},
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIWATT", "54"},
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLIMETER_OF_MERCURY", "54"},
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"POUND_PER_SQUARE_INCH", "54"},
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KARAT", "54"},
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"KELVIN", "54"},
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"ACRE_FOOT", "54"},
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"BUSHEL", "54"},
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CENTILITER", "54"},
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_CENTIMETER", "54"},
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_FOOT", "54"},
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_INCH", "54"},
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_METER", "54"},
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUBIC_YARD", "54"},
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"CUP", "54"},
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"DECILITER", "54"},
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"FLUID_OUNCE", "54"},
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"GALLON", "54"},
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"HECTOLITER", "54"},
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MEGALITER", "54"},
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"MILLILITER", "54"},
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"PINT", "54"},
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"QUART", "54"},
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TABLESPOON", "54"},
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {"TEASPOON", "54"},
205bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"GENERIC_TEMPERATURE", "56"},
206bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"REVOLUTION_ANGLE", "56"},
207bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"LITER_PER_100KILOMETERS", "56"},
208bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"CENTURY", "56"},
209bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"MILE_SCANDINAVIAN", "56"},
210bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"KNOT", "56"},
211bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"CUP_METRIC", "56"},
212bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        {"PINT_METRIC", "56"},
21387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        {"MILLIGRAM_PER_DECILITER", "57"},
21487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        {"MILLIMOLE_PER_LITER", "57"},
21587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        {"PART_PER_MILLION", "57"},
21687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        {"MILE_PER_GALLON_IMPERIAL", "57"},
21787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        {"GALLON_IMPERIAL", "57"},
2182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        {"EAST", "58"},
2192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        {"NORTH", "58"},
2202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        {"SOUTH", "58"},
2212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        {"WEST", "58"},
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
223441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final HashMap<String, String> JAVA_VERSION_MAP = new HashMap<String, String>();
225441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("year");
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("month");
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("week");
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("day");
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("hour");
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("minute");
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TIME_CODES.add("second");
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String verNum : DRAFT_VERSIONS) {
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DRAFT_VERSION_SET.add(verNum);
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String[] funcNameAndVersion : JAVA_VERSIONS) {
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            JAVA_VERSION_MAP.put(funcNameAndVersion[0], funcNameAndVersion[1]);
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
241441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @author markdavis
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    // TODO(junit): resolve
2472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//    public static void main(String[] args) {
2482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        //generateConstants(); if (true) return;
2492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//
2502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        // Ticket #12034 deadlock on multi-threaded static init of MeasureUnit.
2512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        // The code below reliably deadlocks with ICU 56.
2522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        // The test is here in main() rather than in a test function so it can be made to run
2532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        // before anything else.
2542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        Thread thread = new Thread()  {
2552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//            @Override
2562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//            public void run() {
2572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//                @SuppressWarnings("unused")
2582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//                Set<String> measureUnitTypes = MeasureUnit.getAvailableTypes();
2592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//            }
2602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        };
2612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        thread.start();
2622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        @SuppressWarnings("unused")
2632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        Currency cur = Currency.getInstance(ULocale.ENGLISH);
2642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        try {thread.join();} catch(InterruptedException e) {};
2652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        // System.out.println("Done with MeasureUnit thread test.");
2662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//
2672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//        new MeasureUnitTest().run(args);
2682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert//    }
269441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert/*
2712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testZZZ() {
2732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // various generateXXX calls go here, see
2742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // http://site.icu-project.org/design/formatting/measureformat/updating-measure-unit
2752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        // use this test to run each of the ollowing in succession
2762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //generateConstants("58"); // for MeasureUnit.java, update generated MeasureUnit constants
2772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //generateBackwardCompatibilityTest("58.1"); // for MeasureUnitTest.java, create TestCompatible58_1
2782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //generateCXXHConstants("58"); // for measunit.h, update generated createXXX methods
2792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //generateCXXConstants(); // for measunit.cpp, update generated code
2802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        //generateCXXBackwardCompatibilityTest("58.1"); // for measfmttest.cpp, create TestCompatible58_1
2812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        updateJAVAVersions("58"); // for MeasureUnitTest.java, JAVA_VERSIONS
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert*/
284441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatible53_1() {
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureUnit[] units = {
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.G_FORCE,
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DEGREE,
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_MINUTE,
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_SECOND,
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE,
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTARE,
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_FOOT,
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_METER,
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_MILE,
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLISECOND,
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTIMETER,
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOOT,
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH,
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER,
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LIGHT_YEAR,
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER,
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE,
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER,
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PICOMETER,
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YARD,
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GRAM,
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOGRAM,
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE,
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND,
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HORSEPOWER,
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT,
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WATT,
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOPASCAL,
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH_HG,
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIBAR,
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND,
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_HOUR,
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CELSIUS,
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FAHRENHEIT,
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_MILE,
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER,
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR,
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", 46, units.length);
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
337441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
3382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCompatible54_1() {
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureUnit[] units = {
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.G_FORCE,
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_MINUTE,
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ARC_SECOND,
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DEGREE,
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.RADIAN,
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE,
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTARE,
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_FOOT,
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_INCH,
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_METER,
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_MILE,
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SQUARE_YARD,
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_GALLON,
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BIT,
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BYTE,
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGABIT,
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGABYTE,
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOBIT,
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOBYTE,
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGABIT,
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGABYTE,
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TERABIT,
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TERABYTE,
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROSECOND,
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLISECOND,
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NANOSECOND,
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR,
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.AMPERE,
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIAMPERE,
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OHM,
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.VOLT,
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CALORIE,
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOODCALORIE,
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.JOULE,
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOCALORIE,
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOJOULE,
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT_HOUR,
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGAHERTZ,
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HERTZ,
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOHERTZ,
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGAHERTZ,
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTIMETER,
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DECIMETER,
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FATHOM,
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FOOT,
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FURLONG,
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH,
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER,
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LIGHT_YEAR,
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER,
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROMETER,
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE,
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER,
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NANOMETER,
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.NAUTICAL_MILE,
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PARSEC,
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PICOMETER,
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YARD,
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LUX,
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CARAT,
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GRAM,
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOGRAM,
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METRIC_TON,
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MICROGRAM,
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIGRAM,
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE,
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.OUNCE_TROY,
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND,
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.STONE,
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TON,
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GIGAWATT,
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HORSEPOWER,
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOWATT,
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGAWATT,
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIWATT,
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WATT,
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOPASCAL,
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.INCH_HG,
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIBAR,
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KARAT,
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.METER_PER_SECOND,
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILE_PER_HOUR,
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CELSIUS,
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FAHRENHEIT,
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.KELVIN,
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.ACRE_FOOT,
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.BUSHEL,
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CENTILITER,
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_FOOT,
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_INCH,
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_METER,
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_MILE,
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUBIC_YARD,
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.CUP,
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DECILITER,
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.FLUID_OUNCE,
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.GALLON,
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HECTOLITER,
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.LITER,
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MEGALITER,
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MILLILITER,
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.PINT,
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.QUART,
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TABLESPOON,
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.TEASPOON,
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("",  121, units.length);
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
465441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
4662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
467bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestCompatible55_1() {
468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        MeasureUnit[] units = {
469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.G_FORCE,
470bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
471bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ARC_MINUTE,
472bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ARC_SECOND,
473bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DEGREE,
474bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.RADIAN,
475bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ACRE,
476bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTARE,
477bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
478bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_FOOT,
479bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_INCH,
480bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
481bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_METER,
482bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_MILE,
483bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_YARD,
484bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
485bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE_PER_GALLON,
486bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BIT,
487bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BYTE,
488bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGABIT,
489bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGABYTE,
490bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOBIT,
491bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOBYTE,
492bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGABIT,
493bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGABYTE,
494bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TERABIT,
495bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TERABYTE,
496bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DAY,
497bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HOUR,
498bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROSECOND,
499bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLISECOND,
500bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MINUTE,
501bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MONTH,
502bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NANOSECOND,
503bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SECOND,
504bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.WEEK,
505bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.YEAR,
506bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.AMPERE,
507bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIAMPERE,
508bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OHM,
509bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.VOLT,
510bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CALORIE,
511bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FOODCALORIE,
512bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.JOULE,
513bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOCALORIE,
514bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOJOULE,
515bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOWATT_HOUR,
516bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGAHERTZ,
517bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HERTZ,
518bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOHERTZ,
519bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGAHERTZ,
520bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
521bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CENTIMETER,
522bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DECIMETER,
523bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FATHOM,
524bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FOOT,
525bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FURLONG,
526bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.INCH,
527bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOMETER,
528bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LIGHT_YEAR,
529bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER,
530bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROMETER,
531bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE,
532bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIMETER,
533bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NANOMETER,
534bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NAUTICAL_MILE,
535bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PARSEC,
536bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PICOMETER,
537bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.YARD,
538bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LUX,
539bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CARAT,
540bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GRAM,
541bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOGRAM,
542bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METRIC_TON,
543bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROGRAM,
544bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIGRAM,
545bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OUNCE,
546bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OUNCE_TROY,
547bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.POUND,
548bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.STONE,
549bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TON,
550bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGAWATT,
551bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HORSEPOWER,
552bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOWATT,
553bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGAWATT,
554bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIWATT,
555bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.WATT,
556bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTOPASCAL,
557bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.INCH_HG,
558bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIBAR,
559bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
560bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
561bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KARAT,
562bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
563bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER_PER_SECOND,
564bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE_PER_HOUR,
565bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CELSIUS,
566bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FAHRENHEIT,
567bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GENERIC_TEMPERATURE,
568bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KELVIN,
569bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ACRE_FOOT,
570bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BUSHEL,
571bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CENTILITER,
572bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
573bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_FOOT,
574bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_INCH,
575bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
576bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_METER,
577bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_MILE,
578bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_YARD,
579bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUP,
580bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DECILITER,
581bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FLUID_OUNCE,
582bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GALLON,
583bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTOLITER,
584bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LITER,
585bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGALITER,
586bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLILITER,
587bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PINT,
588bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.QUART,
589bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TABLESPOON,
590bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TEASPOON,
591bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        };
592bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        assertEquals("",  122, units.length);
593bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
594bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
5952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
596bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void TestCompatible56_1() {
597bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        MeasureUnit[] units = {
598bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.G_FORCE,
599bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
600bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ARC_MINUTE,
601bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ARC_SECOND,
602bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DEGREE,
603bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.RADIAN,
604bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.REVOLUTION_ANGLE,
605bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ACRE,
606bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTARE,
607bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
608bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_FOOT,
609bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_INCH,
610bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
611bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_METER,
612bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_MILE,
613bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SQUARE_YARD,
614bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LITER_PER_100KILOMETERS,
615bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
616bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE_PER_GALLON,
617bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BIT,
618bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BYTE,
619bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGABIT,
620bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGABYTE,
621bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOBIT,
622bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOBYTE,
623bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGABIT,
624bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGABYTE,
625bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TERABIT,
626bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TERABYTE,
627bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CENTURY,
628bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DAY,
629bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HOUR,
630bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROSECOND,
631bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLISECOND,
632bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MINUTE,
633bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MONTH,
634bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NANOSECOND,
635bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.SECOND,
636bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.WEEK,
637bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.YEAR,
638bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.AMPERE,
639bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIAMPERE,
640bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OHM,
641bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.VOLT,
642bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CALORIE,
643bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FOODCALORIE,
644bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.JOULE,
645bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOCALORIE,
646bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOJOULE,
647bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOWATT_HOUR,
648bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGAHERTZ,
649bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HERTZ,
650bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOHERTZ,
651bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGAHERTZ,
652bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
653bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CENTIMETER,
654bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DECIMETER,
655bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FATHOM,
656bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FOOT,
657bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FURLONG,
658bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.INCH,
659bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOMETER,
660bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LIGHT_YEAR,
661bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER,
662bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROMETER,
663bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE,
664bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE_SCANDINAVIAN,
665bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIMETER,
666bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NANOMETER,
667bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.NAUTICAL_MILE,
668bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PARSEC,
669bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PICOMETER,
670bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.YARD,
671bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LUX,
672bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CARAT,
673bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GRAM,
674bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOGRAM,
675bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METRIC_TON,
676bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MICROGRAM,
677bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIGRAM,
678bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OUNCE,
679bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.OUNCE_TROY,
680bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.POUND,
681bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.STONE,
682bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TON,
683bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GIGAWATT,
684bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HORSEPOWER,
685bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOWATT,
686bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGAWATT,
687bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIWATT,
688bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.WATT,
689bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTOPASCAL,
690bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.INCH_HG,
691bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIBAR,
692bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
693bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
694bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KARAT,
695bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
696bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KNOT,
697bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.METER_PER_SECOND,
698bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILE_PER_HOUR,
699bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CELSIUS,
700bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FAHRENHEIT,
701bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GENERIC_TEMPERATURE,
702bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.KELVIN,
703bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.ACRE_FOOT,
704bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.BUSHEL,
705bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CENTILITER,
706bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
707bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_FOOT,
708bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_INCH,
709bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
710bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_METER,
711bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_MILE,
712bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUBIC_YARD,
713bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUP,
714bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.CUP_METRIC,
715bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.DECILITER,
716bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.FLUID_OUNCE,
717bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.GALLON,
718bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.HECTOLITER,
719bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.LITER,
720bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MEGALITER,
721bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.MILLILITER,
722bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PINT,
723bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.PINT_METRIC,
724bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.QUART,
725bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TABLESPOON,
726bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                MeasureUnit.TEASPOON,
727bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        };
728bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        assertEquals("",  129, units.length);
729bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
730bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
7312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
73287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void TestCompatible57_1() {
73387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        MeasureUnit[] units = {
73487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.G_FORCE,
73587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
73687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.ARC_MINUTE,
73787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.ARC_SECOND,
73887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.DEGREE,
73987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.RADIAN,
74087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.REVOLUTION_ANGLE,
74187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.ACRE,
74287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HECTARE,
74387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
74487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_FOOT,
74587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_INCH,
74687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
74787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_METER,
74887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_MILE,
74987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SQUARE_YARD,
75087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KARAT,
75187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIGRAM_PER_DECILITER,
75287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIMOLE_PER_LITER,
75387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.PART_PER_MILLION,
75487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.LITER_PER_100KILOMETERS,
75587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
75687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILE_PER_GALLON,
75787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILE_PER_GALLON_IMPERIAL,
75887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.BIT,
75987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.BYTE,
76087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GIGABIT,
76187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GIGABYTE,
76287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOBIT,
76387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOBYTE,
76487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MEGABIT,
76587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MEGABYTE,
76687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.TERABIT,
76787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.TERABYTE,
76887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CENTURY,
76987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.DAY,
77087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HOUR,
77187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MICROSECOND,
77287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLISECOND,
77387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MINUTE,
77487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MONTH,
77587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.NANOSECOND,
77687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.SECOND,
77787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.WEEK,
77887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.YEAR,
77987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.AMPERE,
78087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIAMPERE,
78187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.OHM,
78287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.VOLT,
78387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CALORIE,
78487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FOODCALORIE,
78587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.JOULE,
78687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOCALORIE,
78787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOJOULE,
78887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOWATT_HOUR,
78987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GIGAHERTZ,
79087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HERTZ,
79187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOHERTZ,
79287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MEGAHERTZ,
79387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
79487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CENTIMETER,
79587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.DECIMETER,
79687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FATHOM,
79787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FOOT,
79887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FURLONG,
79987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.INCH,
80087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOMETER,
80187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.LIGHT_YEAR,
80287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.METER,
80387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MICROMETER,
80487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILE,
80587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILE_SCANDINAVIAN,
80687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIMETER,
80787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.NANOMETER,
80887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.NAUTICAL_MILE,
80987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.PARSEC,
81087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.PICOMETER,
81187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.YARD,
81287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.LUX,
81387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CARAT,
81487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GRAM,
81587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOGRAM,
81687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.METRIC_TON,
81787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MICROGRAM,
81887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIGRAM,
81987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.OUNCE,
82087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.OUNCE_TROY,
82187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.POUND,
82287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.STONE,
82387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.TON,
82487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GIGAWATT,
82587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HORSEPOWER,
82687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOWATT,
82787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MEGAWATT,
82887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIWATT,
82987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.WATT,
83087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HECTOPASCAL,
83187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.INCH_HG,
83287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIBAR,
83387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
83487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
83587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
83687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KNOT,
83787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.METER_PER_SECOND,
83887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILE_PER_HOUR,
83987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CELSIUS,
84087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FAHRENHEIT,
84187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GENERIC_TEMPERATURE,
84287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.KELVIN,
84387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.ACRE_FOOT,
84487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.BUSHEL,
84587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CENTILITER,
84687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
84787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_FOOT,
84887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_INCH,
84987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
85087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_METER,
85187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_MILE,
85287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUBIC_YARD,
85387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUP,
85487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.CUP_METRIC,
85587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.DECILITER,
85687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.FLUID_OUNCE,
85787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GALLON,
85887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.GALLON_IMPERIAL,
85987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.HECTOLITER,
86087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.LITER,
86187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MEGALITER,
86287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.MILLILITER,
86387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.PINT,
86487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.PINT_METRIC,
86587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.QUART,
86687255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.TABLESPOON,
86787255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert                MeasureUnit.TEASPOON,
86887255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        };
86987255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertEquals("",  134, units.length);
87087255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
87187255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert
8722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void TestCompatible58_1() {
8742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        MeasureUnit[] units = {
8752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.G_FORCE,
8762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.METER_PER_SECOND_SQUARED,
8772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.ARC_MINUTE,
8782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.ARC_SECOND,
8792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.DEGREE,
8802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.RADIAN,
8812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.REVOLUTION_ANGLE,
8822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.ACRE,
8832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HECTARE,
8842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_CENTIMETER,
8852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_FOOT,
8862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_INCH,
8872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_KILOMETER,
8882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_METER,
8892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_MILE,
8902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SQUARE_YARD,
8912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KARAT,
8922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIGRAM_PER_DECILITER,
8932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIMOLE_PER_LITER,
8942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.PART_PER_MILLION,
8952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.LITER_PER_100KILOMETERS,
8962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.LITER_PER_KILOMETER,
8972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILE_PER_GALLON,
8982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILE_PER_GALLON_IMPERIAL,
8992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.EAST,
9002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.NORTH,
9012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SOUTH,
9022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.WEST,
9032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.BIT,
9042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.BYTE,
9052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GIGABIT,
9062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GIGABYTE,
9072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOBIT,
9082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOBYTE,
9092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MEGABIT,
9102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MEGABYTE,
9112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.TERABIT,
9122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.TERABYTE,
9132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CENTURY,
9142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.DAY,
9152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HOUR,
9162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MICROSECOND,
9172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLISECOND,
9182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MINUTE,
9192d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MONTH,
9202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.NANOSECOND,
9212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.SECOND,
9222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.WEEK,
9232d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.YEAR,
9242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.AMPERE,
9252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIAMPERE,
9262d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.OHM,
9272d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.VOLT,
9282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CALORIE,
9292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FOODCALORIE,
9302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.JOULE,
9312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOCALORIE,
9322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOJOULE,
9332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOWATT_HOUR,
9342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GIGAHERTZ,
9352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HERTZ,
9362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOHERTZ,
9372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MEGAHERTZ,
9382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.ASTRONOMICAL_UNIT,
9392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CENTIMETER,
9402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.DECIMETER,
9412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FATHOM,
9422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FOOT,
9432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FURLONG,
9442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.INCH,
9452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOMETER,
9462d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.LIGHT_YEAR,
9472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.METER,
9482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MICROMETER,
9492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILE,
9502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILE_SCANDINAVIAN,
9512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIMETER,
9522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.NANOMETER,
9532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.NAUTICAL_MILE,
9542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.PARSEC,
9552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.PICOMETER,
9562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.YARD,
9572d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.LUX,
9582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CARAT,
9592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GRAM,
9602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOGRAM,
9612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.METRIC_TON,
9622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MICROGRAM,
9632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIGRAM,
9642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.OUNCE,
9652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.OUNCE_TROY,
9662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.POUND,
9672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.STONE,
9682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.TON,
9692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GIGAWATT,
9702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HORSEPOWER,
9712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOWATT,
9722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MEGAWATT,
9732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIWATT,
9742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.WATT,
9752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HECTOPASCAL,
9762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.INCH_HG,
9772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIBAR,
9782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLIMETER_OF_MERCURY,
9792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.POUND_PER_SQUARE_INCH,
9802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KILOMETER_PER_HOUR,
9812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KNOT,
9822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.METER_PER_SECOND,
9832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILE_PER_HOUR,
9842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CELSIUS,
9852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FAHRENHEIT,
9862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GENERIC_TEMPERATURE,
9872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.KELVIN,
9882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.ACRE_FOOT,
9892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.BUSHEL,
9902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CENTILITER,
9912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_CENTIMETER,
9922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_FOOT,
9932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_INCH,
9942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_KILOMETER,
9952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_METER,
9962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_MILE,
9972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUBIC_YARD,
9982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUP,
9992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.CUP_METRIC,
10002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.DECILITER,
10012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.FLUID_OUNCE,
10022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GALLON,
10032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.GALLON_IMPERIAL,
10042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.HECTOLITER,
10052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.LITER,
10062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MEGALITER,
10072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.MILLILITER,
10082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.PINT,
10092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.PINT_METRIC,
10102d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.QUART,
10112d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.TABLESPOON,
10122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                MeasureUnit.TEASPOON,
10132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        };
10142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("",  138, units.length);
10152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
10162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
10172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestExamplesInDocs() {
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFr = MeasureFormat.getInstance(
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.SHORT);
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure measure = new Measure(23, MeasureUnit.CELSIUS);
1022441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        assertEquals("23 °C", "23 °C", fmtFr.format(measure));
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure measureF = new Measure(70, MeasureUnit.FAHRENHEIT);
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("70 °F", "70 °F", fmtFr.format(measureF));
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFrFull = MeasureFormat.getInstance(
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.WIDE);
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 pied et 5,3 pouces",
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 pieds et 5,3 pouces",
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrFull.formatMeasures(
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(70, MeasureUnit.FOOT),
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(5.3, MeasureUnit.INCH)));
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 pied et 1 pouce",
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 pied et 1 pouce",
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrFull.formatMeasures(
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.FOOT),
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH)));
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtFrNarrow = MeasureFormat.getInstance(
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.FRENCH, FormatWidth.NARROW);
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1′ 1″",
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1′ 1″",
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtFrNarrow.formatMeasures(
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.FOOT),
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH)));
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmtEn = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 inch, 2 feet",
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 inch, 2 feet",
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtEn.formatMeasures(
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(1, MeasureUnit.INCH),
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(2, MeasureUnit.FOOT)));
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1055441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
10562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFormatPeriodEn() {
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _19m = {new TimeUnitAmount(19.0, TimeUnit.MINUTE)};
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_23_5s = {
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.5, TimeUnit.SECOND)};
10627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_23_5m = {
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.5, TimeUnit.MINUTE)};
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1h_0m_23s = {
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.HOUR),
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(23.0, TimeUnit.SECOND)};
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _2y_5M_3w_4d = {
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(2.0, TimeUnit.YEAR),
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.MONTH),
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.WEEK),
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(4.0, TimeUnit.DAY)};
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _1m_59_9996s = {
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(1.0, TimeUnit.MINUTE),
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(59.9996, TimeUnit.SECOND)};
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _5h_17m = {
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.HOUR),
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.MINUTE)};
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _neg5h_17m = {
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(-5.0, TimeUnit.HOUR),
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.MINUTE)};
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _19m_28s = {
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(19.0, TimeUnit.MINUTE),
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(28.0, TimeUnit.SECOND)};
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _0h_0m_9s = {
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.HOUR),
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(9.0, TimeUnit.SECOND)};
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _0h_0m_17s = {
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.HOUR),
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(0.0, TimeUnit.MINUTE),
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(17.0, TimeUnit.SECOND)};
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _6h_56_92m = {
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(6.0, TimeUnit.HOUR),
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(56.92, TimeUnit.MINUTE)};
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _3h_4s_5m = {
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.HOUR),
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(4.0, TimeUnit.SECOND),
11007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.MINUTE)};
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _6_7h_56_92m = {
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(6.7, TimeUnit.HOUR),
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(56.92, TimeUnit.MINUTE)};
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeUnitAmount[] _3h_5h = {
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(3.0, TimeUnit.HOUR),
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new TimeUnitAmount(5.0, TimeUnit.HOUR)};
1107441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] fullData = {
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1 minute, 59.9996 seconds"},
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 minutes"},
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1 hour, 23.5 seconds"},
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1 hour, 23.5 minutes"},
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1 hour, 0 minutes, 23 seconds"},
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 years, 5 months, 3 weeks, 4 days"}};
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] abbrevData = {
1116f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1m_59_9996s, "1 min, 59.9996 sec"},
1117f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_19m, "19 min"},
1118f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_23_5s, "1 hr, 23.5 sec"},
1119f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_23_5m, "1 hr, 23.5 min"},
1120f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {_1h_0m_23s, "1 hr, 0 min, 23 sec"},
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 yrs, 5 mths, 3 wks, 4 days"}};
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] narrowData = {
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1m 59.9996s"},
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19m"},
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1h 23.5s"},
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1h 23.5m"},
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1h 0m 23s"},
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2y 5m 3w 4d"}};
1129441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
1130441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] numericData = {
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1:59.9996"},
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19m"},
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1:00:23.5"},
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1:00:23"},
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1:23.5"},
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_5h_17m, "5:17"},
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_neg5h_17m, "-5h 17m"},
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m_28s, "19:28"},
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2y 5m 3w 4d"},
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_0h_0m_9s, "0:00:09"},
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6h_56_92m, "6:56.92"},
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6_7h_56_92m, "6:56.92"},
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_4s_5m, "3h 4s 5m"},
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_5h, "3h 5h"}};
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] fullDataDe = {
11472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {_1m_59_9996s, "1 Minute, 59,9996 Sekunden"},
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 Minuten"},
11492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {_1h_23_5s, "1 Stunde, 23,5 Sekunden"},
11502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                {_1h_23_5m, "1 Stunde, 23,5 Minuten"},
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1 Stunde, 0 Minuten und 23 Sekunden"},
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 Jahre, 5 Monate, 3 Wochen und 4 Tage"}};
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] numericDataDe = {
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1m_59_9996s, "1:59,9996"},
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m, "19 Min."},
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5s, "1:00:23,5"},
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_0m_23s, "1:00:23"},
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_1h_23_5m, "1:23,5"},
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_5h_17m, "5:17"},
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_19m_28s, "19:28"},
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_2y_5M_3w_4d, "2 J, 5 M, 3 W und 4 T"},
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_0h_0m_17s, "0:00:17"},
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_6h_56_92m, "6:56,92"},
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {_3h_5h, "3 Std., 5 Std."}};
1165441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getNumberInstance(ULocale.ENGLISH);
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE, nf);
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en FULL", mf, fullData);
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT, nf);
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en SHORT", mf, abbrevData);
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NARROW, nf);
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en NARROW", mf, narrowData);
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NUMERIC, nf);
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("en NUMERIC", mf, numericData);
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = NumberFormat.getNumberInstance(ULocale.GERMAN);
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.WIDE, nf);
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de FULL", mf, fullDataDe);
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.NUMERIC, nf);
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de NUMERIC", mf, numericDataDe);
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Same tests, with Java Locale
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf = NumberFormat.getNumberInstance(Locale.GERMAN);
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(4);
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.WIDE, nf);
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de FULL(Java Locale)", mf, fullDataDe);
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.NUMERIC, nf);
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyFormatPeriod("de NUMERIC(Java Locale)", mf, numericDataDe);
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1193441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void verifyFormatPeriod(String desc, MeasureFormat mf, Object[][] testData) {
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder builder = new StringBuilder();
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean failure = false;
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] testCase : testData) {
11982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            String actual = mf.format(testCase[0]);
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!testCase[1].equals(actual)) {
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                builder.append(String.format("%s: Expected: '%s', got: '%s'\n", desc, testCase[1], actual));
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                failure = true;
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (failure) {
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln(builder.toString());
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1208441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
12092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test10219FractionalPlurals() {
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        double[] values = {1.588, 1.011};
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[][] expected = {
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1 minute", "1.5 minutes", "1.58 minutes"},
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"1 minute", "1.0 minutes", "1.01 minutes"}
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int j = 0; j < values.length; j++) {
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < expected[j].length; i++) {
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                NumberFormat nf = NumberFormat.getNumberInstance(ULocale.ENGLISH);
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setRoundingMode(BigDecimal.ROUND_DOWN);
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMinimumFractionDigits(i);
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                nf.setMaximumFractionDigits(i);
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureFormat mf = MeasureFormat.getInstance(
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ULocale.ENGLISH, FormatWidth.WIDE, nf);
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                assertEquals("Test10219", expected[j][i], mf.format(new Measure(values[j], MeasureUnit.MINUTE)));
12257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1226441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1228441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
12292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestGreek() {
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] locales = {"el_GR", "el"};
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final MeasureUnit[] units = new MeasureUnit[]{
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.SECOND,
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MINUTE,
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.HOUR,
12367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.DAY,
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.WEEK,
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.MONTH,
12397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                MeasureUnit.YEAR};
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FormatWidth[] styles = new FormatWidth[] {FormatWidth.WIDE, FormatWidth.SHORT};
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] numbers = new int[] {1, 7};
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] expected = {
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 1 wide
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτερόλεπτο",
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπτό",
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδομάδα",
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήνας",
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτος",
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 1 short
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτ.",
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπ.",
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
12557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδ.",
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήν.",
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτ.",	        // year (one)
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 7 wide
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτερόλεπτα",
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπτά",
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρες",
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδομάδες",
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήνες",
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτη",
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el_GR" 7 short
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτ.",
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπ.",
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρ.",		    // hour (other)
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδ.",
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήν.",
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτ.",            // year (other)
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 1 wide
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτερόλεπτο",
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπτό",
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδομάδα",
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήνας",
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτος",
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 1 short
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 δευτ.",
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 λεπ.",
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ώρα",
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 ημέρα",
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 εβδ.",
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 μήν.",
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 έτ.",	        // year (one)
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 7 wide
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτερόλεπτα",
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπτά",
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρες",
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδομάδες",
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήνες",
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτη",
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // "el" 7 short
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 δευτ.",
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 λεπ.",
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ώρ.",		    // hour (other)
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 ημέρες",
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 εβδ.",
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 μήν.",
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "7 έτ."};           // year (other
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int counter = 0;
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String formatted;
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for ( int locIndex = 0; locIndex < locales.length; ++locIndex ) {
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for( int numIndex = 0; numIndex < numbers.length; ++numIndex ) {
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                for ( int styleIndex = 0; styleIndex < styles.length; ++styleIndex ) {
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    for ( int unitIndex = 0; unitIndex < units.length; ++unitIndex ) {
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        Measure m = new Measure(numbers[numIndex], units[unitIndex]);
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        MeasureFormat fmt = MeasureFormat.getInstance(new ULocale(locales[locIndex]), styles[styleIndex]);
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        formatted = fmt.format(m);
13167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        assertEquals(
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                "locale: " + locales[locIndex]
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                        + ", style: " + styles[styleIndex]
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                + ", units: " + units[unitIndex]
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                        + ", value: " + numbers[numIndex],
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                expected[counter], formatted);
13227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ++counter;
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    }
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13292d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testAUnit() {
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String lastType = null;
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (MeasureUnit expected : MeasureUnit.getAvailable()) {
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = expected.getType();
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String code = expected.getSubtype();
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!type.equals(lastType)) {
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(type);
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                lastType = type;
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit actual = MeasureUnit.internalGetInstance(type, code);
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertSame("Identity check", expected, actual);
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1343441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
13442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatSingleArg() {
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 meters", mf.format(new Measure(5, MeasureUnit.METER)));
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1349441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
13502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatMeasuresZeroArg() {
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "", mf.formatMeasures());
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1355441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
13562d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFormatMeasuresOneArg() {
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 meters", mf.formatMeasures(new Measure(5, MeasureUnit.METER)));
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1361441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
1362441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testMultiples() {
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale russia = new ULocale("ru");
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.WIDE, "2 miles, 1 foot, 2.3 inches"},
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.SHORT, "2 mi, 1 ft, 2.3 in"},
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {ULocale.ENGLISH, FormatWidth.NARROW, "2mi 1\u2032 2.3\u2033"},
1371bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {russia, FormatWidth.WIDE,   "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 \u0438 2,3 \u0434\u044E\u0439\u043C\u0430"},
1372bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {russia, FormatWidth.SHORT,  "2 \u043C\u0438\u043B\u0438 1 \u0444\u0443\u0442 \u0438 2,3 \u0434\u044E\u0439\u043C."},
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {russia, FormatWidth.NARROW, "2 \u043C\u0438\u043B\u044C 1 \u0444\u0443\u0442 2,3 \u0434\u044E\u0439\u043C\u0430"},
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    (ULocale) row[0], (FormatWidth) row[1]);
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "testMultiples",
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    row[2],
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    mf.formatMeasures(
1382441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                            new Measure(2, MeasureUnit.MILE),
1383441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                            new Measure(1, MeasureUnit.FOOT),
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            new Measure(2.3, MeasureUnit.INCH)));
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1387441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
13882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1389441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert    public void testManyLocaleDurations() {
1390441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        Measure hours   = new Measure(5, MeasureUnit.HOUR);
1391441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        Measure minutes = new Measure(37, MeasureUnit.MINUTE);
1392441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocDanish       = new ULocale("da");
1393441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocSpanish      = new ULocale("es");
1394441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocFinnish      = new ULocale("fi");
1395441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocIcelandic    = new ULocale("is");
1396441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocNorwegianBok = new ULocale("nb");
1397441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocNorwegianNyn = new ULocale("nn");
1398441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocDutch        = new ULocale("nl");
1399441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        ULocale ulocSwedish      = new ULocale("sv");
1400441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        Object[][] data = new Object[][] {
1401441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocDanish,       FormatWidth.NARROW,  "5 t og 37 min" },
1402441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocDanish,       FormatWidth.NUMERIC, "5.37" },
1403441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.GERMAN,   FormatWidth.NARROW,  "5 Std., 37 Min." },
1404441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.GERMAN,   FormatWidth.NUMERIC, "5:37" },
1405441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.ENGLISH,  FormatWidth.NARROW,  "5h 37m" },
1406441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.ENGLISH,  FormatWidth.NUMERIC, "5:37" },
1407441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocSpanish,      FormatWidth.NARROW,  "5h 37min" },
1408441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocSpanish,      FormatWidth.NUMERIC, "5:37" },
1409441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocFinnish,      FormatWidth.NARROW,  "5t 37min" },
1410441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocFinnish,      FormatWidth.NUMERIC, "5.37" },
1411441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.FRENCH,   FormatWidth.NARROW,  "5h 37m" },
1412441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.FRENCH,   FormatWidth.NUMERIC, "05:37" },
1413441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocIcelandic,    FormatWidth.NARROW,  "5 klst. og 37 m\u00EDn." },
1414441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocIcelandic,    FormatWidth.NUMERIC, "5:37" },
14152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { ULocale.JAPANESE, FormatWidth.NARROW,  "5h37m" },
1416441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.JAPANESE, FormatWidth.NUMERIC, "5:37" },
1417441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocNorwegianBok, FormatWidth.NARROW,  "5t, 37m" },
14182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { ulocNorwegianBok, FormatWidth.NUMERIC, "5:37" },
1419441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocDutch,        FormatWidth.NARROW,  "5 u, 37 m" },
1420441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocDutch,        FormatWidth.NUMERIC, "5:37" },
1421441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocNorwegianNyn, FormatWidth.NARROW,  "5 h og 37 min" },
14222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { ulocNorwegianNyn, FormatWidth.NUMERIC, "5:37" },
1423441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocSwedish,      FormatWidth.NARROW,  "5h 37m" },
1424441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ulocSwedish,      FormatWidth.NUMERIC, "5:37" },
1425441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.CHINESE,  FormatWidth.NARROW,  "5\u5C0F\u65F637\u5206\u949F" },
1426441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            { ULocale.CHINESE,  FormatWidth.NUMERIC, "5:37" },
1427441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        };
1428441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        for (Object[] row : data) {
1429441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            MeasureFormat mf = null;
1430441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            try{
1431441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                mf = MeasureFormat.getInstance( (ULocale)row[0], (FormatWidth)row[1] );
1432441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            } catch(Exception e) {
14332d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                errln("Exception creating MeasureFormat for locale " + row[0] + ", width " +
14342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                        row[1] + ": " + e);
1435441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                continue;
1436441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            }
1437441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            String result = mf.formatMeasures(hours, minutes);
14382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            if (!result.equals(row[2])) {
14392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                errln("MeasureFormat.formatMeasures for locale " + row[0] + ", width " +
14402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                        row[1] + ", expected \"" + (String)row[2] + "\", got \"" + result + "\"" );
1441441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            }
1442441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
1443441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert    }
1444441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
14452d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testSimplePer() {
1447f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Object DONT_CARE = null;
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
1449f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit pattern
1450f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 1.0, MeasureUnit.SECOND, "1 pound per second", DONT_CARE, 0, 0},
1451f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 2.0, MeasureUnit.SECOND, "2 pounds per second", DONT_CARE, 0, 0},
1452f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound pattern
1453f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 1.0, MeasureUnit.MINUTE, "1 pound per minute", DONT_CARE, 0, 0},
1454f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.WIDE, 2.0, MeasureUnit.MINUTE, "2 pounds per minute", DONT_CARE, 0, 0},
1455f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit
1456bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.SHORT, 1.0, MeasureUnit.SECOND, "1 lb/s", DONT_CARE, 0, 0},
1457bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.SHORT, 2.0, MeasureUnit.SECOND, "2 lb/s", DONT_CARE, 0, 0},
1458f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound
1459f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 1.0, MeasureUnit.MINUTE, "1 lb/min", DONT_CARE, 0, 0},
1460f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 2.0, MeasureUnit.MINUTE, "2 lb/min", DONT_CARE, 0, 0},
1461f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // per unit
1462f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 1.0, MeasureUnit.SECOND, "1#/s", DONT_CARE, 0, 0},
1463f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.NARROW, 2.0, MeasureUnit.SECOND, "2#/s", DONT_CARE, 0, 0},
1464f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // compound
1465bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.NARROW, 1.0, MeasureUnit.MINUTE, "1#/min", DONT_CARE, 0, 0},
1466bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.NARROW, 2.0, MeasureUnit.MINUTE, "2#/min", DONT_CARE, 0, 0},
1467f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                // field positions
1468bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.SECOND, "23.3 lb/s", NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3},
1469bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.SECOND, "23.3 lb/s", NumberFormat.Field.INTEGER, 0, 2},
1470f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.MINUTE, "23.3 lb/min", NumberFormat.Field.DECIMAL_SEPARATOR, 2, 3},
1471f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                {FormatWidth.SHORT, 23.3, MeasureUnit.MINUTE, "23.3 lb/min", NumberFormat.Field.INTEGER, 0, 2},
1472f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
14737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
1474441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
14757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
1476f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            FormatWidth formatWidth = (FormatWidth) row[0];
1477f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Number amount = (Number) row[1];
1478f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit perUnit = (MeasureUnit) row[2];
1479f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String expected = row[3].toString();
1480f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            NumberFormat.Field field = (NumberFormat.Field) row[4];
1481f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int startOffset = ((Integer) row[5]).intValue();
1482f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int endOffset = ((Integer) row[6]).intValue();
14837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(
1484f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    ULocale.ENGLISH, formatWidth);
1485f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            FieldPosition pos = field != null ? new FieldPosition(field) : new FieldPosition(0);
1486f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String prefix = "Prefix: ";
14877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
14887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "",
1489f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    prefix + expected,
1490f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    mf.formatMeasurePerUnit(
1491f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new Measure(amount, MeasureUnit.POUND),
1492f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            perUnit,
1493f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new StringBuilder(prefix),
1494f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            pos).toString());
1495f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (field != DONT_CARE) {
1496f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                assertEquals("startOffset", startOffset, pos.getBeginIndex() - prefix.length());
1497f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                assertEquals("endOffset", endOffset, pos.getEndIndex() - prefix.length());
1498f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1499441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
15007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1501441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
15022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
15037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testNumeratorPlurals() {
15047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale polish = new ULocale("pl");
15057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object[][] data = new Object[][] {
15067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {1, "1 stopa na sekundę"},
15077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {2, "2 stopy na sekundę"},
15087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {5, "5 stóp na sekundę"},
15097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {1.5, "1,5 stopy na sekundę"}};
1510441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
15117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : data) {
15127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(polish, FormatWidth.WIDE);
15137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(
15147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    "",
15157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    row[1],
1516f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    mf.formatMeasurePerUnit(
1517f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new Measure((Number) row[0], MeasureUnit.FOOT),
15187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            MeasureUnit.SECOND,
1519f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new StringBuilder(),
1520f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            new FieldPosition(0)).toString());
1521441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
15227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
15237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
15242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
15257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testGram() {
15267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
15277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
15287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "testGram",
15297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 g",
15307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.format(new Measure(1, MeasureUnit.GRAM)));
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
15327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "testGram",
15337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "1 G",
15347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.format(new Measure(1, MeasureUnit.G_FORCE)));
15357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1536441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
15372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
15387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencies() {
15397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_1 = new Measure(1.0, Currency.getInstance("USD"));
15407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_2 = new Measure(2.0, Currency.getInstance("USD"));
15417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure USD_NEG_1 = new Measure(-1.0, Currency.getInstance("USD"));
15427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.WIDE);
15437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "-1.00 US dollars", mf.format(USD_NEG_1));
15447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "1.00 US dollars", mf.format(USD_1));
15457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Wide currency", "2.00 US dollars", mf.format(USD_2));
15467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
15477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "-USD1.00", mf.format(USD_NEG_1));
15487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "USD1.00", mf.format(USD_1));
15497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("short currency", "USD2.00", mf.format(USD_2));
15507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NARROW);
15517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "-$1.00", mf.format(USD_NEG_1));
15527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "$1.00", mf.format(USD_1));
15537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("narrow currency", "$2.00", mf.format(USD_2));
15547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.NUMERIC);
15557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "-$1.00", mf.format(USD_NEG_1));
15567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "$1.00", mf.format(USD_1));
15577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("numeric currency", "$2.00", mf.format(USD_2));
1558441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
15597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        mf = MeasureFormat.getInstance(ULocale.JAPAN, FormatWidth.WIDE);
1560f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "-1.00\u7C73\u30C9\u30EB", mf.format(USD_NEG_1));
1561f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "1.00\u7C73\u30C9\u30EB", mf.format(USD_1));
1562f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Wide currency", "2.00\u7C73\u30C9\u30EB", mf.format(USD_2));
15632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
15642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Measure CAD_1 = new Measure(1.0, Currency.getInstance("CAD"));
15652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        mf = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
15662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        assertEquals("short currency", "CAD1.00", mf.format(CAD_1));
15677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1568441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
15692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
15702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testDisplayNames() {
15712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Object[][] data = new Object[][] {
15722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            // Unit, locale, width, expected result
15732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.YEAR, "en", FormatWidth.WIDE, "years" },
15742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.YEAR, "ja", FormatWidth.WIDE, "年" },
15752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.YEAR, "es", FormatWidth.WIDE, "años" },
15762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.YEAR, "pt", FormatWidth.WIDE, "anos" },
15772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.YEAR, "pt-PT", FormatWidth.WIDE, "anos" },
15782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.AMPERE, "en", FormatWidth.WIDE, "amperes" },
15792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.AMPERE, "ja", FormatWidth.WIDE, "アンペア" },
15802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.AMPERE, "es", FormatWidth.WIDE, "amperios" },
15812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.AMPERE, "pt", FormatWidth.WIDE, "amperes" },
15822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.AMPERE, "pt-PT", FormatWidth.WIDE, "amperes" },
15832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.METER_PER_SECOND_SQUARED, "pt", FormatWidth.WIDE, "metros por segundo ao quadrado" },
15842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.METER_PER_SECOND_SQUARED, "pt-PT", FormatWidth.WIDE, "metros por segundo quadrado" },
15852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SQUARE_KILOMETER, "pt", FormatWidth.NARROW, "km²" },
15862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SQUARE_KILOMETER, "pt", FormatWidth.SHORT, "km²" },
15872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SQUARE_KILOMETER, "pt", FormatWidth.WIDE, "quilômetros quadrados" },
15882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt-PT", FormatWidth.NARROW, "s" },
15892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt-PT", FormatWidth.SHORT, "s" },
15902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt-PT", FormatWidth.WIDE, "segundos" },
15912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt", FormatWidth.NARROW, "seg" },
15922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt", FormatWidth.SHORT, "segs" },
15932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            { MeasureUnit.SECOND, "pt", FormatWidth.WIDE, "segundos" },
15942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        };
15952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
15962d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        for (Object[] test : data) {
15972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            MeasureUnit unit = (MeasureUnit) test[0];
15982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            ULocale locale = ULocale.forLanguageTag((String) test[1]);
15992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            FormatWidth formatWidth = (FormatWidth) test[2];
16002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            String expected = (String) test[3];
16012d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
16022d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            MeasureFormat mf = MeasureFormat.getInstance(locale, formatWidth);
16032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            String actual = mf.getUnitDisplayName(unit);
16042d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            assertEquals(String.format("Unit Display Name for %s, %s, %s", unit, locale, formatWidth),
16052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    expected, actual);
16062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
16072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
16082d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
16092d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
16107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFieldPosition() {
16117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
16127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.SHORT);
16137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
16147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(new Measure(43.5, MeasureUnit.FOOT), new StringBuffer("123456: "), pos);
16157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 10, pos.getBeginIndex());
16167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 11, pos.getEndIndex());
1617441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
16197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt.format(new Measure(43, MeasureUnit.FOOT), new StringBuffer(), pos);
16207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
16217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 0, pos.getEndIndex());
16227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1623441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
16257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testFieldPositionMultiple() {
16267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
16277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.SHORT);
16287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(NumberFormat.Field.INTEGER);
16297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String result = fmt.formatMeasures(
16307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder(),
16317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
16327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(354, MeasureUnit.METER),
16337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER)).toString();
16347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "354 m, 23 cm", result);
1635441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // According to javadocs for {@link Format#format} FieldPosition is set to
16377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // beginning and end of first such field encountered instead of the last
16387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // such field encountered.
16397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
16407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 3, pos.getEndIndex());
1641441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
16437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
16447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
16457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
16467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(354, MeasureUnit.METER),
16477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
16487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5.4, MeasureUnit.MILLIMETER)).toString();
16497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 354 m, 23 cm, 5.4 mm", result);
16507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 23, pos.getBeginIndex());
16517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 24, pos.getEndIndex());
1652441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
16547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder(),
16557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
16567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(3, MeasureUnit.METER),
16577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
16587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5.4, MeasureUnit.MILLIMETER)).toString();
16597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "3 m, 23 cm, 5.4 mm", result);
16607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 13, pos.getBeginIndex());
16617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 14, pos.getEndIndex());
1662441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.DECIMAL_SEPARATOR);
16647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
16657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
16667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
16677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(3, MeasureUnit.METER),
16687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(23, MeasureUnit.CENTIMETER),
16697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5, MeasureUnit.MILLIMETER)).toString();
16707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 3 m, 23 cm, 5 mm", result);
16717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 0, pos.getBeginIndex());
16727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 0, pos.getEndIndex());
1673441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos = new FieldPosition(NumberFormat.Field.INTEGER);
16757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = fmt.formatMeasures(
16767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new StringBuilder("123456: "),
16777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pos,
16787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(57, MeasureUnit.MILLIMETER)).toString();
16797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("result", "123456: 57 mm", result);
16807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("beginIndex", 8, pos.getBeginIndex());
16817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("endIndex", 10, pos.getEndIndex());
1682441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1684441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
16852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
16867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatWithList() {
16877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<Measure> measures = new ArrayList<Measure>(2);
16887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        measures.add(new Measure(5, MeasureUnit.ACRE));
16897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        measures.add(new Measure(3000, MeasureUnit.SQUARE_FOOT));
16907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
16917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
16927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres, 3,000 square feet", fmt.format(measures));
16937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres", fmt.format(measures.subList(0, 1)));
16947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        List<String> badList = new ArrayList<String>();
16957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        badList.add("be");
16967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        badList.add("you");
16977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
16987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.format(badList);
16997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fail("Expected IllegalArgumentException.");
17007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException expected) {
1701441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert           // Expected
17027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1704441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatWithArray() {
17077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Measure[] measures = new Measure[] {
17087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new Measure(5, MeasureUnit.ACRE),
1709441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                new Measure(3000, MeasureUnit.SQUARE_FOOT),
17107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
17117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
17127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
17137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", "5 acres, 3,000 square feet", fmt.format(measures));
17147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1715441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testOldFormatBadArg() {
17187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(
17197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.ENGLISH, FormatWidth.WIDE);
17207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
17217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.format("be");
17227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fail("Expected IllegalArgumentExceptino.");
17237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IllegalArgumentException e) {
17247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Expected
17257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
17267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1727441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17282d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1729f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    public void testUnitPerUnitResolution() {
1730f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // Ticket 11274
1731f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        MeasureFormat fmt = MeasureFormat.getInstance(Locale.ENGLISH, FormatWidth.SHORT);
1732441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
1733f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // This fails unless we resolve to MeasureUnit.POUND_PER_SQUARE_INCH
1734f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("", "50 psi",
1735f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                fmt.formatMeasurePerUnit(
1736f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new Measure(50, MeasureUnit.POUND),
1737f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        MeasureUnit.SQUARE_INCH,
1738f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new StringBuilder(),
1739f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        new FieldPosition(0)).toString());
1740f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
1741441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testEqHashCode() {
17447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
17457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfeq = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.SHORT);
17467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfne = MeasureFormat.getInstance(ULocale.CANADA, FormatWidth.WIDE);
17477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfne2 = MeasureFormat.getInstance(ULocale.ENGLISH, FormatWidth.SHORT);
17487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyEqualsHashCode(mf, mfeq, mfne);
17497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        verifyEqualsHashCode(mf, mfeq, mfne2);
17507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1751f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
17522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1753f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    public void testEqHashCodeOfMeasure() {
1754f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _3feetDouble = new Measure(3.0, MeasureUnit.FOOT);
1755f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _3feetInt = new Measure(3, MeasureUnit.FOOT);
1756f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Measure _4feetInt = new Measure(4, MeasureUnit.FOOT);
1757f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        verifyEqualsHashCode(_3feetDouble, _3feetInt, _4feetInt);
1758f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
1759441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testGetLocale() {
17627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.SHORT);
17637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("", ULocale.GERMAN, mf.getLocale(ULocale.VALID_LOCALE));
17647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1765441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerial() {
17687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureUnit.CELSIUS);
17697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getInstance(ULocale.FRANCE, FormatWidth.NARROW));
17707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(Currency.getInstance("EUR"));
17717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getInstance(ULocale.GERMAN, FormatWidth.SHORT));
17727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkStreamingEquality(MeasureFormat.getCurrencyFormat(ULocale.ITALIAN));
17737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1774441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerialFormatWidthEnum() {
17777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // FormatWidth enum values must map to the same ordinal values for all time in order for
17787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // serialization to work.
17797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.WIDE", 0, FormatWidth.WIDE.ordinal());
17807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.SHORT", 1, FormatWidth.SHORT.ordinal());
17817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.NARROW", 2, FormatWidth.NARROW.ordinal());
17827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("FormatWidth.NUMERIC", 3, FormatWidth.NUMERIC.ordinal());
17837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1784441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
17852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
17867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyFormatStandInForMeasureFormat() {
17877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getCurrencyFormat(ULocale.ENGLISH);
17887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
17897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 feet, 5.3 inches",
17907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "70 feet, 5.3 inches",
17917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
17927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(70, MeasureUnit.FOOT),
17937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(5.3, MeasureUnit.INCH)));
17947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getLocale", ULocale.ENGLISH, mf.getLocale());
17957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getNumberFormat", ULocale.ENGLISH, mf.getNumberFormat().getLocale(ULocale.VALID_LOCALE));
17967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getWidth", MeasureFormat.FormatWidth.WIDE, mf.getWidth());
17977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
17987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
17992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
18007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testCurrencyFormatLocale() {
18017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfu = MeasureFormat.getCurrencyFormat(ULocale.FRANCE);
18027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mfj = MeasureFormat.getCurrencyFormat(Locale.FRANCE);
18037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("getCurrencyFormat ULocale/Locale", mfu, mfj);
18057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
18067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
18072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
18087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void testDoubleZero() {
18097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale en = new ULocale("en");
18107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = NumberFormat.getInstance(en);
18117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMinimumFractionDigits(2);
18127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        nf.setMaximumFractionDigits(2);
18137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        MeasureFormat mf = MeasureFormat.getInstance(en, FormatWidth.WIDE, nf);
18147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
18157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Positive Rounding",
18167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "4 hours, 23 minutes, 16.00 seconds",
18177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
18187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(4.7, MeasureUnit.HOUR),
18197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(23, MeasureUnit.MINUTE),
18207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(16, MeasureUnit.SECOND)));
18217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals(
18227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "Negative Rounding",
18237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "-4 hours, 23 minutes, 16.00 seconds",
18247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                mf.formatMeasures(
18257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(-4.7, MeasureUnit.HOUR),
18267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(23, MeasureUnit.MINUTE),
18277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        new Measure(16, MeasureUnit.SECOND)));
1828441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
18297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1830db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer
18312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1832db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer    public void testIndividualPluralFallback() {
1833db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        // See ticket #11986 "incomplete fallback in MeasureFormat".
1834db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        // In CLDR 28, fr_CA temperature-generic/short has only the "one" form,
1835db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        // and falls back to fr for the "other" form.
1836db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        MeasureFormat mf = MeasureFormat.getInstance(new ULocale("fr_CA"), FormatWidth.SHORT);
1837db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        Measure twoDeg = new Measure(2, MeasureUnit.GENERIC_TEMPERATURE);
1838db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer        assertEquals("2 deg temp in fr_CA", "2°", mf.format(twoDeg));
1839db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer    }
1840441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
18412d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
184287255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    public void testPopulateCache() {
184387255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        // Quick check that the lazily added additions to the MeasureUnit cache are present.
184487255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert        assertTrue("MeasureUnit: unexpectedly few currencies defined", MeasureUnit.getAvailable("currency").size() > 50);
184587255a3fc79cc94374b5b8adc76a86e251ac7d3eFredrik Roubert    }
1846db9ff2c0d1654ae985d19365bb78aad0eab94928Markus Scherer
18472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1848e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer    public void testParseObject() {
1849e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer        MeasureFormat mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.NARROW);
1850e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer        try {
1851e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer            mf.parseObject("3m", null);
1852e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer            fail("MeasureFormat.parseObject(String, ParsePosition) " +
1853e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer                    "should throw an UnsupportedOperationException");
1854e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer        } catch (UnsupportedOperationException expected) {
1855e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer        }
1856e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer    }
1857e7a7efded856b8959849879938d1cb2e8ccab318Markus Scherer
18582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
18592d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public void testCLDRUnitAvailability() {
18602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Set<MeasureUnit> knownUnits = new HashSet<MeasureUnit>();
18612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        Class cMeasureUnit, cTimeUnit;
18622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        try {
18632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            cMeasureUnit = Class.forName("com.ibm.icu.util.MeasureUnit");
18642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            cTimeUnit = Class.forName("com.ibm.icu.util.TimeUnit");
18652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        } catch (ClassNotFoundException e) {
18662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            fail("Count not load MeasureUnit or TimeUnit class: " + e.getMessage());
18672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            return;
18682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
18692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        for (Field field : cMeasureUnit.getFields()) {
18702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            if (field.getGenericType() == cMeasureUnit || field.getGenericType() == cTimeUnit) {
18712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                try {
18722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    MeasureUnit unit = (MeasureUnit) field.get(cMeasureUnit);
18732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    knownUnits.add(unit);
18742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                } catch (IllegalArgumentException e) {
18752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    fail(e.getMessage());
18762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    return;
18772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                } catch (IllegalAccessException e) {
18782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    fail(e.getMessage());
18792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    return;
18802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                }
18812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            }
18822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
18832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        for (String type : MeasureUnit.getAvailableTypes()) {
18842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            if (type.equals("currency") || type.equals("compound")) {
18852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                continue;
18862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            }
18872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            for (MeasureUnit unit : MeasureUnit.getAvailable(type)) {
18882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                if (!knownUnits.contains(unit)) {
18892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                    fail("Unit present in CLDR but not available via constant in MeasureUnit: " + unit);
18902d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                }
18912d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert            }
18922d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        }
18932d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    }
18942d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
18957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
18967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
1897f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    static Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> getUnitsToPerParts() {
1898f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
1899f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<String, String>> unitsToPerStrings =
1900f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<String, String>>();
1901f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<String, MeasureUnit> namesToUnits = new HashMap<String, MeasureUnit>();
1902f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
1903f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            String type = entry.getKey();
1904f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            // Currency types are always atomic units, so we can skip these
1905f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (type.equals("currency")) {
1906f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                continue;
1907f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1908f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
1909f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                String javaName = toJAVAName(unit);
1910f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                String[] nameParts = javaName.split("_PER_");
1911f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                if (nameParts.length == 1) {
1912f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    namesToUnits.put(nameParts[0], unit);
1913f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                } else if (nameParts.length == 2) {
1914f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitsToPerStrings.put(unit, Pair.of(nameParts[0], nameParts[1]));
1915f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                }
1916f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1917f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1918f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> unitsToPerUnits =
1919f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<MeasureUnit, MeasureUnit>>();
1920f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<String, String>> entry : unitsToPerStrings.entrySet()) {
1921f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<String, String> perStrings = entry.getValue();
1922f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit unit = namesToUnits.get(perStrings.first);
1923f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            MeasureUnit perUnit = namesToUnits.get(perStrings.second);
1924f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (unit != null && perUnit != null) {
1925f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                unitsToPerUnits.put(entry.getKey(), Pair.of(unit, perUnit));
1926f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1927f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1928f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        return unitsToPerUnits;
1929f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
1930441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
1931f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
1932f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    // for MeasureFormat during the release process.
19337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXHConstants(String thisVersion) {
19347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
19357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
19367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
19377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
19387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
19397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
19407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
19417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
19437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String code = unit.getSubtype();
19447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toCamelCase(unit);
19457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
19467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, name, unit);
19477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
19487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("#ifndef U_HIDE_DRAFT_API");
19497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    /**");
19517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Returns unit of " + type + ": " + code + ".");
19527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Caller owns returned value and must free it.");
19537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * @param status ICU error code.");
19547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
19557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @draft ICU " + getVersion(javaName, thisVersion));
19567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
19577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU " + getVersion(javaName, thisVersion));
19587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     */");
19607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("    static MeasureUnit *create%s(UErrorCode &status);\n\n", name);
19617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (isDraft(javaName)) {
19627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("#endif /* U_HIDE_DRAFT_API */");
19637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1965441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
19667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1967441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
19687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static void checkForDup(
19697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Map<String, MeasureUnit> seen, String name, MeasureUnit unit) {
19707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (seen.containsKey(name)) {
19717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            throw new RuntimeException("\nCollision!!" + unit + ", " + seen.get(name));
19727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
19737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            seen.put(name, unit);
19747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
19757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
19767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
19777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
19787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
19797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void updateJAVAVersions(String thisVersion) {
19807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
19817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
19827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
19837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
19847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
19857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
19867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
19877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
19887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
19897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
19907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, javaName, unit);
19917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!JAVA_VERSION_MAP.containsKey(javaName)) {
19927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.printf("        {\"%s\", \"%s\"},\n", javaName, thisVersion);
19937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
19947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1995441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
19967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1997441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
19987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static TreeMap<String, List<MeasureUnit>> getAllUnits() {
19997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = new TreeMap<String, List<MeasureUnit>>();
20007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (String type : MeasureUnit.getAvailableTypes()) {
20017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ArrayList<MeasureUnit> units = new ArrayList<MeasureUnit>(MeasureUnit.getAvailable(type));
20027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Collections.sort(
20037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    units,
20047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    new Comparator<MeasureUnit>() {
20057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
20062d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert                        @Override
20077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        public int compare(MeasureUnit o1, MeasureUnit o2) {
20087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            return o1.getSubtype().compareTo(o2.getSubtype());
20097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        }
2010441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
20117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    });
20127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            allUnits.put(type, units);
20137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return allUnits;
20157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2016441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
20177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
20187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
20197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXConstants() {
2020441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        System.out.println("");
20217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
2022441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
20237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const int32_t gOffsets[] = {");
20247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int index = 0;
20257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
20267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.printf("    %d,\n", index);
20277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            index += entry.getValue().size();
20287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    %d\n", index);
20307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
20317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
20327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const int32_t gIndexes[] = {");
20337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        index = 0;
20347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
20357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.printf("    %d,\n", index);
20367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!entry.getKey().equals("currency")) {
20377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                index += entry.getValue().size();
20387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
20407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    %d\n", index);
20417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
20427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
2043f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be sorted alphabetically.");
20447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const char * const gTypes[] = {");
20457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean first = true;
20467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
20477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!first) {
20487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println(",");
20497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
20507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            System.out.print("    \"" + entry.getKey() + "\"");
20517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = false;
2052441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
20537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
20547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
20557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
2056f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be grouped by type and sorted alphabetically within each type.");
20577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("static const char * const gSubTypes[] = {");
20587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        first = true;
2059f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        int offset = 0;
2060f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        int typeIdx = 0;
2061f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Integer> measureUnitToOffset = new HashMap<MeasureUnit, Integer>();
2062f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<MeasureUnit, Pair<Integer, Integer>> measureUnitToTypeSubType =
2063f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                new HashMap<MeasureUnit, Pair<Integer, Integer>>();
20647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
2065f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            int subTypeIdx = 0;
20667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
20677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!first) {
20687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println(",");
20697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
20707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.print("    \"" + unit.getSubtype() + "\"");
20717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                first = false;
2072f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                measureUnitToOffset.put(unit, offset);
2073f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                measureUnitToTypeSubType.put(unit, Pair.of(typeIdx, subTypeIdx));
2074f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                offset++;
2075f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                subTypeIdx++;
20767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2077f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            typeIdx++;
2078441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert        }
20797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
20807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("};");
20817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
2082441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2083f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // Build unit per unit offsets to corresponding type sub types sorted by
2084f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // unit first and then per unit.
2085f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>> unitPerUnitOffsetsToTypeSubType
2086f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                = new TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>>();
2087f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> entry
2088f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : getUnitsToPerParts().entrySet()) {
2089f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<MeasureUnit, MeasureUnit> unitPerUnit = entry.getValue();
2090f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            unitPerUnitOffsetsToTypeSubType.put(
2091f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    OrderedPair.of(
2092f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            measureUnitToOffset.get(unitPerUnit.first),
2093f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                            measureUnitToOffset.get(unitPerUnit.second)),
2094f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    measureUnitToTypeSubType.get(entry.getKey()));
2095f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
2096441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2097f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("// Must be sorted by first value and then second value.");
2098f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("static int32_t unitPerUnitToSingleUnit[][4] = {");
2099f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        first = true;
2100f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<OrderedPair<Integer, Integer>, Pair<Integer, Integer>> entry
2101f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : unitPerUnitOffsetsToTypeSubType.entrySet()) {
2102f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            if (!first) {
2103f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                System.out.println(",");
2104f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
2105f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            first = false;
2106f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            OrderedPair<Integer, Integer> unitPerUnitOffsets = entry.getKey();
2107f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<Integer, Integer> typeSubType = entry.getValue();
2108f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            System.out.printf("        {%d, %d, %d, %d}",
2109f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitPerUnitOffsets.first,
2110f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    unitPerUnitOffsets.second,
2111f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    typeSubType.first,
2112f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    typeSubType.second);
2113f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
2114f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
2115f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("};");
2116f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
2117441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
2118f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
21197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
2120441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
21217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
21227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (type.equals("currency")) {
21237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
21247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
21267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toCamelCase(unit);
2127f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                Pair<Integer, Integer> typeSubType = measureUnitToTypeSubType.get(unit);
2128f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                if (typeSubType == null) {
2129f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    throw new IllegalStateException();
21307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
2131f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                checkForDup(seen, name, unit);
21327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("MeasureUnit *MeasureUnit::create%s(UErrorCode &status) {\n", name);
2133f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                System.out.printf("    return MeasureUnit::create(%d, %d, status);\n",
2134f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        typeSubType.first, typeSubType.second);
21357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("}");
2136441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                System.out.println();
21377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2138f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
21397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
21407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
21417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String toCamelCase(MeasureUnit unit) {
21427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder result = new StringBuilder();
21437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean caps = true;
21447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String code = unit.getSubtype();
21457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int len = code.length();
21467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < len; i++) {
21477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            char ch = code.charAt(i);
21487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (ch == '-') {
21497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                caps = true;
21507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else if (caps) {
21517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result.append(Character.toUpperCase(ch));
21527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                caps = false;
21537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
21547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result.append(ch);
21557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result.toString();
21587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2159441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
21607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static boolean isTypeHidden(String type) {
21617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return "currency".equals(type);
21627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2163441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
21647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
21657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
21667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateBackwardCompatibilityTest(String version) {
21677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
21687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
21697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("    public void TestCompatible%s() {\n", version.replace(".", "_"));
21707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("        MeasureUnit[] units = {");
21717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
21727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int count = 0;
21737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
21747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(entry.getKey())) {
21757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
21767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
21787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String javaName = toJAVAName(unit);
21797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, javaName, unit);
21807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("                MeasureUnit.%s,\n", javaName);
21817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                count++;
21827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
21837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
21847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("        };");
21857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("        assertEquals(\"\",  %d, units.length);\n", count);
21867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    }");
21877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2188441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
21897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
21907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
21917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateCXXBackwardCompatibilityTest(String version) {
21927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
21937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
21947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.printf("void MeasureFormatTest::TestCompatible%s() {\n", version.replace(".", "_"));
21957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    UErrorCode status = U_ZERO_ERROR;");
21967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    LocalPointer<MeasureUnit> measureUnit;");
21977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
21987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
21997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(entry.getKey())) {
22007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
22017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
22037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String camelCase = toCamelCase(unit);
22047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, camelCase, unit);
22057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.printf("    measureUnit.adoptInstead(MeasureUnit::create%s(status));\n", camelCase);
22067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("    assertSuccess(\"\", status);");
22097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println("}");
22107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2211441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
22127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static String toJAVAName(MeasureUnit unit) {
22137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String code = unit.getSubtype();
22147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String type = unit.getType();
22157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String name = code.toUpperCase(Locale.ENGLISH).replace("-", "_");
22167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (type.equals("angle")) {
22177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (code.equals("minute") || code.equals("second")) {
22187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                name = "ARC_" + name;
22197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return name;
22227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
22237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
22257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // for MeasureFormat during the release process.
22267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static void generateConstants(String thisVersion) {
22277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        System.out.println();
22287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
22297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
22307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
22317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String type = entry.getKey();
22327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (isTypeHidden(type)) {
22337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
22347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (MeasureUnit unit : entry.getValue()) {
22367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String name = toJAVAName(unit);
22377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String code = unit.getSubtype();
22387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                checkForDup(seen, name, unit);
22397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    /**");
22407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("     * Constant for unit of " + type +
22417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ": " +
22427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        code);
22437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Special case JAVA had old constants for time from before.
22447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ("duration".equals(type) && TIME_CODES.contains(code)) {
22457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU 4.0");
22467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else if (isDraft(name)) {
22487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @draft ICU " + getVersion(name, thisVersion));
22497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @provisional This API might change or be removed in a future release.");
22507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
22517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("     * @stable ICU " + getVersion(name, thisVersion));
22527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println("    */");
22547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if ("duration".equals(type) && TIME_CODES.contains(code)) {
22557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("    public static final TimeUnit " + name + " = (TimeUnit) MeasureUnit.internalGetInstance(\"" +
22567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            type +
22577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\", \"" +
22587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            code +
22597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\");");
22607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
22617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    System.out.println("    public static final MeasureUnit " + name + " = MeasureUnit.internalGetInstance(\"" +
22627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            type +
22637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\", \"" +
22647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            code +
22657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            "\");");
22667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
22677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                System.out.println();
22687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
22697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2270f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    private static HashMap<Pair<MeasureUnit, MeasureUnit>, MeasureUnit>unitPerUnitToSingleUnit =");
2271f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("            new HashMap<Pair<MeasureUnit, MeasureUnit>, MeasureUnit>();");
2272f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println();
2273f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    static {");
2274f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Map.Entry<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> unitPerUnitEntry
2275f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                : getUnitsToPerParts().entrySet()) {
2276f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Pair<MeasureUnit, MeasureUnit> unitPerUnit = unitPerUnitEntry.getValue();
2277441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert            System.out.println("        unitPerUnitToSingleUnit.put(Pair.<MeasureUnit, MeasureUnit>of(MeasureUnit." + toJAVAName(unitPerUnit.first) + ", MeasureUnit." + toJAVAName(unitPerUnit.second) + "), MeasureUnit." + toJAVAName(unitPerUnitEntry.getKey()) + ");");
2278f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
2279f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        System.out.println("    }");
22807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2281441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
22827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String getVersion(String javaName, String thisVersion) {
22837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String version = JAVA_VERSION_MAP.get(javaName);
22847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (version == null) {
22857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return thisVersion;
22867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return version;
22887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
22897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static boolean isDraft(String javaName) {
22917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String version = JAVA_VERSION_MAP.get(javaName);
22927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (version == null) {
22937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return true;
22947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
22957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return DRAFT_VERSION_SET.contains(version);
22967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
22977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
22987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public <T extends Serializable> void checkStreamingEquality(T item) {
22997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
23007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
23017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOut);
23027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          objectOutputStream.writeObject(item);
23037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          objectOutputStream.close();
23047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          byte[] contents = byteOut.toByteArray();
23057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          logln("bytes: " + contents.length + "; " + item.getClass() + ": " + showBytes(contents));
23067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ByteArrayInputStream byteIn = new ByteArrayInputStream(contents);
23077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          ObjectInputStream objectInputStream = new ObjectInputStream(byteIn);
23087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          Object obj = objectInputStream.readObject();
23097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertEquals("Streamed Object equals ", item, obj);
23107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IOException e) {
23117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          e.printStackTrace();
23127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertNull("Test Serialization " + item.getClass(), e);
23137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ClassNotFoundException e) {
23147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          assertNull("Test Serialization " + item.getClass(), e);
23157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
23177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
23187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
23197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param contents
23207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return
23217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
23227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private String showBytes(byte[] contents) {
23237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      StringBuilder b = new StringBuilder('[');
23247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      for (int i = 0; i < contents.length; ++i) {
23257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int item = contents[i] & 0xFF;
23267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (item >= 0x20 && item <= 0x7F) {
23277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          b.append((char) item);
23287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
23297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          b.append('(').append(Utility.hex(item, 2)).append(')');
23307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
23327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return b.append(']').toString();
23337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2334441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
23357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void verifyEqualsHashCode(Object o, Object eq, Object ne) {
23367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeSame", o, o);
23377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeEq", o, eq);
23387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeNe", o, ne);
23397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeEqTrans", eq, ne);
23407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("verifyEqualsHashCodeHashEq", o.hashCode(), eq.hashCode());
2341441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
23427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // May be a flaky test, but generally should be true.
23437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // May need to comment this out later.
23447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("verifyEqualsHashCodeHashNe", o.hashCode(), ne.hashCode());
23457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2346441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
23472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public static class MeasureUnitHandler implements SerializableTestUtility.Handler
23487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
23492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
23507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Object[] getTestObjects()
23517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
23527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit items[] = {
23537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureUnit.CELSIUS,
2354441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert                    Currency.getInstance("EUR")
23557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
23567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return items;
23577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23582d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
23597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public boolean hasSameBehavior(Object a, Object b)
23607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
23617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit a1 = (MeasureUnit) a;
23627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureUnit b1 = (MeasureUnit) b;
23637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return a1.getType().equals(b1.getType())
23647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getSubtype().equals(b1.getSubtype());
23657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2367441ab1c39b37ef773820d789652301c5f83e7c6bFredrik Roubert
23682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    public static class MeasureFormatHandler  implements SerializableTestUtility.Handler
23697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
23702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
23717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public Object[] getTestObjects()
23727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
23737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat items[] = {
23747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureFormat.getInstance(ULocale.FRANCE, FormatWidth.SHORT),
23757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    MeasureFormat.getInstance(
23767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            ULocale.FRANCE,
23777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            FormatWidth.WIDE,
23787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            NumberFormat.getIntegerInstance(ULocale.CANADA_FRENCH)),
23797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
23807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return items;
23817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        @Override
23837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        public boolean hasSameBehavior(Object a, Object b)
23847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
23857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat a1 = (MeasureFormat) a;
23867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            MeasureFormat b1 = (MeasureFormat) b;
23877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return a1.getLocale().equals(b1.getLocale())
23887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getWidth().equals(b1.getWidth())
23897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    && a1.getNumberFormat().equals(b1.getNumberFormat())
23907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    ;
23917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
23927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
23937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2394