blob: ba22a23b9a786277fdb6406641a5912bf493efa2 [file] [log] [blame]
package org.unicode.cldr.unittest;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.unicode.cldr.test.BuildIcuCompactDecimalFormat;
import org.unicode.cldr.test.BuildIcuCompactDecimalFormat.CurrencyStyle;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.ICUServiceBuilder;
import org.unicode.cldr.util.StandardCodes;
import org.unicode.cldr.util.SupplementalDataInfo;
import org.unicode.cldr.util.SupplementalDataInfo.PluralInfo;
import org.unicode.cldr.util.SupplementalDataInfo.PluralInfo.Count;
import org.unicode.cldr.util.VerifyCompactNumbers;
import com.google.common.base.Objects;
import com.ibm.icu.impl.locale.XCldrStub.Splitter;
import com.ibm.icu.impl.number.DecimalQuantity;
import com.ibm.icu.impl.number.DecimalQuantity_DualStorageBCD;
import com.ibm.icu.text.CompactDecimalFormat;
import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.ULocale;
public class TestCompactNumbers extends TestFmwkPlus {
static final boolean DEBUG = false;
private static StandardCodes sc = StandardCodes.make();
private static final CLDRConfig CLDRCONFIG = CLDRConfig.getInstance();
private static final SupplementalDataInfo SDI = CLDRCONFIG.getSupplementalDataInfo();
private static final CLDRFile ENGLISH = CLDRCONFIG.getEnglish();
private static final Factory factory2 = CLDRCONFIG.getCldrFactory();
public static void main(String[] args) {
new TestCompactNumbers().run(args);
}
public void TestVerify() {
// Just verify no crashes
CLDRFile cldrFile = factory2.make("it", true);
Appendable out = new StringBuilder();
VerifyCompactNumbers.showNumbers(cldrFile, true, "EUR", out, factory2);
if (DEBUG) {
System.out.println(out);
}
}
public void TestInternals() {
// Just verify no crashes
String locale = "it";
String currencyCode = "EUR";
ULocale locale2 = ULocale.forLanguageTag(locale);
CLDRFile cldrFile = factory2.make(locale, true);
Set<String> debugCreationErrors = new LinkedHashSet<>();
String[] debugOriginals = null;
ICUServiceBuilder builder = new ICUServiceBuilder().setCldrFile(cldrFile);
NumberFormat nf = builder.getNumberFormat(1);
CompactDecimalFormat cdf = BuildIcuCompactDecimalFormat.build(cldrFile, debugCreationErrors,
debugOriginals, CompactStyle.SHORT, locale2, CurrencyStyle.PLAIN, currencyCode);
Map<String, Map<String, String>> data = BuildIcuCompactDecimalFormat.buildCustomData(cldrFile, CompactStyle.SHORT, CurrencyStyle.PLAIN);
if (DEBUG) {
for (Entry<String, Map<String, String>> entry : data.entrySet()) {
System.out.println(entry);
}
}
CompactDecimalFormat cdfs = BuildIcuCompactDecimalFormat.build(cldrFile, debugCreationErrors,
debugOriginals, CompactStyle.LONG, locale2, CurrencyStyle.PLAIN, currencyCode);
CompactDecimalFormat cdfCurr = BuildIcuCompactDecimalFormat.build(cldrFile, debugCreationErrors,
debugOriginals, CompactStyle.SHORT, locale2, CurrencyStyle.CURRENCY, currencyCode);
Set<Double> allSamples = VerifyCompactNumbers.collectSamplesAndSetFormats(currencyCode, locale, SDI, cdf, cdfs, cdfCurr);
for (double source : allSamples) {
if (false && source == 22000000 && locale.equals("cs")) {
System.out.println("**");
}
String formattedNumber = nf.format(source);
String compactFormattedNumber = cdf == null ? "n/a" : cdf.format(source);
String compactLongFormattedNumber = cdfs == null ? "n/a" : cdfs.format(source);
String compactCurrFormattedNumber = cdfs == null ? "n/a" : cdfCurr.format(source);
if (DEBUG) System.out.println(source
+ "\tnf:\t" + formattedNumber
+ "\tcnf:\t" + compactFormattedNumber
+ "\tclnf:\t" + compactLongFormattedNumber
+ "\tccnf:\t" + compactCurrFormattedNumber
);
}
}
/** Test case for VerifyCompactNumbers
* https://unicode-org.atlassian.net/browse/CLDR-15737
* https://unicode-org.atlassian.net/browse/CLDR-15762
* */
public void TestVerifyCompactNumbers() {
Set<String> debugCreationErrors = new LinkedHashSet<>();
String[] debugOriginals = null;
String oldLocale = "";
String oldCurrencyCode = "";
CompactDecimalFormat cdfCurr = null;
CompactStyle compactStyle = null;
CurrencyStyle currencyStyle = null;
CLDRFile cldrFile = null;
Object[][] tests = {
{"cs", null, 1100000d, "1,1 milionu"}, // should be 'many', not 1,1 milionů == 'other'
/* Background for cs
* <pattern type="1000000" count="one">0 milion</pattern>
* <pattern type="1000000" count="few">0 miliony</pattern>
* <pattern type="1000000" count="many">0 milionu</pattern>
* <pattern type="1000000" count="other">0 milionů</pattern>
* https://unicode-org.github.io/cldr-staging/charts/41/supplemental/language_plural_rules.html#cs
*/
{"fr", "EUR", 100d, "100 €"},
{"fr", "EUR", 1000d, "1 k €"},
};
for (Object[] row : tests) {
String locale = row[0].toString();
String currencyCode = row[1] == null ? null : row[1].toString();
double value = (double) row[2];
String expected = row[3].toString();
if (!locale.equals(oldLocale) || Objects.equal(currencyCode, oldCurrencyCode)) {
oldLocale = locale;
oldCurrencyCode = currencyCode;
cldrFile = factory2.make(locale, true);
debugCreationErrors.clear();
if (currencyCode == null) {
compactStyle = CompactStyle.LONG;
currencyStyle = CurrencyStyle.PLAIN;
cdfCurr = BuildIcuCompactDecimalFormat.build(cldrFile, debugCreationErrors,
debugOriginals, compactStyle, ULocale.forLanguageTag(locale),
currencyStyle, null);
// note: custom data looks good:
// 1000000={other=0 milionů, one=0 milion, few=0 miliony, many=0 milionu}
} else {
compactStyle = CompactStyle.SHORT;
currencyStyle = CurrencyStyle.CURRENCY;
cdfCurr = BuildIcuCompactDecimalFormat.build(cldrFile, debugCreationErrors,
debugOriginals, compactStyle, ULocale.forLanguageTag(locale),
currencyStyle, currencyCode);
cdfCurr.setCurrency(Currency.getInstance(currencyCode));
int sigDigits = 3;
cdfCurr.setMaximumSignificantDigits(sigDigits);
}
}
String actual = cdfCurr.format(value);
if (!assertEquals("Formatted " + value, expected, actual)) {
if (DEBUG) {
PluralInfo rules = SupplementalDataInfo.getInstance().getPlurals(locale);
int v, f, e;
DecimalQuantity dq = DecimalQuantity_DualStorageBCD.fromExponentString("1.1");
Count count = rules.getCount(dq);
System.out.println("Locale: " + locale);
ICUServiceBuilder builder = new ICUServiceBuilder().setCldrFile(cldrFile);
DecimalFormat decimalFormat = currencyStyle == CurrencyStyle.PLAIN
? builder.getNumberFormat(1)
: builder.getCurrencyFormat(currencyCode);
final String pattern = decimalFormat.toPattern();
System.out.println("Fallback pattern: " + pattern);
System.out.println("Plural Rules: ");
semiSplit.split(rules.getRules()).forEach(x -> System.out.println("\t" + x + ";"));
System.out.println("Plural sample result: " + dq + " => " + count);
Map<String, Map<String, String>> customData = BuildIcuCompactDecimalFormat.buildCustomData(cldrFile, compactStyle, currencyStyle);
customData.forEach((k, vv) -> System.out.println("\t" + k + "\t" + vv));
}
}
}
}
static final Splitter semiSplit = Splitter.on(';').trimResults();
}