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