1 package org.unicode.cldr.unittest; 2 3 import java.util.Arrays; 4 import java.util.Date; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Set; 9 import java.util.TreeSet; 10 11 import org.unicode.cldr.util.CLDRConfig; 12 import org.unicode.cldr.util.CLDRFile; 13 import org.unicode.cldr.util.Factory; 14 import org.unicode.cldr.util.LanguageTagParser; 15 import org.unicode.cldr.util.SupplementalDataInfo; 16 import org.unicode.cldr.util.SupplementalDataInfo.CurrencyDateInfo; 17 18 import com.ibm.icu.dev.test.TestFmwk; 19 20 public class TestLocalCurrency extends TestFmwk { 21 static CLDRConfig testInfo = CLDRConfig.getInstance(); 22 main(String[] args)23 public static void main(String[] args) { 24 new TestLocalCurrency().run(args); 25 } 26 maxLocalizedSymbols(String region)27 private int maxLocalizedSymbols(String region) { 28 final List<String> regionsWithTwoCurrencySymbols = Arrays.asList("AE", "AZ", 29 "BA", "CN", "DZ", "ET", "IQ", "IR", "LK", "KM", "MA", "MR", "MK", "PK", 30 "RS", "SD", "SY", "TN", "UZ"); 31 if (regionsWithTwoCurrencySymbols.contains(region)) { 32 return 2; 33 } 34 return 1; 35 } 36 TestConsistency()37 public void TestConsistency() { 38 39 LanguageTagParser ltp = new LanguageTagParser(); 40 SupplementalDataInfo supplementalDataInfo = testInfo 41 .getSupplementalDataInfo(); 42 Map<String, String> localeToLocalCurrencySymbol = new HashMap<String, String>(); 43 Map<String, Set<String>> localizedCurrencySymbols = new HashMap<String, Set<String>>(); 44 Map<String, Set<String>> regionToLocales = new HashMap<String, Set<String>>(); 45 46 List<String> nonLocalizedOK = Arrays.asList("AED", "AZN", "CHF", "CVE", "GEL", 47 "HRK", "HUF", "IQD", "IRR", "ISK", "KPW", "LTL", "MAD", "MDL", "RON", "RSD", 48 "SDG", "THB", "TMT"); 49 50 Factory factory = testInfo.getCldrFactory(); 51 Date now = new Date(); 52 for (String locale : factory.getAvailable()) { 53 ltp.set(locale); 54 String region = ltp.getRegion(); 55 if (region == null || region.isEmpty() || region.length() != 2) { 56 continue; 57 } 58 CLDRFile localeData = testInfo.getCLDRFile(locale, true); 59 String localCurrency = null; 60 Set<CurrencyDateInfo> targetCurrencyInfo = supplementalDataInfo 61 .getCurrencyDateInfo(region); 62 63 for (CurrencyDateInfo cdi : targetCurrencyInfo) { 64 if (cdi.getStart().before(now) && cdi.getEnd().after(now) 65 && cdi.isLegalTender()) { 66 localCurrency = cdi.getCurrency(); 67 break; 68 } 69 } 70 71 if (localCurrency == null) { 72 errln("No current legal tender currency for locale: " + locale); 73 continue; 74 } else { 75 logln("Testing currency: " + localCurrency + " for locale: " 76 + locale); 77 } 78 79 String checkPath = "//ldml/numbers/currencies/currency[@type=\"" 80 + localCurrency + "\"]/symbol"; 81 String localCurrencySymbol = localeData.getWinningValue(checkPath); 82 localeToLocalCurrencySymbol.put(locale, localCurrencySymbol); 83 84 Set<String> localSymbols = localizedCurrencySymbols.get(region); 85 if (localSymbols == null) { 86 localSymbols = new TreeSet<String>(); 87 } 88 89 if (localCurrencySymbol.equals(localCurrency) 90 && !nonLocalizedOK.contains(localCurrency)) { 91 errln("Currency symbol " + localCurrencySymbol + " for locale " 92 + locale + " is not localized."); 93 } 94 95 localSymbols.add(localCurrencySymbol); 96 localizedCurrencySymbols.put(region, localSymbols); 97 98 Set<String> regionLocales = regionToLocales.get(region); 99 if (regionLocales == null) { 100 regionLocales = new TreeSet<String>(); 101 } 102 103 regionLocales.add(locale); 104 regionToLocales.put(region, regionLocales); 105 106 } 107 108 for (String region : localizedCurrencySymbols.keySet()) { 109 Set<String> symbols = localizedCurrencySymbols.get(region); 110 if (symbols.size() > maxLocalizedSymbols(region)) { 111 StringBuffer errmsg = new StringBuffer(); 112 errmsg.append("Too many localized currency symbols for region: " 113 + region + "\n"); 114 for (String locale : regionToLocales.get(region)) { 115 errmsg.append("\t\tLocale: " + locale); 116 errmsg.append(" Symbol: " 117 + localeToLocalCurrencySymbol.get(locale)); 118 errmsg.append('\n'); 119 } 120 errln(errmsg.toString()); 121 } 122 } 123 } 124 } 125