1
2/********************************************************************
3 * COPYRIGHT:
4 * Copyright (c) 1997-2012, 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", ""); /* use invariant converter */
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) - %s", u_errorName(status));
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    logln(UnicodeString("Override with: ") + override);
97    SimpleDateFormat ovr1(pattern, override, status);
98    if(U_FAILURE(status)) {
99      errln("ERROR: Could not create SimpleDateFormat (pattern, override) - %s", u_errorName(status));
100    }
101
102    status = U_ZERO_ERROR;
103    SimpleDateFormat ovr2(pattern, override, Locale::getGerman(), status);
104    if(U_FAILURE(status)) {
105        errln("ERROR: Could not create SimpleDateFormat (pattern, override, locale) - %s", u_errorName(status));
106    }
107
108    status = U_ZERO_ERROR;
109    logln(UnicodeString("Override with: ") + override_bogus);
110    SimpleDateFormat ovr3(pattern, override_bogus, Locale::getGerman(), status);
111    if(U_SUCCESS(status)) {
112        errln("ERROR: Should not have been able to create SimpleDateFormat (pattern, override, locale) with a bogus override");
113    }
114
115
116    SimpleDateFormat copy(pat);
117
118// ======= Test clone(), assignment, and equality
119
120    logln("Testing clone(), assignment and equality operators");
121
122    if( ! (copy == pat) || copy != pat) {
123        errln("ERROR: Copy constructor (or ==) failed");
124    }
125
126    copy = cust1;
127    if(copy != cust1) {
128        errln("ERROR: Assignment (or !=) failed");
129    }
130
131    Format *clone = def.clone();
132    if( ! (*clone == def) ) {
133        errln("ERROR: Clone() (or ==) failed");
134    }
135    delete clone;
136
137// ======= Test various format() methods
138
139    logln("Testing various format() methods");
140
141    UDate d = 837039928046.0;
142    Formattable fD(d, Formattable::kIsDate);
143
144    UnicodeString res1, res2;
145    FieldPosition pos1(0), pos2(0);
146
147    res1 = def.format(d, res1, pos1);
148    logln( (UnicodeString) "" + d + " formatted to " + res1);
149
150    status = U_ZERO_ERROR;
151    res2 = cust1.format(fD, res2, pos2, status);
152    if(U_FAILURE(status)) {
153        errln("ERROR: format(Formattable [Date]) failed");
154    }
155    logln((UnicodeString) "" + fD.getDate() + " formatted to " + res2);
156
157// ======= Test parse()
158
159    logln("Testing parse()");
160
161    UnicodeString text("02/03/76 2:50 AM, CST");
162    UDate result1, result2;
163    ParsePosition pos(0);
164    result1 = def.parse(text, pos);
165    logln(text + " parsed into " + result1);
166
167    status = U_ZERO_ERROR;
168    result2 = def.parse(text, status);
169    if(U_FAILURE(status)) {
170        errln("ERROR: parse() failed");
171    }
172    logln(text + " parsed into " + result2);
173
174// ======= Test getters and setters
175
176    logln("Testing getters and setters");
177
178    const DateFormatSymbols *syms = pat.getDateFormatSymbols();
179    if(!syms) {
180      errln("Couldn't obtain DateFormatSymbols. Quitting test!");
181      return;
182    }
183    if(syms->getDynamicClassID() != DateFormatSymbols::getStaticClassID()) {
184        errln("ERROR: format->getDateFormatSymbols()->getDynamicClassID() != DateFormatSymbols::getStaticClassID()");
185    }
186    DateFormatSymbols *newSyms = new DateFormatSymbols(*syms);
187    def.adoptDateFormatSymbols(newSyms);
188    pat_fr.setDateFormatSymbols(*newSyms);
189    if( *(pat.getDateFormatSymbols()) != *(def.getDateFormatSymbols())) {
190        errln("ERROR: adopt or set DateFormatSymbols() failed");
191    }
192
193    status = U_ZERO_ERROR;
194    UDate startDate = pat.get2DigitYearStart(status);
195    if(U_FAILURE(status)) {
196        errln("ERROR: getTwoDigitStartDate() failed");
197    }
198
199    status = U_ZERO_ERROR;
200    pat_fr.set2DigitYearStart(startDate, status);
201    if(U_FAILURE(status)) {
202        errln("ERROR: setTwoDigitStartDate() failed");
203    }
204
205// ======= Test DateFormatSymbols constructor
206    newSyms  =new DateFormatSymbols("gregorian", status);
207    if(U_FAILURE(status)) {
208        errln("ERROR: new DateFormatSymbols() failed");
209    }
210    def.adoptDateFormatSymbols(newSyms);
211
212// ======= Test applyPattern()
213
214    logln("Testing applyPattern()");
215
216    UnicodeString p1("yyyy.MM.dd G 'at' hh:mm:ss z");
217    logln("Applying pattern " + p1);
218    status = U_ZERO_ERROR;
219    pat.applyPattern(p1);
220
221    UnicodeString s2;
222    s2 = pat.toPattern(s2);
223    logln("Extracted pattern is " + s2);
224    if(s2 != p1) {
225        errln("ERROR: toPattern() result did not match pattern applied");
226    }
227
228    logln("Applying pattern " + p1);
229    status = U_ZERO_ERROR;
230    pat.applyLocalizedPattern(p1, status);
231    if(U_FAILURE(status)) {
232        errln("ERROR: applyPattern() failed with %s", u_errorName(status));
233    }
234    UnicodeString s3;
235    status = U_ZERO_ERROR;
236    s3 = pat.toLocalizedPattern(s3, status);
237    if(U_FAILURE(status)) {
238        errln("ERROR: toLocalizedPattern() failed");
239    }
240    logln("Extracted pattern is " + s3);
241    if(s3 != p1) {
242        errln("ERROR: toLocalizedPattern() result did not match pattern applied");
243    }
244
245// ======= Test getStaticClassID()
246
247    logln("Testing getStaticClassID()");
248
249    status = U_ZERO_ERROR;
250    DateFormat *test = new SimpleDateFormat(status);
251    if(U_FAILURE(status)) {
252        errln("ERROR: Couldn't create a SimpleDateFormat");
253    }
254
255    if(test->getDynamicClassID() != SimpleDateFormat::getStaticClassID()) {
256        errln("ERROR: getDynamicClassID() didn't return the expected value");
257    }
258
259    delete test;
260
261// ======= Test Ticket 5684 (Parsing with 'e' and 'Y')
262    SimpleDateFormat object(UNICODE_STRING_SIMPLE("YYYY'W'wwe"), status);
263    if(U_FAILURE(status)) {
264        errln("ERROR: Couldn't create a SimpleDateFormat");
265    }
266    object.setLenient(false);
267    ParsePosition pp(0);
268    UDate udDate = object.parse("2007W014", pp);
269    if ((double)udDate == 0.0) {
270        errln("ERROR: Parsing failed using 'Y' and 'e'");
271    }
272}
273
274#endif /* #if !UCONFIG_NO_FORMATTING */
275