17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 1996-2014, Google, International Business Machines Corporation and
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.AttributedCharacterIterator;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.CharacterIterator;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collection;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.HashMap;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedHashSet;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CompactDecimalFormat;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.NumberFormat;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.PluralRules;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CompactDecimalFormatTest extends TestFmwk {
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static void main(String[] args) {
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new CompactDecimalFormatTest().run(args);
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] EnglishTestData = {
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // default is 2 digits of accuracy
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {0.0d, "0"},
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {0.01d, "0.01"},
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {0.1d, "0.1"},
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1d, "1"},
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12, "12"},
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123, "120"},
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234, "1.2K"},
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000, "1K"},
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1049, "1K"},
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345, "12K"},
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456, "120K"},
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567, "1.2M"},
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678, "12M"},
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789, "120M"},
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890, "1.2B"},
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901f, "12B"},
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012f, "120B"},
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123f, "1.2T"},
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234f, "12T"},
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012345f, "120T"},
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234567890f, "12000000T"},
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SerbianTestDataShort = {
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234, "1,2\u00A0\u0445\u0438\u0459."},
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345, "12\u00a0хиљ."},
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {20789, "21\u00a0хиљ."},
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456, "120\u00a0хиљ."},
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567, "1,2\u00a0мил."},
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678, "12\u00a0мил."},
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789, "120\u00a0мил."},
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890, "1,2\u00a0млрд."},
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901f, "12\u00a0млрд."},
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012f, "120\u00a0млрд."},
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123f, "1,2\u00a0бил."},
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234f, "12\u00a0бил."},
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012345f, "120\u00a0бил."},
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123456f, "1200\u00a0бил."},
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SerbianTestDataLong = {
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234, "1,2 хиљаде"},
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345, "12 хиљада"},
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {21789, "22 хиљаде"},
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456, "120 хиљада"},
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {999999, "1 милион"},
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567, "1,2 милиона"},
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678, "12 милиона"},
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789, "120 милиона"},
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890, "1,2 милијарде"},
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901f, "12 милијарди"},
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {20890123456f, "21 милијарда"},
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {21890123456f, "22 милијарде"},
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012f, "120 милијарди"},
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123f, "1,2 трилиона"},
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234f, "12 трилиона"},
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012345f, "120 трилиона"},
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123456f, "1.200 трилиона"},
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SerbianTestDataLongNegative = {
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234, "-1,2 хиљаде"},
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345, "-12 хиљада"},
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-21789, "-22 хиљаде"},
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456, "-120 хиљада"},
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-999999, "-1 милион"},
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567, "-1,2 милиона"},
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678, "-12 милиона"},
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456789, "-120 милиона"},
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567890, "-1,2 милијарде"},
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678901f, "-12 милијарди"},
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-20890123456f, "-21 милијарда"},
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-21890123456f, "-22 милијарде"},
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456789012f, "-120 милијарди"},
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567890123f, "-1,2 трилиона"},
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678901234f, "-12 трилиона"},
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456789012345f, "-120 трилиона"},
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567890123456f, "-1.200 трилиона"},
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] JapaneseTestData = {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234f, "1.2千"},
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345f, "1.2万"},
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456f, "12万"},
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567f, "120万"},
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678f, "1200万"},
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789f, "1.2億"},
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890f, "12億"},
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901f, "120億"},
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012f, "1200億"},
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123f, "1.2兆"},
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234f, "12兆"},
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012345f, "120兆"},
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SwahiliTestData = {
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234f, "elfu\u00a01.2"},
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345f, "elfu\u00a012"},
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456f, "elfu\u00A0120"},
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567f, "M1.2"},
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678f, "M12"},
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789f, "M120"},
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890f, "B1.2"},
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901f, "B12"},
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {123456789012f, "B120"},
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1234567890123f, "T1.2"},
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234f, "T12"},
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12345678901234567890f, "T12000000"},
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] CsTestDataShort = {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000, "1\u00a0tis."},
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1500, "1,5\u00a0tis."},
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {5000, "5\u00a0tis."},
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {23000, "23\u00a0tis."},
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {127123, "130\u00a0tis."},
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1271234, "1,3\u00a0mil."},
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12712345, "13\u00a0mil."},
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {127123456, "130\u00a0mil."},
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1271234567f, "1,3\u00a0mld."},
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12712345678f, "13\u00a0mld."},
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {127123456789f, "130\u00a0mld."},
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1271234567890f, "1,3\u00a0bil."},
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {12712345678901f, "13\u00a0bil."},
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {127123456789012f, "130\u00a0bil."},
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SkTestDataLong = {
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000, "1 tis\u00edc"},
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1572, "1,6 tis\u00edc"},
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {5184, "5,2 tis\u00edc"},
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] SwahiliTestDataNegative = {
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234f, "elfu\u00a0-1.2"},
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345f, "elfu\u00a0-12"},
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456f, "elfu\u00A0-120"},
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567f, "M-1.2"},
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678f, "M-12"},
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456789f, "M-120"},
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567890f, "B-1.2"},
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678901f, "B-12"},
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-123456789012f, "B-120"},
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-1234567890123f, "T-1.2"},
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678901234f, "T-12"},
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {-12345678901234567890f, "T-12000000"},
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] TestACoreCompactFormatList = {
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000, "1K"},
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1100, "1,1K"},
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1200, "1,2Ks"},
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {2000, "2Ks"},
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Object[][] TestACoreCompactFormatListCurrency = {
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1000, "1K$"},
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1100, "1,1K$"},
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {1200, "1,2Ks$s"},
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {2000, "2Ks$s"},
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestACoreCompactFormat() {
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String,String[][]> affixes = new HashMap();
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        affixes.put("one", new String[][] {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","",}, {"","",}, {"","",},
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","K"}, {"","K"}, {"","K"},
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","M"}, {"","M"}, {"","M"},
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","B"}, {"","B"}, {"","B"},
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","T"}, {"","T"}, {"","T"},
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        });
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        affixes.put("other", new String[][] {
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","",}, {"","",}, {"","",},
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","Ks"}, {"","Ks"}, {"","Ks"},
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","Ms"}, {"","Ms"}, {"","Ms"},
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","Bs"}, {"","Bs"}, {"","Bs"},
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                {"","Ts"}, {"","Ts"}, {"","Ts"},
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        });
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Map<String,String[]> currencyAffixes = new HashMap();
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        currencyAffixes.put("one", new String[] {"", "$"});
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        currencyAffixes.put("other", new String[] {"", "$s"});
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long[] divisors = new long[] {
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                0,0,0,
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1000, 1000, 1000,
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1000000, 1000000, 1000000,
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1000000000L, 1000000000L, 1000000000L,
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                1000000000000L, 1000000000000L, 1000000000000L};
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkCore(affixes, null, divisors, TestACoreCompactFormatList);
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkCore(affixes, currencyAffixes, divisors, TestACoreCompactFormatListCurrency);
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void checkCore(Map<String, String[][]> affixes, Map<String, String[]> currencyAffixes, long[] divisors, Object[][] testItems) {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Collection<String> debugCreationErrors = new LinkedHashSet();
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf = new CompactDecimalFormat(
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "#,###.00",
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                DecimalFormatSymbols.getInstance(new ULocale("fr")),
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CompactStyle.SHORT, PluralRules.createRules("one: j is 1 or f is 1"),
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                divisors, affixes, currencyAffixes,
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                debugCreationErrors
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                );
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (debugCreationErrors.size() != 0) {
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (String s : debugCreationErrors) {
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Creation error: " + s);
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            checkCdf("special cdf ", cdf, testItems);
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDefaultSignificantDigits() {
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // We are expecting two significant digits as default.
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf =
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CompactDecimalFormat.getInstance(ULocale.ENGLISH, CompactStyle.SHORT);
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Default significant digits", "12K", cdf.format(12345));
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Default significant digits", "1.2K", cdf.format(1234));
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Default significant digits", "120", cdf.format(123));
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCharacterIterator() {
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf =
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                getCDFInstance(ULocale.forLanguageTag("sw"), CompactStyle.SHORT);
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        AttributedCharacterIterator iter = cdf.formatToCharacterIterator(1234567);
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("CharacterIterator", "M1.2", iterToString(iter));
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        iter = cdf.formatToCharacterIterator(1234567);
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        iter.setIndex(1);
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Attributes", NumberFormat.Field.INTEGER, iter.getAttribute(NumberFormat.Field.INTEGER));
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Attributes", 1, iter.getRunStart());
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Attributes", 2, iter.getRunLimit());
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestEnglishShort() {
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.ENGLISH, CompactStyle.SHORT, EnglishTestData);
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestArabicLongStyle() {
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat cdf =
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CompactDecimalFormat.getInstance(
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ULocale.forLanguageTag("ar"), CompactStyle.LONG);
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Arabic Long", "\u200F-\u0665\u066B\u0663 \u0623\u0644\u0641", cdf.format(-5300));
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestCsShort() {
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("cs"), CompactStyle.SHORT, CsTestDataShort);
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSkLong() {
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sk"), CompactStyle.LONG, SkTestDataLong);
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerbianShort() {
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sr"), CompactStyle.SHORT, SerbianTestDataShort);
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerbianLong() {
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sr"), CompactStyle.LONG, SerbianTestDataLong);
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSerbianLongNegative() {
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sr"), CompactStyle.LONG, SerbianTestDataLongNegative);
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestJapaneseShort() {
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.JAPANESE, CompactStyle.SHORT, JapaneseTestData);
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSwahiliShort() {
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sw"), CompactStyle.SHORT, SwahiliTestData);
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestSwahiliShortNegative() {
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkLocale(ULocale.forLanguageTag("sw"), CompactStyle.SHORT, SwahiliTestDataNegative);
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestFieldPosition() {
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf = getCDFInstance(
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.forLanguageTag("sw"), CompactStyle.SHORT);
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(0);
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer sb = new StringBuffer();
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cdf.format(1234567f, sb, fp);
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp string", "M1.2", sb.toString());
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp start", 1, fp.getBeginIndex());
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("fp end", 2, fp.getEndIndex());
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestEquals() {
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf = CompactDecimalFormat.getInstance(
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.forLanguageTag("sw"), CompactStyle.SHORT);
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat equalsCdf = CompactDecimalFormat.getInstance(
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.forLanguageTag("sw"), CompactStyle.SHORT);
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat notEqualsCdf = CompactDecimalFormat.getInstance(
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ULocale.forLanguageTag("sw"), CompactStyle.LONG);
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("equals", cdf, equalsCdf);
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertNotEquals("not equals", cdf, notEqualsCdf);
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void checkLocale(ULocale locale, CompactStyle style, Object[][] testData) {
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat cdf = getCDFInstance(locale, style);
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        checkCdf(locale + " (" + locale.getDisplayName(locale) + ") for ", cdf, testData);
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private void checkCdf(String title, CompactDecimalFormat cdf, Object[][] testData) {
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (Object[] row : testData) {
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object source = row[0];
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Object expected = row[1];
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            assertEquals(title + source, expected,
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    cdf.format(source));
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static String iterToString(CharacterIterator iter) {
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuilder builder = new StringBuilder();
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (char c = iter.current(); c != CharacterIterator.DONE; c = iter.next()) {
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            builder.append(c);
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return builder.toString();
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static CompactDecimalFormat getCDFInstance(ULocale locale, CompactStyle style) {
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        CompactDecimalFormat result = CompactDecimalFormat.getInstance(locale, style);
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Our tests are written for two significant digits. We set explicitly here
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // because default significant digits may change.
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result.setMaximumSignificantDigits(2);
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result;
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
361