blob: 6fc2be0ed02906b4d7b6285aa669498d43fe6943 [file] [log] [blame]
package org.unicode.cldr.unittest;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
import org.unicode.cldr.test.ExampleGenerator;
import org.unicode.cldr.test.ExampleGenerator.ExampleContext;
import org.unicode.cldr.test.ExampleGenerator.ExampleType;
import org.unicode.cldr.test.ExampleGenerator.UnitLength;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.PathStarrer;
import org.unicode.cldr.util.SupplementalDataInfo.PluralInfo.Count;
import org.unicode.cldr.util.With;
import com.google.common.collect.ImmutableSet;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.dev.util.CollectionUtilities;
public class TestExampleGenerator extends TestFmwk {
CLDRConfig info = CLDRConfig.getInstance();
public static void main(String[] args) {
new TestExampleGenerator().run(args);
}
public void testCurrency() {
String[][] tests = {
{
"fr",
"one",
"〖❬1,23 ❭value-one〗〖❬0,00 ❭value-one〗",
"〖❬1,23❭_❬dollar des États-Unis❭〗〖❬1,23❭_❬euro❭〗〖❬0,00❭_❬dollar des États-Unis❭〗〖❬0,00❭_❬euro❭〗" },
{
"fr",
"other",
"〖❬2,34 ❭value-other〗〖❬3,45 ❭value-other〗",
"〖❬2,34❭_❬dollars des États-Unis❭〗〖❬2,34❭_❬euros❭〗〖❬3,45❭_❬dollars des États-Unis❭〗〖❬3,45❭_❬euros❭〗" },
{ "en", "one", "〖❬1 ❭Bermudan dollar〗",
"〖❬1❭ ❬US dollar❭〗〖❬1❭ ❬euro❭〗" },
{ "en", "other",
"〖❬1.23 ❭Bermudan dollars〗〖❬0.00 ❭Bermudan dollars〗",
"〖❬1.23❭ ❬US dollars❭〗〖❬1.23❭ ❬euros❭〗〖❬0.00❭ ❬US dollars❭〗〖❬0.00❭ ❬euros❭〗" }, };
String sampleCurrencyPatternPrefix = "//ldml/numbers/currencyFormats[@numberSystem=\"latn\"]/unitPattern[@count=\"";
String sampleCurrencyPrefix = "//ldml/numbers/currencies/currency[@type=\"BMD\"]/displayName[@count=\"";
String sampleTemplateSuffix = "\"]";
ExampleContext context = null;
for (String[] row : tests) {
ExampleType type = row[0].equals("en") ? ExampleType.ENGLISH
: ExampleType.NATIVE;
ExampleGenerator exampleGenerator = getExampleGenerator(row[0]);
String value = "value-" + row[1];
String path = sampleCurrencyPrefix + row[1] + sampleTemplateSuffix;
String result = ExampleGenerator
.simplify(exampleGenerator.getExampleHtml(path, value,
context, type), false);
assertEquals(row[0] + "-" + row[1] + "-BMD", row[2], result);
value = "{0}_{1}";
path = sampleCurrencyPatternPrefix + row[1] + sampleTemplateSuffix;
result = ExampleGenerator
.simplify(exampleGenerator.getExampleHtml(path, value,
context, type), false);
assertEquals(row[0] + "-" + row[1] + "-pat", row[3], result);
}
}
static final Set<String> DELIBERATE_EXCLUDED_EXAMPLES = ImmutableSet.of(
// WARNING - do not disable the test by putting in too broad a match. Make sure the paths are reasonably granular.
// ========
// DELIBERATE EXCLUSIONS; no need to have these in context.
// ========
"//ldml/layout/orientation/characterOrder",
"//ldml/layout/orientation/lineOrder",
"//ldml/characters/moreInformation",
"//ldml/numbers/symbols[@numberSystem=\"([^\"]*+)\"]/infinity",
"//ldml/numbers/symbols[@numberSystem=\"([^\"]*+)\"]/list",
"//ldml/numbers/symbols[@numberSystem=\"([^\"]*+)\"]/nan",
"//ldml/numbers/currencies/currency[@type=\"([^\"]*+)\"]/displayName",
"//ldml/localeDisplayNames/measurementSystemNames/measurementSystemName[@type=\"([^\"]*+)\"]",
// old format
"//ldml/numbers/symbols/infinity",
"//ldml/numbers/symbols/list",
"//ldml/numbers/symbols/nan",
"//ldml/posix/messages/nostr",
"//ldml/posix/messages/yesstr",
"//ldml/contextTransforms/contextTransformUsage[@type=\"([^\"]*+)\"]/contextTransform[@type=\"([^\"]*+)\"]",
"//ldml/characters/exemplarCharacters",
"//ldml/characters/exemplarCharacters[@type=\"([^\"]*+)\"]",
"//ldml/characters/parseLenients.*",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/months/monthContext[@type=\"([^\"]*+)\"]/monthWidth[@type=\"([^\"]*+)\"]/month[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/days/dayContext[@type=\"([^\"]*+)\"]/dayWidth[@type=\"([^\"]*+)\"]/day[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/quarters/quarterContext[@type=\"([^\"]*+)\"]/quarterWidth[@type=\"([^\"]*+)\"]/quarter[@type=\"([^\"]*+)\"]",
"//ldml/dates/fields/field[@type=\"([^\"]*+)\"]/displayName",
"//ldml/dates/fields/field[@type=\"([^\"]*+)\"]/relative[@type=\"([^\"]*+)\"]",
"//ldml/dates/fields/field[@type=\"([^\"]*+)\"]/relativeTime[@type=\"([^\"]*+)\"]/relativeTimePattern[@count=\"([^\"]*+)\"]",
"//ldml/dates/fields/field[@type=\"([^\"]*+)\"]/relativePeriod",
"//ldml/dates/fields/field[@type=\"([^\"]*+)\"]/displayName[@alt=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/cyclicNameSets/cyclicNameSet[@type=\"([^\"]*+)\"]/cyclicNameContext[@type=\"([^\"]*+)\"]/cyclicNameWidth[@type=\"([^\"]*+)\"]/cyclicName[@type=\"([^\"]*+)\"]",
"//ldml/numbers/minimalPairs/pluralMinimalPairs[@count=\"([^\"]*+)\"]",
"//ldml/numbers/minimalPairs/ordinalMinimalPairs[@ordinal=\"([^\"]*+)\"]",
"//ldml/characterLabels/characterLabelPattern[@type=\"([^\"]*+)\"]",
"//ldml/characterLabels/characterLabelPattern[@type=\"([^\"]*+)\"][@count=\"([^\"]*+)\"]",
"//ldml/characterLabels/characterLabel[@type=\"([^\"]*+)\"]",
"//ldml/characters/parseLenients[@scope=\"([^\"]*+)\"][@level=\"([^\"]*+)\"]/parseLenient[@sample=\"([^\"]*+)\"]"
);
/**
TEMPORARY EXCLUSIONS; TODO: add examples later
*/
static final Set<String> TEMPORARY_EXCLUDED_EXAMPLES = ImmutableSet.of(
"//ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/currencyMatch",
"//ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/surroundingMatch",
"//ldml/numbers/currencyFormats/currencySpacing/beforeCurrency/insertBetween",
"//ldml/numbers/currencyFormats/currencySpacing/afterCurrency/currencyMatch",
"//ldml/numbers/currencyFormats/currencySpacing/afterCurrency/surroundingMatch",
"//ldml/numbers/currencyFormats/currencySpacing/afterCurrency/insertBetween",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/beforeCurrency/currencyMatch",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/beforeCurrency/surroundingMatch",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/beforeCurrency/insertBetween",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/afterCurrency/currencyMatch",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/afterCurrency/surroundingMatch",
"//ldml/numbers/currencyFormats[@numberSystem=\"([^\"]*+)\"]/currencySpacing/afterCurrency/insertBetween",
"//ldml/localeDisplayNames/variants/variant[@type=\"([^\"]*+)\"]",
"//ldml/localeDisplayNames/keys/key[@type=\"([^\"]*+)\"]",
"//ldml/localeDisplayNames/types/type[@key=\"([^\"]*+)\"][@type=\"([^\"]*+)\"]",
"//ldml/localeDisplayNames/types/type[@key=\"([^\"]*+)\"][@type=\"([^\"]*+)\"][@alt=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraNames/era[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraAbbr/era[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraNarrow/era[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateTimeFormats/appendItems/appendItem[@request=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateTimeFormats/intervalFormats/intervalFormatFallback",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateTimeFormats/intervalFormats/intervalFormatItem[@id=\"([^\"]*+)\"]/greatestDifference[@id=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraNames/era[@type=\"([^\"]*+)\"][@alt=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraAbbr/era[@type=\"([^\"]*+)\"][@alt=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/eras/eraNarrow/era[@type=\"([^\"]*+)\"][@alt=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/months/monthContext[@type=\"([^\"]*+)\"]/monthWidth[@type=\"([^\"]*+)\"]/month[@type=\"([^\"]*+)\"][@yeartype=\"([^\"]*+)\"]",
"//ldml/dates/timeZoneNames/gmtZeroFormat",
"//ldml/numbers/minimumGroupingDigits",
"//ldml/numbers/symbols/timeSeparator",
"//ldml/numbers/symbols[@numberSystem=\"([^\"]*+)\"]/timeSeparator",
"//ldml/units/unitLength[@type=\"([^\"]*+)\"]/unit[@type=\"([^\"]*+)\"]/displayName",
"//ldml/units/unitLength[@type=\"([^\"]*+)\"]/unit[@type=\"([^\"]*+)\"]/perUnitPattern",
"//ldml/units/unitLength[@type=\"([^\"]*+)\"]/coordinateUnit/coordinateUnitPattern[@type=\"([^\"]*+)\"]",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/long/standard" // Error: (TestExampleGenerator.java:245) No background: <Coordinated Universal Time> 〖Coordinated Universal Time〗
// WARNING - do not disable the test by putting in too broad a match. Make sure the paths are reasonably granular.
);
static final Set<String> DELIBERATE_OK_TO_MISS_BACKGROUND = ImmutableSet.of(
"//ldml/numbers/defaultNumberingSystem",
"//ldml/numbers/otherNumberingSystems/native",
// TODO fix formatting
"//ldml/characters/exemplarCharacters",
"//ldml/characters/exemplarCharacters[@type=\"([^\"]*+)\"]",
// TODO Add background
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateFormats/dateFormatLength[@type=\"([^\"]*+)\"]/dateFormat[@type=\"([^\"]*+)\"]/pattern[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/timeFormats/timeFormatLength[@type=\"([^\"]*+)\"]/timeFormat[@type=\"([^\"]*+)\"]/pattern[@type=\"([^\"]*+)\"]",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateTimeFormats/availableFormats/dateFormatItem[@id=\"([^\"]*+)\"]",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/exemplarCity",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/long/daylight",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/short/generic",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/short/standard",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/short/daylight",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/long/generic",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/long/standard",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/long/daylight",
"//ldml/units/durationUnit[@type=\"([^\"]*+)\"]/durationUnitPattern"
);
static final Set<String> TEMPORARY_OK_TO_MISS_BACKGROUND = ImmutableSet.of(
"//ldml/numbers/defaultNumberingSystem",
"//ldml/dates/calendars/calendar[@type=\"([^\"]*+)\"]/dateTimeFormats/availableFormats/dateFormatItem[@id=\"([^\"]*+)\"][@count=\"([^\"]*+)\"]",
"//ldml/dates/timeZoneNames/zone[@type=\"([^\"]*+)\"]/long/standard",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/short/generic",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/short/standard",
"//ldml/dates/timeZoneNames/metazone[@type=\"([^\"]*+)\"]/short/daylight"
);
public void TestAllPaths() {
ExampleGenerator exampleGenerator = getExampleGenerator("en");
PathStarrer ps = new PathStarrer();
Set<String> seen = new HashSet<String>();
CLDRFile cldrFile = exampleGenerator.getCldrFile();
for (String path : CollectionUtilities.addAll(cldrFile.fullIterable()
.iterator(), new TreeSet<String>(cldrFile.getComparator()))) {
String plainStarred = ps.set(path);
String value = cldrFile.getStringValue(path);
if (value == null || path.endsWith("/alias")
|| path.startsWith("//ldml/identity")
|| DELIBERATE_EXCLUDED_EXAMPLES.contains(plainStarred)) {
continue;
}
if (TEMPORARY_EXCLUDED_EXAMPLES.contains(plainStarred)) {
if (logKnownIssue(
"Cldrbug:6342",
"In our tests, make sure that either we have an example for every path that is used in context.")) {
continue;
}
continue;
}
String example = exampleGenerator.getExampleHtml(path, value);
String javaEscapedStarred = "\""
+ plainStarred.replace("\"", "\\\"") + "\",";
if (example == null) {
if (!seen.contains(javaEscapedStarred)) {
errln("No example:\t<" + value + ">\t" + javaEscapedStarred);
}
} else {
// if
// (path.equals("//ldml/units/unitLength[@type=\"long\"]/compoundUnit[@type=\"per\"]/unitPattern[@count=\"one\"]"))
// {
// String example2 = exampleGenerator.getExampleHtml(path,
// value);
// }
String simplified = ExampleGenerator.simplify(example, false);
if (simplified.contains("null")) {
if (true || !seen.contains(javaEscapedStarred)) {
errln("'null' in message:\t<" + value + ">\t"
+ simplified + "\t" + javaEscapedStarred);
// String example2 =
// exampleGenerator.getExampleHtml(path, value); // for
// debugging
}
} else if (!simplified.startsWith("〖")) {
if (!seen.contains(javaEscapedStarred)) {
errln("Funny HTML:\t<" + value + ">\t" + simplified
+ "\t" + javaEscapedStarred);
}
} else if (!simplified.contains("❬")
&& !DELIBERATE_OK_TO_MISS_BACKGROUND.contains(plainStarred)
&& !TEMPORARY_OK_TO_MISS_BACKGROUND.contains(plainStarred)) {
if (!seen.contains(javaEscapedStarred)) {
errln("No background:\t<" + value + ">\t" + simplified
+ "\t" + javaEscapedStarred);
}
}
}
seen.add(javaEscapedStarred);
}
}
public void TestUnits() {
ExampleGenerator exampleGenerator = getExampleGenerator("en");
checkValue("Duration hm", "〖5:37〗", exampleGenerator,
"//ldml/units/durationUnit[@type=\"hm\"]/durationUnitPattern");
checkValue(
"Length m",
"〖❬1.00❭ meter〗",
exampleGenerator,
"//ldml/units/unitLength[@type=\"long\"]/unit[@type=\"length-meter\"]/unitPattern[@count=\"one\"]");
checkValue(
"Length m",
"〖❬1.50❭ meters〗",
exampleGenerator,
"//ldml/units/unitLength[@type=\"long\"]/unit[@type=\"length-meter\"]/unitPattern[@count=\"other\"]");
checkValue(
"Length m",
"〖❬1.50❭ m〗",
exampleGenerator,
"//ldml/units/unitLength[@type=\"short\"]/unit[@type=\"length-meter\"]/unitPattern[@count=\"other\"]");
checkValue(
"Length m",
"〖❬1.50❭m〗",
exampleGenerator,
"//ldml/units/unitLength[@type=\"narrow\"]/unit[@type=\"length-meter\"]/unitPattern[@count=\"other\"]");
}
private void checkValue(String message, String expected,
ExampleGenerator exampleGenerator, String path) {
String value = exampleGenerator.getCldrFile().getStringValue(path);
String actual = exampleGenerator.getExampleHtml(path, value);
assertEquals(message, expected,
ExampleGenerator.simplify(actual, false));
}
public void TestCompoundUnit() {
String[][] tests = { { "LONG", "one", "〖❬1.00 meter❭ per ❬second❭〗" },
{ "SHORT", "one", "〖❬1.00 m❭/❬sec❭〗" },
{ "NARROW", "one", "〖❬1.00m❭/❬s❭〗" },
{ "LONG", "other", "〖❬1.50 meters❭ per ❬second❭〗" },
{ "SHORT", "other", "〖❬1.50 m❭/❬sec❭〗" },
{ "NARROW", "other", "〖❬1.50m❭/❬s❭〗" }, };
checkCompoundUnits("en", tests);
// reenable these after Arabic has meter translated
// String[][] tests2 = {
// {"LONG", "few", "〖❬1 meter❭ per ❬second❭〗"},
// };
// checkCompoundUnits("ar", tests2);
}
private void checkCompoundUnits(String locale, String[][] tests) {
ExampleGenerator exampleGenerator = getExampleGenerator(locale);
for (String[] pair : tests) {
String actual = exampleGenerator.handleCompoundUnit(
UnitLength.valueOf(pair[0]), Count.valueOf(pair[1]), "");
assertEquals("CompoundUnit", pair[2],
ExampleGenerator.simplify(actual, true));
}
}
HashMap<String, ExampleGenerator> ExampleGeneratorCache = new HashMap<String, ExampleGenerator>();
private ExampleGenerator getExampleGenerator(String locale) {
ExampleGenerator result = ExampleGeneratorCache.get(locale);
if (result == null) {
final CLDRFile nativeCldrFile = info.getCLDRFile(locale,
true);
result = new ExampleGenerator(nativeCldrFile, info.getEnglish(),
CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
ExampleGeneratorCache.put(locale, result);
}
return result;
}
public void TestEllipsis() {
ExampleGenerator exampleGenerator = getExampleGenerator("it");
String[][] tests = { { "initial", "〖…❬iappone❭〗" },
{ "medial", "〖❬Svizzer❭…❬iappone❭〗" },
{ "final", "〖❬Svizzer❭…〗" },
{ "word-initial", "〖… ❬Giappone❭〗" },
{ "word-medial", "〖❬Svizzera❭ … ❬Giappone❭〗" },
{ "word-final", "〖❬Svizzera❭ …〗" }, };
for (String[] pair : tests) {
checkValue(exampleGenerator, "//ldml/characters/ellipsis[@type=\""
+ pair[0] + "\"]", pair[1]);
}
}
private void checkValue(ExampleGenerator exampleGenerator, String path,
String expected) {
String value = exampleGenerator.getCldrFile().getStringValue(path);
String result = ExampleGenerator.simplify(
exampleGenerator.getExampleHtml(path, value), false);
assertEquals("Ellipsis", expected, result);
}
public static String simplify(String exampleHtml) {
return ExampleGenerator.simplify(exampleHtml, false);
}
public void TestClip() {
assertEquals("Clipping", "bc", ExampleGenerator.clip("abc", 1, 0));
assertEquals("Clipping", "ab", ExampleGenerator.clip("abc", 0, 1));
assertEquals("Clipping", "b\u0308c\u0308",
ExampleGenerator.clip("a\u0308b\u0308c\u0308", 1, 0));
assertEquals("Clipping", "a\u0308b\u0308",
ExampleGenerator.clip("a\u0308b\u0308c\u0308", 0, 1));
}
public void TestPaths() {
showCldrFile(info.getEnglish());
showCldrFile(info.getCLDRFile("fr", true));
}
public void TestMiscPatterns() {
ExampleGenerator exampleGenerator = getExampleGenerator("it");
checkValue(
"At least",
"〖⩾❬99❭〗",
exampleGenerator,
"//ldml/numbers/miscPatterns[@numberSystem=\"latn\"]/pattern[@type=\"atLeast\"]");
checkValue("Range", "〖❬99❭-❬144❭〗", exampleGenerator,
"//ldml/numbers/miscPatterns[@numberSystem=\"latn\"]/pattern[@type=\"range\"]");
// String actual = exampleGenerator.getExampleHtml(
// "//ldml/numbers/miscPatterns[@type=\"arab\"]/pattern[@type=\"atLeast\"]",
// "at least {0}", Zoomed.IN);
// assertEquals("Invalid format",
// "<div class='cldr_example'>at least 99</div>", actual);
}
public void TestPluralSamples() {
ExampleGenerator exampleGenerator = getExampleGenerator("sv");
String path = "//ldml/units/unitLength[@type=\"short\"]/unit[@type=\"length-centimeter\"]/unitPattern[@count=\"one\"]";
checkValue("Number should be one", "〖❬1❭ cm〗", exampleGenerator, path);
}
public void TestLocaleDisplayPatterns() {
ExampleGenerator exampleGenerator = getExampleGenerator("it");
String actual = exampleGenerator.getExampleHtml(
"//ldml/localeDisplayNames/localeDisplayPattern/localePattern",
"{0} [{1}]");
assertEquals(
"localePattern example faulty",
"<div class='cldr_example'><span class='cldr_substituted'>uzbeco</span> [<span class='cldr_substituted'>Afghanistan</span>]</div>"
+ "<div class='cldr_example'><span class='cldr_substituted'>uzbeco</span> [<span class='cldr_substituted'>arabo, Afghanistan</span>]</div>"
+ "<div class='cldr_example'><span class='cldr_substituted'>uzbeco</span> [<span class='cldr_substituted'>arabo, Afghanistan, Cifre indo-arabe, Fuso orario: africa/addis_ababa</span>]</div>",
actual);
actual = exampleGenerator
.getExampleHtml(
"//ldml/localeDisplayNames/localeDisplayPattern/localeSeparator",
"{0}. {1}");
assertEquals(
"localeSeparator example faulty",
"<div class='cldr_example'><span class='cldr_substituted'>uzbeco (arabo</span>. <span class='cldr_substituted'>Afghanistan)</span></div>"
+ "<div class='cldr_example'><span class='cldr_substituted'>uzbeco (arabo</span>. <span class='cldr_substituted'>Afghanistan</span>. <span class='cldr_substituted'>Cifre indo-arabe</span>. <span class='cldr_substituted'>Fuso orario: africa/addis_ababa)</span></div>",
actual);
}
public void TestCurrencyFormats() {
ExampleGenerator exampleGenerator = getExampleGenerator("it");
String actual = simplify(exampleGenerator
.getExampleHtml(
"//ldml/numbers/currencyFormats[@numberSystem=\"latn\"]/currencyFormatLength/currencyFormat[@type=\"standard\"]/pattern[@type=\"standard\"]",
"¤ #0.00"));
assertEquals("Currency format example faulty",
"〖USD ❬1295,00❭〗〖-USD ❬1295,00❭〗", actual);
}
public void TestSymbols() {
CLDRFile english = info.getEnglish();
ExampleGenerator exampleGenerator = new ExampleGenerator(english,
english, CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
String actual = exampleGenerator
.getExampleHtml(
"//ldml/numbers/symbols[@numberSystem=\"latn\"]/superscriptingExponent",
"x");
if (!logKnownIssue("13453", "ICU Regression: DecimalFormat getPositiveSuffix() returns nonempty string for scientific format")) {
assertEquals(
"superscriptingExponent faulty",
"<div class='cldr_example'><span class='cldr_substituted'>1.23456789</span>x10<span class='cldr_substituted'><sup>5</sup></span></div>",
actual);
}
}
public void TestFallbackFormat() {
ExampleGenerator exampleGenerator = new ExampleGenerator(
info.getEnglish(), info.getEnglish(),
CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
String actual = exampleGenerator.getExampleHtml(
"//ldml/dates/timeZoneNames/fallbackFormat", "{1} [{0}]");
assertEquals("fallbackFormat faulty", "〖❬Central Time❭ [❬Cancun❭]〗",
ExampleGenerator.simplify(actual, false));
}
public void Test4897() {
ExampleGenerator exampleGenerator = getExampleGenerator("it");
for (String xpath : With.in(exampleGenerator.getCldrFile().iterator(
"//ldml/dates/timeZoneNames",
exampleGenerator.getCldrFile().getComparator()))) {
String value = exampleGenerator.getCldrFile().getStringValue(xpath);
String actual = exampleGenerator.getExampleHtml(xpath, value, null,
ExampleType.NATIVE);
if (actual == null) {
if (!xpath.contains("singleCountries")
&& !xpath.contains("gmtZeroFormat")) {
errln("Null value for " + value + "\t" + xpath);
// for debugging
exampleGenerator.getExampleHtml(xpath, value, null,
ExampleType.NATIVE);
}
} else {
logln(actual + "\t" + value + "\t" + xpath);
}
}
}
public void Test4528() {
String[][] testPairs = {
{
"//ldml/numbers/currencies/currency[@type=\"BMD\"]/displayName[@count=\"other\"]",
"〖❬1,23 ❭dollari delle Bermuda〗〖❬0,00 ❭dollari delle Bermuda〗" },
{
"//ldml/numbers/currencyFormats[@numberSystem=\"latn\"]/unitPattern[@count=\"other\"]",
"〖❬1,23❭ ❬dollari statunitensi❭〗〖❬1,23❭ ❬euro❭〗〖❬0,00❭ ❬dollari statunitensi❭〗〖❬0,00❭ ❬euro❭〗" },
{ "//ldml/numbers/currencies/currency[@type=\"BMD\"]/symbol",
"〖❬123.456,79 ❭BMD〗" }, };
ExampleGenerator exampleGenerator = getExampleGenerator("it");
for (String[] testPair : testPairs) {
String xpath = testPair[0];
String expected = testPair[1];
String value = exampleGenerator.getCldrFile().getStringValue(xpath);
String actual = simplify(exampleGenerator.getExampleHtml(xpath,
value, null, ExampleType.NATIVE));
assertEquals("specifics", expected, actual);
}
}
public void Test4607() {
String[][] testPairs = {
{
"//ldml/numbers/decimalFormats[@numberSystem=\"latn\"]/decimalFormatLength[@type=\"long\"]/decimalFormat[@type=\"standard\"]/pattern[@type=\"1000\"][@count=\"one\"]",
"<div class='cldr_example'><span class='cldr_substituted'>1</span> thousand</div>" },
{
"//ldml/numbers/percentFormats[@numberSystem=\"latn\"]/percentFormatLength/percentFormat[@type=\"standard\"]/pattern[@type=\"standard\"]",
"<div class='cldr_example'><span class='cldr_substituted'>5</span>%</div>"
+ "<div class='cldr_example'><span class='cldr_substituted'>12,345</span>,<span class='cldr_substituted'>679</span>%</div>"
+ "<div class='cldr_example'>-<span class='cldr_substituted'>12,345</span>,<span class='cldr_substituted'>679</span>%</div>" } };
final CLDRFile nativeCldrFile = info.getEnglish();
ExampleGenerator exampleGenerator = new ExampleGenerator(
info.getEnglish(), info.getEnglish(),
CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
for (String[] testPair : testPairs) {
String xpath = testPair[0];
String expected = testPair[1];
String value = nativeCldrFile.getStringValue(xpath);
String actual = exampleGenerator.getExampleHtml(xpath, value, null,
ExampleType.NATIVE);
assertEquals("specifics", expected, actual);
}
}
private void showCldrFile(final CLDRFile cldrFile) {
ExampleGenerator exampleGenerator = new ExampleGenerator(cldrFile,
info.getEnglish(), CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
checkPathValue(
exampleGenerator,
"//ldml/dates/calendars/calendar[@type=\"chinese\"]/dateFormats/dateFormatLength[@type=\"full\"]/dateFormat[@type=\"standard\"]/pattern[@type=\"standard\"][@draft=\"unconfirmed\"]",
"EEEE d MMMMl y'x'G", null);
for (String xpath : cldrFile.fullIterable()) {
if (xpath.endsWith("/alias")) {
continue;
}
String value = cldrFile.getStringValue(xpath);
checkPathValue(exampleGenerator, xpath, value, null);
if (xpath.contains("count=\"one\"")) {
String xpath2 = xpath.replace("count=\"one\"", "count=\"1\"");
checkPathValue(exampleGenerator, xpath2, value, null);
}
}
}
private void checkPathValue(ExampleGenerator exampleGenerator,
String xpath, String value, String expected) {
Set<String> alreadySeen = new HashSet<String>();
for (ExampleType type : ExampleType.values()) {
try {
String text = exampleGenerator.getExampleHtml(xpath, value,
null, type);
if (text == null)
continue;
if (text.contains("Exception")) {
errln("getExampleHtml\t" + type + "\t" + text);
} else if (!alreadySeen.contains(text)) {
if (text.contains("n/a")) {
if (text.contains("&lt;")) {
errln("Text not quoted correctly:" + "\t" + text
+ "\t" + xpath);
}
}
if (text.contains("&lt;")) {
int x = 0; // for debugging
}
boolean skipLog = false;
if (expected != null && type == ExampleType.NATIVE) {
String simplified = ExampleGenerator.simplify(text,
false);
// redo for debugging
text = exampleGenerator.getExampleHtml(xpath, value,
null, type);
skipLog = !assertEquals("Example text for «" + value + "»", expected, simplified);
}
if (!skipLog) {
logln("getExampleHtml\t" + type + "\t" + text + "\t"
+ xpath);
}
alreadySeen.add(text);
}
} catch (Exception e) {
errln("getExampleHtml\t" + type + "\t" + e.getMessage());
}
}
try {
String text = exampleGenerator.getHelpHtml(xpath, value);
if (text == null) {
// skip
} else if (text.contains("Exception")) {
errln("getHelpHtml\t" + text);
} else {
logln("getExampleHtml(help)\t" + "\t" + text + "\t" + xpath);
}
} catch (Exception e) {
if (false) {
e.printStackTrace();
}
errln("getHelpHtml\t" + e.getMessage());
}
}
public void TestCompactPlurals() {
checkCompactExampleFor("de", Count.one, "〖❬1❭ Mio. €〗", "short", "currency", "000000");
checkCompactExampleFor("de", Count.other, "〖❬2❭ Mio. €〗", "short", "currency", "000000");
checkCompactExampleFor("de", Count.one, "〖❬12❭ Mio. €〗", "short", "currency", "0000000");
checkCompactExampleFor("de", Count.other, "〖❬10❭ Mio. €〗", "short", "currency", "0000000");
checkCompactExampleFor("cs", Count.many, "〖❬1,1❭ milionu〗", "long", "decimal", "000000");
checkCompactExampleFor("pl", Count.other, "〖❬1,1❭ miliona〗", "long", "decimal", "000000");
}
private void checkCompactExampleFor(String localeID, Count many,
String expected, String longVsShort, String decimalVsCurrency, String zeros) {
CLDRFile cldrFile = info.getCLDRFile(localeID, true);
ExampleGenerator exampleGenerator = new ExampleGenerator(cldrFile,
info.getEnglish(), CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
String path = "//ldml/numbers/"
+ decimalVsCurrency + "Formats[@numberSystem=\"latn\"]"
+ "/" + decimalVsCurrency + "FormatLength[@type=\"" + longVsShort + "\"]"
+ "/" + decimalVsCurrency + "Format[@type=\"standard\"]"
+ "/pattern[@type=\"1" + zeros + "\"][@count=\"" + many + "\"]";
checkPathValue(exampleGenerator, path, cldrFile.getStringValue(path),
expected);
}
//ldml/numbers/currencyFormats[@numberSystem="latn"]/currencyFormatLength[@type="short"]/currencyFormat[@type="standard"]/pattern[@type="1000"][@count="one"]
public void TestDayPeriods() {
//checkDayPeriod("da", "format", "morning1", "〖05:00 – 10:00〗〖❬7:30❭ morgens〗");
checkDayPeriod("zh", "format", "morning1", "〖05:00 – 08:00⁻〗〖清晨❬6:30❭〗");
checkDayPeriod("de", "format", "morning1", "〖05:00 – 10:00⁻〗〖❬7:30 ❭morgens〗");
checkDayPeriod("de", "stand-alone", "morning1", "〖05:00 – 10:00⁻〗");
checkDayPeriod("de", "format", "morning2", "〖10:00 – 12:00⁻〗〖❬11:00 ❭vormittags〗");
checkDayPeriod("de", "stand-alone", "morning2", "〖10:00 – 12:00⁻〗");
checkDayPeriod("pl", "format", "morning1", "〖06:00 – 10:00⁻〗〖❬8:00 ❭rano〗");
checkDayPeriod("pl", "stand-alone", "morning1", "〖06:00 – 10:00⁻〗");
checkDayPeriod("en", "format", "night1", "〖00:00 – 06:00⁻; 21:00 – 24:00⁻〗〖❬3:00 ❭at night〗");
checkDayPeriod("en", "stand-alone", "night1", "〖00:00 – 06:00⁻; 21:00 – 24:00⁻〗");
checkDayPeriod("en", "format", "noon", "〖12:00〗〖❬12:00 ❭noon〗");
checkDayPeriod("en", "format", "midnight", "〖00:00〗〖❬12:00 ❭midnight〗");
checkDayPeriod("en", "format", "am", "〖00:00 – 12:00⁻〗〖❬6:00 ❭AM〗");
checkDayPeriod("en", "format", "pm", "〖12:00 – 24:00⁻〗〖❬6:00 ❭PM〗");
}
private void checkDayPeriod(String localeId, String type, String dayPeriodCode, String expected) {
CLDRFile cldrFile = info.getCLDRFile(localeId, true);
ExampleGenerator exampleGenerator = new ExampleGenerator(cldrFile, info.getEnglish(), CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY);
String prefix = "//ldml/dates/calendars/calendar[@type=\"gregorian\"]/dayPeriods/dayPeriodContext[@type=\"";
String suffix = "\"]/dayPeriodWidth[@type=\"wide\"]/dayPeriod[@type=\""
+ dayPeriodCode
+ "\"]";
String path = prefix + type + suffix;
checkPathValue(exampleGenerator, path, cldrFile.getStringValue(path), expected);
}
}