1
2/********************************************************************
3 * COPYRIGHT:
4 * Copyright (c) 1997-2009, International Business Machines Corporation and
5 * others. All Rights Reserved.
6 ********************************************************************/
7
8#include "unicode/utypes.h"
9
10#if !UCONFIG_NO_FORMATTING
11
12#include "sdtfmtts.h"
13
14#include "unicode/smpdtfmt.h"
15#include "unicode/dtfmtsym.h"
16
17// This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
18// try to test the full functionality.  It just calls each function in the class and
19// verifies that it works on a basic level.
20
21void IntlTestSimpleDateFormatAPI::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
22{
23    if (exec) logln("TestSuite SimpleDateFormatAPI");
24    switch (index) {
25        case 0: name = "SimpleDateFormat API test";
26                if (exec) {
27                    logln("SimpleDateFormat API test---"); logln("");
28                    UErrorCode status = U_ZERO_ERROR;
29                    Locale saveLocale;
30                    Locale::setDefault(Locale::getEnglish(), status);
31                    if(U_FAILURE(status)) {
32                        errln("ERROR: Could not set default locale, test may not give correct results");
33                    }
34                    testAPI(/*par*/);
35                    Locale::setDefault(saveLocale, status);
36                }
37                break;
38
39        default: name = ""; break;
40    }
41}
42
43/**
44 * Test various generic API methods of SimpleDateFormat for API coverage.
45 */
46void IntlTestSimpleDateFormatAPI::testAPI(/*char *par*/)
47{
48    UErrorCode status = U_ZERO_ERROR;
49
50// ======= Test constructors
51
52    logln("Testing SimpleDateFormat constructors");
53
54    SimpleDateFormat def(status);
55    if(U_FAILURE(status)) {
56        dataerrln("ERROR: Could not create SimpleDateFormat (default) - exitting");
57        return;
58    }
59
60    status = U_ZERO_ERROR;
61    const UnicodeString pattern("yyyy.MM.dd G 'at' hh:mm:ss z");
62    const UnicodeString override("y=hebr;d=thai;s=arab");
63    const UnicodeString override_bogus("y=hebr;d=thai;s=bogus");
64
65    SimpleDateFormat pat(pattern, status);
66    if(U_FAILURE(status)) {
67        errln("ERROR: Could not create SimpleDateFormat (pattern)");
68    }
69
70    status = U_ZERO_ERROR;
71    SimpleDateFormat pat_fr(pattern, Locale::getFrench(), status);
72    if(U_FAILURE(status)) {
73        errln("ERROR: Could not create SimpleDateFormat (pattern French)");
74    }
75
76    status = U_ZERO_ERROR;
77    DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getFrench(), status);
78    if(U_FAILURE(status)) {
79        errln("ERROR: Could not create DateFormatSymbols (French)");
80    }
81
82    status = U_ZERO_ERROR;
83    SimpleDateFormat cust1(pattern, symbols, status);
84    if(U_FAILURE(status)) {
85        dataerrln("ERROR: Could not create SimpleDateFormat (pattern, symbols*) - exitting");
86        return;
87    }
88
89    status = U_ZERO_ERROR;
90    SimpleDateFormat cust2(pattern, *symbols, status);
91    if(U_FAILURE(status)) {
92        errln("ERROR: Could not create SimpleDateFormat (pattern, symbols)");
93    }
94
95    status = U_ZERO_ERROR;
96    SimpleDateFormat ovr1(pattern, override, status);
97    if(U_FAILURE(status)) {
98        errln("ERROR: Could not create SimpleDateFormat (pattern, override)");
99    }
100
101    status = U_ZERO_ERROR;
102    SimpleDateFormat ovr2(pattern, override, Locale::getGerman(), status);
103    if(U_FAILURE(status)) {
104        errln("ERROR: Could not create SimpleDateFormat (pattern, override, locale)");
105    }
106
107    status = U_ZERO_ERROR;
108    SimpleDateFormat ovr3(pattern, override_bogus, Locale::getGerman(), status);
109    if(U_SUCCESS(status)) {
110        errln("ERROR: Should not have been able to create SimpleDateFormat (pattern, override, locale) with a bogus override");
111    }
112
113
114    SimpleDateFormat copy(pat);
115
116// ======= Test clone(), assignment, and equality
117
118    logln("Testing clone(), assignment and equality operators");
119
120    if( ! (copy == pat) || copy != pat) {
121        errln("ERROR: Copy constructor (or ==) failed");
122    }
123
124    copy = cust1;
125    if(copy != cust1) {
126        errln("ERROR: Assignment (or !=) failed");
127    }
128
129    Format *clone = def.clone();
130    if( ! (*clone == def) ) {
131        errln("ERROR: Clone() (or ==) failed");
132    }
133    delete clone;
134
135// ======= Test various format() methods
136
137    logln("Testing various format() methods");
138
139    UDate d = 837039928046.0;
140    Formattable fD(d, Formattable::kIsDate);
141
142    UnicodeString res1, res2;
143    FieldPosition pos1(0), pos2(0);
144
145    res1 = def.format(d, res1, pos1);
146    logln( (UnicodeString) "" + d + " formatted to " + res1);
147
148    status = U_ZERO_ERROR;
149    res2 = cust1.format(fD, res2, pos2, status);
150    if(U_FAILURE(status)) {
151        errln("ERROR: format(Formattable [Date]) failed");
152    }
153    logln((UnicodeString) "" + fD.getDate() + " formatted to " + res2);
154
155// ======= Test parse()
156
157    logln("Testing parse()");
158
159    UnicodeString text("02/03/76 2:50 AM, CST");
160    UDate result1, result2;
161    ParsePosition pos(0);
162    result1 = def.parse(text, pos);
163    logln(text + " parsed into " + result1);
164
165    status = U_ZERO_ERROR;
166    result2 = def.parse(text, status);
167    if(U_FAILURE(status)) {
168        errln("ERROR: parse() failed");
169    }
170    logln(text + " parsed into " + result2);
171
172// ======= Test getters and setters
173
174    logln("Testing getters and setters");
175
176    const DateFormatSymbols *syms = pat.getDateFormatSymbols();
177    if(!syms) {
178      errln("Couldn't obtain DateFormatSymbols. Quitting test!");
179      return;
180    }
181    if(syms->getDynamicClassID() != DateFormatSymbols::getStaticClassID()) {
182        errln("ERROR: format->getDateFormatSymbols()->getDynamicClassID() != DateFormatSymbols::getStaticClassID()");
183    }
184    DateFormatSymbols *newSyms = new DateFormatSymbols(*syms);
185    def.adoptDateFormatSymbols(newSyms);
186    pat_fr.setDateFormatSymbols(*newSyms);
187    if( *(pat.getDateFormatSymbols()) != *(def.getDateFormatSymbols())) {
188        errln("ERROR: adopt or set DateFormatSymbols() failed");
189    }
190
191    status = U_ZERO_ERROR;
192    UDate startDate = pat.get2DigitYearStart(status);
193    if(U_FAILURE(status)) {
194        errln("ERROR: getTwoDigitStartDate() failed");
195    }
196
197    status = U_ZERO_ERROR;
198    pat_fr.set2DigitYearStart(startDate, status);
199    if(U_FAILURE(status)) {
200        errln("ERROR: setTwoDigitStartDate() failed");
201    }
202
203// ======= Test DateFormatSymbols constructor
204    newSyms  =new DateFormatSymbols("gregorian", status);
205    if(U_FAILURE(status)) {
206        errln("ERROR: new DateFormatSymbols() failed");
207    }
208    def.adoptDateFormatSymbols(newSyms);
209
210// ======= Test applyPattern()
211
212    logln("Testing applyPattern()");
213
214    UnicodeString p1("yyyy.MM.dd G 'at' hh:mm:ss z");
215    logln("Applying pattern " + p1);
216    status = U_ZERO_ERROR;
217    pat.applyPattern(p1);
218
219    UnicodeString s2;
220    s2 = pat.toPattern(s2);
221    logln("Extracted pattern is " + s2);
222    if(s2 != p1) {
223        errln("ERROR: toPattern() result did not match pattern applied");
224    }
225
226    logln("Applying pattern " + p1);
227    status = U_ZERO_ERROR;
228    pat.applyLocalizedPattern(p1, status);
229    if(U_FAILURE(status)) {
230        errln("ERROR: applyPattern() failed with " + (int32_t) status);
231    }
232    UnicodeString s3;
233    status = U_ZERO_ERROR;
234    s3 = pat.toLocalizedPattern(s3, status);
235    if(U_FAILURE(status)) {
236        errln("ERROR: toLocalizedPattern() failed");
237    }
238    logln("Extracted pattern is " + s3);
239    if(s3 != p1) {
240        errln("ERROR: toLocalizedPattern() result did not match pattern applied");
241    }
242
243// ======= Test getStaticClassID()
244
245    logln("Testing getStaticClassID()");
246
247    status = U_ZERO_ERROR;
248    DateFormat *test = new SimpleDateFormat(status);
249    if(U_FAILURE(status)) {
250        errln("ERROR: Couldn't create a SimpleDateFormat");
251    }
252
253    if(test->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
254        errln("ERROR: getDynamicClassID() didn't return the expected value");
255    }
256
257    delete test;
258
259// ======= Test Ticket 5684 (Parsing with 'e' and 'Y')
260    SimpleDateFormat object(UNICODE_STRING_SIMPLE("YYYY'W'wwe"), status);
261    if(U_FAILURE(status)) {
262        errln("ERROR: Couldn't create a SimpleDateFormat");
263    }
264    object.setLenient(false);
265    ParsePosition pp(0);
266    UDate udDate = object.parse("2007W014", pp);
267    if ((double)udDate == 0.0) {
268        errln("ERROR: Parsing failed using 'Y' and 'e'");
269    }
270}
271
272#endif /* #if !UCONFIG_NO_FORMATTING */
273