1/***********************************************************************
2 * Copyright (c) 1997-2011, International Business Machines Corporation
3 * and others. All Rights Reserved.
4 ***********************************************************************/
5
6#include "unicode/utypes.h"
7
8#if !UCONFIG_NO_FORMATTING
9
10#include "miscdtfm.h"
11
12#include "unicode/format.h"
13#include "unicode/decimfmt.h"
14#include "unicode/datefmt.h"
15#include "unicode/smpdtfmt.h"
16#include "unicode/dtfmtsym.h"
17#include "unicode/locid.h"
18#include "unicode/msgfmt.h"
19#include "unicode/numfmt.h"
20#include "unicode/choicfmt.h"
21#include "unicode/gregocal.h"
22
23// *****************************************************************************
24// class DateFormatMiscTests
25// *****************************************************************************
26
27#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break;
28
29void
30DateFormatMiscTests::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
31{
32    // if (exec) logln((UnicodeString)"TestSuite DateFormatMiscTests");
33    switch (index) {
34        CASE(0, test4097450)
35        CASE(1, test4099975)
36        CASE(2, test4117335)
37
38        default: name = ""; break;
39    }
40}
41
42UBool
43DateFormatMiscTests::failure(UErrorCode status, const char* msg)
44{
45    if(U_FAILURE(status)) {
46        errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
47        return TRUE;
48    }
49
50    return FALSE;
51}
52
53/*
54 * @bug 4097450
55 */
56void
57DateFormatMiscTests::test4097450()
58{
59    //
60    // Date parse requiring 4 digit year.
61    //
62    UnicodeString  dstring [] = {
63        UnicodeString("97"),
64        UnicodeString("1997"),
65        UnicodeString("97"),
66        UnicodeString("1997"),
67        UnicodeString("01"),
68        UnicodeString("2001"),
69        UnicodeString("01"),
70        UnicodeString("2001"),
71        UnicodeString("1"),
72        UnicodeString("1"),
73        UnicodeString("11"),
74        UnicodeString("11"),
75        UnicodeString("111"),
76        UnicodeString("111")
77    };
78
79    UnicodeString dformat [] = {
80        UnicodeString("yy"),
81        UnicodeString("yy"),
82        UnicodeString("yyyy"),
83        UnicodeString("yyyy"),
84        UnicodeString("yy"),
85        UnicodeString("yy"),
86        UnicodeString("yyyy"),
87        UnicodeString("yyyy"),
88        UnicodeString("yy"),
89        UnicodeString("yyyy"),
90        UnicodeString("yy"),
91        UnicodeString("yyyy"),
92        UnicodeString("yy"),
93        UnicodeString("yyyy")
94    };
95
96/*    UBool dresult [] = {
97        TRUE,
98        FALSE,
99        FALSE,
100        TRUE,
101        TRUE,
102        FALSE,
103        FALSE,
104        TRUE,
105        FALSE,
106        FALSE,
107        TRUE,
108        FALSE,
109        FALSE,
110        FALSE
111    };*/
112
113    UErrorCode status = U_ZERO_ERROR;
114    SimpleDateFormat *formatter;
115    SimpleDateFormat *resultFormatter = new SimpleDateFormat((UnicodeString)"yyyy", status);
116    if (U_FAILURE(status)) {
117        dataerrln("Fail new SimpleDateFormat: %s", u_errorName(status));
118        return;
119    }
120
121    logln("Format\tSource\tResult");
122    logln("-------\t-------\t-------");
123    for (int i = 0; i < 14/*dstring.length*/; i++)
124    {
125        log(dformat[i] + "\t" + dstring[i] + "\t");
126        formatter = new SimpleDateFormat(dformat[i], status);
127        if(failure(status, "new SimpleDateFormat")) return;
128        //try {
129        UnicodeString str;
130        FieldPosition pos(FieldPosition::DONT_CARE);
131        logln(resultFormatter->format(formatter->parse(dstring[i], status), str, pos));
132        failure(status, "resultFormatter->format");
133            //if ( !dresult[i] ) System.out.print("   <-- error!");
134        /*}
135        catch (ParseException exception) {
136            //if ( dresult[i] ) System.out.print("   <-- error!");
137            System.out.print("exception --> " + exception);
138        }*/
139        delete formatter;
140        logln();
141    }
142
143    delete resultFormatter;
144}
145
146/*
147 * @bug 4099975
148 */
149void
150DateFormatMiscTests::test4099975()
151{
152    /**
153     * Test Constructor SimpleDateFormat::SimpleDateFormat (const UnicodeString & pattern,
154     *                                    const DateFormatSymbols & formatData, UErrorCode & status )
155     * The DateFormatSymbols object is NOT adopted; Modifying the original DateFormatSymbols
156     * should not change the SimpleDateFormat's behavior.
157     */
158    UDate d = Calendar::getNow();
159    {
160        UErrorCode status = U_ZERO_ERROR;
161        DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
162        if (U_FAILURE(status)) {
163            dataerrln("Unable to create DateFormatSymbols - %s", u_errorName(status));
164            return;
165        }
166        SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), *symbols, status);
167        if(failure(status, "new SimpleDateFormat")) return;
168        UnicodeString format0;
169        format0 = df->format(d, format0);
170        UnicodeString localizedPattern0;
171        localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
172        failure(status, "df->toLocalizedPattern");
173        symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
174        UnicodeString format1;
175        format1 = df->format(d, format1);
176        if (format0 != format1) {
177            errln(UnicodeString("Formats are different. format0: ") + format0
178                + UnicodeString("; format1: ") + format1);
179        }
180        UnicodeString localizedPattern1;
181        localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
182        failure(status, "df->toLocalizedPattern");
183        if (localizedPattern0 != localizedPattern1) {
184            errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0
185                + UnicodeString("; localizedPattern1: ") + localizedPattern1);
186        }
187        delete symbols;
188        delete df;
189    }
190    /*
191     * Test void SimpleDateFormat::setDateFormatSymbols (  const DateFormatSymbols & newFormatSymbols )
192     * Modifying the original DateFormatSymbols should not change the SimpleDateFormat's behavior.
193     */
194    {
195        UErrorCode status = U_ZERO_ERROR;
196        DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
197        if(failure(status, "new DateFormatSymbols")) return;
198        SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
199        if(failure(status, "new SimpleDateFormat")) return;
200        df->setDateFormatSymbols(*symbols);
201        UnicodeString format0;
202        format0 = df->format(d, format0);
203        UnicodeString localizedPattern0;
204        localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
205        failure(status, "df->toLocalizedPattern");
206        symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
207        UnicodeString format1;
208        format1 = df->format(d, format1);
209        if (format0 != format1) {
210            errln(UnicodeString("Formats are different. format0: ") + format0
211                + UnicodeString("; format1: ") + format1);
212        }
213        UnicodeString localizedPattern1;
214        localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
215        failure(status, "df->toLocalizedPattern");
216        if (localizedPattern0 != localizedPattern1) {
217            errln(UnicodeString("Pattern has been changed. localizedPattern0: ") + localizedPattern0
218                + UnicodeString("; localizedPattern1: ") + localizedPattern1);
219        }
220        delete symbols;
221        delete df;
222
223    }
224    //Test the pointer version of the constructor (and the adoptDateFormatSymbols method)
225    {
226        UErrorCode status = U_ZERO_ERROR;
227        DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
228        if(failure(status, "new DateFormatSymbols")) return;
229        SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), symbols, status);
230        if(failure(status, "new SimpleDateFormat")) return;
231        UnicodeString format0;
232        format0 = df->format(d, format0);
233        UnicodeString localizedPattern0;
234        localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
235        failure(status, "df->toLocalizedPattern");
236        symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
237        UnicodeString format1;
238        format1 = df->format(d, format1);
239        if (format0 != format1) {
240            errln(UnicodeString("Formats are different. format0: ") + format0
241                + UnicodeString("; format1: ") + format1);
242        }
243        UnicodeString localizedPattern1;
244        localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
245        failure(status, "df->toLocalizedPattern");
246        if (localizedPattern0 == localizedPattern1) {
247            errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0
248                + UnicodeString("; localizedPattern1: ") + localizedPattern1);
249        }
250        //delete symbols; the caller is no longer responsible for deleting the symbols
251        delete df;
252    }
253    //
254    {
255        UErrorCode status = U_ZERO_ERROR;
256        DateFormatSymbols* symbols = new DateFormatSymbols(Locale::getUS(), status);
257        failure(status, "new DateFormatSymbols");
258        SimpleDateFormat *df = new SimpleDateFormat(UnicodeString("E hh:mm"), status);
259        if(failure(status, "new SimpleDateFormat")) return;
260        df-> adoptDateFormatSymbols(symbols);
261        UnicodeString format0;
262        format0 = df->format(d, format0);
263        UnicodeString localizedPattern0;
264        localizedPattern0 = df->toLocalizedPattern(localizedPattern0, status);
265        failure(status, "df->toLocalizedPattern");
266        symbols->setLocalPatternChars(UnicodeString("abcdefghijklmonpqr")); // change value of field
267        UnicodeString format1;
268        format1 = df->format(d, format1);
269        if (format0 != format1) {
270            errln(UnicodeString("Formats are different. format0: ") + format0
271                + UnicodeString("; format1: ") + format1);
272        }
273        UnicodeString localizedPattern1;
274        localizedPattern1 = df->toLocalizedPattern(localizedPattern1, status);
275        failure(status, "df->toLocalizedPattern");
276        if (localizedPattern0 == localizedPattern1) {
277            errln(UnicodeString("Pattern should have been changed. localizedPattern0: ") + localizedPattern0
278                + UnicodeString("; localizedPattern1: ") + localizedPattern1);
279        }
280        //delete symbols; the caller is no longer responsible for deleting the symbols
281        delete df;
282    }
283}
284
285/*
286 * @test @(#)bug4117335.java    1.1 3/5/98
287 *
288 * @bug 4117335
289 */
290void
291DateFormatMiscTests::test4117335()
292{
293    //UnicodeString bc = "\u7d00\u5143\u524d";
294    UChar bcC [] = {
295        0x7D00,
296        0x5143,
297        0x524D
298    };
299    UnicodeString bc(bcC, 3, 3);
300
301    //UnicodeString ad = "\u897f\u66a6";
302    UChar adC [] = {
303        0x897F,
304        0x66A6
305    };
306    UnicodeString ad(adC, 2, 2);
307
308    //UnicodeString jstLong = "\u65e5\u672c\u6a19\u6e96\u6642";
309    UChar jstLongC [] = {
310        0x65e5,
311        0x672c,
312        0x6a19,
313        0x6e96,
314        0x6642
315    };
316    UChar jdtLongC [] = {0x65E5, 0x672C, 0x590F, 0x6642, 0x9593};
317
318    UnicodeString jstLong(jstLongC, 5, 5);
319
320//    UnicodeString jstShort = "JST";
321
322    UnicodeString tzID = "Asia/Tokyo";
323
324    UnicodeString jdtLong(jdtLongC, 5, 5);
325
326//    UnicodeString jdtShort = "JDT";
327    UErrorCode status = U_ZERO_ERROR;
328    DateFormatSymbols *symbols = new DateFormatSymbols(Locale::getJapan(), status);
329    if(U_FAILURE(status)) {
330      dataerrln("Failure creating DateFormatSymbols, %s", u_errorName(status));
331      delete symbols;
332      return;
333    }
334    failure(status, "new DateFormatSymbols");
335    int32_t eraCount = 0;
336    const UnicodeString *eras = symbols->getEraNames(eraCount);
337
338    logln(UnicodeString("BC = ") + eras[0]);
339    if (eras[0] != bc) {
340        errln("*** Should have been " + bc);
341        //throw new Exception("Error in BC");
342    }
343
344    logln(UnicodeString("AD = ") + eras[1]);
345    if (eras[1] != ad) {
346        errln("*** Should have been " + ad);
347        //throw new Exception("Error in AD");
348    }
349
350    int32_t rowCount, colCount;
351    const UnicodeString **zones = symbols->getZoneStrings(rowCount, colCount);
352    //don't hard code the index .. compute it.
353    int32_t index = -1;
354    for (int32_t i = 0; i < rowCount; ++i) {
355        if (tzID == (zones[i][0])) {
356            index = i;
357            break;
358        }
359    }
360    logln(UnicodeString("Long zone name = ") + zones[index][1]);
361    if (zones[index][1] != jstLong) {
362        errln("*** Should have been " + prettify(jstLong)+ " but it is: " + prettify(zones[index][1]));
363        //throw new Exception("Error in long TZ name");
364    }
365//    logln(UnicodeString("Short zone name = ") + zones[index][2]);
366//    if (zones[index][2] != jstShort) {
367//        errln("*** Should have been " + prettify(jstShort) + " but it is: " + prettify(zones[index][2]));
368//        //throw new Exception("Error in short TZ name");
369//    }
370    logln(UnicodeString("Long zone name = ") + zones[index][3]);
371    if (zones[index][3] != jdtLong) {
372        errln("*** Should have been " + prettify(jstLong) + " but it is: " + prettify(zones[index][3]));
373        //throw new Exception("Error in long TZ name");
374    }
375//    logln(UnicodeString("SHORT zone name = ") + zones[index][4]);
376//    if (zones[index][4] != jdtShort) {
377//        errln("*** Should have been " + prettify(jstShort)+ " but it is: " + prettify(zones[index][4]));
378//        //throw new Exception("Error in short TZ name");
379//    }
380    delete symbols;
381
382}
383
384#endif /* #if !UCONFIG_NO_FORMATTING */
385