• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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