blob: 0f577bb5a5d2a533fdd84b5867c0a74583e6c84b [file] [log] [blame]
package org.unicode.cldr.unittest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.SupplementalDataInfo;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
import com.ibm.icu.impl.Row.R2;
import com.ibm.icu.util.ICUUncheckedIOException;
public class TestUnContainment extends TestFmwkPlus {
static CLDRConfig testInfo = CLDRConfig.getInstance();
private static final SupplementalDataInfo SUPPLEMENTAL_DATA_INFO = testInfo.getSupplementalDataInfo();
Map<String, R2<List<String>, String>> regionToInfo = SUPPLEMENTAL_DATA_INFO
.getLocaleAliasInfo()
.get("territory");
private static final Set<String> NOT_CLDR_TERRITORY_CODES = ImmutableSet.of("830"); // Channel Islands
private static final Set<String> KNOWN_CONTAINMENT_EXCEPTIONS = ImmutableSet.of("AQ","680"); // Antarctica, Sark
final Multimap<String, String> UnChildToParent;
{
Multimap<String, String> _UnChildToParent = TreeMultimap.create();
Splitter tab = Splitter.on('\t').trimResults();
try (BufferedReader unCodes = CldrUtility.getUTF8Data("external/UnCodes.txt");) {
for (String line : FileUtilities.in(unCodes)) {
List<String> items = tab.splitToList(line);
if (line.isEmpty() || line.startsWith("Global Code")) {
continue;
}
String parent = null;
for (int i = 0; i < 10; i += 2) {
String region = items.get(i);
if (!region.isEmpty()) {
region = unToCldrCode(region);
if (parent != null && region != null){
_UnChildToParent.put(region, parent);
}
if (region != null) {
parent = region;
}
}
if (i == 6) {
++i; // hack because last two are out of order
}
}
}
UnChildToParent = ImmutableSetMultimap.copyOf(_UnChildToParent);
} catch (IOException e) {
throw new ICUUncheckedIOException(e);
}
}
public static void main(String[] args) {
new TestUnContainment().run(args);
}
private String name(Collection<String> codes) {
StringBuilder result = new StringBuilder();
for (String code : codes) {
if (result.length() != 0) {
result.append(", ");
}
result.append(name(code));
}
return result.toString();
}
private String name(String code) {
String name = testInfo.getEnglish().getName(CLDRFile.TERRITORY_NAME, code);
return name + " (" + code + ")";
}
private String unToCldrCode(String code) {
if (NOT_CLDR_TERRITORY_CODES.contains(code)) {
return null;
}
R2<List<String>, String> codeInfo = regionToInfo.get(code);
if (codeInfo != null) {
if (codeInfo.get0() != null && !codeInfo.get0().isEmpty()) {
code = codeInfo.get0().get(0);
}
}
return code;
}
public void TestContainment() {
/*
CLDR
<group type="001" contains="019 002 150 142 009"/> <!--World -->
<group type="001" contains="EU EZ UN" status="grouping"/> <!--European Union, Eurozone, United Nations -->
<group type="001" contains="QU" status="deprecated"/> <!--European Union -->
<group type="011" contains="BF BJ CI CV GH GM GN GW LR ML MR NE NG SH SL SN TG"/> <!--Western Africa -->
*/
for (Entry<String, Collection<String>> entry : UnChildToParent.asMap().entrySet()) {
Collection<String> unParents = entry.getValue();
String unChild = entry.getKey();
//System.out.println(name(unParents) + "\t" + name(unChild));
for (String unParent : unParents) {
Set<String> children = SUPPLEMENTAL_DATA_INFO.getContained(unParent);
if (children != null && children.contains(unChild)) {
continue;
}
// See CLDR ticket 10187 for rationalization on the known containment exceptions.
if (KNOWN_CONTAINMENT_EXCEPTIONS.contains(unChild)) {
continue;
}
msg("UN containment doesn't match CLDR for " + name(unParent)
+ ": cldr children " + children
+ " don't contain UN " + name(unChild), ERR, true, true);
}
}
}
}