blob: 902eb5dcb1221bf924bd7c13dc6a3b7f0dcde3b9 [file] [log] [blame]
package org.unicode.cldr.unittest;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRFile.Status;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.DtdType;
import org.unicode.cldr.util.XMLSource;
import com.ibm.icu.dev.test.TestFmwk;
// make this a JUnit test?
public class TestAliases extends TestFmwk {
static final CLDRConfig config = CLDRConfig.getInstance();
public static void main(String[] args) {
new TestAliases().run(args);
}
public void testAlias() {
String[][] testCases = {
{ "//ldml/foo[@fii=\"abc\"]", "//ldml" },
{ "//ldml/foo[@fii=\"ab/c\"]", "//ldml" },
{ "//ldml/foo[@fii=\"ab/[c\"]", "//ldml" },
};
for (String[] pair : testCases) {
if (!XMLSource.Alias.stripLastElement(pair[0]).equals(pair[1])) {
errln(Arrays.asList(pair).toString());
}
}
}
/** Check on
* http://unicode.org/cldr/trac/ticket/9477
* <field type="quarter-narrow">
* <alias source="locale" path="../field[@type='quarter-short']"/>
* </field>
<field type="quarter-short">
<relativeTime type="future">
<relativeTimePattern count="one">in {0} qtr.</relativeTimePattern>
<relativeTimePattern count="other">in {0} qtrs.</relativeTimePattern>
</relativeTime>
</field>
*/
public void testCountBase() {
String[][] testCases = {
{"en", "//ldml/numbers/currencyFormats/currencyFormatLength[@type=\"short\"]/currencyFormat[@type=\"standard\"]/pattern[@type=\"1000\"][@count=\"one\"]",
"en", "//ldml/numbers/currencyFormats[@numberSystem=\"latn\"]/currencyFormatLength[@type=\"short\"]/currencyFormat[@type=\"standard\"]/pattern[@type=\"1000\"][@count=\"one\"]"
},
{"en", "//ldml/characterLabels/characterLabelPattern[@type=\"strokes\"][@count=\"one\"]",
"en", "//ldml/characterLabels/characterLabelPattern[@type=\"strokes\"][@count=\"one\"]",
},
{"ak", "//ldml/characterLabels/characterLabelPattern[@type=\"strokes\"][@count=\"one\"]",
"root", "//ldml/characterLabels/characterLabelPattern[@type=\"strokes\"][@count=\"other\"]",
}
};
Status status = new Status();
for (String[] row : testCases) {
String locale = row[0];
CLDRFile factory = config.getCldrFactory().make(locale, true);
String originalPath = row[1];
String expectedLocale = row[2];
String expectedPath = row[3];
String actualLocale = factory.getSourceLocaleID(originalPath, status);
String actualPath = status.pathWhereFound;
assertEquals("path", expectedPath, actualPath);
assertEquals("locale", expectedLocale, actualLocale);
}
}
static final CLDRFile en = config.getEnglish();
public void testCountFull() {
Status status = new Status();
Set<String> sorted = new TreeSet<>();
Matcher countMatcher = Pattern.compile("\\[@count=\"([^\"]*)\"\\]").matcher("");
for (String path : en.fullIterable()) {
if (!path.contains("@count") || !path.contains("/field")) { // TODO remove /field
continue;
}
if (path.equals("//ldml/dates/fields/field[@type=\"wed-narrow\"]/relativeTime[@type=\"future\"]/relativeTimePattern[@count=\"one\"]")) {
int debug = 0;
}
String actualLocale = en.getSourceLocaleID(path, status);
String actualPath = status.pathWhereFound;
if ("en".equals(actualLocale) && path.equals(actualPath)) {
continue;
}
String value = en.getStringValue(path);
String fullpath = en.getFullXPath(path);
countMatcher.reset(path).find();
String sourceCount = countMatcher.group(1);
countMatcher.reset(actualPath).find();
String actualCount = countMatcher.group(1);
if (assertEquals(path, sourceCount, actualCount)) {
continue;
}
en.getSourceLocaleID(path, status); // for debugging
sorted.add("locale:\t" + actualLocale
+ "\nsource path:\t" + path
+ "\nsource fpath:\t" + (path.equals(fullpath) ? "=" : fullpath)
+ "\nactual path:\t" + (path.equals(actualPath) ? "=" : actualPath)
+ "\nactual value:\t" + value);
}
sorted.forEach(x -> System.out.println(x));
}
/**
* Change to "testEmitChanged()" to emit a file of current inheritance.
* @throws IOException
*/
public void checkEmitChanged() throws IOException {
Status status = new Status();
Set<String> sorted = new TreeSet<>();
try (PrintWriter out = FileUtilities.openUTF8Writer(CLDRPaths.AUX_DIRECTORY + "temp", "inheritance0.txt")) {
for (CLDRFile factory : Arrays.asList(
config.getCldrFactory().make("root", true),
en,
config.getCldrFactory().make("en_001", true), // example with double inheritance
config.getCldrFactory().make("ak", true) // example with few strings
)) {
sorted.clear();
out.println("source locale\tactual locale\tsource path\tactual path");
String locale = factory.getLocaleID();
for (String path : factory.fullIterable()) {
if (path.contains("calendar[@type=")
&& !(path.contains("calendar[@type=\"gregorian")
|| path.contains("calendar[@type=\"generic"))
) {
continue;
}
if (path.contains("[@numberSystem=")
&& !(path.contains("[@numberSystem=\"latn")
|| path.contains("[@numberSystem=\"deva"))
) {
continue;
}
String actualLocale = factory.getSourceLocaleID(path, status);
String actualPath = status.pathWhereFound;
if (path.equals(actualPath)) {
continue;
}
sorted.add(
locale
+ "\t" + (locale.equals(actualLocale) ? "=" : actualLocale)
+ "\t" + path
+ "\t" + (path.equals(actualPath) ? "=" : actualPath));
}
System.out.println(locale + "\t" + sorted.size());
sorted.forEach(x -> out.println(x));
}
}
}
/** Test that <alias> elements only are in root.html
* For speed in testing, just checks for the presence of "<alias" to avoid doing XML parse.
*/
public void TestOnlyRootHasAliases() {
for (String dirString : DtdType.ldml.directories) {
checkForAliases(CLDRPaths.COMMON_DIRECTORY + dirString);
}
}
/** Test that <alias> elements only are in root.html
* For speed in testing, just checks for the presence of "<alias" to avoid doing XML parse.
*/
private void checkForAliases(String dirString) {
File file = new File(dirString);
if (file.isDirectory()) {
for (String subfile : file.list()) {
checkForAliases(dirString + "/" + subfile);
}
} else {
String name = file.getName();
if (!name.equals("root.xml") && name.endsWith(".xml")) {
for (String line : FileUtilities.in(FileUtilities.openFile(file))) {
if (line.contains("<alias")) {
errln(file + " contains <alias…");
}
}
}
}
}
}