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
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)23 void 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 */
testAPI()48 void 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) - exiting");
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*) - exiting");
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