1 /* 2 * Created on May 19, 2005 3 * Copyright (C) 2004-2005, Unicode, Inc., International Business Machines Corporation, and others. 4 * For terms of use, see http://www.unicode.org/terms_of_use.html 5 */ 6 package org.unicode.cldr.tool; 7 8 import java.util.HashMap; 9 import java.util.Iterator; 10 import java.util.Map; 11 import java.util.Set; 12 import java.util.TreeMap; 13 import java.util.TreeSet; 14 15 import org.unicode.cldr.util.CLDRFile; 16 import org.unicode.cldr.util.Factory; 17 import org.unicode.cldr.util.ICUServiceBuilder; 18 import org.unicode.cldr.util.Log; 19 20 import com.ibm.icu.text.UnicodeSet; 21 import com.ibm.icu.util.ULocale; 22 23 class GenerateCldrDateTimeTests { 24 Map<ULocale, UnicodeSet> ulocale_exemplars = new TreeMap<ULocale, UnicodeSet>(GenerateCldrTests.ULocaleComparator); 25 Map<UnicodeSet, UnicodeSet> uniqueExemplars = new HashMap<UnicodeSet, UnicodeSet>(); 26 Set<ULocale> locales = new TreeSet<ULocale>(GenerateCldrTests.ULocaleComparator); 27 28 UnicodeSet getExemplarSet(ULocale locale) { 29 return ulocale_exemplars.get(locale); 30 } 31 32 void show() { 33 Log.logln("Showing Locales"); 34 Log.logln("Unique Exemplars: " + uniqueExemplars.size()); 35 for (Iterator<ULocale> it2 = ulocale_exemplars.keySet().iterator(); it2.hasNext();) { 36 ULocale locale = it2.next(); 37 UnicodeSet us = getExemplarSet(locale); 38 Log.logln("\t" + locale + ", " + us); 39 } 40 } 41 42 static final ULocale ROOT = new ULocale("root"); // since CLDR has different root. 43 private Factory cldrFactory; 44 ICUServiceBuilder icuServiceBuilder; 45 46 GenerateCldrDateTimeTests(String sourceDir, String localeRegex, boolean doResolved) { 47 this.cldrFactory = Factory.make(sourceDir, ".*"); 48 icuServiceBuilder = new ICUServiceBuilder(); 49 Set<String> s = GenerateCldrTests.getMatchingXMLFiles(sourceDir, localeRegex); 50 for (Iterator<String> it = s.iterator(); it.hasNext();) { 51 getInfo(it.next(), doResolved); 52 } 53 // now do inheritance manually 54 for (Iterator<ULocale> it = locales.iterator(); it.hasNext();) { 55 ULocale locale = it.next(); 56 UnicodeSet ex = (UnicodeSet) ulocale_exemplars.get(locale); 57 if (ex != null) continue; 58 for (ULocale parent = locale.getFallback(); parent != null; parent = parent.getFallback()) { 59 ULocale fixedParent = parent.getLanguage().length() == 0 ? ROOT : parent; 60 ex = (UnicodeSet) ulocale_exemplars.get(fixedParent); 61 if (ex == null) continue; 62 ulocale_exemplars.put(locale, ex); 63 break; 64 } 65 } 66 67 } 68 69 void getInfo(String locale, boolean doResolved) { 70 System.out.println("Getting info for: " + locale); 71 locales.add(new ULocale(locale)); 72 CLDRFile cldrFile = cldrFactory.make(locale, doResolved); 73 // Node node = LDMLUtilities.getNode(doc, "//ldml/characters/exemplarCharacters"); 74 String cpath = "//ldml/characters/exemplarCharacters"; 75 String path = cldrFile.getFullXPath(cpath); 76 if (path == null) return; 77 // if (path.indexOf("[@draft=") >= 0) System.out.println("Skipping draft: " + locale + ",\t" + path); 78 String exemplars = cldrFile.getStringValue(cpath); 79 UnicodeSet exemplarSet = new UnicodeSet(exemplars); 80 UnicodeSet fixed = (UnicodeSet) uniqueExemplars.get(exemplarSet); 81 if (fixed == null) { 82 uniqueExemplars.put(exemplarSet, exemplarSet); 83 fixed = exemplarSet; 84 } 85 ulocale_exemplars.put(new ULocale(locale), fixed); 86 } 87 88 // ========== DATES ========== 89 90 /* 91 * Equator DateEquator = new Equator() { 92 *//** 93 * Must both be ULocales 94 */ 95 /* 96 * public boolean equals(Object o1, Object o2) { 97 * ULocale loc1 = (ULocale) o1; 98 * ULocale loc2 = (ULocale) o2; 99 * for (int i = 0; i < ICUServiceBuilder.LIMIT_DATE_FORMAT_INDEX; ++i) { 100 * for (int j = 0; j < ICUServiceBuilder.LIMIT_DATE_FORMAT_INDEX; ++j) { 101 * if (i == 0 && j == 0) continue; // skip null case 102 * DateFormat df1 = icuServiceBuilder.getDateFormat(loc1.toString(), i, j); 103 * NumberFormat nf = df1.getNumberFormat(); 104 * nf.setCurrency(ICUServiceBuilder.NO_CURRENCY); 105 * df1.setNumberFormat(nf); 106 * DateFormat df2 = icuServiceBuilder.getDateFormat(loc2.toString(), i, j); 107 * nf = df2.getNumberFormat(); 108 * nf.setCurrency(ICUServiceBuilder.NO_CURRENCY); 109 * df2.setNumberFormat(nf); 110 * if (!df1.equals(df2)) { 111 * df1.equals(df2); 112 * return false; 113 * } 114 * } 115 * } 116 * return true; 117 * } 118 * }; 119 */ 120 121 /* 122 * Equator ZoneEquator = new Equator() { 123 * 124 * public boolean equals(Object o1, Object o2) { 125 * ULocale loc1 = (ULocale) o1; 126 * ULocale loc2 = (ULocale) o2; 127 * // locales are equivalent they have the same zone resources. 128 * CLDRFile cldrFile1 = cldrFactory.make(loc1.toString(),true); 129 * CLDRFile cldrFile2 = cldrFactory.make(loc1.toString(),true); 130 * for (int i = 0; i < ICUServiceBuilder.LIMIT_DATE_FORMAT_INDEX; ++i) { 131 * for (int j = 0; j < ICUServiceBuilder.LIMIT_DATE_FORMAT_INDEX; ++j) { 132 * if (i == 0 && j == 0) continue; // skip null case 133 * DateFormat df1 = icuServiceBuilder.getDateFormat(loc1.toString(), i, j); 134 * NumberFormat nf = df1.getNumberFormat(); 135 * nf.setCurrency(ICUServiceBuilder.NO_CURRENCY); 136 * df1.setNumberFormat(nf); 137 * DateFormat df2 = icuServiceBuilder.getDateFormat(loc2.toString(), i, j); 138 * nf = df2.getNumberFormat(); 139 * nf.setCurrency(ICUServiceBuilder.NO_CURRENCY); 140 * df2.setNumberFormat(nf); 141 * if (!df1.equals(df2)) { 142 * df1.equals(df2); 143 * return false; 144 * } 145 * } 146 * } 147 * return false; 148 * } 149 * }; 150 */ 151 // ========== NUMBERS ========== 152 153 /* 154 * <numbers> 155 * - 156 * <symbols> 157 * <decimal>.</decimal> 158 * <group>,</group> 159 * <list>;</list> 160 * <percentSign>%</percentSign> 161 * <nativeZeroDigit>0</nativeZeroDigit> 162 * <patternDigit>#</patternDigit> 163 * <plusSign>+</plusSign> 164 * <minusSign>-</minusSign> 165 * <exponential>E</exponential> 166 * <perMille>\u2030</perMille> 167 * <infinity>\u221E</infinity> 168 * <nan>NaN</nan> 169 * </symbols> 170 * - 171 * <decimalFormats> 172 * - 173 * <decimalFormatLength> 174 * - 175 * <decimalFormat> 176 * <pattern>#,##0.###</pattern> 177 */ 178 179 /* 180 * Equator NumberEquator = new Equator() { 181 *//** 182 * Must both be ULocales 183 */ 184 /* 185 * public boolean equals(Object o1, Object o2) { 186 * ULocale loc1 = (ULocale) o1; 187 * ULocale loc2 = (ULocale) o2; 188 * for (int i = 0; i < ICUServiceBuilder.LIMIT_NUMBER_INDEX; ++i) { 189 * NumberFormat nf1 = icuServiceBuilder.getNumberFormat(loc1.toString(), i); 190 * NumberFormat nf2 = icuServiceBuilder.getNumberFormat(loc2.toString(), i); 191 * boolean result = nf1.equals(nf2); 192 * if (!result) { 193 * return false; 194 * } 195 * } 196 * return true; 197 * } 198 * }; 199 */ 200 201 /** 202 * 203 */ 204 public ICUServiceBuilder getICUServiceBuilder() { 205 return icuServiceBuilder; 206 } 207 }