1 package org.unicode.cldr.unittest; 2 3 import java.util.Arrays; 4 import java.util.Collections; 5 import java.util.EnumSet; 6 import java.util.HashSet; 7 import java.util.Set; 8 9 import org.unicode.cldr.test.CoverageLevel2; 10 import org.unicode.cldr.util.CLDRConfig; 11 import org.unicode.cldr.util.CLDRFile; 12 import org.unicode.cldr.util.CLDRLocale; 13 import org.unicode.cldr.util.CoreCoverageInfo; 14 import org.unicode.cldr.util.CoreCoverageInfo.CoreItems; 15 import org.unicode.cldr.util.Factory; 16 import org.unicode.cldr.util.LanguageTagParser; 17 import org.unicode.cldr.util.Level; 18 import org.unicode.cldr.util.Organization; 19 import org.unicode.cldr.util.PathHeader; 20 import org.unicode.cldr.util.StandardCodes; 21 import org.unicode.cldr.util.SupplementalDataInfo; 22 23 import com.google.common.collect.LinkedHashMultimap; 24 import com.google.common.collect.Multimap; 25 26 public class TestCoverage extends TestFmwkPlus { 27 28 static final StandardCodes sc = StandardCodes.make(); 29 static final CLDRConfig testInfo = CLDRConfig.getInstance(); 30 static final SupplementalDataInfo sdi = testInfo.getSupplementalDataInfo(); 31 main(String[] args)32 public static void main(String[] args) { 33 new TestCoverage().run(args); 34 } 35 36 static Set<CoreItems> all = Collections.unmodifiableSet(EnumSet 37 .allOf(CoreItems.class)); 38 static Set<CoreItems> none = Collections.unmodifiableSet(EnumSet 39 .noneOf(CoreItems.class)); 40 TestBasic()41 public void TestBasic() { 42 CLDRFile engCldrFile = testInfo.getEnglish(); 43 Multimap<CoreItems, String> errors = LinkedHashMultimap.create(); 44 Set<CoreItems> coreCoverage = CoreCoverageInfo.getCoreCoverageInfo( 45 engCldrFile, errors); 46 if (!assertEquals("English should be complete", all, coreCoverage)) { 47 showDiff("Missing", all, coreCoverage); 48 } 49 CLDRFile skimpyLocale = testInfo.getCldrFactory().make("asa", false); 50 errors.clear(); 51 coreCoverage = CoreCoverageInfo.getCoreCoverageInfo(skimpyLocale, 52 errors); 53 if (!assertEquals("Skimpy locale should not be complete", none, 54 coreCoverage)) { 55 showDiff("Missing", all, coreCoverage); 56 showDiff("Extra", coreCoverage, none); 57 } 58 } 59 TestSelected()60 public void TestSelected() { 61 Object[][] tests = { 62 { "en", "//ldml/localeDisplayNames/subdivisions/subdivision[@type=\"gbeng\"]", Level.MODERN, 8 }, 63 { "en", "//ldml/numbers/minimalPairs/ordinalMinimalPairs[@ordinal=\"other\"]", Level.MODERATE, 20 }, 64 { "en", "//ldml/numbers/minimalPairs/pluralMinimalPairs[@count=\"other\"]", Level.MODERATE, 20 }, 65 }; 66 PathHeader.Factory phf = PathHeader.getFactory(testInfo.getEnglish()); 67 for (Object[] test : tests) { 68 String localeId = (String) test[0]; 69 String path = (String) test[1]; 70 Level expectedLevel = (Level) test[2]; 71 int expectedVotes = (Integer) test[3]; 72 CoverageLevel2 coverageLevel = CoverageLevel2.getInstance(sdi, localeId); 73 Level level = coverageLevel.getLevel(path); 74 PathHeader ph = phf.fromPath(path); 75 assertEquals(localeId + " : " + path + " : ", expectedLevel, level); 76 CLDRLocale loc = CLDRLocale.getInstance(localeId); 77 int actualVotes = sdi.getRequiredVotes(loc, ph); 78 assertEquals(localeId + " : " + path + " : ", expectedVotes, actualVotes); 79 } 80 } 81 82 static final boolean DEBUG = false; 83 TestLocales()84 public void TestLocales() { 85 long start = System.currentTimeMillis(); 86 logln("Status\tLocale\tName\tLevel\tCount" + showColumn(all) 87 + "\tError Messages"); 88 LanguageTagParser ltp = new LanguageTagParser(); 89 Multimap<CoreItems, String> errors = LinkedHashMultimap.create(); 90 Set<String> toTest = new HashSet( 91 Arrays.asList("ky mn ms uz az kk pa sr zh lo".split(" "))); 92 Set<String> defaultContents = sdi.getDefaultContentLocales(); 93 94 Factory fullCldrFactory = testInfo.getFullCldrFactory(); 95 for (String locale : fullCldrFactory.getAvailable()) { 96 if (!ltp.set(locale).getRegion().isEmpty() || locale.equals("root") 97 || defaultContents.contains(locale)) { 98 continue; 99 } 100 Level level = sc.getLocaleCoverageLevel(Organization.cldr, locale); 101 if (DEBUG && (!toTest.contains(locale) || level != Level.MODERN)) { 102 continue; 103 } 104 if (locale.equals("am")) { 105 int debug = 0; 106 } 107 108 CLDRFile testFile = fullCldrFactory.make(locale, false); 109 Set<CoreItems> coreCoverage; 110 errors.clear(); 111 try { 112 coreCoverage = CoreCoverageInfo.getCoreCoverageInfo(testFile, 113 errors); 114 } catch (Exception e) { 115 errln("Failure for locale: " + getLocaleAndName(locale)); 116 e.printStackTrace(); 117 continue; 118 } 119 Set missing = EnumSet.allOf(CoreItems.class); 120 missing.removeAll(coreCoverage); 121 if (missing.size() != 0) { 122 errln("\t" + getLocaleAndName(locale) + "\t" + level + "\t" 123 + missing.size() + showColumn(missing) + "\t" + errors); 124 } else { 125 logln("OK\t" + getLocaleAndName(locale) + "\t" + level + "\t" 126 + missing.size()); 127 } 128 } 129 long end = System.currentTimeMillis(); 130 logln("Elapsed:\t" + (end - start)); 131 } 132 getLocaleAndName(String locale)133 private String getLocaleAndName(String locale) { 134 return locale + "\t" + testInfo.getEnglish().getName(locale); 135 } 136 showColumn(Set items)137 private String showColumn(Set items) { 138 StringBuilder result = new StringBuilder(); 139 for (CoreItems x : CoreItems.values()) { 140 result.append("\t"); 141 if (items.contains(x)) { 142 result.append(x); 143 } 144 } 145 return result.toString(); 146 } 147 showDiff(String title, Set<CoreItems> all, Set<CoreItems> coreCoverage)148 public void showDiff(String title, Set<CoreItems> all, 149 Set<CoreItems> coreCoverage) { 150 Set diff = EnumSet.copyOf(all); 151 diff.removeAll(coreCoverage); 152 if (diff.size() != 0) { 153 errln("\t" + title + ": " + diff); 154 } 155 } 156 } 157