2 *******************************************************************************
\r
3 * Copyright (C) 2003-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.util;
\r
9 import com.ibm.icu.dev.test.TestFmwk;
\r
10 import com.ibm.icu.impl.ICUResourceBundle;
\r
11 import com.ibm.icu.lang.UScript;
\r
12 import com.ibm.icu.text.UnicodeSet;
\r
13 import com.ibm.icu.text.UnicodeSetIterator;
\r
14 import com.ibm.icu.util.LocaleData;
\r
15 import com.ibm.icu.util.ULocale;
\r
16 import java.util.HashSet;
\r
17 import java.util.Arrays;
\r
22 * To change the template for this generated type comment go to
\r
23 * Window>Preferences>Java>Code Generation>Code and Comments
\r
25 public class LocaleDataTest extends TestFmwk{
\r
27 public static void main(String[] args) throws Exception{
\r
28 new LocaleDataTest().run(args);
\r
31 private ULocale[] availableLocales = null;
\r
33 public LocaleDataTest(){
\r
35 protected void init(){
\r
36 availableLocales = ICUResourceBundle.getAvailableULocales(ICUResourceBundle.ICU_BASE_NAME);
\r
38 public void TestPaperSize(){
\r
39 for(int i = 0; i < availableLocales.length; i++){
\r
40 ULocale locale = availableLocales[i];
\r
41 LocaleData.PaperSize paperSize = LocaleData.getPaperSize(locale);
\r
42 // skip testing of "in" .. deprecated code for Indonesian
\r
43 String lang = locale.getLanguage();
\r
44 if(lang.equals("in")){
\r
47 if(locale.toString().indexOf("_US") >= 0 || locale.toString().indexOf("_CA") >= 0 ||
\r
48 locale.toString().indexOf("_PH") >= 0 || locale.toString().indexOf("_CL") >= 0 ||
\r
49 locale.toString().indexOf("_PR") >= 0 || locale.toString().indexOf("_VE") >= 0 ||
\r
50 locale.toString().indexOf("_CO") >= 0 || locale.toString().indexOf("_MX") >= 0 ){
\r
51 if(paperSize.getHeight()!= 279 || paperSize.getWidth() != 216 ){
\r
52 errln("PaperSize did not return the expected value for locale "+ locale+
\r
53 " Expected height: 279 width: 216."+
\r
54 " Got height: "+paperSize.getHeight()+" width: "+paperSize.getWidth()
\r
57 logln("PaperSize returned the expected values for locale " + locale);
\r
60 if(paperSize.getHeight()!= 297 || paperSize.getWidth() != 210 ){
\r
61 errln("PaperSize did not return the expected value for locale "+ locale +
\r
62 " Expected height: 297 width: 210."+
\r
63 " Got height: "+paperSize.getHeight() +" width: "+paperSize.getWidth()
\r
66 logln("PaperSize returned the expected values for locale " + locale);
\r
71 public void TestMeasurementSystem(){
\r
72 for(int i=0; i<availableLocales.length; i++){
\r
73 ULocale locale = availableLocales[i];
\r
74 LocaleData.MeasurementSystem ms = LocaleData.getMeasurementSystem(locale);
\r
75 // skip testing of "in" .. deprecated code for Indonesian
\r
76 String lang = locale.getLanguage();
\r
77 if(lang.equals("in")){
\r
80 if(locale.toString().indexOf("_US") >= 0){
\r
81 if(ms == LocaleData.MeasurementSystem.US){
\r
82 logln("Got the expected measurement system for locale: " + locale);
\r
84 errln("Did not get the expected measurement system for locale: "+ locale);
\r
87 if(ms == LocaleData.MeasurementSystem.SI){
\r
88 logln("Got the expected measurement system for locale: " + locale);
\r
90 errln("Did not get the expected measurement system for locale: "+ locale);
\r
96 // Bundle together a UnicodeSet (of expemplars) and ScriptCode combination.
\r
97 // We keep a set of combinations that have already been tested, to
\r
98 // avoid repeated (time consuming) retesting of the same data.
\r
99 // Instances of this class must be well behaved as members of a set.
\r
100 static class ExemplarGroup {
\r
102 private UnicodeSet set;
\r
104 ExemplarGroup(UnicodeSet s, int[] scriptCodes) {
\r
108 public int hashCode() {
\r
110 for (int i=0; i<scs.length && i<4; i++) {
\r
111 hash = (hash<<8)+scs[i];
\r
115 public boolean equals(Object other) {
\r
116 ExemplarGroup o = (ExemplarGroup)other;
\r
117 boolean r = Arrays.equals(scs, o.scs) &&
\r
123 public void TestExemplarSet(){
\r
124 HashSet testedExemplars = new HashSet();
\r
125 int equalCount = 0;
\r
126 for(int i=0; i<availableLocales.length; i++){
\r
127 ULocale locale = availableLocales[i];
\r
128 int[] scriptCodes = UScript.getCode(locale);
\r
129 if (scriptCodes==null) {
\r
130 // I hate the JDK's solution for deprecated language codes.
\r
131 // Why does the Locale constructor change the string I passed to it ?
\r
132 // such a broken hack !!!!!
\r
133 // so in effect I can never test the script code for Indonesian :(
\r
134 if(locale.toString().indexOf(("in"))<0){
\r
135 errln("UScript.getCode returned null for locale: " + locale);
\r
139 UnicodeSet exemplarSets[] = new UnicodeSet[2];
\r
140 for (int k=0; k<2; ++k) { // for casing option in (normal, caseInsensitive)
\r
141 int option = (k==0) ? 0 : UnicodeSet.CASE;
\r
142 UnicodeSet exemplarSet = LocaleData.getExemplarSet(locale, option);
\r
143 exemplarSets[k] = exemplarSet;
\r
144 ExemplarGroup exGrp = new ExemplarGroup(exemplarSet, scriptCodes);
\r
145 if (!testedExemplars.contains(exGrp)) {
\r
146 testedExemplars.add(exGrp);
\r
147 UnicodeSet[] sets = new UnicodeSet[scriptCodes.length];
\r
148 // create the UnicodeSets for the script
\r
149 for(int j=0; j < scriptCodes.length; j++){
\r
150 sets[j] = new UnicodeSet("[:" + UScript.getShortName(scriptCodes[j]) + ":]");
\r
152 boolean existsInScript = false;
\r
153 UnicodeSetIterator iter = new UnicodeSetIterator(exemplarSet);
\r
154 // iterate over the
\r
155 while (!existsInScript && iter.nextRange()) {
\r
156 if (iter.codepoint != UnicodeSetIterator.IS_STRING) {
\r
157 for(int j=0; j<sets.length; j++){
\r
158 if(sets[j].contains(iter.codepoint, iter.codepointEnd)){
\r
159 existsInScript = true;
\r
164 for(int j=0; j<sets.length; j++){
\r
165 if(sets[j].contains(iter.string)){
\r
166 existsInScript = true;
\r
172 if(existsInScript == false){
\r
173 errln("ExemplarSet containment failed for locale : "+ locale);
\r
177 // This is expensive, so only do it if it will be visible
\r
179 logln(locale.toString() + " exemplar " + exemplarSets[0]);
\r
180 logln(locale.toString() + " exemplar(case-folded) " + exemplarSets[1]);
\r
182 assertTrue(locale.toString() + " case-folded is a superset",
\r
183 exemplarSets[1].containsAll(exemplarSets[0]));
\r
184 if (exemplarSets[1].equals(exemplarSets[0])) {
\r
188 // Note: The case-folded set should sometimes be a strict superset
\r
189 // and sometimes be equal.
\r
190 assertTrue("case-folded is sometimes a strict superset, and sometimes equal",
\r
191 equalCount > 0 && equalCount < availableLocales.length);
\r
193 public void TestExemplarSet2(){
\r
194 int equalCount = 0;
\r
195 HashSet testedExemplars = new HashSet();
\r
196 for(int i=0; i<availableLocales.length; i++){
\r
197 ULocale locale = availableLocales[i];
\r
198 LocaleData ld = LocaleData.getInstance(locale);
\r
199 int[] scriptCodes = UScript.getCode(locale);
\r
200 if (scriptCodes==null) {
\r
201 if(locale.toString().indexOf(("in"))<0){
\r
202 errln("UScript.getCode returned null for locale: "+ locale);
\r
206 UnicodeSet exemplarSets[] = new UnicodeSet[4];
\r
208 for (int k=0; k<2; ++k) { // for casing option in (normal, uncased)
\r
209 int option = (k==0) ? 0 : UnicodeSet.CASE;
\r
210 for(int h=0; h<2; ++h){
\r
211 int type = (h==0) ? LocaleData.ES_STANDARD : LocaleData.ES_AUXILIARY;
\r
213 UnicodeSet exemplarSet = ld.getExemplarSet(option, type);
\r
214 exemplarSets[k*2+h] = exemplarSet;
\r
216 ExemplarGroup exGrp = new ExemplarGroup(exemplarSet, scriptCodes);
\r
217 if (!testedExemplars.contains(exGrp)) {
\r
218 testedExemplars.add(exGrp);
\r
219 UnicodeSet[] sets = new UnicodeSet[scriptCodes.length];
\r
220 // create the UnicodeSets for the script
\r
221 for(int j=0; j < scriptCodes.length; j++){
\r
222 sets[j] = new UnicodeSet("[:" + UScript.getShortName(scriptCodes[j]) + ":]");
\r
224 boolean existsInScript = false;
\r
225 UnicodeSetIterator iter = new UnicodeSetIterator(exemplarSet);
\r
226 // iterate over the
\r
227 while (!existsInScript && iter.nextRange()) {
\r
228 if (iter.codepoint != UnicodeSetIterator.IS_STRING) {
\r
229 for(int j=0; j<sets.length; j++){
\r
230 if(sets[j].contains(iter.codepoint, iter.codepointEnd)){
\r
231 existsInScript = true;
\r
236 for(int j=0; j<sets.length; j++){
\r
237 if(sets[j].contains(iter.string)){
\r
238 existsInScript = true;
\r
244 // TODO: How to verify LocaleData.ES_AUXILIARY ???
\r
245 if(existsInScript == false && h == 0){
\r
246 errln("ExemplarSet containment failed for locale,option,type : "+ locale + ", " + option + ", " + type);
\r
251 // This is expensive, so only do it if it will be visible
\r
253 logln(locale.toString() + " exemplar(ES_STANDARD)" + exemplarSets[0]);
\r
254 logln(locale.toString() + " exemplar(ES_AUXILIARY) " + exemplarSets[1]);
\r
255 logln(locale.toString() + " exemplar(case-folded,ES_STANDARD) " + exemplarSets[2]);
\r
256 logln(locale.toString() + " exemplar(case-folded,ES_AUXILIARY) " + exemplarSets[3]);
\r
258 assertTrue(locale.toString() + " case-folded is a superset",
\r
259 exemplarSets[2].containsAll(exemplarSets[0]));
\r
260 assertTrue(locale.toString() + " case-folded is a superset",
\r
261 exemplarSets[3].containsAll(exemplarSets[1]));
\r
262 if (exemplarSets[2].equals(exemplarSets[0])) {
\r
265 if (exemplarSets[3].equals(exemplarSets[1])) {
\r
269 // Note: The case-folded set should sometimes be a strict superset
\r
270 // and sometimes be equal.
\r
271 assertTrue("case-folded is sometimes a strict superset, and sometimes equal",
\r
272 equalCount > 0 && equalCount < availableLocales.length * 2);
\r
274 public void TestCoverage(){
\r
275 LocaleData ld = LocaleData.getInstance();
\r
276 boolean t = ld.getNoSubstitute();
\r
277 ld.setNoSubstitute(t);
\r
278 assertEquals("LocaleData get/set NoSubstitute",
\r
280 ld.getNoSubstitute());
\r
282 logln(ld.getDelimiter(LocaleData.QUOTATION_START));
\r
283 logln(ld.getDelimiter(LocaleData.QUOTATION_END));
\r
284 logln(ld.getDelimiter(LocaleData.ALT_QUOTATION_START));
\r
285 logln(ld.getDelimiter(LocaleData.ALT_QUOTATION_END));
\r
288 public void TestLocaleDisplayPattern(){
\r
289 LocaleData ld = LocaleData.getInstance();
\r
290 logln("Default locale "+ " LocaleDisplayPattern:" + ld.getLocaleDisplayPattern());
\r
291 logln("Default locale "+ " LocaleSeparator:" + ld.getLocaleSeparator());
\r
292 for(int i = 0; i < availableLocales.length; i++){
\r
293 ULocale locale = availableLocales[i];
\r
294 ld = LocaleData.getInstance(locale);
\r
295 logln(locale.toString() + " LocaleDisplayPattern:" + ld.getLocaleDisplayPattern());
\r
296 logln(locale.toString() + " LocaleSeparator:" + ld.getLocaleSeparator());
\r