1 package org.unicode.cldr.unittest; 2 3 import com.ibm.icu.impl.Row.R2; 4 import java.io.File; 5 import java.util.ArrayList; 6 import java.util.Arrays; 7 import java.util.HashSet; 8 import java.util.Iterator; 9 import java.util.LinkedHashSet; 10 import java.util.List; 11 import java.util.Locale; 12 import java.util.Map; 13 import java.util.Map.Entry; 14 import java.util.Set; 15 import java.util.TreeMap; 16 import org.unicode.cldr.util.CLDRConfig; 17 import org.unicode.cldr.util.CLDRPaths; 18 import org.unicode.cldr.util.ChainedMap; 19 import org.unicode.cldr.util.Pair; 20 import org.unicode.cldr.util.StandardCodes.LstrType; 21 import org.unicode.cldr.util.SupplementalDataInfo; 22 import org.unicode.cldr.util.Validity; 23 import org.unicode.cldr.util.Validity.Status; 24 import org.unicode.cldr.util.XMLFileReader; 25 import org.unicode.cldr.util.XPathParts; 26 27 public class TestSubdivisions extends TestFmwkPlus { 28 private static final String SUB_DIR = CLDRPaths.COMMON_DIRECTORY + "subdivisions/"; 29 static final SupplementalDataInfo SDI = CLDRConfig.getInstance().getSupplementalDataInfo(); 30 main(String[] args)31 public static void main(String[] args) { 32 new TestSubdivisions().run(args); 33 } 34 TestContainment()35 public void TestContainment() { 36 Set<String> containers = SDI.getContainersForSubdivisions(); 37 assertNotNull("subdivision containers", containers); 38 Set<String> states = SDI.getContainedSubdivisions("US"); 39 40 assertRelation("US contains CA", true, states, TestFmwkPlus.CONTAINS, "usca"); 41 42 /* 43 * <subgroup type="BE" contains="WAL BRU VLG"/> 44 * <subgroup type="BE" subtype="WAL" contains="WLX WNA WHT WBR WLG"/> 45 * <subgroup type="BE" subtype="VLG" contains="VBR VWV VAN VLI VOV"/> 46 */ 47 assertEquals( 48 "BE", 49 new HashSet<String>(Arrays.asList("bewal", "bebru", "bevlg")), 50 SDI.getContainedSubdivisions("BE")); 51 assertEquals( 52 "BE", 53 new HashSet<String>(Arrays.asList("bewlx", "bewna", "bewht", "bewbr", "bewlg")), 54 SDI.getContainedSubdivisions("bewal")); 55 } 56 TestNames()57 public void TestNames() { 58 final Map<String, R2<List<String>, String>> subdivisionAliases = 59 SDI.getLocaleAliasInfo().get("subdivision"); 60 // <subdivisionAlias type="CN-71" replacement="TW" reason="overlong"/> 61 // R2<List<String>, String> region = subdivisionAliases.get(value); 62 final Validity VALIDITY = Validity.getInstance(); 63 Map<String, Status> deprecated = VALIDITY.getCodeToStatus(LstrType.subdivision); 64 65 for (String file : new File(SUB_DIR).list()) { 66 if (!file.endsWith(".xml")) { 67 continue; 68 } 69 checkSubdivisionFile(file, subdivisionAliases, deprecated); 70 } 71 } 72 checkSubdivisionFile( String file, final Map<String, R2<List<String>, String>> subdivisionAliases, Map<String, Status> deprecated)73 private void checkSubdivisionFile( 74 String file, 75 final Map<String, R2<List<String>, String>> subdivisionAliases, 76 Map<String, Status> deprecated) { 77 String lang = file.replace(".xml", ""); 78 79 List<Pair<String, String>> data = new ArrayList<>(); 80 XMLFileReader.loadPathValues(SUB_DIR + file, data, true); 81 logln(file + "\t" + data.size()); 82 ChainedMap.M4<String, String, String, Status> countryToNameToSubdivisions = 83 ChainedMap.of( 84 new TreeMap<String, Object>(), 85 new TreeMap<String, Object>(), 86 new TreeMap<String, Object>(), 87 Status.class); 88 89 for (Pair<String, String> entry : data) { 90 // <subdivision type="AD-02">Canillo</subdivision> 91 XPathParts parts = XPathParts.getFrozenInstance(entry.getFirst()); 92 if (!parts.getElement(-1).equals("subdivision")) { 93 continue; 94 } 95 String name = entry.getSecond(); 96 final String subdivision = parts.getAttributeValue(-1, "type"); 97 String country = subdivision.substring(0, 2); 98 99 // if there is an alias, we're ok, don't bother with it 100 R2<List<String>, String> subdivisionAlias = subdivisionAliases.get(subdivision); 101 if (subdivisionAlias != null) { 102 // String countryName = 103 // CLDRConfig.getInstance().getEnglish().getName(CLDRFile.TERRITORY_NAME, country); 104 // assertEquals("country " + country + " = subdivision " + subdivision, countryName, 105 // value); 106 continue; 107 } 108 countryToNameToSubdivisions.put( 109 country, name, subdivision, deprecated.get(subdivision)); 110 } 111 // now look for uniqueness 112 LinkedHashSet<String> problemSet = new LinkedHashSet<>(); 113 for (Entry<String, Map<String, Map<String, Status>>> entry1 : countryToNameToSubdivisions) { 114 String country = entry1.getKey().toUpperCase(Locale.ROOT); 115 for (Entry<String, Map<String, Status>> entry2 : entry1.getValue().entrySet()) { 116 String name = entry2.getKey(); 117 Map<String, Status> subdivisionMap = entry2.getValue(); 118 if (subdivisionMap.size() == 1) { 119 continue; 120 } 121 logln(lang + "," + country + "Name «" + name + "» for " + subdivisionMap.keySet()); 122 // we have multiple names. 123 // remove the deprecated ones, but generate aliases 124 problemSet.clear(); 125 for (Iterator<Entry<String, Status>> it = subdivisionMap.entrySet().iterator(); 126 it.hasNext(); ) { 127 Entry<String, Status> entry = it.next(); 128 if (entry.getValue() != Status.regular) { // if not deprecated 129 problemSet.add(entry.getKey()); 130 it.remove(); 131 } 132 } 133 if (problemSet.size() < 2) { 134 continue; 135 } 136 // warn about collisions 137 errln(lang + "," + country + "Name collision for «" + name + "» in " + problemSet); 138 139 // show the possible aliases to add 140 String first = problemSet.iterator().next(); 141 for (String deprecatedItem : subdivisionMap.keySet()) { 142 warnln( 143 lang 144 + "," 145 + country 146 + "Consider adding: " 147 + "<subdivisionAlias type=\"" 148 + deprecatedItem 149 + "\" replacement=\"" 150 + first 151 + "\" reason=\"deprecated\"/>"); 152 } 153 } 154 } 155 } 156 } 157