1 /********************************************************************
2  * Copyright (c) 1997-2013, International Business Machines
3  * Corporation and others. All Rights Reserved.
4  ********************************************************************/
5 
6 #include "unicode/utypes.h"
7 
8 #if !UCONFIG_NO_FORMATTING
9 
10 #include "tsdtfmsy.h"
11 
12 #include "unicode/dtfmtsym.h"
13 
14 
15 //--------------------------------------------------------------------
16 // Time bomb - allows temporary behavior that expires at a given
17 //             release
18 //--------------------------------------------------------------------
19 
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)20 void IntlTestDateFormatSymbols::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
21 {
22     if (exec) logln("TestSuite DateFormatSymbols");
23     switch (index) {
24         TESTCASE(0,TestSymbols);
25         TESTCASE(1,TestGetMonths);
26         TESTCASE(2,TestGetMonths2);
27         TESTCASE(3,TestGetWeekdays2);
28         TESTCASE(4,TestGetEraNames);
29         TESTCASE(5,TestGetSetSpecificItems);
30         default: name = ""; break;
31     }
32 }
33 
34 /**
35  * Test getMonths.
36  */
TestGetMonths()37 void IntlTestDateFormatSymbols::TestGetMonths()
38 {
39     UErrorCode  status = U_ZERO_ERROR;
40     int32_t cnt;
41     const UnicodeString* month;
42     DateFormatSymbols *symbol;
43 
44     symbol=new DateFormatSymbols(Locale::getDefault(), status);
45 
46     month=symbol->getMonths(cnt);
47 
48     logln((UnicodeString)"size = " + cnt);
49 
50     for (int32_t i=0; i<cnt; ++i)
51     {
52         logln(month[i]);
53     }
54 
55     delete symbol;
56 }
57 
TestGetMonths2()58 void IntlTestDateFormatSymbols::TestGetMonths2()
59 {
60     UErrorCode  status = U_ZERO_ERROR;
61     DateFormatSymbols *symbol;
62 
63     symbol=new DateFormatSymbols(Locale::getDefault(), status);
64 
65     DateFormatSymbols::DtContextType context[] = {DateFormatSymbols::STANDALONE, DateFormatSymbols::FORMAT};
66     DateFormatSymbols::DtWidthType width[] = {DateFormatSymbols::WIDE, DateFormatSymbols::ABBREVIATED, DateFormatSymbols::NARROW};
67 
68     for (int32_t i = 0; i < 2; i++) {
69         for (int32_t j = 0; j < 3; j++) {
70             int32_t cnt;
71             const UnicodeString * month = symbol->getMonths(cnt,context[i],width[j]);
72 
73             logln((UnicodeString)"size = " + cnt);
74 
75             for (int32_t k = 0; k < cnt; k++) {
76                 logln(month[k]);
77             }
78         }
79     }
80     delete symbol;
81 }
82 
TestGetWeekdays2()83 void IntlTestDateFormatSymbols::TestGetWeekdays2()
84 {
85     UErrorCode  status = U_ZERO_ERROR;
86     DateFormatSymbols *symbol;
87 
88     symbol=new DateFormatSymbols(Locale::getDefault(), status);
89 
90     DateFormatSymbols::DtContextType context[] = {DateFormatSymbols::STANDALONE, DateFormatSymbols::FORMAT};
91     DateFormatSymbols::DtWidthType width[] = {DateFormatSymbols::WIDE, DateFormatSymbols::ABBREVIATED, DateFormatSymbols::NARROW};
92 
93     for (int32_t i = 0; i < 2; i++) {
94         for (int32_t j = 0; j < 3; j++) {
95             int32_t cnt;
96             const UnicodeString * wd = symbol->getWeekdays(cnt,context[i],width[j]);
97 
98             logln((UnicodeString)"size = " + cnt);
99 
100             for (int32_t k = 0; k < cnt; k++) {
101                 logln(wd[k]);
102             }
103         }
104     }
105     delete symbol;
106 }
107 
108 
TestGetEraNames()109 void IntlTestDateFormatSymbols::TestGetEraNames()
110 {
111     UErrorCode  status = U_ZERO_ERROR;
112     int32_t cnt;
113     const UnicodeString* name;
114     DateFormatSymbols *symbol;
115 
116     symbol=new DateFormatSymbols(Locale::getDefault(), status);
117 
118     name=symbol->getEraNames(cnt);
119 
120     logln((UnicodeString)"size = " + cnt);
121 
122     for (int32_t i=0; i<cnt; ++i)
123     {
124         logln(name[i]);
125     }
126 
127     delete symbol;
128 }
129 
UnicodeStringsArePrefixes(int32_t count,int32_t prefixLen,const UnicodeString * prefixArray,const UnicodeString * baseArray)130 UBool IntlTestDateFormatSymbols::UnicodeStringsArePrefixes(int32_t count, int32_t prefixLen, const UnicodeString *prefixArray, const UnicodeString *baseArray)
131 {
132     int32_t i;
133     for (i = 0; i < count; i++) {
134         if (baseArray[i].compare(0, prefixLen, prefixArray[i]) != 0) {
135             errln("ERROR: Mismatch example: expect prefix \"" + prefixArray[i] + "\" of base \"" + baseArray[i] + "\".");
136             return FALSE;
137         }
138     }
139     return TRUE;
140 }
141 
TestGetSetSpecificItems()142 void IntlTestDateFormatSymbols::TestGetSetSpecificItems()
143 {
144     UErrorCode  status = U_ZERO_ERROR;
145     DateFormatSymbols *symbol=new DateFormatSymbols(Locale::getEnglish(), status);
146     if(U_FAILURE(status)) {
147         dataerrln("ERROR: Couldn't create English DateFormatSymbols " + (UnicodeString)u_errorName(status));
148         return;
149     }
150     int32_t cntFmtAbbrev, cntFmtShort, cntStdAloneShort;
151     const UnicodeString * wdFmtAbbrev     = symbol->getWeekdays(cntFmtAbbrev,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED);
152     const UnicodeString * wdFmtShort      = symbol->getWeekdays(cntFmtShort,DateFormatSymbols::FORMAT,DateFormatSymbols::SHORT);
153     const UnicodeString * wdStdAloneShort = symbol->getWeekdays(cntStdAloneShort,DateFormatSymbols::STANDALONE,DateFormatSymbols::SHORT);
154     // Expect that English short names are prefixes of abbreviated names
155     if (cntFmtShort != cntFmtAbbrev || !UnicodeStringsArePrefixes(cntFmtAbbrev, 2, wdFmtShort, wdFmtAbbrev)) {
156         errln("ERROR: English format short weekday names don't match prefixes of format abbreviated names");
157     }
158     if (cntStdAloneShort != cntFmtAbbrev || !UnicodeStringsArePrefixes(cntFmtAbbrev, 2, wdStdAloneShort, wdFmtAbbrev)) {
159         errln("ERROR: English standalone short weekday names don't match prefixes of format abbreviated names");
160     }
161 
162     delete symbol;
163 }
164 
165 /**
166  * Test the API of DateFormatSymbols; primarily a simple get/set set.
167  */
TestSymbols()168 void IntlTestDateFormatSymbols::TestSymbols(/* char *par */)
169 {
170     UErrorCode status = U_ZERO_ERROR;
171 
172     DateFormatSymbols fr(Locale::getFrench(), status);
173     if(U_FAILURE(status)) {
174         dataerrln("ERROR: Couldn't create French DateFormatSymbols " + (UnicodeString)u_errorName(status));
175         return;
176     }
177 
178     status = U_ZERO_ERROR;
179     DateFormatSymbols fr2(Locale::getFrench(), status);
180     if(U_FAILURE(status)) {
181         errcheckln(status, "ERROR: Couldn't create French DateFormatSymbols " + (UnicodeString)u_errorName(status));
182         return;
183     }
184 
185     status = U_ZERO_ERROR;
186     DateFormatSymbols en(Locale::getEnglish(), status);
187     if(U_FAILURE(status)) {
188         errcheckln(status, "ERROR: Couldn't create English DateFormatSymbols " + (UnicodeString)u_errorName(status));
189         return;
190     }
191 
192     if(en == fr || ! (en != fr) ) {
193         errln("ERROR: English DateFormatSymbols equal to French");
194     }
195 
196     // just do some VERY basic tests to make sure that get/set work
197 
198     int32_t count = 0;
199     const UnicodeString *eras = en.getEras(count);
200     if(count == 0) {
201       errln("ERROR: 0 english eras.. exiting..\n");
202       return;
203     }
204     int32_t eraNamesCount = 0;
205     const UnicodeString *eraNames = en.getEraNames(eraNamesCount);
206     if(eraNamesCount == 0) {
207       errln("ERROR: 0 english eraNames\n");
208     } else if ( eraNames[0].length() <= eras[0].length() ) {
209       // At least for English we know a wide eraName should be longer than an abbrev era
210       errln("ERROR: english eraNames[0] not longer than eras[0]\n");
211     }
212     int32_t narrowErasCount = 0;
213     const UnicodeString *narrowEras = en.getNarrowEras(narrowErasCount);
214     if(narrowErasCount == 0) {
215       errln("ERROR: 0 english narrowEras\n");
216     } else if ( narrowEras[0].length() >= eras[0].length() ) {
217       // At least for English we know a narrowEra should be shorter than an abbrev era
218       errln("ERROR: english narrowEras[0] not shorter than eras[0]\n");
219     }
220 
221     fr.setEras(eras, count);
222     if( *en.getEras(count) != *fr.getEras(count)) {
223       errln("ERROR: setEras() failed");
224     }
225 
226     const UnicodeString *months = en.getMonths(count);
227     fr.setMonths(months, count);
228     if( *en.getMonths(count) != *fr.getMonths(count)) {
229         errln("ERROR: setMonths() failed");
230     }
231 
232     const UnicodeString *shortMonths = en.getShortMonths(count);
233     fr.setShortMonths(shortMonths, count);
234     if( *en.getShortMonths(count) != *fr.getShortMonths(count)) {
235         errln("ERROR: setShortMonths() failed");
236     }
237 
238     const UnicodeString *wideMonths = en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE);
239     fr2.setMonths(wideMonths, count, DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE);
240     if( *en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE) !=
241         *fr2.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE )) {
242         errln("ERROR: setMonths(FORMAT,WIDE) failed");
243     }
244 
245     const UnicodeString *abbrMonths = en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED);
246     fr2.setMonths(abbrMonths, count, DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED);
247     if( *en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED) !=
248         *fr2.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED )) {
249         errln("ERROR: setMonths(FORMAT,ABBREVIATED) failed");
250     }
251 
252     const UnicodeString *narrowMonths = en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW);
253     fr.setMonths(narrowMonths, count, DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW);
254     if( *en.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW) !=
255         *fr.getMonths(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW )) {
256         errln("ERROR: setMonths(FORMAT,NARROW) failed");
257     }
258 
259     const UnicodeString *standaloneWideMonths = en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE);
260     fr.setMonths(standaloneWideMonths, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE);
261     if( *en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE) !=
262         *fr.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE )) {
263         errln("ERROR: setMonths(STANDALONE,WIDE) failed");
264     }
265 
266     const UnicodeString *standaloneShortMonths = en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED);
267     fr.setMonths(standaloneShortMonths, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED);
268     if( *en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED) !=
269         *fr.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED )) {
270         errln("ERROR: setMonths(STANDALONE,ABBREVIATED) failed");
271     }
272 
273     const UnicodeString *standaloneNarrowMonths = en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW);
274     fr.setMonths(standaloneNarrowMonths, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW);
275     if( *en.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW) !=
276         *fr.getMonths(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW )) {
277         errln("ERROR: setMonths(STANDALONE,NARROW) failed");
278     }
279 
280     const UnicodeString *weekdays = en.getWeekdays(count);
281     fr.setWeekdays(weekdays, count);
282     if( *en.getWeekdays(count) != *fr.getWeekdays(count)) {
283         errln("ERROR: setWeekdays() failed");
284     }
285 
286     const UnicodeString *shortWeekdays = en.getShortWeekdays(count);
287     fr.setShortWeekdays(shortWeekdays, count);
288     if( *en.getShortWeekdays(count) != *fr.getShortWeekdays(count)) {
289         errln("ERROR: setShortWeekdays() failed");
290     }
291 
292     const UnicodeString *wideWeekdays = en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE);
293     fr2.setWeekdays(wideWeekdays, count, DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE);
294     if( *en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE) !=
295         *fr2.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::WIDE )) {
296         errln("ERROR: setWeekdays(FORMAT,WIDE) failed");
297     }
298 
299     const UnicodeString *abbrWeekdays = en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED);
300     fr2.setWeekdays(abbrWeekdays, count, DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED);
301     if( *en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED) !=
302         *fr2.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::ABBREVIATED )) {
303         errln("ERROR: setWeekdays(FORMAT,ABBREVIATED) failed");
304     }
305 
306     const UnicodeString *narrowWeekdays = en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW);
307     fr.setWeekdays(narrowWeekdays, count, DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW);
308     if( *en.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW) !=
309         *fr.getWeekdays(count,DateFormatSymbols::FORMAT,DateFormatSymbols::NARROW )) {
310         errln("ERROR: setWeekdays(FORMAT,NARROW) failed");
311     }
312 
313     const UnicodeString *standaloneWideWeekdays = en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE);
314     fr.setWeekdays(standaloneWideWeekdays, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE);
315     if( *en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE) !=
316         *fr.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::WIDE )) {
317         errln("ERROR: setWeekdays(STANDALONE,WIDE) failed");
318     }
319 
320     const UnicodeString *standaloneShortWeekdays = en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED);
321     fr.setWeekdays(standaloneShortWeekdays, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED);
322     if( *en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED) !=
323         *fr.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::ABBREVIATED )) {
324         errln("ERROR: setWeekdays(STANDALONE,ABBREVIATED) failed");
325     }
326 
327     const UnicodeString *standaloneNarrowWeekdays = en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW);
328     fr.setWeekdays(standaloneNarrowWeekdays, count, DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW);
329     if( *en.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW) !=
330         *fr.getWeekdays(count,DateFormatSymbols::STANDALONE,DateFormatSymbols::NARROW )) {
331         errln("ERROR: setWeekdays(STANDALONE,NARROW) failed");
332     }
333 
334     const UnicodeString *wideQuarters = en.getQuarters(count,DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE);
335     fr2.setQuarters(wideQuarters, count, DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE);
336     if( *en.getQuarters(count,DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE) !=
337         *fr2.getQuarters(count,DateFormatSymbols::FORMAT, DateFormatSymbols::WIDE )) {
338         errln("ERROR: setQuarters(FORMAT, WIDE) failed");
339     }
340 
341     const UnicodeString *abbrQuarters = en.getQuarters(count,DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED);
342     fr2.setQuarters(abbrQuarters, count, DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED);
343     if( *en.getQuarters(count,DateFormatSymbols::FORMAT, DateFormatSymbols::ABBREVIATED) !=
344         *fr2.getQuarters(count,DateFormatSymbols::FORMAT ,DateFormatSymbols::ABBREVIATED )) {
345         errln("ERROR: setQuarters(FORMAT, ABBREVIATED) failed");
346     }
347 
348     const UnicodeString *standaloneWideQuarters = en.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
349     fr.setQuarters(standaloneWideQuarters, count, DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE);
350     if( *en.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE) !=
351         *fr.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::WIDE )) {
352         errln("ERROR: setQuarters(STANDALONE, WIDE) failed");
353     }
354 
355     const UnicodeString *standaloneShortQuarters = en.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
356     fr.setQuarters(standaloneShortQuarters, count, DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED);
357     if( *en.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED) !=
358         *fr.getQuarters(count,DateFormatSymbols::STANDALONE, DateFormatSymbols::ABBREVIATED )) {
359         errln("ERROR: setQuarters(STANDALONE, ABBREVIATED) failed");
360     }
361 
362     const UnicodeString *ampms = en.getAmPmStrings(count);
363     fr.setAmPmStrings(ampms, count);
364     if( *en.getAmPmStrings(count) != *fr.getAmPmStrings(count)) {
365         errln("ERROR: setAmPmStrings() failed");
366     }
367 
368     int32_t rowCount = 0, columnCount = 0;
369     const UnicodeString **strings = en.getZoneStrings(rowCount, columnCount);
370     fr.setZoneStrings(strings, rowCount, columnCount);
371     const UnicodeString **strings1 = fr.getZoneStrings(rowCount, columnCount);
372     for(int32_t i = 0; i < rowCount; i++) {
373        for(int32_t j = 0; j < columnCount; j++) {
374             if( strings[i][j] != strings1[i][j] ) {
375                 errln("ERROR: setZoneStrings() failed");
376             }
377         }
378     }
379 
380     UnicodeString localPattern, pat1, pat2;
381     localPattern = en.getLocalPatternChars(localPattern);
382     fr.setLocalPatternChars(localPattern);
383     if( en.getLocalPatternChars(pat1) != fr.getLocalPatternChars(pat2)) {
384         errln("ERROR: setLocalPatternChars() failed");
385     }
386 
387 
388     status = U_ZERO_ERROR;
389     DateFormatSymbols foo(status);
390     DateFormatSymbols bar(foo);
391 
392     en = fr;
393 
394     if(en != fr) {
395         errln("ERROR: Assignment operator failed");
396     }
397     if(foo != bar) {
398         errln("ERROR: Copy Constructor failed");
399     }
400 }
401 
402 #endif /* #if !UCONFIG_NO_FORMATTING */
403