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