• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)21 void 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  */
testAPI()46 void 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