• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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