1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * Copyright (c) 1997-2014, International Business Machines Corporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ***********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Test Internationalized Calendars for C++ */
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "string.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "japancal.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "caltest.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK(status, msg) \
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { \
2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln((UnicodeString(u_errorName(status)) + UnicodeString(" : " ) )+ msg); \
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return; \
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UnicodeString escape( const UnicodeString&src)
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString dst;
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dst.remove();
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < src.length(); ++i) {
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar c = src[i];
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c < 0x0080)
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dst += c;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dst += UnicodeString("[");
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            char buf [8];
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sprintf(buf, "%#x", c);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dst += UnicodeString(buf);
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dst += UnicodeString("]");
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return dst;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "incaltst.h"
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/gregocal.h"
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class IntlCalendarTest
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//--- move to CalendarTest?
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Turn this on to dump the calendar fields
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define U_DEBUG_DUMPCALS
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite IntlCalendarTest");
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(0,TestTypes);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(1,TestGregorian);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(2,TestBuddhist);
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(3,TestJapanese);
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(4,TestBuddhistFormat);
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(5,TestJapaneseFormat);
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(6,TestJapanese3860);
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(7,TestPersian);
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(8,TestPersianFormat);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CASE(9,TestTaiwan);
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default: name = ""; break;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef CASE
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---------------------------------------------------------------------------------
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test various API methods for API completeness.
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruIntlCalendarTest::TestTypes()
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  Calendar *c = NULL;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int j;
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *locs [40] = { "en_US_VALLEYGIRL",
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_US_VALLEYGIRL@collation=phonebook;calendar=japanese",
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "en_US_VALLEYGIRL@collation=phonebook;calendar=gregorian",
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ja_JP@calendar=japanese",
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "th_TH@calendar=buddhist",
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "ja_JP_TRADITIONAL",
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "th_TH_TRADITIONAL",
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "th_TH_TRADITIONAL@calendar=gregorian",
104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            "en_US",
105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            "th_TH",    // Default calendar for th_TH is buddhist
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            "th",       // th's default region is TH and buddhist is used as default for TH
107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            "en_TH",    // Default calendar for any locales with region TH is buddhist
10827f654740f2a26ad62a5c155af9199af9e69b889claireho                            "en-TH-u-ca-gregory",
109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            NULL };
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const char *types[40] = { "gregorian",
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "japanese",
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "gregorian",
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "japanese",
114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            "buddhist",
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            "japanese",
116fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            "buddhist",
117fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            "gregorian",
118fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                            "gregorian",
11959d709d503bab6e2b61931737e662dd293b40578ccornelius                            "gregorian",  // android-changed.  "buddhist",
12059d709d503bab6e2b61931737e662dd293b40578ccornelius                            "gregorian",  // android-changed.  "buddhist",
12159d709d503bab6e2b61931737e662dd293b40578ccornelius                            "gregorian",  // android-changed.  "buddhist",
12227f654740f2a26ad62a5c155af9199af9e69b889claireho                            "gregorian",
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                            NULL };
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(j=0;locs[j];j++) {
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("Creating calendar of locale ")  + locs[j]);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = Calendar::createInstance(locs[j], status);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating '" + UnicodeString(locs[j]) + "' calendar");
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)) {
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString(" type is ") + c->getType());
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(strcmp(c->getType(), types[j])) {
1336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln(UnicodeString(locs[j]) + UnicodeString("Calendar type ") + c->getType() + " instead of " + types[j]);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Run a test of a quasi-Gregorian calendar.  This is a calendar
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that behaves like a Gregorian but has different year/era mappings.
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The int[] data array should have the format:
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * { era, year, gregorianYear, month, dayOfMonth, ...  ... , -1 }
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::quasiGregorianTest(Calendar& cal, const Locale& gcl, const int32_t *data) {
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // As of JDK 1.4.1_01, using the Sun JDK GregorianCalendar as
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // a reference throws us off by one hour.  This is most likely
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  // due to the JDK 1.4 incorporation of historical time zones.
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //java.util.Calendar grego = java.util.Calendar.getInstance();
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  Calendar *grego = Calendar::createInstance(gcl, status);
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (U_FAILURE(status)) {
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dataerrln("Error calling Calendar::createInstance");
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t tz1 = cal.get(UCAL_ZONE_OFFSET,status);
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t tz2 = grego -> get (UCAL_ZONE_OFFSET, status);
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(tz1 != tz2) {
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln((UnicodeString)"cal's tz " + tz1 + " != grego's tz " + tz2);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (int32_t i=0; data[i]!=-1; ) {
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t era = data[i++];
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t year = data[i++];
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t gregorianYear = data[i++];
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t month = data[i++];
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dayOfMonth = data[i++];
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    grego->clear();
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    grego->set(gregorianYear, month, dayOfMonth);
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate D = grego->getTime(status);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.clear();
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.set(UCAL_ERA, era);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.set(year, month, dayOfMonth);
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = cal.getTime(status);
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_DEBUG_DUMPCALS
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"cal  : " + CalendarTest::calToStr(cal));
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"grego: " + CalendarTest::calToStr(*grego));
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (d == D) {
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("OK: ") + era + ":" + year + "/" + (month+1) + "/" + dayOfMonth +
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " => " + d + " (" + UnicodeString(cal.getType()) + ")");
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln(UnicodeString("Fail: (fields to millis)") + era + ":" + year + "/" + (month+1) + "/" + dayOfMonth +
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " => " + d + ", expected " + D + " (" + UnicodeString(cal.getType()) + "Off by: " + (d-D));
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now, set the gregorian millis on the other calendar
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.clear();
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.setTime(D, status);
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int e = cal.get(UCAL_ERA, status);
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int y = cal.get(UCAL_YEAR, status);
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_DEBUG_DUMPCALS
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"cal  : " + CalendarTest::calToStr(cal));
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"grego: " + CalendarTest::calToStr(*grego));
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (y == year && e == era) {
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln((UnicodeString)"OK: " + D + " => " + cal.get(UCAL_ERA, status) + ":" +
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.get(UCAL_YEAR, status) + "/" +
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (cal.get(UCAL_MONTH, status)+1) + "/" + cal.get(UCAL_DATE, status) +  " (" + UnicodeString(cal.getType()) + ")");
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Fail: (millis to fields)" + D + " => " + cal.get(UCAL_ERA, status) + ":" +
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.get(UCAL_YEAR, status) + "/" +
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (cal.get(UCAL_MONTH, status)+1) + "/" + cal.get(UCAL_DATE, status) +
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ", expected " + era + ":" + year + "/" + (month+1) + "/" +
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dayOfMonth +  " (" + UnicodeString(cal.getType()));
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete grego;
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  CHECK(status, "err during quasiGregorianTest()");
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Verify that Gregorian works like Gregorian
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestGregorian() {
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeA = Calendar::getNow();
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t data[] = {
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1868, 1868, UCAL_SEPTEMBER, 8,
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1868, 1868, UCAL_SEPTEMBER, 9,
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1869, 1869, UCAL_JUNE, 4,
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1912, 1912, UCAL_JULY, 29,
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1912, 1912, UCAL_JULY, 30,
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar::AD, 1912, 1912, UCAL_AUGUST, 1,
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance(/*"de_DE", */ status);
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating de_CH calendar"));
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Sanity check the calendar
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeB = Calendar::getNow();
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeCal = cal->getTime(status);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(timeA <= timeCal) || !(timeCal <= timeB)) {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Error: Calendar time " + timeCal +
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " is not within sampled times [" + timeA + " to " + timeB + "]!");
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // end sanity check
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Note, the following is a good way to test the sanity of the constructed calendars,
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // using Collation as a delay-loop:
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // $ intltest  format/IntlCalendarTest  collate/G7CollationTest format/IntlCalendarTest
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quasiGregorianTest(*cal,Locale("fr_FR"),data);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that BuddhistCalendar shifts years to Buddhist Era but otherwise
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * behaves like GregorianCalendar.
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestBuddhist() {
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // BE 2542 == 1999 CE
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeA = Calendar::getNow();
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t data[] = {
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0,           // B. era   [928479600000]
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        2542,        // B. year
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1999,        // G. year
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_JUNE,   // month
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        4,           // day
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0,           // B. era   [-79204842000000]
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        3,           // B. year
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -540,        // G. year
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_FEBRUARY, // month
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        12,          // day
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0,           // test month calculation:  4795 BE = 4252 AD is a leap year, but 4795 AD is not.
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        4795,        // BE [72018057600000]
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        4252,        // AD
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_FEBRUARY,
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        29,
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance("th_TH@calendar=buddhist", status);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating th_TH@calendar=buddhist calendar"));
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Sanity check the calendar
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeB = Calendar::getNow();
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeCal = cal->getTime(status);
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(timeA <= timeCal) || !(timeCal <= timeB)) {
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Error: Calendar time " + timeCal +
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " is not within sampled times [" + timeA + " to " + timeB + "]!");
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // end sanity check
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quasiGregorianTest(*cal,Locale("th_TH@calendar=gregorian"),data);
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that TaiWanCalendar shifts years to Minguo Era but otherwise
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * behaves like GregorianCalendar.
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestTaiwan() {
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // MG 1 == 1912 AD
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeA = Calendar::getNow();
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TODO port these to the data items
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t data[] = {
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1,           // B. era   [928479600000]
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1,        // B. year
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1912,        // G. year
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_JUNE,   // month
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        4,           // day
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1,           // B. era   [-79204842000000]
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        3,           // B. year
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1914,        // G. year
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_FEBRUARY, // month
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        12,          // day
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1,           // B. era   [-79204842000000]
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        96,           // B. year
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        2007,        // G. year
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_FEBRUARY, // month
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        12,          // day
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    cal = Calendar::createInstance("en_US@calendar=roc", status);
338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating en_US@calendar=roc calendar"));
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Sanity check the calendar
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeB = Calendar::getNow();
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeCal = cal->getTime(status);
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(timeA <= timeCal) || !(timeCal <= timeB)) {
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Error: Calendar time " + timeCal +
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " is not within sampled times [" + timeA + " to " + timeB + "]!");
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // end sanity check
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quasiGregorianTest(*cal,Locale("en_US"),data);
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that JapaneseCalendar shifts years to Japanese Eras but otherwise
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * behaves like GregorianCalendar.
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestJapanese() {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeA = Calendar::getNow();
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Sorry.. japancal.h is private! */
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define JapaneseCalendar_MEIJI  232
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define JapaneseCalendar_TAISHO 233
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define JapaneseCalendar_SHOWA  234
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define JapaneseCalendar_HEISEI 235
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // BE 2542 == 1999 CE
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t data[] = {
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //       Jera         Jyr  Gyear   m             d
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_MEIJI, 1, 1868, UCAL_SEPTEMBER, 8,
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_MEIJI, 1, 1868, UCAL_SEPTEMBER, 9,
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_MEIJI, 2, 1869, UCAL_JUNE, 4,
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_MEIJI, 45, 1912, UCAL_JULY, 29,
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_TAISHO, 1, 1912, UCAL_JULY, 30,
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_TAISHO, 1, 1912, UCAL_AUGUST, 1,
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // new tests (not in java)
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_SHOWA,     64,   1989,  UCAL_JANUARY, 7,  // Test current era transition (different code path than others)
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_HEISEI,    1,   1989,  UCAL_JANUARY, 8,
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_HEISEI,    1,   1989,  UCAL_JANUARY, 9,
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_HEISEI,    1,   1989,  UCAL_DECEMBER, 20,
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        JapaneseCalendar_HEISEI,  15,  2003,  UCAL_MAY, 22,
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance("ja_JP@calendar=japanese", status);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar"));
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Sanity check the calendar
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeB = Calendar::getNow();
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeCal = cal->getTime(status);
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(timeA <= timeCal) || !(timeCal <= timeB)) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Error: Calendar time " + timeCal +
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " is not within sampled times [" + timeA + " to " + timeB + "]!");
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // end sanity check
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    quasiGregorianTest(*cal,Locale("ja_JP"),data);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestBuddhistFormat() {
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test simple parse/format with adopt
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // First, a contrived english test..
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate aDate = 999932400000.0;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=buddhist"), status);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating date format instance");
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating gregorian date format instance");
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!fmt) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Coudln't create en_US instance");
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt2->format(aDate, str);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "Test Date: " + str);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str.remove();
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format(aDate, str);
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "as Buddhist Calendar: " + escape(str));
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected("September 8, 2544 BE");
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(str != expected) {
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Expected " + escape(expected) + " but got " + escape(str));
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate otherDate = fmt->parse(expected, status);
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(otherDate != aDate) {
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString str3;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->format(otherDate, str3);
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " +  otherDate + ", " + escape(str3));
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Parsed OK: " + expected);
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "Error occured testing Buddhist Calendar in English ");
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now, try in Thai
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48"
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e28. 2544");
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0;
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("th_TH_TRADITIONAL"); // legacy
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48"
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e1e.\\u0e28. 2544");
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0;
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("th_TH@calendar=buddhist");
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48"
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e28. 2001");
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("th_TH@calendar=gregorian");
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u0E27\\u0E31\\u0E19\\u0E40\\u0E2A\\u0E32\\u0E23\\u0E4C\\u0E17\\u0E35\\u0E48"
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " 8 \\u0E01\\u0E31\\u0e19\\u0e22\\u0e32\\u0e22\\u0e19 \\u0e04.\\u0e28. 2001");
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0;
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("th_TH_TRADITIONAL@calendar=gregorian");
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TaiwanFormat has been moved to testdata/format.txt
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestJapaneseFormat() {
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance("ja_JP_TRADITIONAL", status);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating ja_JP_TRADITIONAL calendar"));
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal2 = cal->clone();
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = NULL;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test simple parse/format with adopt
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate aDate = 999932400000.0;
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yy G"), Locale("en_US@calendar=japanese"), status);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating date format instance");
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!fmt) {
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Coudln't create en_US instance");
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt2->format(aDate, str);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "Test Date: " + str);
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str.remove();
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format(aDate, str);
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "as Japanese Calendar: " + str);
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected("September 8, 13 Heisei");
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(str != expected) {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Expected " + expected + " but got " + str);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate otherDate = fmt->parse(expected, status);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(otherDate != aDate) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString str3;
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pp;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->parse(expected, *cal2, pp);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->format(otherDate, str3);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " +  " = " +   otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) );
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Parsed OK: " + expected);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test parse with incomplete information
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = new SimpleDateFormat(UnicodeString("G y"), Locale("en_US@calendar=japanese"), status);
53350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    aDate = -3197117222000.0;
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating date format instance");
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!fmt) {
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Coudln't create en_US instance");
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt2->format(aDate, str);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "Test Date: " + str);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str.remove();
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format(aDate, str);
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString() + "as Japanese Calendar: " + str);
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected("Meiji 1");
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(str != expected) {
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Expected " + expected + " but got " + str);
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate otherDate = fmt->parse(expected, status);
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(otherDate != aDate) {
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString str3;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pp;
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->parse(expected, *cal2, pp);
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->format(otherDate, str3);
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Parse incorrect of " + expected + " - wanted " + aDate + " but got " +  " = " +
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                otherDate + ", " + str3 + " = " + CalendarTest::calToStr(*cal2) );
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Parsed OK: " + expected);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal2;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "Error occured");
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now, try in Japanese
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5\\u571f\\u66dc\\u65e5");
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0; // Testing a recent date
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("ja_JP@calendar=japanese");
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u5e73\\u621013\\u5e749\\u67088\\u65e5\\u571f\\u66dc\\u65e5");
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 999932400000.0; // Testing a recent date
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("ja_JP_TRADITIONAL"); // legacy
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u5b89\\u6c385\\u5e747\\u67084\\u65e5\\u6728\\u66dc\\u65e5");
58550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UDate         expectDate = -6106032422000.0; // 1776-07-04T00:00:00Z-075258
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("ja_JP@calendar=japanese");
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   // Jitterbug 1869 - this is an ambiguous era. (Showa 64 = Jan 6 1989, but Showa could be 2 other eras) )
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u662d\\u548c64\\u5e741\\u67086\\u65e5\\u91d1\\u66dc\\u65e5");
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate         expectDate = 600076800000.0;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("ja_JP@calendar=japanese");
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {   // This Feb 29th falls on a leap year by gregorian year, but not by Japanese year.
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expect = CharsToUnicodeString("\\u5EB7\\u6B632\\u5e742\\u670829\\u65e5\\u65e5\\u66dc\\u65e5");
60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UDate         expectDate =  -16214400422000.0;  // 1456-03-09T00:00Z-075258
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Locale        loc("ja_JP@calendar=japanese");
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        simpleTest(loc, expect, expectDate, status);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestJapanese3860()
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance("ja_JP@calendar=japanese", status);
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating ja_JP@calendar=japanese calendar"));
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal2 = cal->clone();
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("HH:mm:ss.S MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test simple parse/format with adopt
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate aDate = 0;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test parse with missing era (should default to current era, heisei)
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test parse with incomplete information
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing parse w/ missing era...");
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y.M.d"), Locale("ja_JP@calendar=japanese"), status);
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "creating date format instance");
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!fmt) {
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Coudln't create en_US instance");
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode s2 = U_ZERO_ERROR;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal2->clear();
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString samplestr("1.1.9");
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString() + "Test Year: " + samplestr);
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            aDate = fmt->parse(samplestr, s2);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pp=0;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->parse(samplestr, *cal2, pp);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(s2, "parsing the 1.1.9 string");
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("*cal2 after 119 parse:");
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str.remove();
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt2->format(aDate, str);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString() + "as Gregorian Calendar: " + str);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal2->setTime(aDate, s2);
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t gotYear = cal2->get(UCAL_YEAR, s2);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t gotEra = cal2->get(UCAL_ERA, s2);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t expectYear = 1;
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t expectEra = JapaneseCalendar::getCurrentEra();
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((gotYear!=1) || (gotEra != expectEra)) {
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(UnicodeString("parse "+samplestr+" of 'y.m.d' as Japanese Calendar, expected year ") + expectYear +
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString(" and era ") + expectEra +", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")");
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete fmt;
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test simple parse/format with adopt
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate aDate = 0;
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test parse with missing era (should default to current era, heisei)
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Test parse with incomplete information
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing parse w/ just year...");
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("y"), Locale("ja_JP@calendar=japanese"), status);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "creating date format instance");
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!fmt) {
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Coudln't create en_US instance");
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode s2 = U_ZERO_ERROR;
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal2->clear();
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString samplestr("1");
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString() + "Test Year: " + samplestr);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            aDate = fmt->parse(samplestr, s2);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ParsePosition pp=0;
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->parse(samplestr, *cal2, pp);
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(s2, "parsing the 1 string");
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("*cal2 after 1 parse:");
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str.remove();
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt2->format(aDate, str);
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString() + "as Gregorian Calendar: " + str);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal2->setTime(aDate, s2);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t gotYear = cal2->get(UCAL_YEAR, s2);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t gotEra = cal2->get(UCAL_ERA, s2);
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t expectYear = 1;
692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            int32_t expectEra = 235; //JapaneseCalendar::kCurrentEra;
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if((gotYear!=1) || (gotEra != expectEra)) {
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(UnicodeString("parse "+samplestr+" of 'y' as Japanese Calendar, expected year ") + expectYear +
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString(" and era ") + expectEra +", but got year " + gotYear + " and era " + gotEra + " (Gregorian:" + str +")");
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(UnicodeString() + " year: " + gotYear + ", era: " + gotEra);
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete fmt;
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal2;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify the Persian Calendar.
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestPersian() {
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeA = Calendar::getNow();
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance("fa_IR@calendar=persian", status);
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, UnicodeString("Creating fa_IR@calendar=persian calendar"));
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Sanity check the calendar
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeB = Calendar::getNow();
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate timeCal = cal->getTime(status);
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(timeA <= timeCal) || !(timeCal <= timeB)) {
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln((UnicodeString)"Error: Calendar time " + timeCal +
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            " is not within sampled times [" + timeA + " to " + timeB + "]!");
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // end sanity check
73054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
73154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    // Test various dates to be sure of validity
73254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    int32_t data[] = {
73354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1925, 4, 24, 1304, 2, 4,
73454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2011, 1, 11, 1389, 10, 21,
73554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1986, 2, 25, 1364, 12, 6,
73654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1934, 3, 14, 1312, 12, 23,
73754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
73854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2090, 3, 19, 1468, 12, 29,
73954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2007, 2, 22, 1385, 12, 3,
74054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1969, 12, 31, 1348, 10, 10,
74154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1945, 11, 12, 1324, 8, 21,
74254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1925, 3, 31, 1304, 1, 11,
74354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
74454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1996, 3, 19, 1374, 12, 29,
74554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1996, 3, 20, 1375, 1, 1,
74654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1997, 3, 20, 1375, 12, 30,
74754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        1997, 3, 21, 1376, 1, 1,
74854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
74954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2008, 3, 19, 1386, 12, 29,
75054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2008, 3, 20, 1387, 1, 1,
75154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2004, 3, 19, 1382, 12, 29,
75254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2004, 3, 20, 1383, 1, 1,
75354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
75454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 3, 20, 1384, 12, 29,
75554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 3, 21, 1385, 1, 1,
75654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
75754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 4, 20, 1384, 1, 31,
75854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 4, 21, 1384, 2, 1,
75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 5, 21, 1384, 2, 31,
76054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 5, 22, 1384, 3, 1,
76154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 6, 21, 1384, 3, 31,
76254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 6, 22, 1384, 4, 1,
76354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 7, 22, 1384, 4, 31,
76454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 7, 23, 1384, 5, 1,
76554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 8, 22, 1384, 5, 31,
76654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 8, 23, 1384, 6, 1,
76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 9, 22, 1384, 6, 31,
76854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 9, 23, 1384, 7, 1,
76954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 10, 22, 1384, 7, 30,
77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 10, 23, 1384, 8, 1,
77154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 11, 21, 1384, 8, 30,
77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 11, 22, 1384, 9, 1,
77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 12, 21, 1384, 9, 30,
77454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2005, 12, 22, 1384, 10, 1,
77554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 1, 20, 1384, 10, 30,
77654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 1, 21, 1384, 11, 1,
77754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 2, 19, 1384, 11, 30,
77854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 2, 20, 1384, 12, 1,
77954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 3, 20, 1384, 12, 29,
78054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2006, 3, 21, 1385, 1, 1,
78154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
78254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        // The 2820-year cycle arithmetical algorithm would fail this one.
78354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        2025, 3, 21, 1404, 1, 1,
78454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
78554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1
78654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    };
78754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
78854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    Calendar *grego = Calendar::createInstance("fa_IR@calendar=gregorian", status);
78954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    for (int32_t i=0; data[i]!=-1; ) {
79054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t gregYear = data[i++];
79154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t gregMonth = data[i++]-1;
79254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t gregDay = data[i++];
79354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t persYear = data[i++];
79454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t persMonth = data[i++]-1;
79554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t persDay = data[i++];
79654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
79754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        // Test conversion from Persian dates
79854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        grego->clear();
79954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        grego->set(gregYear, gregMonth, gregDay);
80054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
80154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        cal->clear();
80254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        cal->set(persYear, persMonth, persDay);
80354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
80454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UDate persTime = cal->getTime(status);
80554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UDate gregTime = grego->getTime(status);
80654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
80754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (persTime != gregTime) {
80854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          errln(UnicodeString("Expected ") + gregTime + " but got " + persTime);
80954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
81054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
81154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        // Test conversion to Persian dates
81254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        cal->clear();
81354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        cal->setTime(gregTime, status);
81454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
81554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t computedYear = cal->get(UCAL_YEAR, status);
81654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t computedMonth = cal->get(UCAL_MONTH, status);
81754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t computedDay = cal->get(UCAL_DATE, status);
81854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
81954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if ((persYear != computedYear) ||
82054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            (persMonth != computedMonth) ||
82154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            (persDay != computedDay)) {
82254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius          errln(UnicodeString("Expected ") + persYear + "/" + (persMonth+1) + "/" + persDay +
82354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                " but got " +  computedYear + "/" + (computedMonth+1) + "/" + computedDay);
82454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
82554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
82654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    }
82754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
82954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    delete grego;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::TestPersianFormat() {
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale(" en_US@calendar=persian"), status);
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating date format instance");
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt2 = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"), Locale("en_US@calendar=gregorian"), status);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "creating gregorian date format instance");
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString gregorianDate("January 18, 2007 AD");
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate aDate = fmt2->parse(gregorianDate, status);
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!fmt) {
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Coudln't create en_US instance");
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format(aDate, str);
845c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        logln(UnicodeString() + "as Persian Calendar: " + escape(str));
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString expected("Dey 28, 1385 AP");
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(str != expected) {
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Expected " + escape(expected) + " but got " + escape(str));
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate otherDate = fmt->parse(expected, status);
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(otherDate != aDate) {
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString str3;
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->format(otherDate, str3);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " +  otherDate + ", " + escape(str3));
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Parsed OK: " + expected);
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
858c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Two digit year parsing problem #4732
859c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        fmt->applyPattern("yy-MM-dd");
860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        str.remove();
861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        fmt->format(aDate, str);
862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        expected.setTo("85-10-28");
863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if(str != expected) {
864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("Expected " + escape(expected) + " but got " + escape(str));
865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        otherDate = fmt->parse(expected, status);
867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (otherDate != aDate) {
868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln("Parse incorrect of " + escape(expected) + " - wanted " + aDate + " but got " + otherDate);
869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            logln("Parsed OK: " + expected);
871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK(status, "Error occured testing Persian Calendar in English ");
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid IntlCalendarTest::simpleTest(const Locale& loc, const UnicodeString& expect, UDate expectDate, UErrorCode& status)
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tmp;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate         d;
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat *fmt0 = DateFormat::createDateTimeInstance(DateFormat::kFull, DateFormat::kFull);
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Try format/parse of " + (UnicodeString)loc.getName());
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat *fmt2 = DateFormat::createDateInstance(DateFormat::kFull, loc);
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fmt2) {
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt2->format(expectDate, tmp);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(escape(tmp) + " ( in locale " + loc.getName() + ")");
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(tmp != expect) {
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Failed to format " ) + loc.getName() + " expected " + escape(expect) + " got " + escape(tmp) );
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d = fmt2->parse(expect,status);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Error occured parsing " + UnicodeString(loc.getName()));
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(d != expectDate) {
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt2->format(d,tmp);
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Failed to parse " ) + escape(expect) + ", " + loc.getName() + " expect " + (double)expectDate + " got " + (double)d  + " " + escape(tmp));
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln( "wanted " + escape(fmt0->format(expectDate,tmp.remove())) + " but got " + escape(fmt0->format(d,tmp.remove())));
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt2;
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"Can't create " + loc.getName() + " date instance");
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt0;
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef CHECK
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
914