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