2 *******************************************************************************
3 * Copyright (C) 2009-2013, Google, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 package com.ibm.icu.dev.test.translit;
9 import com.ibm.icu.dev.test.TestFmwk;
10 import com.ibm.icu.lang.UScript;
11 import com.ibm.icu.text.Transliterator;
12 import com.ibm.icu.text.UTF16;
13 import com.ibm.icu.text.UnicodeSet;
14 import com.ibm.icu.text.UnicodeSetIterator;
20 public class AnyScriptTest extends TestFmwk {
21 public static void main(String[] args) throws Exception {
22 new AnyScriptTest().run(args);
25 public void TestContext() {
26 Transliterator t = Transliterator.createFromRules("foo", "::[bc]; a{b}d > B;", Transliterator.FORWARD);
27 String sample = "abd abc b";
28 assertEquals("context works", "aBd abc b", t.transform(sample));
31 public void TestScripts(){
32 // get a couple of characters of each script for testing
34 StringBuffer testBuffer = new StringBuffer();
35 for (int script = 0; script < UScript.CODE_LIMIT; ++script) {
36 UnicodeSet test = new UnicodeSet().applyPropertyAlias("script", UScript.getName(script));
37 int count = Math.min(20, test.size());
38 for (int i = 0; i < count; ++i){
39 testBuffer.append(UTF16.valueOf(test.charAt(i)));
42 String test = testBuffer.toString();
43 logln("Test line: " + test);
45 int inclusion = getInclusion();
46 boolean testedUnavailableScript = false;
48 for (int script = 0; script < UScript.CODE_LIMIT; ++script) {
49 if (script == UScript.COMMON || script == UScript.INHERITED) {
52 // if the inclusion rate is not 10, skip all but a small number of items.
53 // Make sure, however, that we test at least one unavailable script
54 if (inclusion < 10 && script != UScript.LATIN
55 && script != UScript.HAN
56 && script != UScript.HIRAGANA
57 && testedUnavailableScript
62 String scriptName = UScript.getName(script);
65 t = Transliterator.getInstance("any-" + scriptName);
66 } catch (Exception e) {
67 testedUnavailableScript = true;
68 logln("Skipping unavailable: " + scriptName);
69 continue; // we don't handle all scripts
71 logln("Checking: " + scriptName);
73 t.transform(test); // just verify we don't crash
75 scriptName = UScript.getShortName(script);
76 t = Transliterator.getInstance("any-" + scriptName);
77 t.transform(test); // just verify we don't crash
82 * Check to make sure that wide characters are converted when going to narrow scripts.
84 public void TestForWidth(){
85 Transliterator widen = Transliterator.getInstance("halfwidth-fullwidth");
86 Transliterator narrow = Transliterator.getInstance("fullwidth-halfwidth");
87 UnicodeSet ASCII = new UnicodeSet("[:ascii:]");
88 String lettersAndSpace = "abc def";
89 final String punctOnly = "( )";
91 String wideLettersAndSpace = widen.transform(lettersAndSpace);
92 String widePunctOnly = widen.transform(punctOnly);
93 assertContainsNone("Should be wide", ASCII, wideLettersAndSpace);
94 assertContainsNone("Should be wide", ASCII, widePunctOnly);
97 back = narrow.transform(wideLettersAndSpace);
98 assertEquals("Should be narrow", lettersAndSpace, back);
99 back = narrow.transform(widePunctOnly);
100 assertEquals("Should be narrow", punctOnly, back);
102 Transliterator latin = Transliterator.getInstance("any-Latn");
103 back = latin.transform(wideLettersAndSpace);
104 assertEquals("Should be ascii", lettersAndSpace, back);
106 back = latin.transform(widePunctOnly);
107 assertEquals("Should be ascii", punctOnly, back);
109 // Han-Latin is now forward-only per CLDR ticket #5630
110 //Transliterator t2 = Transliterator.getInstance("any-Han");
111 //back = t2.transform(widePunctOnly);
112 //assertEquals("Should be same", widePunctOnly, back);
117 public void TestCommonDigits() {
118 UnicodeSet westernDigitSet = new UnicodeSet("[0-9]");
119 UnicodeSet westernDigitSetAndMarks = new UnicodeSet("[[0-9][:Mn:]]");
120 UnicodeSet arabicDigitSet = new UnicodeSet("[[:Nd:]&[:block=Arabic:]]");
121 Transliterator latin = Transliterator.getInstance("Any-Latn");
122 Transliterator arabic = Transliterator.getInstance("Any-Arabic");
123 String westernDigits = getList(westernDigitSet);
124 String arabicDigits = getList(arabicDigitSet);
126 String fromArabic = latin.transform(arabicDigits);
127 assertContainsAll("Any-Latin transforms Arabic digits", westernDigitSetAndMarks, fromArabic);
128 if (false) { // we don't require conversion to Arabic digits
129 String fromLatin = arabic.transform(westernDigits);
130 assertContainsAll("Any-Arabic transforms Western digits", arabicDigitSet, fromLatin);
134 // might want to add to TestFmwk
135 private void assertContainsAll(String message, UnicodeSet set, String string) {
136 handleAssert(set.containsAll(string), message, set, string, "contains all of", false);
139 private void assertContainsNone(String message, UnicodeSet set, String string) {
140 handleAssert(set.containsNone(string), message, set, string, "contains none of", false);
143 // might want to add to UnicodeSet
144 private String getList(UnicodeSet set) {
145 StringBuffer result = new StringBuffer();
146 for (UnicodeSetIterator it = new UnicodeSetIterator(set); it.next();) {
147 result.append(it.getString());
149 return result.toString();