1 /********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 2005-2006, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7 #include "aliastst.h"
8 #include "unicode/calendar.h"
9 #include "unicode/smpdtfmt.h"
10 #include "unicode/datefmt.h"
11 #include "unicode/unistr.h"
12 #include "unicode/coll.h"
13 #include "unicode/resbund.h"
14 #include <stdio.h>
15 #include <string.h>
16 #include <stdlib.h>
17
18 const char* _LOCALE_ALIAS[][2] = {
19 {"in", "id"},
20 {"in_ID", "id_ID"},
21 {"iw", "he"},
22 {"iw_IL", "he_IL"},
23 {"ji", "yi"},
24 {"en_BU", "en_MM"},
25 {"en_DY", "en_BJ"},
26 {"en_HV", "en_BF"},
27 {"en_NH", "en_VU"},
28 {"en_RH", "en_ZW"},
29 {"en_TP", "en_TL"},
30 {"en_ZR", "en_CD"}
31 };
32
33 const int _LOCALE_NUMBER = 12;
34
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)35 void LocaleAliasTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ){
36 switch (index) {
37 TESTCASE(0, TestCalendar);
38 TESTCASE(1, TestDateFormat);
39 TESTCASE(2, TestCollation);
40 TESTCASE(3, TestULocale);
41 TESTCASE(4, TestUResourceBundle);
42 TESTCASE(5, TestDisplayName);
43 // keep the last index in sync with the condition in default:
44
45 default:
46 if (index <= 5) { // keep this in sync with the last index!
47 name = "(test omitted by !UCONFIG_NO_FORMATTING)";
48 } else {
49 name = "";
50 }
51 break; //needed to end loop
52 }
53 }
54
TestCalendar()55 void LocaleAliasTest::TestCalendar() {
56 #if !UCONFIG_NO_FORMATTING
57 UErrorCode status = U_ZERO_ERROR;
58 for (int i=0; i<_LOCALE_NUMBER; i++) {
59 Locale oldLoc(_LOCALE_ALIAS[i][0]);
60 Locale newLoc(_LOCALE_ALIAS[i][1]);
61 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
62 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
63 continue;
64 }
65 logln("\nold locale:%s new locale:%s",oldLoc.getName(),newLoc.getName());
66 Calendar* c1 = Calendar::createInstance(oldLoc, status);
67 Calendar* c2 = Calendar::createInstance(newLoc, status);
68
69 //Test function "getLocale(ULocale.VALID_LOCALE)"
70 const char* l1 = c1->getLocaleID(ULOC_VALID_LOCALE, status);
71 const char* l2 = c2->getLocaleID(ULOC_VALID_LOCALE, status);
72 if (strcmp(newLoc.getName(), l1)!=0) {
73 errln("CalendarTest: newLoc!=l1: newLoc= "+UnicodeString(newLoc.getName()) +" l1= "+UnicodeString(l1));
74 }
75 if (strcmp(l1, l2)!=0) {
76 errln("CalendarTest: l1!=l2: l1= "+UnicodeString(l1) +" l2= "+UnicodeString(l2));
77 }
78 if(!(c1==c2)){
79 errln("CalendarTest: c1!=c2. newLoc= "+UnicodeString(newLoc.getName()) +" oldLoc= "+UnicodeString(oldLoc.getName()));
80 }
81 logln("Calendar(getLocale) old:"+UnicodeString(l1)+" new:"+UnicodeString(l2));
82 delete c1;
83 delete c2;
84 }
85 #endif
86 }
TestDateFormat()87 void LocaleAliasTest::TestDateFormat() {
88 #if !UCONFIG_NO_FORMATTING
89 UErrorCode status = U_ZERO_ERROR;
90 for (int i=0; i<_LOCALE_NUMBER; i++) {
91 Locale oldLoc(_LOCALE_ALIAS[i][0]);
92 Locale newLoc(_LOCALE_ALIAS[i][1]);
93 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
94 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
95 continue;
96 }
97 logln("\nold locale:%s new locale:%s",oldLoc.getName(),newLoc.getName());
98
99 DateFormat* df1 = DateFormat::createDateInstance(DateFormat::FULL, oldLoc);
100 DateFormat* df2 = DateFormat::createDateInstance(DateFormat::FULL, newLoc);
101
102 //Test function "getLocale"
103 const char* l1 = df1->getLocaleID(ULOC_VALID_LOCALE, status);
104 const char* l2 = df2->getLocaleID(ULOC_VALID_LOCALE, status);
105 if (strcmp(newLoc.getName(), l1)!=0) {
106 errln("CalendarTest: newLoc!=l1: newLoc= "+UnicodeString(newLoc.getName()) +" l1= "+UnicodeString(l1));
107 }
108 if (strcmp(l1, l2)!=0) {
109 errln("TestDateFormat: l1!=l2: l1= "+UnicodeString(l1) +" l2= "+UnicodeString(l2));
110 }
111 if(!(df1==df2)){
112 errln("TestDateFormat: c1!=c2. newLoc= "+UnicodeString(newLoc.getName()) +" oldLoc= "+UnicodeString(oldLoc.getName()));
113 }
114 logln("DateFormat(getLocale) old:%s new:%s",l1,l2);
115
116 delete df1;
117 delete df2;
118 }
119 #endif
120 }
TestCollation()121 void LocaleAliasTest::TestCollation() {
122 #if !UCONFIG_NO_COLLATION
123 UErrorCode status = U_ZERO_ERROR;
124 for (int i=0; i<_LOCALE_NUMBER; i++) {
125 Locale oldLoc(_LOCALE_ALIAS[i][0]);
126 Locale newLoc(_LOCALE_ALIAS[i][1]);
127 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
128 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
129 continue;
130 }
131 logln("\nold locale:%s new locale:%s",oldLoc.getName(),newLoc.getName());
132
133 Collator* c1 = Collator::createInstance(oldLoc, status);
134 Collator* c2 = Collator::createInstance(newLoc, status);
135
136 Locale l1 = c1->getLocale(ULOC_VALID_LOCALE, status);
137 Locale l2 = c2->getLocale(ULOC_VALID_LOCALE, status);
138
139 if (strcmp(newLoc.getName(), l1.getName())!=0) {
140 errln("CalendarTest: newLoc!=l1: newLoc= "+UnicodeString(newLoc.getName()) +" l1= "+UnicodeString(l1.getName()));
141 }
142 if (strcmp(l1.getName(), l2.getName())!=0) {
143 errln("CollationTest: l1!=l2: l1= "+UnicodeString(l1.getName()) +" l2= "+UnicodeString(l2.getName()));
144 }
145 if(!(c1==c2)){
146 errln("CollationTest: c1!=c2. newLoc= "+UnicodeString(newLoc.getName()) +" oldLoc= "+UnicodeString(oldLoc.getName()));
147 }
148 logln("Collator(getLocale) old:%s new:%s", l1.getName(), l2.getName());
149 delete c1;
150 delete c2;
151 }
152 #endif
153 }
TestULocale()154 void LocaleAliasTest::TestULocale() {
155 for (int i=0; i<_LOCALE_NUMBER; i++) {
156 Locale oldLoc(_LOCALE_ALIAS[i][0]);
157 Locale newLoc(_LOCALE_ALIAS[i][1]);
158 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
159 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
160 continue;
161 }
162 logln("\nold locale:%s new locale:%s",oldLoc.getName(),newLoc.getName());
163
164 UnicodeString name1, name2;
165 oldLoc.getDisplayName(name1);
166 newLoc.getDisplayName(name2);
167 if (name1!=name2) {
168 errln("DisplayNames are not equal. newLoc= "+UnicodeString(newLoc.getName()) +" oldLoc= "+UnicodeString(oldLoc.getName()));
169 }
170 log("ULocale(getDisplayName) old:");
171 log(name1);
172 log(" new:");
173 logln(name2);
174 }
175 }
LocaleAliasTest()176 LocaleAliasTest::LocaleAliasTest(){
177 UErrorCode status = U_ZERO_ERROR;
178 resIndex = ures_open(NULL,"res_index", &status);
179 if(U_FAILURE(status)){
180 errln("Could not open res_index.res. Exiting. Error: %s\n", u_errorName(status));
181 resIndex=NULL;
182 }
183 defLocale = Locale::getDefault();
184 Locale::setDefault(Locale::getUS(), status);
185 }
~LocaleAliasTest()186 LocaleAliasTest::~LocaleAliasTest(){
187 /* reset the default locale */
188 UErrorCode status = U_ZERO_ERROR;
189 Locale::setDefault(defLocale, status);
190 ures_close(resIndex);
191 if(U_FAILURE(status)){
192 errln("Could not reset the default locale. Exiting. Error: %s\n", u_errorName(status));
193 }
194 }
isLocaleAvailable(const char * loc)195 UBool LocaleAliasTest::isLocaleAvailable(const char* loc){
196 if(resIndex==NULL){
197 return FALSE;
198 }
199 UErrorCode status = U_ZERO_ERROR;
200 int32_t len = 0;
201 ures_getStringByKey(resIndex, loc,&len, &status);
202 if(U_FAILURE(status)){
203 return FALSE;
204 }
205 return TRUE;
206 }
TestDisplayName()207 void LocaleAliasTest::TestDisplayName() {
208 int32_t availableNum =0;
209 const Locale* available = Locale::getAvailableLocales(availableNum);
210 for (int i=0; i<_LOCALE_NUMBER; i++) {
211 Locale oldLoc(_LOCALE_ALIAS[i][0]);
212 Locale newLoc(_LOCALE_ALIAS[i][1]);
213 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
214 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
215 continue;
216 }
217 for(int j=0; j<availableNum; j++){
218 UnicodeString dipLocName = UnicodeString(available[j].getName());
219 const UnicodeString oldCountry = oldLoc.getDisplayCountry(dipLocName);
220 const UnicodeString newCountry = newLoc.getDisplayCountry(dipLocName);
221 const UnicodeString oldLang = oldLoc.getDisplayLanguage(dipLocName);
222 const UnicodeString newLang = newLoc.getDisplayLanguage(dipLocName);
223
224 // is there display name for the current country ID
225 if(newCountry != newLoc.getCountry()){
226 if(oldCountry!=newCountry){
227 errln("getCountry() failed for "+ UnicodeString(oldLoc.getName()) +" oldCountry= "+ prettify(oldCountry) +" newCountry = "+prettify(newCountry)+ " in display locale "+ UnicodeString(available[j].getName()));
228 }
229 }
230 //there is a display name for the current lang ID
231 if(newLang != newLoc.getLanguage()){
232 if(oldLang != newLang){
233 errln("getLanguage() failed for " + UnicodeString(oldLoc.getName()) + " oldLang = "+ prettify(oldLang) +" newLang = "+prettify(newLang)+ " in display locale "+UnicodeString(available[j].getName()));
234 }
235 }
236 }
237 }
238 }
TestUResourceBundle()239 void LocaleAliasTest::TestUResourceBundle() {
240
241 UErrorCode status = U_ZERO_ERROR;
242 for (int i=0; i<_LOCALE_NUMBER; i++) {
243 Locale oldLoc(_LOCALE_ALIAS[i][0]);
244 Locale newLoc(_LOCALE_ALIAS[i][1]);
245 if(!isLocaleAvailable(_LOCALE_ALIAS[i][1])){
246 logln(UnicodeString(newLoc.getName())+" is not available. Skipping!");
247 continue;
248 }
249 logln("\nold locale:%s new locale:%s",oldLoc.getName(),newLoc.getName());
250
251 ResourceBundle* rb1 = NULL;
252 ResourceBundle* rb2 = NULL;
253
254 const char* testdatapath=loadTestData(status);
255
256 UnicodeString us1("NULL");
257 UnicodeString us2("NULL");
258 rb1 = new ResourceBundle(testdatapath, oldLoc, status);
259 if (U_FAILURE(U_ZERO_ERROR)) {
260
261 } else {
262 us1 = rb1->getStringEx("locale", status);
263 }
264 rb2 = new ResourceBundle(testdatapath, newLoc, status);
265 if (U_FAILURE(U_ZERO_ERROR)){
266
267 } else {
268 us2 = rb2->getStringEx("locale", status);
269 }
270 UnicodeString uNewLoc(newLoc.getName());
271 if (us1.compare(uNewLoc)!=0 || us1.compare(us2)!=0 || status!=U_ZERO_ERROR) {
272
273 }
274 log("UResourceBundle(getStringEx) old:");
275 log(us1);
276 log(" new:");
277 logln(us2);
278
279 if (rb1!=NULL) {
280 delete rb1;
281 }
282 if (rb2!=NULL) {
283 delete rb2;
284 }
285 }
286
287 }
288