blob: 27dc2ace0dfa436cf81f6dffcc741c8989e2c86d [file] [log] [blame]
// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
package com.ibm.icu.dev.test.lang;
import java.util.Arrays;
import java.util.Collection;
import java.util.Locale;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.lang.UScript;
import com.ibm.icu.util.ULocale;
@RunWith(Enclosed.class)
public class DataDrivenUScriptTest extends TestFmwk {
private static String scriptsToString(int[] scripts) {
if (scripts == null) {
return "null";
}
StringBuilder sb = new StringBuilder();
for (int script : scripts) {
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(UScript.getShortName(script));
}
return sb.toString();
}
private static void assertEqualScripts(String msg, int[] expectedScripts, int[] actualScripts) {
assertEquals(msg, scriptsToString(expectedScripts), scriptsToString(actualScripts));
}
@RunWith(Parameterized.class)
public static class LocaleGetCodeTest {
private ULocale testLocaleName;
private int expected;
public LocaleGetCodeTest(ULocale testLocaleName, int expected) {
this.testLocaleName = testLocaleName;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] { { new ULocale("en"), UScript.LATIN },
{ new ULocale("en_US"), UScript.LATIN },
{ new ULocale("sr"), UScript.CYRILLIC },
{ new ULocale("ta"), UScript.TAMIL },
{ new ULocale("te_IN"), UScript.TELUGU },
{ new ULocale("hi"), UScript.DEVANAGARI },
{ new ULocale("he"), UScript.HEBREW },
{ new ULocale("ar"), UScript.ARABIC },
{ new ULocale("abcde"), UScript.INVALID_CODE },
{ new ULocale("abcde_cdef"), UScript.INVALID_CODE },
{ new ULocale("iw"), UScript.HEBREW }
});
}
@Test
public void TestLocaleGetCode() {
int[] code = UScript.getCode(testLocaleName);
if (code == null) {
if (expected != UScript.INVALID_CODE) {
errln("Error testing UScript.getCode(). Got: null" + " Expected: " + expected + " for locale "
+ testLocaleName);
}
} else if ((code[0] != expected)) {
errln("Error testing UScript.getCode(). Got: " + code[0] + " Expected: " + expected + " for locale "
+ testLocaleName);
}
ULocale defaultLoc = ULocale.getDefault();
ULocale esperanto = new ULocale("eo_DE");
ULocale.setDefault(esperanto);
code = UScript.getCode(esperanto);
if (code != null) {
if (code[0] != UScript.LATIN) {
errln("Did not get the expected script code for Esperanto");
}
} else {
warnln("Could not load the locale data.");
}
ULocale.setDefault(defaultLoc);
// Should work regardless of whether we have locale data for the language.
assertEqualScripts("tg script: Cyrl", // Tajik
new int[] { UScript.CYRILLIC }, UScript.getCode(new ULocale("tg")));
assertEqualScripts("xsr script: Deva", // Sherpa
new int[] { UScript.DEVANAGARI }, UScript.getCode(new ULocale("xsr")));
// Multi-script languages.
assertEqualScripts("ja scripts: Kana Hira Hani",
new int[] { UScript.KATAKANA, UScript.HIRAGANA, UScript.HAN }, UScript.getCode(ULocale.JAPANESE));
assertEqualScripts("ko scripts: Hang Hani", new int[] { UScript.HANGUL, UScript.HAN },
UScript.getCode(ULocale.KOREAN));
assertEqualScripts("zh script: Hani", new int[] { UScript.HAN }, UScript.getCode(ULocale.CHINESE));
assertEqualScripts("zh-Hant scripts: Hani Bopo", new int[] { UScript.HAN, UScript.BOPOMOFO },
UScript.getCode(ULocale.TRADITIONAL_CHINESE));
assertEqualScripts("zh-TW scripts: Hani Bopo", new int[] { UScript.HAN, UScript.BOPOMOFO },
UScript.getCode(ULocale.TAIWAN));
// Ambiguous API, but this probably wants to return Latin rather than Rongorongo (Roro).
assertEqualScripts("ro-RO script: Latn", new int[] { UScript.LATIN }, UScript.getCode("ro-RO")); // String
// not
// ULocale
}
}
@RunWith(Parameterized.class)
public static class TestMultipleUScript extends TestFmwk {
private String testLocaleName;
private Locale testLocale;
private int[] expected;
public TestMultipleUScript(String testLocaleName, int[] expected, Locale testLocale) {
this.testLocaleName = testLocaleName;
this.testLocale = testLocale;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] {
{ "ja", new int[] { UScript.KATAKANA, UScript.HIRAGANA, UScript.HAN }, Locale.JAPANESE },
{ "ko_KR", new int[] { UScript.HANGUL, UScript.HAN }, Locale.KOREA },
{ "zh", new int[] { UScript.HAN }, Locale.CHINESE },
{ "zh_TW", new int[] { UScript.HAN, UScript.BOPOMOFO }, Locale.TAIWAN }
});
}
@Test
public void TestMultipleCodes() {
int[] code = UScript.getCode(testLocaleName);
if (code != null) {
for (int j = 0; j < code.length; j++) {
if (code[j] != expected[j]) {
errln("Error testing UScript.getCode(). Got: " + code[j] + " Expected: " + expected[j]
+ " for locale " + testLocaleName);
}
}
} else {
errln("Error testing UScript.getCode() for locale " + testLocaleName);
}
logln(" Testing UScript.getCode(Locale) with locale: " + testLocale.getDisplayName());
code = UScript.getCode(testLocale);
if (code != null) {
for (int j = 0; j < code.length; j++) {
if (code[j] != expected[j]) {
errln("Error testing UScript.getCode(). Got: " + code[j] + " Expected: " + expected[j]
+ " for locale " + testLocaleName);
}
}
} else {
errln("Error testing UScript.getCode() for locale " + testLocaleName);
}
}
}
@RunWith(Parameterized.class)
public static class GetCodeTest extends TestFmwk {
private String testName;
private int expected;
public GetCodeTest(String testName, int expected) {
this.testName = testName;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] {
/* test locale */
{ "en", UScript.LATIN },
{ "en_US", UScript.LATIN },
{ "sr", UScript.CYRILLIC },
{ "ta", UScript.TAMIL },
{ "gu", UScript.GUJARATI },
{ "te_IN", UScript.TELUGU },
{ "hi", UScript.DEVANAGARI },
{ "he", UScript.HEBREW },
{ "ar", UScript.ARABIC },
{ "abcde", UScript.INVALID_CODE },
{ "abscde_cdef", UScript.INVALID_CODE },
{ "iw", UScript.HEBREW },
/* test abbr */
{ "Hani", UScript.HAN },
{ "Hang", UScript.HANGUL },
{ "Hebr", UScript.HEBREW },
{ "Hira", UScript.HIRAGANA },
{ "Knda", UScript.KANNADA },
{ "Kana", UScript.KATAKANA },
{ "Khmr", UScript.KHMER },
{ "Lao", UScript.LAO },
{ "Latn", UScript.LATIN }, /* "Latf","Latg", */
{ "Mlym", UScript.MALAYALAM },
{ "Mong", UScript.MONGOLIAN },
/* test names */
{ "CYRILLIC", UScript.CYRILLIC },
{ "DESERET", UScript.DESERET },
{ "DEVANAGARI", UScript.DEVANAGARI },
{ "ETHIOPIC", UScript.ETHIOPIC },
{ "GEORGIAN", UScript.GEORGIAN },
{ "GOTHIC", UScript.GOTHIC },
{ "GREEK", UScript.GREEK },
{ "GUJARATI", UScript.GUJARATI },
{ "COMMON", UScript.COMMON },
{ "INHERITED", UScript.INHERITED },
/* test lower case names */
{ "malayalam", UScript.MALAYALAM },
{ "mongolian", UScript.MONGOLIAN },
{ "myanmar", UScript.MYANMAR },
{ "ogham", UScript.OGHAM },
{ "old-italic", UScript.OLD_ITALIC },
{ "oriya", UScript.ORIYA },
{ "runic", UScript.RUNIC },
{ "sinhala", UScript.SINHALA },
{ "syriac", UScript.SYRIAC },
{ "tamil", UScript.TAMIL },
{ "telugu", UScript.TELUGU },
{ "thaana", UScript.THAANA },
{ "thai", UScript.THAI },
{ "tibetan", UScript.TIBETAN },
/* test the bounds */
{ "Cans", UScript.CANADIAN_ABORIGINAL },
{ "arabic", UScript.ARABIC },
{ "Yi", UScript.YI },
{ "Zyyy", UScript.COMMON }
});
}
@Test
public void TestGetCode() {
int[] code = UScript.getCode(testName);
if (code == null) {
if (expected != UScript.INVALID_CODE) {
// getCode returns null if the code could not be found
errln("Error testing UScript.getCode(). Got: null" + " Expected: " + expected + " for locale "
+ testName);
}
} else if ((code[0] != expected)) {
errln("Error testing UScript.getCode(). Got: " + code + " Expected: " + expected + " for locale "
+ testName);
}
}
}
@RunWith(Parameterized.class)
public static class GetNameTest {
private int testCode;
private String expected;
public GetNameTest(int testCode, String expected) {
this.testCode = testCode;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] {
{ UScript.CYRILLIC, "Cyrillic" },
{ UScript.DESERET, "Deseret" },
{ UScript.DEVANAGARI, "Devanagari" },
{ UScript.ETHIOPIC, "Ethiopic" },
{ UScript.GEORGIAN, "Georgian" },
{ UScript.GOTHIC, "Gothic" },
{ UScript.GREEK, "Greek" },
{ UScript.GUJARATI, "Gujarati" }
});
}
@Test
public void TestGetName() {
String scriptName = UScript.getName(testCode);
if (!expected.equals(scriptName)) {
errln("Error testing UScript.getName(). Got: " + scriptName + " Expected: " + expected);
}
}
}
@RunWith(Parameterized.class)
public static class GetShortNameTest {
private int testCode;
private String expected;
public GetShortNameTest(int testCode, String expected) {
this.testCode = testCode;
this.expected = expected;
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new Object[][] {
{ UScript.HAN, "Hani" },
{ UScript.HANGUL, "Hang" },
{ UScript.HEBREW, "Hebr" },
{ UScript.HIRAGANA, "Hira" },
{ UScript.KANNADA, "Knda" },
{ UScript.KATAKANA, "Kana" },
{ UScript.KHMER, "Khmr" },
{ UScript.LAO, "Laoo" },
{ UScript.LATIN, "Latn" },
{ UScript.MALAYALAM, "Mlym" },
{ UScript.MONGOLIAN, "Mong" },
});
}
@Test
public void TestGetShortName() {
String shortName = UScript.getShortName(testCode);
if (!expected.equals(shortName)) {
errln("Error testing UScript.getShortName(). Got: " + shortName + " Expected: " + expected);
}
}
}
@RunWith(Parameterized.class)
public static class GetScriptTest {
private int codepoint;
private int expected;
public GetScriptTest(int[] codepoint) {
this.codepoint = codepoint[0];
this.expected = codepoint[1];
}
@Parameterized.Parameters
public static Collection testData() {
return Arrays.asList(new int[][] {
{ 0x0000FF9D, UScript.KATAKANA },
{ 0x0000FFBE, UScript.HANGUL },
{ 0x0000FFC7, UScript.HANGUL },
{ 0x0000FFCF, UScript.HANGUL },
{ 0x0000FFD7, UScript.HANGUL },
{ 0x0000FFDC, UScript.HANGUL },
{ 0x00010300, UScript.OLD_ITALIC },
{ 0x00010330, UScript.GOTHIC },
{ 0x0001034A, UScript.GOTHIC },
{ 0x00010400, UScript.DESERET },
{ 0x00010428, UScript.DESERET },
{ 0x0001D167, UScript.INHERITED },
{ 0x0001D17B, UScript.INHERITED },
{ 0x0001D185, UScript.INHERITED },
{ 0x0001D1AA, UScript.INHERITED },
{ 0x00020000, UScript.HAN },
{ 0x00000D02, UScript.MALAYALAM },
{ 0x00050005, UScript.UNKNOWN }, // new Zzzz value in Unicode 5.0
{ 0x00000000, UScript.COMMON },
{ 0x0001D169, UScript.INHERITED },
{ 0x0001D182, UScript.INHERITED },
{ 0x0001D18B, UScript.INHERITED },
{ 0x0001D1AD, UScript.INHERITED },
});
}
@Test
public void TestGetScript() {
int code = UScript.INVALID_CODE;
code = UScript.getScript(codepoint);
if (code != expected) {
errln("Error testing UScript.getScript(). Got: " + code + " Expected: " + expected
+ " for codepoint 0x + hex(codepoint).");
}
}
}
}