1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/************************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
31b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert * Copyright (c) 1997-2015, International Business Machines Corporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ************************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "caltest.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dtfmtsym.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/gregocal.h"
1354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#include "unicode/localpointer.h"
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "hebrwcal.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
1727f654740f2a26ad62a5c155af9199af9e69b889claireho#include "dbgutil.h"
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/udat.h"
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/ustring.h"
20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "cstring.h"
21103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/localpointer.h"
2259d709d503bab6e2b61931737e662dd293b40578ccornelius#include "islamcal.h"
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define mkcstr(U) u_austrcpy(calloc(8, u_strlen(U) + 1), U)
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2659d709d503bab6e2b61931737e662dd293b40578ccornelius#define TEST_CHECK_STATUS { \
2759d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(status)) { \
2859d709d503bab6e2b61931737e662dd293b40578ccornelius        if (status == U_MISSING_RESOURCE_ERROR) { \
2959d709d503bab6e2b61931737e662dd293b40578ccornelius            dataerrln("%s:%d: Test failure.  status=%s", __FILE__, __LINE__, u_errorName(status)); \
3059d709d503bab6e2b61931737e662dd293b40578ccornelius        } else { \
3159d709d503bab6e2b61931737e662dd293b40578ccornelius            errln("%s:%d: Test failure.  status=%s", __FILE__, __LINE__, u_errorName(status)); \
3259d709d503bab6e2b61931737e662dd293b40578ccornelius        } return;}}
33103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
34f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#define TEST_CHECK_STATUS_LOCALE(testlocale) { \
35f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (U_FAILURE(status)) { \
36f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        if (status == U_MISSING_RESOURCE_ERROR) { \
37f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            dataerrln("%s:%d: Test failure, locale %s.  status=%s", __FILE__, __LINE__, testlocale, u_errorName(status)); \
38f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } else { \
39f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            errln("%s:%d: Test failure, locale %s.  status=%s", __FILE__, __LINE__, testlocale, u_errorName(status)); \
40f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        } return;}}
41f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius
42103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define TEST_ASSERT(expr) {if ((expr)==FALSE) {errln("%s:%d: Test failure \n", __FILE__, __LINE__);};}
43103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class CalendarTest
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString CalendarTest::calToStr(const Calendar & cal)
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString out;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int i;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UDate d;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for(i = 0;i<UCAL_FIELD_COUNT;i++) {
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    out += (UnicodeString("") + fieldName((UCalendarDateFields)i) + "=" +  cal.get((UCalendarDateFields)i, status) + UnicodeString(" "));
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  out += "[" + UnicodeString(cal.getType()) + "]";
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(cal.inDaylightTime(status)) {
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    out += UnicodeString(" (in DST), zone=");
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  else {
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    out += UnicodeString(", zone=");
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString str2;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  out += cal.getTimeZone().getDisplayName(str2);
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  d = cal.getTime(status);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  out += UnicodeString(" :","") + d;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return out;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite TestCalendar");
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 0:
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestDOW943";
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestDOW943---"); logln("");
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestDOW943();
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1:
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestClonesUnique908";
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestClonesUnique908---"); logln("");
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestClonesUnique908();
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 2:
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestGregorianChange768";
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestGregorianChange768---"); logln("");
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestGregorianChange768();
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 3:
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestDisambiguation765";
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestDisambiguation765---"); logln("");
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestDisambiguation765();
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 4:
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestGMTvsLocal4064654";
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestGMTvsLocal4064654---"); logln("");
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestGMTvsLocal4064654();
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 5:
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestAddSetOrder621";
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestAddSetOrder621---"); logln("");
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestAddSetOrder621();
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 6:
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestAdd520";
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestAdd520---"); logln("");
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestAdd520();
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 7:
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestFieldSet4781";
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestFieldSet4781---"); logln("");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestFieldSet4781();
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 8:
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestSerialize337";
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestSerialize337---"); logln("");
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //  TestSerialize337();
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 9:
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestSecondsZero121";
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestSecondsZero121---"); logln("");
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestSecondsZero121();
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 10:
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestAddSetGet0610";
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestAddSetGet0610---"); logln("");
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestAddSetGet0610();
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 11:
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestFields060";
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestFields060---"); logln("");
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestFields060();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 12:
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestEpochStartFields";
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestEpochStartFields---"); logln("");
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestEpochStartFields();
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 13:
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestDOWProgression";
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestDOWProgression---"); logln("");
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestDOWProgression();
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 14:
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestGenericAPI";
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestGenericAPI---"); logln("");
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestGenericAPI();
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 15:
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestAddRollExtensive";
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestAddRollExtensive---"); logln("");
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestAddRollExtensive();
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 16:
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestDOW_LOCALandYEAR_WOY";
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestDOW_LOCALandYEAR_WOY---"); logln("");
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestDOW_LOCALandYEAR_WOY();
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 17:
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestWOY";
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestWOY---"); logln("");
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestWOY();
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 18:
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            name = "TestRog";
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestRog---"); logln("");
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestRog();
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 19:
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           name = "TestYWOY";
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exec) {
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TestYWOY---"); logln("");
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                TestYWOY();
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 20:
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          name = "TestJD";
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if(exec) {
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("TestJD---"); logln("");
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TestJD();
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 21:
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          name = "TestDebug";
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          if(exec) {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("TestDebug---"); logln("");
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TestDebug();
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          }
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          break;
232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        case 22:
233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          name = "Test6703";
234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          if(exec) {
235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            logln("Test6703---"); logln("");
236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            Test6703();
237b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          }
238b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          break;
239b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        case 23:
240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          name = "Test3785";
241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          if(exec) {
242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            logln("Test3785---"); logln("");
243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            Test3785();
244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          }
245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru          break;
24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case 24:
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          name = "Test1624";
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          if(exec) {
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            logln("Test1624---"); logln("");
25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            Test1624();
25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          }
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho          break;
253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        case 25:
254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          name = "TestTimeStamp";
255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          if(exec) {
256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln("TestTimeStamp---"); logln("");
257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TestTimeStamp();
258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          }
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          break;
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        case 26:
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          name = "TestISO8601";
262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          if(exec) {
263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln("TestISO8601---"); logln("");
264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            TestISO8601();
265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          }
266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          break;
267103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        case 27:
268103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          name = "TestAmbiguousWallTimeAPIs";
269103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if(exec) {
270103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            logln("TestAmbiguousWallTimeAPIs---"); logln("");
271103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            TestAmbiguousWallTimeAPIs();
272103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          }
273103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          break;
274103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        case 28:
275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          name = "TestRepeatedWallTime";
276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if(exec) {
277103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            logln("TestRepeatedWallTime---"); logln("");
278103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            TestRepeatedWallTime();
279103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          }
280103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          break;
281103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        case 29:
282103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          name = "TestSkippedWallTime";
283103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if(exec) {
284103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            logln("TestSkippedWallTime---"); logln("");
285103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            TestSkippedWallTime();
286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          }
287103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          break;
288103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        case 30:
289103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          name = "TestCloneLocale";
290103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          if(exec) {
291103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            logln("TestCloneLocale---"); logln("");
292103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            TestCloneLocale();
293103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          }
294103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius          break;
29559d709d503bab6e2b61931737e662dd293b40578ccornelius        case 31:
29659d709d503bab6e2b61931737e662dd293b40578ccornelius          name = "TestIslamicUmAlQura";
29759d709d503bab6e2b61931737e662dd293b40578ccornelius          if(exec) {
29859d709d503bab6e2b61931737e662dd293b40578ccornelius            logln("TestIslamicUmAlQura---"); logln("");
29959d709d503bab6e2b61931737e662dd293b40578ccornelius            TestIslamicUmAlQura();
30059d709d503bab6e2b61931737e662dd293b40578ccornelius          }
30159d709d503bab6e2b61931737e662dd293b40578ccornelius          break;
30259d709d503bab6e2b61931737e662dd293b40578ccornelius        case 32:
30359d709d503bab6e2b61931737e662dd293b40578ccornelius          name = "TestIslamicTabularDates";
30459d709d503bab6e2b61931737e662dd293b40578ccornelius          if(exec) {
30559d709d503bab6e2b61931737e662dd293b40578ccornelius            logln("TestIslamicTabularDates---"); logln("");
30659d709d503bab6e2b61931737e662dd293b40578ccornelius            TestIslamicTabularDates();
30759d709d503bab6e2b61931737e662dd293b40578ccornelius          }
30859d709d503bab6e2b61931737e662dd293b40578ccornelius          break;
309fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        case 33:
310fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          name = "TestHebrewMonthValidation";
311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          if(exec) {
312fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            logln("TestHebrewMonthValidation---"); logln("");
313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TestHebrewMonthValidation();
314fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          }
315fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          break;
316fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        case 34:
317fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          name = "TestWeekData";
318fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          if(exec) {
319fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            logln("TestWeekData---"); logln("");
320fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TestWeekData();
321fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          }
322fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          break;
323fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        case 35:
324fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          name = "TestAddAcrossZoneTransition";
325fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          if(exec) {
326fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            logln("TestAddAcrossZoneTransition---"); logln("");
327fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TestAddAcrossZoneTransition();
328fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          }
329fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius          break;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---------------------------------------------------------------------------------
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString CalendarTest::fieldName(UCalendarDateFields f) {
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (f) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define FIELD_NAME_STR(x) case x: return (#x+5)
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_ERA );
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_YEAR );
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_MONTH );
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_WEEK_OF_YEAR );
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_WEEK_OF_MONTH );
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DATE );
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DAY_OF_YEAR );
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DAY_OF_WEEK );
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DAY_OF_WEEK_IN_MONTH );
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_AM_PM );
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_HOUR );
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_HOUR_OF_DAY );
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_MINUTE );
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_SECOND );
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_MILLISECOND );
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_ZONE_OFFSET );
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DST_OFFSET );
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_YEAR_WOY );
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_DOW_LOCAL );
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_EXTENDED_YEAR );
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_JULIAN_DAY );
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FIELD_NAME_STR( UCAL_MILLISECONDS_IN_DAY );
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef FIELD_NAME_STR
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return UnicodeString("") + ((int32_t)f);
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test various API methods for API completeness.
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestGenericAPI()
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool eq = FALSE,b4 = FALSE,af = FALSE;
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate when = date(90, UCAL_APRIL, 15);
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tzid("TestZone");
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t tzoffset = 123400;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone = new SimpleTimeZone(tzoffset, tzid);
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(zone->clone(), status);
385f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #1", TRUE)) return;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (*zone != cal->getTimeZone()) errln("FAIL: Calendar::getTimeZone failed");
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal2 = Calendar::createInstance(cal->getTimeZone(), status);
390f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #2")) return;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setTime(when, status);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->setTime(when, status);
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "Calendar::setTime")) return;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*cal == *cal2)) errln("FAIL: Calendar::operator== failed");
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((*cal != *cal2))  errln("FAIL: Calendar::operator!= failed");
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!cal->equals(*cal2, status) ||
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->before(*cal2, status) ||
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->after(*cal2, status) ||
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status)) errln("FAIL: equals/before/after failed");
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("cal2->setTime(when+1000)");
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal2->setTime(when + 1000, status);
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "Calendar::setTime")) return;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal->equals(*cal2, status) ||
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal2->before(*cal, status) ||
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->after(*cal2, status) ||
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status)) errln("FAIL: equals/before/after failed after setTime(+1000)");
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    logln("cal->roll(UCAL_SECOND)");
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->roll(UCAL_SECOND, (UBool) TRUE, status);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
41750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    cal->roll(UCAL_SECOND, (int32_t)0, status);
41850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "Calendar::roll")) return;
42050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(eq=cal->equals(*cal2, status)) ||
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (b4=cal->before(*cal2, status)) ||
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (af=cal->after(*cal2, status)) ||
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status)) {
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("FAIL: equals[%c]/before[%c]/after[%c] failed after roll 1 second [should be T/F/F]",
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            eq?'T':'F',
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            b4?'T':'F',
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            af?'T':'F');
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Roll back to January
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->roll(UCAL_MONTH, (int32_t)(1 + UCAL_DECEMBER - cal->get(UCAL_MONTH, status)), status);
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "Calendar::roll")) return;
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal->equals(*cal2, status) ||
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal2->before(*cal, status) ||
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->after(*cal2, status) ||
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_FAILURE(status)) errln("FAIL: equals/before/after failed after rollback to January");
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *z = cal->orphanTimeZone();
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z->getID(str) != tzid ||
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z->getRawOffset() != tzoffset)
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: orphanTimeZone failed");
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<2; ++i)
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool lenient = ( i > 0 );
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->setLenient(lenient);
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (lenient != cal->isLenient()) errln("FAIL: setLenient/isLenient failed");
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Later: Check for lenient behavior
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=UCAL_SUNDAY; i<=UCAL_SATURDAY; ++i)
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->setFirstDayOfWeek((UCalendarDaysOfWeek)i);
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->getFirstDayOfWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode aStatus = U_ZERO_ERROR;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->getFirstDayOfWeek(aStatus) != i || U_FAILURE(aStatus)) errln("FAIL: getFirstDayOfWeek(status) failed");
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=1; i<=7; ++i)
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->setMinimalDaysInFirstWeek((uint8_t)i);
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->getMinimalDaysInFirstWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<UCAL_FIELD_COUNT; ++i)
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (cal->getMinimum((UCalendarDateFields)i) > cal->getGreatestMinimum((UCalendarDateFields)i))
4728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            errln(UnicodeString("FAIL: getMinimum larger than getGreatestMinimum for field ") + i);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->getLeastMaximum((UCalendarDateFields)i) > cal->getMaximum((UCalendarDateFields)i))
4748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            errln(UnicodeString("FAIL: getLeastMaximum larger than getMaximum for field ") + i);
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->getMinimum((UCalendarDateFields)i) >= cal->getMaximum((UCalendarDateFields)i))
4768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            errln(UnicodeString("FAIL: getMinimum not less than getMaximum for field ") + i);
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->adoptTimeZone(TimeZone::createDefault());
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1984, 5, 24);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal->getTime(status) != date(84, 5, 24) || U_FAILURE(status))
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Calendar::set(3 args) failed");
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1985, 3, 2, 11, 49);
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal->getTime(status) != date(85, 3, 2, 11, 49) || U_FAILURE(status))
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Calendar::set(5 args) failed");
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1995, 9, 12, 1, 39, 55);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (cal->getTime(status) != date(95, 9, 12, 1, 39, 55) || U_FAILURE(status))
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Calendar::set(6 args) failed");
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->getTime(status);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "Calendar::getTime")) return;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<UCAL_FIELD_COUNT; ++i)
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch(i) {
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case UCAL_YEAR: case UCAL_MONTH: case UCAL_DATE:
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case UCAL_HOUR_OF_DAY: case UCAL_MINUTE: case UCAL_SECOND:
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case UCAL_EXTENDED_YEAR:
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if (!cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet F, should be T " + fieldName((UCalendarDateFields)i));
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            default:
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet = T, should be F  " + fieldName((UCalendarDateFields)i));
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->clear((UCalendarDateFields)i);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::clear/isSet failed " + fieldName((UCalendarDateFields)i));
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if(cal->getActualMinimum(Calendar::SECOND, status) != 0){
51350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Calendar is suppose to return 0 for getActualMinimum");
51450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
51550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
51650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Calendar *cal3 = Calendar::createInstance(status);
51750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    cal3->roll(Calendar::SECOND, (int32_t)0, status);
51850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::roll(EDateFields, int32_t, UErrorCode)")) return;
51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal2;
52250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete cal3;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count;
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale* loc = Calendar::getAvailableLocales(count);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (count < 1 || loc == 0)
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
5286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: getAvailableLocales failed");
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<count; ++i)
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal = Calendar::createInstance(loc[i], status);
535f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            if (U_FAILURE(status)) {
536f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                errcheckln(status, UnicodeString("FAIL: Calendar::createInstance #3, locale ") +  loc[i].getName() + " , error " + u_errorName(status));
537f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius                return;
538f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius            }
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete cal;
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance(TimeZone::createDefault(), Locale::getEnglish(), status);
544f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #4")) return;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance(*zone, Locale::getEnglish(), status);
548f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #5")) return;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *gc = new GregorianCalendar(*zone, status);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(Locale::getEnglish(), status);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(Locale::getEnglish(), status);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(*zone, Locale::getEnglish(), status);
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(zone, status);
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(1998, 10, 14, 21, 43, status);
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (gc->getTime(status) != (d =date(98, 10, 14, 21, 43) )|| U_FAILURE(status))
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("FAIL: new GregorianCalendar(ymdhm) failed with " + UnicodeString(u_errorName(status)) + ",  cal="  + gc->getTime(status)  + UnicodeString(calToStr(*gc)) + ", d=" + d);
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln(UnicodeString("GOOD: cal=")  +gc->getTime(status)  + UnicodeString(calToStr(*gc)) + ", d=" + d);
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(1998, 10, 14, 21, 43, 55, status);
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (gc->getTime(status) != (d=date(98, 10, 14, 21, 43, 55)) || U_FAILURE(status))
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("FAIL: new GregorianCalendar(ymdhms) failed with " + UnicodeString(u_errorName(status)));
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar gc2(Locale::getEnglish(), status);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc2 = *gc;
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (gc2 != *gc || !(gc2 == *gc)) errln("FAIL: GregorianCalendar assignment/operator==/operator!= failed");
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z;
58750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Code coverage for Calendar class. */
58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    cal = Calendar::createInstance(status);
590f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #6")) {
59150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
59250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }else {
59350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ((Calendar *)cal)->roll(UCAL_HOUR, (int32_t)100, status);
59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        ((Calendar *)cal)->clear(UCAL_HOUR);
59550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_SERVICE
59650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        URegistryKey key = cal->registerFactory(NULL, status);
59750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        cal->unregister(key, status);
59850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
59950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete cal;
60150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
60250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    status = U_ZERO_ERROR;
60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    cal = Calendar::createInstance(Locale("he_IL@calendar=hebrew"), status);
604f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if (failure(status, "Calendar::createInstance #7")) {
60550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
60650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
60750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        cal->roll(Calendar::MONTH, (int32_t)100, status);
60850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
60950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
61054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    LocalPointer<StringEnumeration> values(
61154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        Calendar::getKeywordValuesForLocale("calendar", Locale("he"), FALSE, status));
61254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    if (values.isNull() || U_FAILURE(status)) {
61354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        dataerrln("FAIL: Calendar::getKeywordValuesForLocale(he): %s", u_errorName(status));
61454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    } else {
61554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UBool containsHebrew = FALSE;
61654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        const char *charValue;
61754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        int32_t valueLength;
61854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        while ((charValue = values->next(&valueLength, status)) != NULL) {
61954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (valueLength == 6 && strcmp(charValue, "hebrew") == 0) {
62054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                containsHebrew = TRUE;
62154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
62254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
62354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (!containsHebrew) {
62454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            errln("Calendar::getKeywordValuesForLocale(he)->next() does not contain \"hebrew\"");
62554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
62654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
62754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        values->reset(status);
62854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        containsHebrew = FALSE;
62954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        UnicodeString hebrew = UNICODE_STRING_SIMPLE("hebrew");
63054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        const UChar *ucharValue;
63154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        while ((ucharValue = values->unext(&valueLength, status)) != NULL) {
63254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            UnicodeString value(FALSE, ucharValue, valueLength);
63354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (value == hebrew) {
63454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                containsHebrew = TRUE;
63554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
63654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
63754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (!containsHebrew) {
63854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            errln("Calendar::getKeywordValuesForLocale(he)->unext() does not contain \"hebrew\"");
63954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
64054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
64154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        values->reset(status);
64254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        containsHebrew = FALSE;
64354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        const UnicodeString *stringValue;
64454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        while ((stringValue = values->snext(status)) != NULL) {
64554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            if (*stringValue == hebrew) {
64654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius                containsHebrew = TRUE;
64754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            }
64854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
64954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        if (!containsHebrew) {
65054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius            errln("Calendar::getKeywordValuesForLocale(he)->snext() does not contain \"hebrew\"");
65154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius        }
65250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
65350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete cal;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This test confirms the correct behavior of add when incrementing
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * through subsequent days.
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestRog()
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar* gc = new GregorianCalendar(status);
66750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t year = 1997, month = UCAL_APRIL, date = 1;
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(year, month, date);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(UCAL_HOUR_OF_DAY, 23);
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(UCAL_MINUTE, 0);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(UCAL_SECOND, 0);
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(UCAL_MILLISECOND, 0);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 9; i++, gc->add(UCAL_DATE, 1, status)) {
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (gc->get(UCAL_YEAR, status) != year ||
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            gc->get(UCAL_MONTH, status) != month ||
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            gc->get(UCAL_DATE, status) != (date + i)) errln("FAIL: Date wrong");
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the handling of the day of the week, checking for correctness and
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for correct minimum and maximum values.
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestDOW943()
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dowTest(FALSE);
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dowTest(TRUE);
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::dowTest(UBool lenient)
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar* cal = new GregorianCalendar(status);
70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("cal - Aug 12, 1997\n");
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1997, UCAL_AUGUST, 12);
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->getTime(status);
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((lenient?UnicodeString("LENIENT0: "):UnicodeString("nonlenient0: ")) + UnicodeString(calToStr(*cal)));
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setLenient(lenient);
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("cal - Dec 1, 1996\n");
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1996, UCAL_DECEMBER, 1);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((lenient?UnicodeString("LENIENT: "):UnicodeString("nonlenient: ")) + UnicodeString(calToStr(*cal)));
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dow = cal->get(UCAL_DAY_OF_WEEK, status);
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::get failed [%s]", u_errorName(status)); return; }
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t min = cal->getMinimum(UCAL_DAY_OF_WEEK);
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t max = cal->getMaximum(UCAL_DAY_OF_WEEK);
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dow < min ||
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dow > max) errln(UnicodeString("FAIL: Day of week ") + (int32_t)dow + " out of range");
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dow != UCAL_SUNDAY) errln("FAIL: Day of week should be SUNDAY[%d] not %d", UCAL_SUNDAY, dow);
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (min != UCAL_SUNDAY ||
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        max != UCAL_SATURDAY) errln("FAIL: Min/max bad");
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that cloned Calendar objects do not inadvertently share substructures.
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestClonesUnique908()
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *c = Calendar::createInstance(status);
73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *d = (Calendar*) c->clone();
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MILLISECOND, 123);
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d->set(UCAL_MILLISECOND, 456);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->get(UCAL_MILLISECOND, status) != 123 ||
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d->get(UCAL_MILLISECOND, status) != 456) {
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Clones share fields");
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete d;
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that the Gregorian cutoff value works as advertised.
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestGregorianChange768()
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool b;
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar* c = new GregorianCalendar(status);
75850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("With cutoff ") + dateToString(c->getGregorianChange(), str));
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    b = c->isLeapYear(1800);
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString(" isLeapYear(1800) = ") + (b ? "true" : "false"));
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString(" (should be FALSE)"));
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (b) errln("FAIL");
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setGregorianChange(date(0, 0, 1), status);
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("GregorianCalendar::setGregorianChange failed"); return; }
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("With cutoff ") + dateToString(c->getGregorianChange(), str));
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    b = c->isLeapYear(1800);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString(" isLeapYear(1800) = ") + (b ? "true" : "false"));
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString(" (should be TRUE)"));
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!b) errln("FAIL");
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm the functioning of the field disambiguation algorithm.
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestDisambiguation765()
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *c = Calendar::createInstance("en_US", status);
78450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->setLenient(FALSE);
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DATE, 3);
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 third day of June = ", c, 1997, UCAL_JUNE, 3);
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK_IN_MONTH, 1);
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 first Tuesday in June = ", c, 1997, UCAL_JUNE, 3);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK_IN_MONTH, - 1);
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 last Tuesday in June = ", c, 1997, UCAL_JUNE, 24);
803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->clear();
806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK_IN_MONTH, 0);
810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->getTime(status);
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 zero-th Tuesday in June = ", status);
812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_MONTH, 1);
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 1 of June = ", c, 1997, UCAL_JUNE, 3);
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_MONTH, 5);
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 5 of June = ", c, 1997, UCAL_JULY, 1);
825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->clear();
828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_MONTH, UCAL_JUNE);
831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_MONTH, 0);
832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    c->setMinimalDaysInFirstWeek(1);
833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    c->getTime(status);
834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    verify765("1997 Tuesday in week 0 of June = ", status);
835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Note: The following test used to expect YEAR 1997, WOY 1 to
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * resolve to a date in Dec 1996; that is, to behave as if
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * YEAR_WOY were 1997.  With the addition of a new explicit
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * YEAR_WOY field, YEAR_WOY must itself be set if that is what is
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * desired.  Using YEAR in combination with WOY is ambiguous, and
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * results in the first WOY/DOW day of the year satisfying the
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * given fields (there may be up to two such days). In this case,
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * it propertly resolves to Tue Dec 30 1997, which has a WOY value
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * of 1 (for YEAR_WOY 1998) and a DOW of Tuesday, and falls in the
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * _calendar_ year 1997, as specified. - aliu */
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR_WOY, 1997); // aliu
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_YEAR, 1);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 1 of yearWOY = ", c, 1996, UCAL_DECEMBER, 31);
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear(); // - add test for YEAR
852b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    c->setMinimalDaysInFirstWeek(1);
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_YEAR, 1);
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 1 of year = ", c, 1997, UCAL_DECEMBER, 30);
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->clear();
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_YEAR, 1997);
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(UCAL_WEEK_OF_YEAR, 10);
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 10 of year = ", c, 1997, UCAL_MARCH, 4);
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} week 0 is no longer a valid week of year
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*c->clear();
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(Calendar::YEAR, 1997);
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(Calendar::DAY_OF_WEEK, Calendar::TUESDAY);
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //c->set(Calendar::WEEK_OF_YEAR, 0);
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c->set(Calendar::WEEK_OF_YEAR, 1);
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    verify765("1997 Tuesday in week 0 of year = ", c, 1996, Calendar::DECEMBER, 24);*/
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //catch(IllegalArgumentException ex) {
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("FAIL: Exception seen:");
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    ex.printStackTrace(log);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::verify765(const UnicodeString& msg, Calendar* c, int32_t year, int32_t month, int32_t day)
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t y = c->get(UCAL_YEAR, status);
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t m = c->get(UCAL_MONTH, status);
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t d = c->get(UCAL_DATE, status);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( y == year &&
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         m == month &&
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         d == day) {
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("FAIL: Calendar::get failed"); return; }
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("PASS: " + msg + dateToString(c->getTime(status), str));
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + msg + dateToString(c->getTime(status), str) + "; expected " + (int32_t)year + "/" + (int32_t)(month + 1) + "/" + (int32_t)day +
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            "; got " + (int32_t)y + "/" + (int32_t)(m + 1) + "/" + (int32_t)d + " for Locale: " + c->getLocaleID(ULOC_ACTUAL_LOCALE,status));
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::verify765(const UnicodeString& msg/*, IllegalArgumentException e*/, UErrorCode status)
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (status != U_ILLEGAL_ARGUMENT_ERROR) errln("FAIL: No IllegalArgumentException for " + msg);
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else logln("PASS: " + msg + "IllegalArgument as expected");
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that the offset between local time and GMT behaves as expected.
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestGMTvsLocal4064654()
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test4064654(1997, 1, 1, 12, 0, 0);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test4064654(1997, 4, 16, 18, 30, 0);
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::test4064654(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn, int32_t sc)
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate date;
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *gmtcal = Calendar::createInstance(status);
93450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gmtcal->adoptTimeZone(TimeZone::createTimeZone("Africa/Casablanca"));
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gmtcal->set(yr, mo - 1, dt, hr, mn, sc);
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gmtcal->set(UCAL_MILLISECOND, 0);
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    date = gmtcal->getTime(status);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("date = " + dateToString(date, str));
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(status);
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::createInstance failed"); return; }
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setTime(date, status);
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = cal->getTimeZone().getOffset((uint8_t)cal->get(UCAL_ERA, status),
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  cal->get(UCAL_YEAR, status),
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  cal->get(UCAL_MONTH, status),
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  cal->get(UCAL_DATE, status),
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  (uint8_t)cal->get(UCAL_DAY_OF_WEEK, status),
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                  cal->get(UCAL_MILLISECOND, status), status);
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("offset for " + dateToString(date, str) + "= " + (offset / 1000 / 60 / 60.0) + "hr");
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t utc = ((cal->get(UCAL_HOUR_OF_DAY, status) * 60 +
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    cal->get(UCAL_MINUTE, status)) * 60 +
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   cal->get(UCAL_SECOND, status)) * 1000 +
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->get(UCAL_MILLISECOND, status) - offset;
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expected = ((hr * 60 + mn) * 60 + sc) * 1000;
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (utc != expected) errln(UnicodeString("FAIL: Discrepancy of ") + (utc - expected) +
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                               " millis = " + ((utc - expected) / 1000 / 60 / 60.0) + " hr");
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gmtcal;
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The operations of adding and setting should not exhibit pathological
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * dependence on the order of operations.  This test checks for this.
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestAddSetOrder621()
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = date(97, 4, 14, 13, 23, 45);
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(status);
97750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
97850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setTime(d, status);
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::setTime failed");
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->add(UCAL_DATE, - 5, status);
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::add failed");
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_HOUR_OF_DAY, 0);
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_MINUTE, 0);
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_SECOND, 0);
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateToString(cal->getTime(status), s);
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::getTime failed");
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal = Calendar::createInstance(status);
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::createInstance failed");
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setTime(d, status);
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::setTime failed");
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_HOUR_OF_DAY, 0);
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_MINUTE, 0);
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_SECOND, 0);
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->add(UCAL_DATE, - 5, status);
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::add failed");
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s2;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateToString(cal->getTime(status), s2);
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Calendar::getTime failed");
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete cal;
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s == s2)
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Pass: " + s + " == " + s2);
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + s + " != " + s2);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that adding to various fields works.
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestAdd520()
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t y = 1997, m = UCAL_FEBRUARY, d = 1;
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *temp = new GregorianCalendar(y, m, d, status);
104950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->add(UCAL_YEAR, 1, status);
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    y++;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->add(UCAL_MONTH, 1, status);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    m++;
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->add(UCAL_DATE, 1, status);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d++;
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->add(UCAL_DATE, 2, status);
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d += 2;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->add(UCAL_DATE, 28, status);
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = 1;++m;
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    check520(temp, y, m, d);
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete temp;
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Execute adding and rolling in GregorianCalendar extensively,
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestAddRollExtensive()
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t maxlimit = 40;
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t y = 1997, m = UCAL_FEBRUARY, d = 1, hr = 1, min = 1, sec = 0, ms = 0;
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *temp = new GregorianCalendar(y, m, d, status);
108650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->set(UCAL_HOUR, hr);
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->set(UCAL_MINUTE, min);
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->set(UCAL_SECOND, sec);
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp->set(UCAL_MILLISECOND, ms);
1092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    temp->setMinimalDaysInFirstWeek(1);
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCalendarDateFields e;
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing GregorianCalendar add...");
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = UCAL_YEAR;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (e < UCAL_FIELD_COUNT) {
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t i;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t limit = maxlimit;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < limit; i++) {
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp->add(e, 1, status);
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { limit = i; status = U_ZERO_ERROR; }
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < limit; i++) {
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp->add(e, -1, status);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("GregorianCalendar::add -1 failed"); return; }
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        check520(temp, y, m, d, hr, min, sec, ms, e);
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e = (UCalendarDateFields) ((int32_t) e + 1);
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing GregorianCalendar roll...");
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    e = UCAL_YEAR;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (e < UCAL_FIELD_COUNT) {
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t i;
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t limit = maxlimit;
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < limit; i++) {
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(calToStr(*temp) + UnicodeString("  " ) + fieldName(e) + UnicodeString("++") );
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp->roll(e, 1, status);
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              logln("caltest.cpp:%d e=%d, i=%d - roll(+) err %s\n",  __LINE__, (int) e, (int) i, u_errorName(status));
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              logln(calToStr(*temp));
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              limit = i; status = U_ZERO_ERROR;
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < limit; i++) {
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("caltest.cpp:%d e=%d, i=%d\n",  __LINE__, (int) e, (int) i);
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(calToStr(*temp) + UnicodeString("  " ) + fieldName(e) + UnicodeString("--") );
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp->roll(e, -1, status);
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln(UnicodeString("GregorianCalendar::roll ") + CalendarTest::fieldName(e) + " count=" + UnicodeString('@'+i) + " by -1 failed with " + u_errorName(status) ); return; }
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        check520(temp, y, m, d, hr, min, sec, ms, e);
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e = (UCalendarDateFields) ((int32_t) e + 1);
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete temp;
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::check520(Calendar* c,
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t y, int32_t m, int32_t d,
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t hr, int32_t min, int32_t sec,
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t ms, UCalendarDateFields field)
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->get(UCAL_YEAR, status) != y ||
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_MONTH, status) != m ||
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_DATE, status) != d ||
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_HOUR, status) != hr ||
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_MINUTE, status) != min ||
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_SECOND, status) != sec ||
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_MILLISECOND, status) != ms) {
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("U_FAILURE for field ") + (int32_t)field +
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ": Expected y/m/d h:m:s:ms of " +
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                y + "/" + (m + 1) + "/" + d + " " +
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              hr + ":" + min + ":" + sec + ":" + ms +
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; got " + c->get(UCAL_YEAR, status) +
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "/" + (c->get(UCAL_MONTH, status) + 1) +
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "/" + c->get(UCAL_DATE, status) +
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " " + c->get(UCAL_HOUR, status) + ":" +
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              c->get(UCAL_MINUTE, status) + ":" +
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              c->get(UCAL_SECOND, status) + ":" +
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              c->get(UCAL_MILLISECOND, status)
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              );
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Confirmed: ") + y + "/" +
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                (m + 1) + "/" + d + " " +
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                hr + ":" + min + ":" + sec + ":" + ms);
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::check520(Calendar* c,
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t y, int32_t m, int32_t d)
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (c->get(UCAL_YEAR, status) != y ||
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_MONTH, status) != m ||
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->get(UCAL_DATE, status) != d) {
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAILURE: Expected y/m/d of ") +
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              y + "/" + (m + 1) + "/" + d + " " +
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "; got " + c->get(UCAL_YEAR, status) +
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "/" + (c->get(UCAL_MONTH, status) + 1) +
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "/" + c->get(UCAL_DATE, status)
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              );
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Confirmed: ") + y + "/" +
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                (m + 1) + "/" + d);
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test that setting of fields works.  In particular, make sure that all instances
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of GregorianCalendar don't share a static instance of the fields array.
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestFieldSet4781()
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // try {
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar *g = new GregorianCalendar(status);
121750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (failure(status, "new GregorianCalendar", TRUE)) return;
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar *g2 = new GregorianCalendar(status);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        g2->set(UCAL_HOUR, 12, status);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        g2->set(UCAL_MINUTE, 0, status);
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        g2->set(UCAL_SECOND, 0, status);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::set failed"); return; }
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*g == *g2) logln("Same");
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else logln("Different");
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //catch(IllegalArgumentException e) {
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("Unexpected exception seen: " + e);
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete g;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete g2;
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* We don't support serialization on C++
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestSerialize337()
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar cal = Calendar::getInstance();
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool ok = FALSE;
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    try {
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FileOutputStream f = new FileOutputStream(FILENAME);
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ObjectOutput s = new ObjectOutputStream(f);
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.writeObject(PREFIX);
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.writeObject(cal);
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s.writeObject(POSTFIX);
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f.close();
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FileInputStream in = new FileInputStream(FILENAME);
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ObjectInputStream t = new ObjectInputStream(in);
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString& pre = (UnicodeString&) t.readObject();
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Calendar c = (Calendar) t.readObject();
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString& post = (UnicodeString&) t.readObject();
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        in.close();
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ok = pre.equals(PREFIX) &&
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            post.equals(POSTFIX) &&
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal->equals(c);
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        File fl = new File(FILENAME);
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fl.delete();
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch(IOException e) {
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Exception received:");
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.printStackTrace(log);
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch(ClassNotFoundException e) {
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Exception received:");
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.printStackTrace(log);
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!ok) errln("Serialization of Calendar object failed.");
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& CalendarTest::PREFIX = "abc";
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& CalendarTest::POSTFIX = "def";
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& CalendarTest::FILENAME = "tmp337.bin";
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that the seconds of a Calendar can be zeroed out through the
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * expected sequence of operations.
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestSecondsZero121()
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = new GregorianCalendar(status);
129050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->setTime(Calendar::getNow(), status);
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(UCAL_SECOND, 0);
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::set failed"); return; }
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = cal->getTime(status);
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dateToString(d, s);
12996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (s.indexOf("DATE_FORMAT_FAILURE") >= 0) {
13006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Got: \"DATE_FORMAT_FAILURE\".");
13016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    } else if (s.indexOf(":00 ") < 0) {
13026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errln("Expected to see :00 in " + s);
13036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that a specific sequence of adding and setting works as expected;
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * it should not vary depending on when and whether the get method is
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * called.
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestAddSetGet0610()
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString EXPECTED_0610("1993/0/5", "");
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Calendar *calendar = new GregorianCalendar(status);
132150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (failure(status, "new GregorianCalendar", TRUE)) return;
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calendar->set(1993, UCAL_JANUARY, 4);
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("1A) " + value(calendar));
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calendar->add(UCAL_DATE, 1, status);
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString v = value(calendar);
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("1B) " + v);
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("--) 1993/0/5");
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete calendar;
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Calendar *calendar = new GregorianCalendar(1993, UCAL_JANUARY, 4, status);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("2A) " + value(calendar));
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calendar->add(UCAL_DATE, 1, status);
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString v = value(calendar);
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("2B) " + v);
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("--) 1993/0/5");
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete calendar;
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Calendar *calendar = new GregorianCalendar(1993, UCAL_JANUARY, 4, status);
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("3A) " + value(calendar));
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calendar->getTime(status);
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calendar->add(UCAL_DATE, 1, status);
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString v = value(calendar);
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("3B) " + v);
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("--) 1993/0/5");
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete calendar;
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::value(Calendar* calendar)
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return UnicodeString("") + (int32_t)calendar->get(UCAL_YEAR, status) +
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "/" + (int32_t)calendar->get(UCAL_MONTH, status) +
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "/" + (int32_t)calendar->get(UCAL_DATE, status) +
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (U_FAILURE(status) ? " FAIL: Calendar::get failed" : "");
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that various fields on a known date are set correctly.
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestFields060()
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t year = 1997;
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t month = UCAL_OCTOBER;
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dDate = 22;
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *calendar = 0;
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    calendar = new GregorianCalendar(year, month, dDate, status);
138750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < EXPECTED_FIELDS_length;) {
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCalendarDateFields field = (UCalendarDateFields)EXPECTED_FIELDS[i++];
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t expected = EXPECTED_FIELDS[i++];
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (calendar->get(field, status) != expected) {
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Expected field ") + (int32_t)field + " to have value " + (int32_t)expected +
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  "; received " + (int32_t)calendar->get(field, status) + " instead");
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete calendar;
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t CalendarTest::EXPECTED_FIELDS[] = {
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_YEAR, 1997,
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_MONTH, UCAL_OCTOBER,
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_DATE, 22,
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_DAY_OF_WEEK, UCAL_WEDNESDAY,
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_DAY_OF_WEEK_IN_MONTH, 4,
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCAL_DAY_OF_YEAR, 295
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t CalendarTest::EXPECTED_FIELDS_length = (int32_t)(sizeof(CalendarTest::EXPECTED_FIELDS) /
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sizeof(CalendarTest::EXPECTED_FIELDS[0]));
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Verify that various fields on a known date are set correctly.  In this
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * case, the start of the epoch (January 1 1970).
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestEpochStartFields()
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *z = TimeZone::createDefault();
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *c = Calendar::createInstance(status);
142450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = - z->getRawOffset();
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *gc = new GregorianCalendar(status);
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->setTimeZone(*z);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->setTime(d, status);
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool idt = gc->inDaylightTime(status);
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("GregorianCalendar::inDaylightTime failed"); return; }
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (idt) {
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Warning: Skipping test because " + dateToString(d, str) + " is in DST.");
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c->setTime(d, status);
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < UCAL_ZONE_OFFSET;++i) {
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (c->get((UCalendarDateFields)i, status) != EPOCH_FIELDS[i])
1442b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                dataerrln(UnicodeString("Expected field ") + i + " to have value " + EPOCH_FIELDS[i] +
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      "; saw " + c->get((UCalendarDateFields)i, status) + " instead");
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c->get(UCAL_ZONE_OFFSET, status) != z->getRawOffset())
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Expected field ZONE_OFFSET to have value ") + z->getRawOffset() +
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  "; saw " + c->get(UCAL_ZONE_OFFSET, status) + " instead");
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (c->get(UCAL_DST_OFFSET, status) != 0)
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Expected field DST_OFFSET to have value 0") +
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  "; saw " + c->get(UCAL_DST_OFFSET, status) + " instead");
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete c;
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z;
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t CalendarTest::EPOCH_FIELDS[] = {
1465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    1, 1970, 0, 1, 1, 1, 1, 5, 1, 0, 0, 0, 0, 0, 0, - 28800000, 0
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test that the days of the week progress properly when add is called repeatedly
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for increments of 24 days.
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestDOWProgression()
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = new GregorianCalendar(1972, UCAL_OCTOBER, 26, status);
147950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    marchByDelta(cal, 24);
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::TestDOW_LOCALandYEAR_WOY()
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Note: I've commented out the loop_addroll tests for YEAR and
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * YEAR_WOY below because these two fields should NOT behave
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * identically when adding.  YEAR should keep the month/dom
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * invariant.  YEAR_WOY should keep the woy/dow invariant.  I've
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * added a new test that checks for this in place of the old call
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * to loop_addroll. - aliu */
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t times = 20;
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal=Calendar::createInstance(Locale::getGermany(), status);
149850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *sdf=new SimpleDateFormat(UnicodeString("YYYY'-W'ww-ee"), Locale::getGermany(), status);
1500103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) { dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status)); return; }
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // ICU no longer use localized date-time pattern characters by default.
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // So we set pattern chars using 'J' instead of 'Y'.
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormatSymbols *dfs = new DateFormatSymbols(Locale::getGermany(), status);
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dfs->setLocalPatternChars(UnicodeString("GyMdkHmsSEDFwWahKzJeugAZvcLQq"));
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sdf->adoptDateFormatSymbols(dfs);
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sdf->applyLocalizedPattern(UnicodeString("JJJJ'-W'ww-ee"), status);
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Couldn't apply localized pattern"); return; }
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    cal->clear();
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1997, UCAL_DECEMBER, 25);
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doYEAR_WOYLoop(cal, sdf, times, status);
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //loop_addroll(cal, /*sdf,*/ times, UCAL_YEAR_WOY, UCAL_YEAR,  status);
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    yearAddTest(*cal, status); // aliu
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1997"); return; }
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1998, UCAL_DECEMBER, 25);
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doYEAR_WOYLoop(cal, sdf, times, status);
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //loop_addroll(cal, /*sdf,*/ times, UCAL_YEAR_WOY, UCAL_YEAR,  status);
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    yearAddTest(*cal, status); // aliu
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1998"); return; }
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->clear();
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->set(1582, UCAL_OCTOBER, 1);
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    doYEAR_WOYLoop(cal, sdf, times, status);
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //loop_addroll(cal, /*sdf,*/ times, Calendar::YEAR_WOY, Calendar::YEAR,  status);
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    yearAddTest(*cal, status); // aliu
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1582"); return; }
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sdf;
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return;
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Confirm that adding a YEAR and adding a YEAR_WOY work properly for
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the given Calendar at its current setting.
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::yearAddTest(Calendar& cal, UErrorCode& status) {
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * When adding the YEAR, the month and day should remain constant.
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * When adding the YEAR_WOY, the WOY and DOW should remain constant. - aliu
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Examples:
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Wed Jan 14 1998 / 1998-W03-03 Add(YEAR_WOY, 1) -> Wed Jan 20 1999 / 1999-W03-03
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *                                Add(YEAR, 1)     -> Thu Jan 14 1999 / 1999-W02-04
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Thu Jan 14 1999 / 1999-W02-04 Add(YEAR_WOY, 1) -> Thu Jan 13 2000 / 2000-W02-04
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *                                Add(YEAR, 1)     -> Fri Jan 14 2000 / 2000-W02-05
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Sun Oct 31 1582 / 1582-W42-07 Add(YEAR_WOY, 1) -> Sun Oct 23 1583 / 1583-W42-07
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *                                Add(YEAR, 1)     -> Mon Oct 31 1583 / 1583-W44-01
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t y   = cal.get(UCAL_YEAR, status);
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t mon = cal.get(UCAL_MONTH, status);
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t day = cal.get(UCAL_DATE, status);
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ywy = cal.get(UCAL_YEAR_WOY, status);
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status);
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dow = cal.get(UCAL_DOW_LOCAL, status);
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate t = cal.getTime(status);
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)){
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed to create Calendar for locale. Error: ") + UnicodeString(u_errorName(status)));
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str, str2;
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), status);
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setCalendar(cal);
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(t, str.remove());
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str += ".add(YEAR, 1)    =>";
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.add(UCAL_YEAR, 1, status);
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t y2   = cal.get(UCAL_YEAR, status);
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t mon2 = cal.get(UCAL_MONTH, status);
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t day2 = cal.get(UCAL_DATE, status);
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(cal.getTime(status), str);
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (y2 != (y+1) || mon2 != mon || day2 != day) {
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str += (UnicodeString)", expected year " +
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (y+1) + ", month " + (mon+1) + ", day " + day;
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + str);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) );
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(str);
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(t, str.remove());
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str += ".add(YEAR_WOY, 1)=>";
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.setTime(t, status);
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln( UnicodeString(" <- ") + CalendarTest::calToStr(cal) );
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.add(UCAL_YEAR_WOY, 1, status);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t ywy2 = cal.get(UCAL_YEAR_WOY, status);
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t woy2 = cal.get(UCAL_WEEK_OF_YEAR, status);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dow2 = cal.get(UCAL_DOW_LOCAL, status);
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(cal.getTime(status), str);
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ywy2 != (ywy+1) || woy2 != woy || dow2 != dow) {
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        str += (UnicodeString)", expected yearWOY " +
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (ywy+1) + ", woy " + woy + ", dowLocal " + dow;
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: " + str);
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) );
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(str);
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::loop_addroll(Calendar *cal, /*SimpleDateFormat *sdf,*/ int times, UCalendarDateFields field, UCalendarDateFields field2, UErrorCode& errorCode) {
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *calclone;
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), errorCode);
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setCalendar(*cal);
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int i;
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<times; i++) {
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calclone = cal->clone();
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate start = cal->getTime(errorCode);
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->add(field,1,errorCode);
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Error in add"); delete calclone; return; }
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calclone->add(field2,1,errorCode);
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Error in add"); delete calclone; return; }
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(cal->getTime(errorCode) != calclone->getTime(errorCode)) {
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString str("FAIL: Results of add differ. "), str2;
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str += fmt.format(start, str2) + " ";
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str += UnicodeString("Add(") + fieldName(field) + ", 1) -> " +
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(cal->getTime(errorCode), str2.remove()) + "; ";
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str += UnicodeString("Add(") + fieldName(field2) + ", 1) -> " +
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(calclone->getTime(errorCode), str2.remove());
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete calclone;
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete calclone;
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i<times; i++) {
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calclone = cal->clone();
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->roll(field,(int32_t)1,errorCode);
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Error in roll"); delete calclone; return; }
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        calclone->roll(field2,(int32_t)1,errorCode);
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Error in roll"); delete calclone; return; }
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(cal->getTime(errorCode) != calclone->getTime(errorCode)) {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete calclone;
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Results of roll differ!");
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete calclone;
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::doYEAR_WOYLoop(Calendar *cal, SimpleDateFormat *sdf,
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    int32_t times, UErrorCode& errorCode) {
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString us;
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate tst, original;
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *tstres = new GregorianCalendar(Locale::getGermany(), errorCode);
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int i=0; i<times; ++i) {
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sdf->format(Formattable(cal->getTime(errorCode),Formattable::kIsDate), us, errorCode);
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //logln("expected: "+us);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Format error"); return; }
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tst=sdf->parse(us,errorCode);
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Parse error"); return; }
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->clear();
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->setTime(tst, errorCode);
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //logln((UnicodeString)"Parsed week of year is "+tstres->get(UCAL_WEEK_OF_YEAR, errorCode));
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Set time error"); return; }
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        original = cal->getTime(errorCode);
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        us.remove();
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sdf->format(Formattable(tst,Formattable::kIsDate), us, errorCode);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //logln("got: "+us);
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Get time error"); return; }
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(original!=tst) {
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            us.remove();
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sdf->format(Formattable(original, Formattable::kIsDate), us, errorCode);
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Parsed time doesn't match with regular");
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("expected "+us + " " + calToStr(*cal));
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            us.remove();
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            sdf->format(Formattable(tst, Formattable::kIsDate), us, errorCode);
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("got "+us + " " + calToStr(*tstres));
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->clear();
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->set(UCAL_YEAR_WOY, cal->get(UCAL_YEAR_WOY, errorCode));
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->set(UCAL_WEEK_OF_YEAR, cal->get(UCAL_WEEK_OF_YEAR, errorCode));
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tstres->set(UCAL_DOW_LOCAL, cal->get(UCAL_DOW_LOCAL, errorCode));
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(cal->get(UCAL_YEAR, errorCode) != tstres->get(UCAL_YEAR, errorCode)) {
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Different Year!");
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"Expected "+cal->get(UCAL_YEAR, errorCode));
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"Got "+tstres->get(UCAL_YEAR, errorCode));
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(cal->get(UCAL_DAY_OF_YEAR, errorCode) != tstres->get(UCAL_DAY_OF_YEAR, errorCode)) {
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Different Day Of Year!");
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"Expected "+cal->get(UCAL_DAY_OF_YEAR, errorCode));
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"Got "+tstres->get(UCAL_DAY_OF_YEAR, errorCode));
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //logln(calToStr(*cal));
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->add(UCAL_DATE, 1, errorCode);
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(errorCode)) { errln("Add error"); return; }
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        us.remove();
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete (tstres);
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCalendarTest::marchByDelta(Calendar* cal, int32_t delta)
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cur = (Calendar*) cal->clone();
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t initialDOW = cur->get(UCAL_DAY_OF_WEEK, status);
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DOW, newDOW = initialDOW;
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DOW = newDOW;
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("DOW = ") + DOW + "  " + dateToString(cur->getTime(status), str));
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cur->add(UCAL_DAY_OF_WEEK, delta, status);
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newDOW = cur->get(UCAL_DAY_OF_WEEK, status);
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t expectedDOW = 1 + (DOW + delta - 1) % 7;
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (newDOW != expectedDOW) {
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Day of week should be ") + expectedDOW + " instead of " + newDOW +
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  " on " + dateToString(cur->getTime(status), str));
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (newDOW != initialDOW);
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cur;
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHECK(status, msg) \
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { \
17396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, msg); \
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return; \
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::TestWOY(void) {
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FDW = Mon, MDFW = 4:
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Dec 26 1999, WOY 51
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Dec 27 1999, WOY 52
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Tue Dec 28 1999, WOY 52
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Wed Dec 29 1999, WOY 52
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Thu Dec 30 1999, WOY 52
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Fri Dec 31 1999, WOY 52
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sat Jan 01 2000, WOY 52 ***
1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Jan 02 2000, WOY 52 ***
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Jan 03 2000, WOY 1
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Tue Jan 04 2000, WOY 1
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Wed Jan 05 2000, WOY 1
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Thu Jan 06 2000, WOY 1
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Fri Jan 07 2000, WOY 1
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sat Jan 08 2000, WOY 1
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Jan 09 2000, WOY 1
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Jan 10 2000, WOY 2
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FDW = Mon, MDFW = 2:
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Dec 26 1999, WOY 52
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Dec 27 1999, WOY 1  ***
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Tue Dec 28 1999, WOY 1  ***
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Wed Dec 29 1999, WOY 1  ***
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Thu Dec 30 1999, WOY 1  ***
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Fri Dec 31 1999, WOY 1  ***
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sat Jan 01 2000, WOY 1
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Jan 02 2000, WOY 1
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Jan 03 2000, WOY 2
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Tue Jan 04 2000, WOY 2
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Wed Jan 05 2000, WOY 2
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Thu Jan 06 2000, WOY 2
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Fri Jan 07 2000, WOY 2
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sat Jan 08 2000, WOY 2
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Jan 09 2000, WOY 2
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Jan 10 2000, WOY 3
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar cal(status);
1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy', WOY' w"), status);
178850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Cannot construct calendar/format", TRUE)) return;
1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCalendarDaysOfWeek fdw = (UCalendarDaysOfWeek) 0;
1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //for (int8_t pass=2; pass<=2; ++pass) {
1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int8_t pass=1; pass<=2; ++pass) {
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch (pass) {
1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 1:
1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fdw = UCAL_MONDAY;
1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.setFirstDayOfWeek(fdw);
1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.setMinimalDaysInFirstWeek(4);
1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.adoptCalendar(cal.clone());
1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case 2:
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fdw = UCAL_MONDAY;
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.setFirstDayOfWeek(fdw);
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.setMinimalDaysInFirstWeek(2);
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.adoptCalendar(cal.clone());
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //for (i=2; i<=6; ++i) {
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<16; ++i) {
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate t, t2;
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t t_y, t_woy, t_dow;
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.clear();
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(1999, UCAL_DECEMBER, 26 + i);
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt.format(t = cal.getTime(status), str.remove());
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: getTime failed");
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("* ") + str);
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dow = cal.get(UCAL_DAY_OF_WEEK, status);
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status);
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t year = cal.get(UCAL_YEAR, status);
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t mon = cal.get(UCAL_MONTH, status);
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(calToStr(cal));
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: get failed");
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dowLocal = dow - fdw;
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dowLocal < 0) dowLocal += 7;
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dowLocal++;
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t yearWoy = year;
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (mon == UCAL_JANUARY) {
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (woy >= 52) --yearWoy;
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (woy == 1) ++yearWoy;
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Basic fields->time check y/woy/dow
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Since Y/WOY is ambiguous, we do a check of the fields,
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // not of the specific time.
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.clear();
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR, year);
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_WEEK_OF_YEAR, woy);
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DAY_OF_WEEK, dow);
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_y = cal.get(UCAL_YEAR, status);
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_woy = cal.get(UCAL_WEEK_OF_YEAR, status);
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_dow = cal.get(UCAL_DAY_OF_WEEK, status);
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: get failed");
1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t_y != year || t_woy != woy || t_dow != dow) {
1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: y/woy/dow fields->time => ";
1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(cal.getTime(status), str);
1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(calToStr(cal));
1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("[get!=set] Y%d!=%d || woy%d!=%d || dow%d!=%d\n",
1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  t_y, year, t_woy, woy, t_dow, dow);
1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          logln("y/woy/dow fields->time OK");
1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Basic fields->time check y/woy/dow_local
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Since Y/WOY is ambiguous, we do a check of the fields,
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // not of the specific time.
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.clear();
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR, year);
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_WEEK_OF_YEAR, woy);
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DOW_LOCAL, dowLocal);
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_y = cal.get(UCAL_YEAR, status);
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_woy = cal.get(UCAL_WEEK_OF_YEAR, status);
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t_dow = cal.get(UCAL_DOW_LOCAL, status);
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: get failed");
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t_y != year || t_woy != woy || t_dow != dowLocal) {
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: y/woy/dow_local fields->time => ";
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(cal.getTime(status), str);
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Basic fields->time check y_woy/woy/dow
1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.clear();
1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR_WOY, yearWoy);
1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_WEEK_OF_YEAR, woy);
1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DAY_OF_WEEK, dow);
1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: getTime failed");
1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: y_woy/woy/dow fields->time => ";
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(calToStr(cal));
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("%.f != %.f\n", t, t2);
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          logln("y_woy/woy/dow OK");
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Basic fields->time check y_woy/woy/dow_local
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.clear();
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR_WOY, yearWoy);
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_WEEK_OF_YEAR, woy);
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DOW_LOCAL, dowLocal);
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: getTime failed");
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: y_woy/woy/dow_local fields->time => ";
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Testing DOW_LOCAL.. dow%d\n", dow);
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Make sure DOW_LOCAL disambiguates over DOW
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t wrongDow = dow - 3;
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (wrongDow < 1) wrongDow += 7;
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.setTime(t, status);
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DAY_OF_WEEK, wrongDow);
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DOW_LOCAL, dowLocal);
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: set/getTime failed");
1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: DOW_LOCAL fields->time => ";
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(calToStr(cal));
1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("%.f :   DOW%d, DOW_LOCAL%d -> %.f\n",
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  t, wrongDow, dowLocal, t2);
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Make sure DOW disambiguates over DOW_LOCAL
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t wrongDowLocal = dowLocal - 3;
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (wrongDowLocal < 1) wrongDowLocal += 7;
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.setTime(t, status);
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DOW_LOCAL, wrongDowLocal);
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_DAY_OF_WEEK, dow);
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: set/getTime failed");
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: DOW       fields->time => ";
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Make sure YEAR_WOY disambiguates over YEAR
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.setTime(t, status);
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR, year - 2);
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR_WOY, yearWoy);
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: set/getTime failed");
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: YEAR_WOY  fields->time => ";
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Make sure YEAR disambiguates over YEAR_WOY
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.setTime(t, status);
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR_WOY, yearWoy - 2);
1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal.set(UCAL_YEAR, year);
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        t2 = cal.getTime(status);
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CHECK(status, "Fail: set/getTime failed");
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (t != t2) {
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "Fail: YEAR      fields->time => ";
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t2, str);
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(str);
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      FDW = Mon, MDFW = 4:
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Dec 26 1999, WOY 51
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Mon Dec 27 1999, WOY 52
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Tue Dec 28 1999, WOY 52
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Wed Dec 29 1999, WOY 52
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Thu Dec 30 1999, WOY 52
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Fri Dec 31 1999, WOY 52
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sat Jan 01 2000, WOY 52
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         Sun Jan 02 2000, WOY 52
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Roll the DOW_LOCAL within week 52
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=27; i<=33; ++i) {
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t amount;
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (amount=-7; amount<=7; ++amount) {
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str = "roll(";
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.set(1999, UCAL_DECEMBER, i);
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UDate t, t2;
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(cal.getTime(status), str);
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(status, "Fail: getTime failed");
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            str += UnicodeString(", ") + amount + ") = ";
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.roll(UCAL_DOW_LOCAL, amount, status);
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(status, "Fail: roll failed");
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            t = cal.getTime(status);
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t newDom = i + amount;
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            while (newDom < 27) newDom += 7;
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            while (newDom > 33) newDom -= 7;
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            cal.set(1999, UCAL_DECEMBER, newDom);
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            t2 = cal.getTime(status);
1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            CHECK(status, "Fail: getTime failed");
1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(t, str);
1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (t != t2) {
1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                str.append(", exp ");
1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                fmt.format(t2, str);
1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(str);
2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(str);
2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::TestYWOY()
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UnicodeString str;
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UErrorCode status = U_ZERO_ERROR;
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   GregorianCalendar cal(status);
201350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   if (failure(status, "construct GregorianCalendar", TRUE)) return;
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.setFirstDayOfWeek(UCAL_SUNDAY);
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.setMinimalDaysInFirstWeek(1);
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln("Setting:  ywoy=2004, woy=1, dow=MONDAY");
2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.clear();
2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_YEAR_WOY,2004);
2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_WEEK_OF_YEAR,1);
2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DAY_OF_WEEK, UCAL_MONDAY);
2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln(calToStr(cal));
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if(cal.get(UCAL_YEAR, status) != 2003) {
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     errln("year not 2003");
2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln("+ setting DOW to THURSDAY");
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.clear();
2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_YEAR_WOY,2004);
2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_WEEK_OF_YEAR,1);
2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY);
2034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln(calToStr(cal));
2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if(cal.get(UCAL_YEAR, status) != 2004) {
2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     errln("year not 2004");
2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln("+ setting DOW_LOCAL to 1");
2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.clear();
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_YEAR_WOY,2004);
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_WEEK_OF_YEAR,1);
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY);
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DOW_LOCAL, 1);
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   logln(calToStr(cal));
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if(cal.get(UCAL_YEAR, status) != 2003) {
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     errln("year not 2003");
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.setFirstDayOfWeek(UCAL_MONDAY);
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.setMinimalDaysInFirstWeek(4);
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   UDate t = 946713600000.;
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.setTime(t, status);
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DAY_OF_WEEK, 4);
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   cal.set(UCAL_DOW_LOCAL, 6);
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   if(cal.getTime(status) != t) {
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     logln(calToStr(cal));
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     errln("FAIL:  DOW_LOCAL did not take precedence");
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   }
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::TestJD()
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int32_t jd;
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const int32_t kEpochStartAsJulianDay = 2440588;
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  GregorianCalendar cal(status);
207150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  if (failure(status, "construct GregorianCalendar", TRUE)) return;
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal.setTimeZone(*TimeZone::getGMT());
2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal.clear();
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  jd = cal.get(UCAL_JULIAN_DAY, status);
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(jd != kEpochStartAsJulianDay) {
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("Wanted JD of %d at time=0, [epoch 1970] but got %d\n", kEpochStartAsJulianDay, jd);
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Wanted JD of %d at time=0, [epoch 1970], got %d\n", kEpochStartAsJulianDay, jd);
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal.setTime(Calendar::getNow(), status);
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal.clear();
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  cal.set(UCAL_JULIAN_DAY, kEpochStartAsJulianDay);
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UDate epochTime = cal.getTime(status);
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(epochTime != 0) {
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime);
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  } else {
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime);
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// make sure the ctestfw utilities are in sync with the Calendar
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid CalendarTest::TestDebug()
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2096b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for(int32_t  t=0;t<=UDBG_ENUM_COUNT;t++) {
2097b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t count = udbg_enumCount((UDebugEnumType)t);
2098b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(count == -1) {
2099b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln("enumCount(%d) returned -1", count);
2100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
2101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for(int32_t i=0;i<=count;i++) {
2103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(t<=UDBG_HIGHEST_CONTIGUOUS_ENUM && i<count) {
2104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                if( i!=udbg_enumArrayValue((UDebugEnumType)t, i)) {
2105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    errln("FAIL: udbg_enumArrayValue(%d,%d) returned %d, expected %d", t, i, udbg_enumArrayValue((UDebugEnumType)t,i), i);
2106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                }
2107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            } else {
2108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                logln("Testing count+1:");
2109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const char *name = udbg_enumName((UDebugEnumType)t,i);
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  if(name==NULL) {
2112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          if(i==count || t>UDBG_HIGHEST_CONTIGUOUS_ENUM  ) {
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                logln(" null name - expected.\n");
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          } else {
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                errln("FAIL: udbg_enumName(%d,%d) returned NULL", t, i);
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          }
2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          name = "(null)";
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  }
2119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho          logln("udbg_enumArrayValue(%d,%d) = %s, returned %d", t, i,
2120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                      name, udbg_enumArrayValue((UDebugEnumType)t,i));
2121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln("udbg_enumString = " + udbg_enumString((UDebugEnumType)t,i));
2122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(udbg_enumExpectedCount((UDebugEnumType)t) != count && t<=UDBG_HIGHEST_CONTIGUOUS_ENUM) {
2124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("FAIL: udbg_enumExpectedCount(%d): %d, != UCAL_FIELD_COUNT=%d ", t, udbg_enumExpectedCount((UDebugEnumType)t), count);
2125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
2126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln("udbg_ucal_fieldCount: %d, UCAL_FIELD_COUNT=udbg_enumCount %d ", udbg_enumExpectedCount((UDebugEnumType)t), count);
2127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef CHECK
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// List of interesting locales
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *CalendarTest::testLocaleID(int32_t i)
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  switch(i) {
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 0: return "he_IL@calendar=hebrew";
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 1: return "en_US@calendar=hebrew";
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 2: return "fr_FR@calendar=hebrew";
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 3: return "fi_FI@calendar=hebrew";
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 4: return "nl_NL@calendar=hebrew";
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 5: return "hu_HU@calendar=hebrew";
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 6: return "nl_BE@currency=MTL;calendar=islamic";
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 7: return "th_TH_TRADITIONAL@calendar=gregorian";
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 8: return "ar_JO@calendar=islamic-civil";
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 9: return "fi_FI@calendar=islamic";
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 10: return "fr_CH@calendar=islamic-civil";
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 11: return "he_IL@calendar=islamic-civil";
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 12: return "hu_HU@calendar=buddhist";
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 13: return "hu_HU@calendar=islamic";
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  case 14: return "en_US@calendar=japanese";
2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  default: return NULL;
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t CalendarTest::testLocaleCount()
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static int32_t gLocaleCount = -1;
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(gLocaleCount < 0) {
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;testLocaleID(i) != NULL;i++) {
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      ;
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gLocaleCount = i;
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return gLocaleCount;
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UDate doMinDateOfCalendar(Calendar* adopt, UBool &isGregorian, UErrorCode& status) {
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) return 0.0;
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  adopt->clear();
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  adopt->set(UCAL_EXTENDED_YEAR, adopt->getActualMinimum(UCAL_EXTENDED_YEAR, status));
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UDate ret = adopt->getTime(status);
217627f654740f2a26ad62a5c155af9199af9e69b889claireho  isGregorian = dynamic_cast<GregorianCalendar*>(adopt) != NULL;
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  delete adopt;
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return ret;
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate CalendarTest::minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status) {
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) return 0.0;
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return doMinDateOfCalendar(Calendar::createInstance(locale, status), isGregorian, status);
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate CalendarTest::minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status) {
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(status)) return 0.0;
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return doMinDateOfCalendar(cal.clone(), isGregorian, status);
2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid CalendarTest::Test6703()
2192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
2193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Calendar *cal;
2195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Locale loc1("en@calendar=fubar");
2197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    cal = Calendar::createInstance(loc1, status);
219850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "Calendar::createInstance", TRUE)) return;
2199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete cal;
2200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    status = U_ZERO_ERROR;
2202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Locale loc2("en");
2203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    cal = Calendar::createInstance(loc2, status);
2204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (failure(status, "Calendar::createInstance")) return;
2205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete cal;
2206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    status = U_ZERO_ERROR;
2208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    Locale loc3("en@calendar=roc");
2209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    cal = Calendar::createInstance(loc3, status);
2210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (failure(status, "Calendar::createInstance")) return;
2211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    delete cal;
2212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return;
2214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid CalendarTest::Test3785()
2217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{
2218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
221950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString uzone = UNICODE_STRING_SIMPLE("Europe/Paris");
222050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString exp1 = UNICODE_STRING_SIMPLE("Mon 30 Jumada II 1433 AH, 01:47:03");
222150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString exp2 = UNICODE_STRING_SIMPLE("Mon 1 Rajab 1433 AH, 01:47:04");
2222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
222350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUDateFormatPointer df(udat_open(UDAT_NONE, UDAT_NONE, "en@calendar=islamic", uzone.getTerminatedBuffer(),
222450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                                         uzone.length(), NULL, 0, &status));
222550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (df.isNull() || U_FAILURE(status)) return;
2226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar upattern[64];
2228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    u_uastrcpy(upattern, "EEE d MMMM y G, HH:mm:ss");
222950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    udat_applyPattern(df.getAlias(), FALSE, upattern, u_strlen(upattern));
2230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UChar ubuffer[1024];
2232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UDate ud0 = 1337557623000.0;
2233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    status = U_ZERO_ERROR;
223550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    udat_format(df.getAlias(), ud0, ubuffer, 1024, NULL, &status);
223650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
223750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Error formatting date 1\n");
223850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
223950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
2240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    //printf("formatted: '%s'\n", mkcstr(ubuffer));
2241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
224250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString act1(ubuffer);
224350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if ( act1 != exp1 ) {
224450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Unexpected result from date 1 format\n");
224550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
2246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ud0 += 1000.0; // add one second
2247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    status = U_ZERO_ERROR;
224950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    udat_format(df.getAlias(), ud0, ubuffer, 1024, NULL, &status);
225050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
225150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Error formatting date 2\n");
225250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
225350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
2254b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    //printf("formatted: '%s'\n", mkcstr(ubuffer));
225550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString act2(ubuffer);
225650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if ( act2 != exp2 ) {
225750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        errln("Unexpected result from date 2 format\n");
225850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
2259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
2260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return;
2261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid CalendarTest::Test1624() {
226450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UErrorCode status = U_ZERO_ERROR;
226550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Locale loc("he_IL@calendar=hebrew");
226650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    HebrewCalendar hc(loc,status);
226750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
226850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for (int32_t year = 5600; year < 5800; year++ ) {
226950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
227050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        for (int32_t month = HebrewCalendar::TISHRI; month <= HebrewCalendar::ELUL; month++) {
227150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            // skip the adar 1 month if year is not a leap year
227250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (HebrewCalendar::isLeapYear(year) == FALSE && month == HebrewCalendar::ADAR_1) {
227350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                continue;
227450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
227550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            int32_t day = 15;
227650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            hc.set(year,month,day);
227750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            int32_t dayHC = hc.get(UCAL_DATE,status);
227850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            int32_t monthHC = hc.get(UCAL_MONTH,status);
227950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            int32_t yearHC = hc.get(UCAL_YEAR,status);
228050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
228150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (failure(status, "HebrewCalendar.get()", TRUE)) continue;
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (dayHC != day) {
228450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                errln(" ==> day %d incorrect, should be: %d\n",dayHC,day);
228550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
228650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
228750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (monthHC != month) {
228850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                errln(" ==> month %d incorrect, should be: %d\n",monthHC,month);
228950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
229050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
229150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (yearHC != year) {
229250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                errln(" ==> day %d incorrect, should be: %d\n",yearHC,year);
229350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                break;
229450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
229550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
229650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
229750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return;
229850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CalendarTest::TestTimeStamp() {
2301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
2302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UDate start = 0.0, time;
2303b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Calendar *cal;
2304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2305b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Create a new Gregorian Calendar.
2306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    cal = Calendar::createInstance("en_US@calender=gregorian", status);
2307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {
2308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Error creating Gregorian calendar.");
2309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
2310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int i = 0; i < 20000; i++) {
2313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // Set the Gregorian Calendar to a specific date for testing.
2314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        cal->set(2009, UCAL_JULY, 3, 0, 49, 46);
2315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        time = cal->getTime(status);
2317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
2318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error calling getTime()");
2319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
2320b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2321b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (i == 0) {
2323b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            start = time;
2324b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } else {
2325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (start != time) {
2326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("start and time not equal.");
2327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                break;
2328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
2329b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2330b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete cal;
2333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2335b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid CalendarTest::TestISO8601() {
2336b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    const char* TEST_LOCALES[] = {
2337b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "en_US@calendar=iso8601",
2338b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "en_US@calendar=Iso8601",
2339b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "th_TH@calendar=iso8601",
2340b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        "ar_EG@calendar=iso8601",
2341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        NULL
2342b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
2343b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t TEST_DATA[][3] = {
2345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2008, 1, 2008},
2346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2009, 1, 2009},
2347b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2010, 53, 2009},
2348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2011, 52, 2010},
2349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2012, 52, 2011},
2350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2013, 1, 2013},
2351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {2014, 1, 2014},
2352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        {0, 0, 0},
2353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    };
2354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for (int i = 0; TEST_LOCALES[i] != NULL; i++) {
2356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        UErrorCode status = U_ZERO_ERROR;
2357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        Calendar *cal = Calendar::createInstance(TEST_LOCALES[i], status);
2358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (U_FAILURE(status)) {
2359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error: Failed to create a calendar for locale: %s", TEST_LOCALES[i]);
2360b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
2361b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2362b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if (uprv_strcmp(cal->getType(), "gregorian") != 0) {
2363b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln("Error: Gregorian calendar is not used for locale: %s", TEST_LOCALES[i]);
2364b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
2365b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2366b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for (int j = 0; TEST_DATA[j][0] != 0; j++) {
2367b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            cal->set(TEST_DATA[j][0], UCAL_JANUARY, 1);
2368b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t weekNum = cal->get(UCAL_WEEK_OF_YEAR, status);
2369b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t weekYear = cal->get(UCAL_YEAR_WOY, status);
2370b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (U_FAILURE(status)) {
2371b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Error: Failed to get week of year");
2372b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                break;
2373b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
2374b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (weekNum != TEST_DATA[j][1] || weekYear != TEST_DATA[j][2]) {
2375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                errln("Error: Incorrect week of year on January 1st, %d for locale %s: Returned [weekNum=%d, weekYear=%d], Expected [weekNum=%d, weekYear=%d]",
2376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                    TEST_DATA[j][0], TEST_LOCALES[i], weekNum, weekYear, TEST_DATA[j][1], TEST_DATA[j][2]);
2377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
2378b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
2379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        delete cal;
2380b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2381b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2382b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2383b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2384103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid
2385103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalendarTest::TestAmbiguousWallTimeAPIs(void) {
2386103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
2387103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    Calendar* cal = Calendar::createInstance(status);
2388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
2389103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Error creating a calendar instance.");
2390103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
2391103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2393103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (cal->getRepeatedWallTimeOption() != UCAL_WALLTIME_LAST) {
2394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Default repeted time option is not UCAL_WALLTIME_LAST");
2395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2396103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (cal->getSkippedWallTimeOption() != UCAL_WALLTIME_LAST) {
2397103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Default skipped time option is not UCAL_WALLTIME_LAST");
2398103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2399103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2400103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    Calendar* cal2 = cal->clone();
2401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (*cal != *cal2) {
2403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Cloned calendar != the original");
2404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (!cal->equals(*cal2, status)) {
2406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: The time of cloned calendar is not equal to the original");
2407103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else if (U_FAILURE(status)) {
2408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Error equals");
2409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2410103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    status = U_ZERO_ERROR;
2411103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2412103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    cal2->setRepeatedWallTimeOption(UCAL_WALLTIME_FIRST);
2413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    cal2->setSkippedWallTimeOption(UCAL_WALLTIME_FIRST);
2414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (*cal == *cal2) {
2416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Cloned and modified calendar == the original");
2417103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (!cal->equals(*cal2, status)) {
2419103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: The time of cloned calendar is not equal to the original after changing wall time options");
2420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else if (U_FAILURE(status)) {
2421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Error equals after changing wall time options");
2422103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    status = U_ZERO_ERROR;
2424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (cal2->getRepeatedWallTimeOption() != UCAL_WALLTIME_FIRST) {
2426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Repeted time option is not UCAL_WALLTIME_FIRST");
2427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2428103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (cal2->getSkippedWallTimeOption() != UCAL_WALLTIME_FIRST) {
2429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Skipped time option is not UCAL_WALLTIME_FIRST");
2430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2431103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2432103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    cal2->setRepeatedWallTimeOption(UCAL_WALLTIME_NEXT_VALID);
2433103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (cal2->getRepeatedWallTimeOption() != UCAL_WALLTIME_FIRST) {
2434103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Repeated wall time option was updated other than UCAL_WALLTIME_FIRST");
2435103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2436103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2437103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    delete cal;
2438103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    delete cal2;
2439103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2440103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2441103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusclass CalFields {
2442103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliuspublic:
2443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CalFields(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t min, int32_t sec, int32_t ms = 0);
2444103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    CalFields(const Calendar& cal, UErrorCode& status);
2445103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    void setTo(Calendar& cal) const;
2446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char* toString(char* buf, int32_t len) const;
2447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UBool operator==(const CalFields& rhs) const;
2448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UBool operator!=(const CalFields& rhs) const;
2449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UBool isEquivalentTo(const Calendar& cal, UErrorCode& status) const;
2450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusprivate:
2452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t year;
2453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t month;
2454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t day;
2455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t hour;
2456103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t min;
2457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t sec;
2458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t ms;
2459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius};
2460103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2461fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusCalFields::CalFields(int32_t year, int32_t month, int32_t day, int32_t hour, int32_t min, int32_t sec, int32_t ms)
2462fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    : year(year), month(month), day(day), hour(hour), min(min), sec(sec), ms(ms) {
2463103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2464103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2465103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalFields::CalFields(const Calendar& cal, UErrorCode& status) {
2466103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    year = cal.get(UCAL_YEAR, status);
2467103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    month = cal.get(UCAL_MONTH, status) + 1;
2468103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    day = cal.get(UCAL_DAY_OF_MONTH, status);
2469103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    hour = cal.get(UCAL_HOUR_OF_DAY, status);
2470103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    min = cal.get(UCAL_MINUTE, status);
2471103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    sec = cal.get(UCAL_SECOND, status);
2472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ms = cal.get(UCAL_MILLISECOND, status);
2473103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid
2476103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalFields::setTo(Calendar& cal) const {
2477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    cal.clear();
2478103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    cal.set(year, month - 1, day, hour, min, sec);
2479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    cal.set(UCAL_MILLISECOND, ms);
2480103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2481103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2482103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliuschar*
2483103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalFields::toString(char* buf, int32_t len) const {
2484103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    char local[32];
2485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    sprintf(local, "%04d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, min, sec, ms);
2486103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    uprv_strncpy(buf, local, len - 1);
2487103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    buf[len - 1] = 0;
2488103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return buf;
2489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2490103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2491103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUBool
2492103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalFields::operator==(const CalFields& rhs) const {
2493103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return year == rhs.year
2494103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        && month == rhs.month
2495103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        && day == rhs.day
2496103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        && hour == rhs.hour
2497103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        && min == rhs.min
2498fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && sec == rhs.sec
2499fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && ms == rhs.ms;
2500103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2501103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2502103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUBool
2503103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCalFields::operator!=(const CalFields& rhs) const {
2504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return !(*this == rhs);
2505103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2507fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUBool
2508fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusCalFields::isEquivalentTo(const Calendar& cal, UErrorCode& status) const {
2509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return year == cal.get(UCAL_YEAR, status)
2510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && month == cal.get(UCAL_MONTH, status) + 1
2511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && day == cal.get(UCAL_DAY_OF_MONTH, status)
2512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && hour == cal.get(UCAL_HOUR_OF_DAY, status)
2513fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && min == cal.get(UCAL_MINUTE, status)
2514fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && sec == cal.get(UCAL_SECOND, status)
2515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        && ms == cal.get(UCAL_MILLISECOND, status);
2516fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
2517fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
2518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliustypedef struct {
2519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char*     tzid;
2520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields in;
2521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields expLastGMT;
2522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields expFirstGMT;
2523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} RepeatedWallTimeTestData;
2524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic const RepeatedWallTimeTestData RPDATA[] =
2526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
2527103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    // Time zone            Input wall time                 WALLTIME_LAST in GMT            WALLTIME_FIRST in GMT
2528103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,0,59,59),   CalFields(2011,11,6,4,59,59),   CalFields(2011,11,6,4,59,59)},
2529103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,1,0,0),     CalFields(2011,11,6,6,0,0),     CalFields(2011,11,6,5,0,0)},
2530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,1,0,1),     CalFields(2011,11,6,6,0,1),     CalFields(2011,11,6,5,0,1)},
2531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,1,30,0),    CalFields(2011,11,6,6,30,0),    CalFields(2011,11,6,5,30,0)},
2532103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,1,59,59),   CalFields(2011,11,6,6,59,59),   CalFields(2011,11,6,5,59,59)},
2533103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,2,0,0),     CalFields(2011,11,6,7,0,0),     CalFields(2011,11,6,7,0,0)},
2534103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,11,6,2,0,1),     CalFields(2011,11,6,7,0,1),     CalFields(2011,11,6,7,0,1)},
2535103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2536103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,1,29,59),    CalFields(2011,4,2,14,29,59),   CalFields(2011,4,2,14,29,59)},
2537103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,1,30,0),     CalFields(2011,4,2,15,0,0),     CalFields(2011,4,2,14,30,0)},
2538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,1,45,0),     CalFields(2011,4,2,15,15,0),    CalFields(2011,4,2,14,45,0)},
2539103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,1,59,59),    CalFields(2011,4,2,15,29,59),   CalFields(2011,4,2,14,59,59)},
2540103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,2,0,0),      CalFields(2011,4,2,15,30,0),    CalFields(2011,4,2,15,30,0)},
2541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Australia/Lord_Howe", CalFields(2011,4,3,2,0,1),      CalFields(2011,4,2,15,30,1),    CalFields(2011,4,2,15,30,1)},
2542103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2543103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {NULL,                  CalFields(0,0,0,0,0,0),         CalFields(0,0,0,0,0,0),          CalFields(0,0,0,0,0,0)}
2544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius};
2545103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid CalendarTest::TestRepeatedWallTime(void) {
2547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
2548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calGMT((const TimeZone&)*TimeZone::getGMT(), status);
2549103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calDefault(status);
2550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calLast(status);
2551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calFirst(status);
2552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2553103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
2554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Failed to create a calendar object.");
2555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
2556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    calLast.setRepeatedWallTimeOption(UCAL_WALLTIME_LAST);
2559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    calFirst.setRepeatedWallTimeOption(UCAL_WALLTIME_FIRST);
2560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (int32_t i = 0; RPDATA[i].tzid != NULL; i++) {
2562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        char buf[32];
2563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TimeZone *tz = TimeZone::createTimeZone(RPDATA[i].tzid);
2564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // UCAL_WALLTIME_LAST
2566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        status = U_ZERO_ERROR;
2567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calLast.setTimeZone(*tz);
2568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        RPDATA[i].in.setTo(calLast);
2569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calGMT.setTime(calLast.getTime(status), status);
2570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CalFields outLastGMT(calGMT, status);
2571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (U_FAILURE(status)) {
2572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln(UnicodeString("Fail: Failed to get/set time calLast/calGMT (UCAL_WALLTIME_LAST) - ")
2573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "]");
2574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        } else {
2575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (outLastGMT != RPDATA[i].expLastGMT) {
2576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: UCAL_WALLTIME_LAST ") + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "] is parsed as "
2577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + outLastGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + RPDATA[i].expLastGMT.toString(buf, sizeof(buf)) + "[GMT]");
2578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // default
2582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        status = U_ZERO_ERROR;
2583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calDefault.setTimeZone(*tz);
2584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        RPDATA[i].in.setTo(calDefault);
2585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calGMT.setTime(calDefault.getTime(status), status);
2586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CalFields outDefGMT(calGMT, status);
2587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (U_FAILURE(status)) {
2588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln(UnicodeString("Fail: Failed to get/set time calLast/calGMT (default) - ")
2589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "]");
2590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        } else {
2591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (outDefGMT != RPDATA[i].expLastGMT) {
2592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: (default) ") + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "] is parsed as "
2593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + outDefGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + RPDATA[i].expLastGMT.toString(buf, sizeof(buf)) + "[GMT]");
2594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        // UCAL_WALLTIME_FIRST
2598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        status = U_ZERO_ERROR;
2599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calFirst.setTimeZone(*tz);
2600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        RPDATA[i].in.setTo(calFirst);
2601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        calGMT.setTime(calFirst.getTime(status), status);
2602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        CalFields outFirstGMT(calGMT, status);
2603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (U_FAILURE(status)) {
2604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            errln(UnicodeString("Fail: Failed to get/set time calLast/calGMT (UCAL_WALLTIME_FIRST) - ")
2605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "]");
2606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        } else {
2607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (outFirstGMT != RPDATA[i].expFirstGMT) {
2608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: UCAL_WALLTIME_FIRST ") + RPDATA[i].in.toString(buf, sizeof(buf)) + "[" + RPDATA[i].tzid + "] is parsed as "
2609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + outFirstGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + RPDATA[i].expFirstGMT.toString(buf, sizeof(buf)) + "[GMT]");
2610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        delete tz;
2613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliustypedef struct {
2617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const char*     tzid;
2618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields in;
2619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UBool           isValid;
2620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields expLastGMT;
2621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields expFirstGMT;
2622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const CalFields expNextAvailGMT;
2623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} SkippedWallTimeTestData;
2624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic SkippedWallTimeTestData SKDATA[] =
2626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius{
2627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     // Time zone           Input wall time                 valid?  WALLTIME_LAST in GMT            WALLTIME_FIRST in GMT           WALLTIME_NEXT_VALID in GMT
2628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,1,59,59),   TRUE,   CalFields(2011,3,13,6,59,59),   CalFields(2011,3,13,6,59,59),   CalFields(2011,3,13,6,59,59)},
2629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,2,0,0),     FALSE,  CalFields(2011,3,13,7,0,0),     CalFields(2011,3,13,6,0,0),     CalFields(2011,3,13,7,0,0)},
2630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,2,1,0),     FALSE,  CalFields(2011,3,13,7,1,0),     CalFields(2011,3,13,6,1,0),     CalFields(2011,3,13,7,0,0)},
2631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,2,30,0),    FALSE,  CalFields(2011,3,13,7,30,0),    CalFields(2011,3,13,6,30,0),    CalFields(2011,3,13,7,0,0)},
2632103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,2,59,59),   FALSE,  CalFields(2011,3,13,7,59,59),   CalFields(2011,3,13,6,59,59),   CalFields(2011,3,13,7,0,0)},
2633103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"America/New_York",    CalFields(2011,3,13,3,0,0),     TRUE,   CalFields(2011,3,13,7,0,0),     CalFields(2011,3,13,7,0,0),     CalFields(2011,3,13,7,0,0)},
2634103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Pacific/Apia",        CalFields(2011,12,29,23,59,59), TRUE,   CalFields(2011,12,30,9,59,59),  CalFields(2011,12,30,9,59,59),  CalFields(2011,12,30,9,59,59)},
2636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Pacific/Apia",        CalFields(2011,12,30,0,0,0),    FALSE,  CalFields(2011,12,30,10,0,0),   CalFields(2011,12,29,10,0,0),   CalFields(2011,12,30,10,0,0)},
2637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Pacific/Apia",        CalFields(2011,12,30,12,0,0),   FALSE,  CalFields(2011,12,30,22,0,0),   CalFields(2011,12,29,22,0,0),   CalFields(2011,12,30,10,0,0)},
2638103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Pacific/Apia",        CalFields(2011,12,30,23,59,59), FALSE,  CalFields(2011,12,31,9,59,59),  CalFields(2011,12,30,9,59,59),  CalFields(2011,12,30,10,0,0)},
2639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {"Pacific/Apia",        CalFields(2011,12,31,0,0,0),    TRUE,   CalFields(2011,12,30,10,0,0),   CalFields(2011,12,30,10,0,0),   CalFields(2011,12,30,10,0,0)},
2640103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    {NULL,                  CalFields(0,0,0,0,0,0),         TRUE,   CalFields(0,0,0,0,0,0),         CalFields(0,0,0,0,0,0),         CalFields(0,0,0,0,0,0)}
2642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius};
2643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid CalendarTest::TestSkippedWallTime(void) {
2646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode status = U_ZERO_ERROR;
2647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calGMT((const TimeZone&)*TimeZone::getGMT(), status);
2648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calDefault(status);
2649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calLast(status);
2650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calFirst(status);
2651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    GregorianCalendar calNextAvail(status);
2652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(status)) {
2654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        errln("Fail: Failed to create a calendar object.");
2655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
2656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    calLast.setSkippedWallTimeOption(UCAL_WALLTIME_LAST);
2659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    calFirst.setSkippedWallTimeOption(UCAL_WALLTIME_FIRST);
2660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    calNextAvail.setSkippedWallTimeOption(UCAL_WALLTIME_NEXT_VALID);
2661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    for (int32_t i = 0; SKDATA[i].tzid != NULL; i++) {
2663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        UDate d;
2664103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        char buf[32];
2665103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        TimeZone *tz = TimeZone::createTimeZone(SKDATA[i].tzid);
2666103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        for (int32_t j = 0; j < 2; j++) {
2668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            UBool bLenient = (j == 0);
2669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            // UCAL_WALLTIME_LAST
2671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            status = U_ZERO_ERROR;
2672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calLast.setLenient(bLenient);
2673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calLast.setTimeZone(*tz);
2674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            SKDATA[i].in.setTo(calLast);
2675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            d = calLast.getTime(status);
2676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (bLenient || SKDATA[i].isValid) {
2677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                calGMT.setTime(d, status);
2678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                CalFields outLastGMT(calGMT, status);
2679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                if (U_FAILURE(status)) {
2680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    errln(UnicodeString("Fail: Failed to get/set time calLast/calGMT (UCAL_WALLTIME_LAST) - ")
2681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                } else {
2683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    if (outLastGMT != SKDATA[i].expLastGMT) {
2684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        dataerrln(UnicodeString("Fail: UCAL_WALLTIME_LAST ") + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "] is parsed as "
2685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            + outLastGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + SKDATA[i].expLastGMT.toString(buf, sizeof(buf)) + "[GMT]");
2686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    }
2687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                }
2688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            } else if (U_SUCCESS(status)) {
2689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                // strict, invalid wall time - must report an error
2690103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: An error expected (UCAL_WALLTIME_LAST)") +
2691103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2692103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2693103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2694103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            // default
2695103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            status = U_ZERO_ERROR;
2696103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calDefault.setLenient(bLenient);
2697103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calDefault.setTimeZone(*tz);
2698103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            SKDATA[i].in.setTo(calDefault);
2699103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            d = calDefault.getTime(status);
2700103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (bLenient || SKDATA[i].isValid) {
2701103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                calGMT.setTime(d, status);
2702103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                CalFields outDefGMT(calGMT, status);
2703103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                if (U_FAILURE(status)) {
2704103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    errln(UnicodeString("Fail: Failed to get/set time calDefault/calGMT (default) - ")
2705103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2706103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                } else {
2707103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    if (outDefGMT != SKDATA[i].expLastGMT) {
2708103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        dataerrln(UnicodeString("Fail: (default) ") + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "] is parsed as "
2709103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            + outDefGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + SKDATA[i].expLastGMT.toString(buf, sizeof(buf)) + "[GMT]");
2710103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    }
2711103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                }
2712103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            } else if (U_SUCCESS(status)) {
2713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                // strict, invalid wall time - must report an error
2714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: An error expected (default)") +
2715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2717103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2718103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            // UCAL_WALLTIME_FIRST
2719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            status = U_ZERO_ERROR;
2720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calFirst.setLenient(bLenient);
2721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calFirst.setTimeZone(*tz);
2722103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            SKDATA[i].in.setTo(calFirst);
2723103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            d = calFirst.getTime(status);
2724103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (bLenient || SKDATA[i].isValid) {
2725103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                calGMT.setTime(d, status);
2726103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                CalFields outFirstGMT(calGMT, status);
2727103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                if (U_FAILURE(status)) {
2728103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    errln(UnicodeString("Fail: Failed to get/set time calFirst/calGMT (UCAL_WALLTIME_FIRST) - ")
2729103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2730103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                } else {
2731103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    if (outFirstGMT != SKDATA[i].expFirstGMT) {
2732103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        dataerrln(UnicodeString("Fail: UCAL_WALLTIME_FIRST ") + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "] is parsed as "
2733103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            + outFirstGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + SKDATA[i].expFirstGMT.toString(buf, sizeof(buf)) + "[GMT]");
2734103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    }
2735103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                }
2736103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            } else if (U_SUCCESS(status)) {
2737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                // strict, invalid wall time - must report an error
2738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: An error expected (UCAL_WALLTIME_FIRST)") +
2739103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2740103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2741103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2742103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            // UCAL_WALLTIME_NEXT_VALID
2743103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            status = U_ZERO_ERROR;
2744103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calNextAvail.setLenient(bLenient);
2745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            calNextAvail.setTimeZone(*tz);
2746103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            SKDATA[i].in.setTo(calNextAvail);
2747103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            d = calNextAvail.getTime(status);
2748103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            if (bLenient || SKDATA[i].isValid) {
2749103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                calGMT.setTime(d, status);
2750103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                CalFields outNextAvailGMT(calGMT, status);
2751103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                if (U_FAILURE(status)) {
2752103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    errln(UnicodeString("Fail: Failed to get/set time calNextAvail/calGMT (UCAL_WALLTIME_NEXT_VALID) - ")
2753103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2754103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                } else {
2755103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    if (outNextAvailGMT != SKDATA[i].expNextAvailGMT) {
2756103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                        dataerrln(UnicodeString("Fail: UCAL_WALLTIME_NEXT_VALID ") + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "] is parsed as "
2757103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                            + outNextAvailGMT.toString(buf, sizeof(buf)) + "[GMT]. Expected: " + SKDATA[i].expNextAvailGMT.toString(buf, sizeof(buf)) + "[GMT]");
2758103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    }
2759103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                }
2760103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            } else if (U_SUCCESS(status)) {
2761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                // strict, invalid wall time - must report an error
2762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                dataerrln(UnicodeString("Fail: An error expected (UCAL_WALLTIME_NEXT_VALID)") +
2763103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                    + SKDATA[i].in.toString(buf, sizeof(buf)) + "[" + SKDATA[i].tzid + "]");
2764103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            }
2765103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
2766103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2767103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        delete tz;
2768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
2769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2770103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
2771103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid CalendarTest::TestCloneLocale(void) {
2772103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  UErrorCode status = U_ZERO_ERROR;
2773103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  LocalPointer<Calendar>  cal(Calendar::createInstance(TimeZone::getGMT()->clone(),
2774103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                                                       Locale::createFromName("en"), status));
2775103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TEST_CHECK_STATUS;
2776103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  Locale l0 = cal->getLocale(ULOC_VALID_LOCALE, status);
2777103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TEST_CHECK_STATUS;
2778103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  LocalPointer<Calendar> cal2(cal->clone());
2779103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  Locale l = cal2->getLocale(ULOC_VALID_LOCALE, status);
2780103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  if(l0!=l) {
2781103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errln("Error: cloned locale %s != original locale %s, status %s\n", l0.getName(), l.getName(), u_errorName(status));
2782103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  }
2783103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius  TEST_CHECK_STATUS;
2784103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
2785103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
278659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid CalendarTest::setAndTestCalendar(Calendar* cal, int32_t initMonth, int32_t initDay, int32_t initYear, UErrorCode& status) {
278759d709d503bab6e2b61931737e662dd293b40578ccornelius        cal->clear();
278859d709d503bab6e2b61931737e662dd293b40578ccornelius        cal->setLenient(FALSE);
278959d709d503bab6e2b61931737e662dd293b40578ccornelius        cal->set(initYear, initMonth, initDay);
279059d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t day = cal->get(UCAL_DAY_OF_MONTH, status);
279159d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t month = cal->get(UCAL_MONTH, status);
279259d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t year = cal->get(UCAL_YEAR, status);
279359d709d503bab6e2b61931737e662dd293b40578ccornelius        if(U_FAILURE(status))
279459d709d503bab6e2b61931737e662dd293b40578ccornelius            return;
279559d709d503bab6e2b61931737e662dd293b40578ccornelius
279659d709d503bab6e2b61931737e662dd293b40578ccornelius        if(initDay != day || initMonth != month || initYear != year)
279759d709d503bab6e2b61931737e662dd293b40578ccornelius        {
279859d709d503bab6e2b61931737e662dd293b40578ccornelius            errln(" year init values:\tmonth %i\tday %i\tyear %i", initMonth, initDay, initYear);
279959d709d503bab6e2b61931737e662dd293b40578ccornelius            errln("values post set():\tmonth %i\tday %i\tyear %i",month, day, year);
280059d709d503bab6e2b61931737e662dd293b40578ccornelius        }
280159d709d503bab6e2b61931737e662dd293b40578ccornelius}
280259d709d503bab6e2b61931737e662dd293b40578ccornelius
280359d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid CalendarTest::setAndTestWholeYear(Calendar* cal, int32_t startYear, UErrorCode& status) {
280459d709d503bab6e2b61931737e662dd293b40578ccornelius        for(int32_t startMonth = 0; startMonth < 12; startMonth++) {
280559d709d503bab6e2b61931737e662dd293b40578ccornelius            for(int32_t startDay = 1; startDay < 31; startDay++ ) {
280659d709d503bab6e2b61931737e662dd293b40578ccornelius                    setAndTestCalendar(cal, startMonth, startDay, startYear, status);
280759d709d503bab6e2b61931737e662dd293b40578ccornelius                    if(U_FAILURE(status) && startDay == 30) {
280859d709d503bab6e2b61931737e662dd293b40578ccornelius                        status = U_ZERO_ERROR;
280959d709d503bab6e2b61931737e662dd293b40578ccornelius                        continue;
281059d709d503bab6e2b61931737e662dd293b40578ccornelius                    }
281159d709d503bab6e2b61931737e662dd293b40578ccornelius                    TEST_CHECK_STATUS;
281259d709d503bab6e2b61931737e662dd293b40578ccornelius            }
281359d709d503bab6e2b61931737e662dd293b40578ccornelius        }
281459d709d503bab6e2b61931737e662dd293b40578ccornelius}
28151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
28161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// =====================================================================
281759d709d503bab6e2b61931737e662dd293b40578ccornelius
28181b7d32f919554dda9c193b32188251337bc756f1Fredrik Rouberttypedef struct {
28191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int16_t  gYear;
28201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int8_t   gMon;
28211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int8_t   gDay;
28221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int16_t  uYear;
28231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int8_t   uMon;
28241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    int8_t   uDay;
28251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} GregoUmmAlQuraMap;
28261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
28271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// data from
28281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// Official Umm-al-Qura calendar of SA:
28291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// home, http://www.ummulqura.org.sa/default.aspx
28301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// converter, http://www.ummulqura.org.sa/Index.aspx
28311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic const GregoUmmAlQuraMap guMappings[] = {
28321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  gregorian,    ummAlQura
28331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  year mo da,   year mo da
28341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//  (using 1-based months here)
28351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1882,11,12,   1300, 1, 1 },
28361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1892, 7,25,   1310, 1, 1 },
28371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1896, 6,12,   1314, 1, 1 },
28381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1898, 5,22,   1316, 1, 1 },
28391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1900, 4,30,   1318, 1, 1 },
28401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1901, 4,20,   1319, 1, 1 },
28411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1902, 4,10,   1320, 1, 1 },
28421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1903, 3,30,   1321, 1, 1 },
28431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1904, 3,19,   1322, 1, 1 },
28441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1905, 3, 8,   1323, 1, 1 },
28451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1906, 2,25,   1324, 1, 1 },
28461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1907, 2,14,   1325, 1, 1 },
28471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1908, 2, 4,   1326, 1, 1 },
28481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1909, 1,23,   1327, 1, 1 },
28491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1910, 1,13,   1328, 1, 1 },
28501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1911, 1, 2,   1329, 1, 1 },
28511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1911,12,22,   1330, 1, 1 },
28521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1912,12,10,   1331, 1, 1 },
28531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1913,11,30,   1332, 1, 1 },
28541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1914,11,19,   1333, 1, 1 },
28551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1915,11, 9,   1334, 1, 1 },
28561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1916,10,28,   1335, 1, 1 },
28571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1917,10,18,   1336, 1, 1 },
28581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1918,10, 7,   1337, 1, 1 },
28591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1919, 9,26,   1338, 1, 1 },
28601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1920, 9,14,   1339, 1, 1 },
28611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1921, 9, 4,   1340, 1, 1 },
28621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1922, 8,24,   1341, 1, 1 },
28631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1923, 8,14,   1342, 1, 1 },
28641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1924, 8, 2,   1343, 1, 1 },
28651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1925, 7,22,   1344, 1, 1 },
28661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1926, 7,11,   1345, 1, 1 },
28671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1927, 6,30,   1346, 1, 1 },
28681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1928, 6,19,   1347, 1, 1 },
28691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1929, 6, 9,   1348, 1, 1 },
28701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1930, 5,29,   1349, 1, 1 },
28711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1931, 5,19,   1350, 1, 1 },
28721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1932, 5, 7,   1351, 1, 1 },
28731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1933, 4,26,   1352, 1, 1 },
28741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1934, 4,15,   1353, 1, 1 },
28751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1935, 4, 5,   1354, 1, 1 },
28761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1936, 3,24,   1355, 1, 1 },
28771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1937, 3,14,   1356, 1, 1 },
28781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1938, 3, 4,   1357, 1, 1 },
28791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1939, 2,21,   1358, 1, 1 },
28801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1940, 2,10,   1359, 1, 1 },
28811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1941, 1,29,   1360, 1, 1 },
28821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1942, 1,18,   1361, 1, 1 },
28831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1943, 1, 8,   1362, 1, 1 },
28841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1943,12,28,   1363, 1, 1 },
28851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1944,12,17,   1364, 1, 1 },
28861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1945,12, 6,   1365, 1, 1 },
28871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1946,11,25,   1366, 1, 1 },
28881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1947,11,14,   1367, 1, 1 },
28891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1948,11, 3,   1368, 1, 1 },
28901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1949,10,23,   1369, 1, 1 },
28911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1950,10,13,   1370, 1, 1 },
28921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1951,10, 3,   1371, 1, 1 },
28931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1952, 9,21,   1372, 1, 1 },
28941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1953, 9,10,   1373, 1, 1 },
28951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1954, 8,30,   1374, 1, 1 },
28961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1955, 8,19,   1375, 1, 1 },
28971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1956, 8, 8,   1376, 1, 1 },
28981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1957, 7,29,   1377, 1, 1 },
28991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1958, 7,18,   1378, 1, 1 },
29001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1959, 7, 8,   1379, 1, 1 },
29011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1960, 6,26,   1380, 1, 1 },
29021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1961, 6,15,   1381, 1, 1 },
29031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1962, 6, 4,   1382, 1, 1 },
29041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1963, 5,24,   1383, 1, 1 },
29051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1964, 5,13,   1384, 1, 1 },
29061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1965, 5, 3,   1385, 1, 1 },
29071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1966, 4,22,   1386, 1, 1 },
29081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1967, 4,11,   1387, 1, 1 },
29091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1968, 3,30,   1388, 1, 1 },
29101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1969, 3,19,   1389, 1, 1 },
29111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1970, 3, 9,   1390, 1, 1 },
29121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1971, 2,27,   1391, 1, 1 },
29131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1972, 2,16,   1392, 1, 1 },
29141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1973, 2, 5,   1393, 1, 1 },
29151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1974, 1,25,   1394, 1, 1 },
29161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1975, 1,14,   1395, 1, 1 },
29171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1976, 1, 3,   1396, 1, 1 },
29181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1976,12,22,   1397, 1, 1 },
29191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1977,12,12,   1398, 1, 1 },
29201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1978,12, 1,   1399, 1, 1 },
29211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1979,11,21,   1400, 1, 1 },
29221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1980,11, 9,   1401, 1, 1 },
29231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1981,10,29,   1402, 1, 1 },
29241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1982,10,18,   1403, 1, 1 },
29251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1983,10, 8,   1404, 1, 1 },
29261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1984, 9,26,   1405, 1, 1 },
29271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1985, 9,16,   1406, 1, 1 },
29281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1986, 9, 6,   1407, 1, 1 },
29291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1987, 8,26,   1408, 1, 1 },
29301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1988, 8,14,   1409, 1, 1 },
29311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1989, 8, 3,   1410, 1, 1 },
29321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1990, 7,23,   1411, 1, 1 },
29331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1991, 7,13,   1412, 1, 1 },
29341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1992, 7, 2,   1413, 1, 1 },
29351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1993, 6,21,   1414, 1, 1 },
29361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1994, 6,11,   1415, 1, 1 },
29371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1995, 5,31,   1416, 1, 1 },
29381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1996, 5,19,   1417, 1, 1 },
29391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1997, 5, 8,   1418, 1, 1 },
29401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1998, 4,28,   1419, 1, 1 },
29411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 4,17,   1420, 1, 1 },
29421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 5,16,   1420, 2, 1 },
29431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 6,15,   1420, 3, 1 },
29441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 7,14,   1420, 4, 1 },
29451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 8,12,   1420, 5, 1 },
29461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999, 9,11,   1420, 6, 1 },
29471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999,10,10,   1420, 7, 1 },
29481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999,11, 9,   1420, 8, 1 },
29491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 1999,12, 9,   1420, 9, 1 },
29501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 1, 8,   1420,10, 1 },
29511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 2, 7,   1420,11, 1 },
29521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 3, 7,   1420,12, 1 },
29531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 4, 6,   1421, 1, 1 },
29541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 5, 5,   1421, 2, 1 },
29551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 6, 3,   1421, 3, 1 },
29561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 7, 3,   1421, 4, 1 },
29571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 8, 1,   1421, 5, 1 },
29581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 8,30,   1421, 6, 1 },
29591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000, 9,28,   1421, 7, 1 },
29601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000,10,28,   1421, 8, 1 },
29611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000,11,27,   1421, 9, 1 },
29621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2000,12,27,   1421,10, 1 },
29631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 1,26,   1421,11, 1 },
29641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 2,24,   1421,12, 1 },
29651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 3,26,   1422, 1, 1 },
29661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 4,25,   1422, 2, 1 },
29671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 5,24,   1422, 3, 1 },
29681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 6,22,   1422, 4, 1 },
29691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 7,22,   1422, 5, 1 },
29701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 8,20,   1422, 6, 1 },
29711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001, 9,18,   1422, 7, 1 },
29721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001,10,17,   1422, 8, 1 },
29731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001,11,16,   1422, 9, 1 },
29741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2001,12,16,   1422,10, 1 },
29751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 1,15,   1422,11, 1 },
29761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 2,13,   1422,12, 1 },
29771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 3,15,   1423, 1, 1 },
29781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 4,14,   1423, 2, 1 },
29791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 5,13,   1423, 3, 1 },
29801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 6,12,   1423, 4, 1 },
29811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 7,11,   1423, 5, 1 },
29821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 8,10,   1423, 6, 1 },
29831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002, 9, 8,   1423, 7, 1 },
29841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002,10, 7,   1423, 8, 1 },
29851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002,11, 6,   1423, 9, 1 },
29861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2002,12, 5,   1423,10, 1 },
29871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 1, 4,   1423,11, 1 },
29881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 2, 2,   1423,12, 1 },
29891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 3, 4,   1424, 1, 1 },
29901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 4, 3,   1424, 2, 1 },
29911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 5, 2,   1424, 3, 1 },
29921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 6, 1,   1424, 4, 1 },
29931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 7, 1,   1424, 5, 1 },
29941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 7,30,   1424, 6, 1 },
29951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 8,29,   1424, 7, 1 },
29961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003, 9,27,   1424, 8, 1 },
29971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003,10,26,   1424, 9, 1 },
29981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003,11,25,   1424,10, 1 },
29991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2003,12,24,   1424,11, 1 },
30001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 1,23,   1424,12, 1 },
30011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 2,21,   1425, 1, 1 },
30021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 3,22,   1425, 2, 1 },
30031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 4,20,   1425, 3, 1 },
30041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 5,20,   1425, 4, 1 },
30051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 6,19,   1425, 5, 1 },
30061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 7,18,   1425, 6, 1 },
30071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 8,17,   1425, 7, 1 },
30081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004, 9,15,   1425, 8, 1 },
30091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004,10,15,   1425, 9, 1 },
30101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004,11,14,   1425,10, 1 },
30111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2004,12,13,   1425,11, 1 },
30121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 1,12,   1425,12, 1 },
30131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 2,10,   1426, 1, 1 },
30141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 3,11,   1426, 2, 1 },
30151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 4,10,   1426, 3, 1 },
30161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 5, 9,   1426, 4, 1 },
30171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 6, 8,   1426, 5, 1 },
30181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 7, 7,   1426, 6, 1 },
30191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 8, 6,   1426, 7, 1 },
30201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005, 9, 5,   1426, 8, 1 },
30211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005,10, 4,   1426, 9, 1 },
30221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005,11, 3,   1426,10, 1 },
30231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2005,12, 3,   1426,11, 1 },
30241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 1, 1,   1426,12, 1 },
30251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 1,31,   1427, 1, 1 },
30261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 3, 1,   1427, 2, 1 },
30271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 3,30,   1427, 3, 1 },
30281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 4,29,   1427, 4, 1 },
30291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 5,28,   1427, 5, 1 },
30301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 6,27,   1427, 6, 1 },
30311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 7,26,   1427, 7, 1 },
30321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 8,25,   1427, 8, 1 },
30331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006, 9,24,   1427, 9, 1 },
30341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006,10,23,   1427,10, 1 },
30351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006,11,22,   1427,11, 1 },
30361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2006,12,22,   1427,12, 1 },
30371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 1,20,   1428, 1, 1 },
30381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 2,19,   1428, 2, 1 },
30391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 3,20,   1428, 3, 1 },
30401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 4,18,   1428, 4, 1 },
30411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 5,18,   1428, 5, 1 },
30421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 6,16,   1428, 6, 1 },
30431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 7,15,   1428, 7, 1 },
30441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 8,14,   1428, 8, 1 },
30451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007, 9,13,   1428, 9, 1 },
30461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007,10,13,   1428,10, 1 },
30471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007,11,11,   1428,11, 1 },
30481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2007,12,11,   1428,12, 1 },
30491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 1,10,   1429, 1, 1 },
30501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 2, 8,   1429, 2, 1 },
30511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 3, 9,   1429, 3, 1 },
30521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 4, 7,   1429, 4, 1 },
30531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 5, 6,   1429, 5, 1 },
30541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 6, 5,   1429, 6, 1 },
30551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 7, 4,   1429, 7, 1 },
30561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 8, 2,   1429, 8, 1 },
30571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008, 9, 1,   1429, 9, 1 },
30581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008,10, 1,   1429,10, 1 },
30591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008,10,30,   1429,11, 1 },
30601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008,11,29,   1429,12, 1 },
30611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2008,12,29,   1430, 1, 1 },
30621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 1,27,   1430, 2, 1 },
30631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 2,26,   1430, 3, 1 },
30641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 3,28,   1430, 4, 1 },
30651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 4,26,   1430, 5, 1 },
30661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 5,25,   1430, 6, 1 },
30671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 6,24,   1430, 7, 1 },
30681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 7,23,   1430, 8, 1 },
30691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 8,22,   1430, 9, 1 },
30701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009, 9,20,   1430,10, 1 },
30711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009,10,20,   1430,11, 1 },
30721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009,11,18,   1430,12, 1 },
30731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2009,12,18,   1431, 1, 1 },
30741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 1,16,   1431, 2, 1 },
30751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 2,15,   1431, 3, 1 },
30761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 3,17,   1431, 4, 1 },
30771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 4,15,   1431, 5, 1 },
30781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 5,15,   1431, 6, 1 },
30791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 6,13,   1431, 7, 1 },
30801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 7,13,   1431, 8, 1 },
30811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 8,11,   1431, 9, 1 },
30821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010, 9,10,   1431,10, 1 },
30831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010,10, 9,   1431,11, 1 },
30841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010,11, 7,   1431,12, 1 },
30851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2010,12, 7,   1432, 1, 1 },
30861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 1, 5,   1432, 2, 1 },
30871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 2, 4,   1432, 3, 1 },
30881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 3, 6,   1432, 4, 1 },
30891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 4, 5,   1432, 5, 1 },
30901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 5, 4,   1432, 6, 1 },
30911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 6, 3,   1432, 7, 1 },
30921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 7, 2,   1432, 8, 1 },
30931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 8, 1,   1432, 9, 1 },
30941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 8,30,   1432,10, 1 },
30951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011, 9,29,   1432,11, 1 },
30961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011,10,28,   1432,12, 1 },
30971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011,11,26,   1433, 1, 1 },
30981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2011,12,26,   1433, 2, 1 },
30991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 1,24,   1433, 3, 1 },
31001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 2,23,   1433, 4, 1 },
31011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 3,24,   1433, 5, 1 },
31021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 4,22,   1433, 6, 1 },
31031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 5,22,   1433, 7, 1 },
31041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 6,21,   1433, 8, 1 },
31051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 7,20,   1433, 9, 1 },
31061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 8,19,   1433,10, 1 },
31071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012, 9,17,   1433,11, 1 },
31081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012,10,17,   1433,12, 1 },
31091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012,11,15,   1434, 1, 1 },
31101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2012,12,14,   1434, 2, 1 },
31111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 1,13,   1434, 3, 1 },
31121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 2,11,   1434, 4, 1 },
31131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 3,13,   1434, 5, 1 },
31141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 4,11,   1434, 6, 1 },
31151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 5,11,   1434, 7, 1 },
31161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 6,10,   1434, 8, 1 },
31171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 7, 9,   1434, 9, 1 },
31181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 8, 8,   1434,10, 1 },
31191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013, 9, 7,   1434,11, 1 },
31201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013,10, 6,   1434,12, 1 },
31211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013,11, 4,   1435, 1, 1 },
31221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2013,12, 4,   1435, 2, 1 },
31231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 1, 2,   1435, 3, 1 },
31241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 2, 1,   1435, 4, 1 },
31251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 3, 2,   1435, 5, 1 },
31261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 4, 1,   1435, 6, 1 },
31271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 4,30,   1435, 7, 1 },
31281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 5,30,   1435, 8, 1 },
31291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 6,28,   1435, 9, 1 },
31301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 7,28,   1435,10, 1 },
31311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 8,27,   1435,11, 1 },
31321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014, 9,25,   1435,12, 1 },
31331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014,10,25,   1436, 1, 1 },
31341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014,11,23,   1436, 2, 1 },
31351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2014,12,23,   1436, 3, 1 },
31361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 1,21,   1436, 4, 1 },
31371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 2,20,   1436, 5, 1 },
31381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 3,21,   1436, 6, 1 },
31391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 4,20,   1436, 7, 1 },
31401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 5,19,   1436, 8, 1 },
31411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 6,18,   1436, 9, 1 },
31421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 7,17,   1436,10, 1 },
31431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 8,16,   1436,11, 1 },
31441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015, 9,14,   1436,12, 1 },
31451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015,10,14,   1437, 1, 1 },
31461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015,11,13,   1437, 2, 1 },
31471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2015,12,12,   1437, 3, 1 },
31481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 1,11,   1437, 4, 1 },
31491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 2,10,   1437, 5, 1 },
31501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 3,10,   1437, 6, 1 },
31511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 4, 8,   1437, 7, 1 },
31521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 5, 8,   1437, 8, 1 },
31531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 6, 6,   1437, 9, 1 },
31541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 7, 6,   1437,10, 1 },
31551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 8, 4,   1437,11, 1 },
31561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016, 9, 2,   1437,12, 1 },
31571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016,10, 2,   1438, 1, 1 },
31581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016,11, 1,   1438, 2, 1 },
31591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016,11,30,   1438, 3, 1 },
31601b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2016,12,30,   1438, 4, 1 },
31611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 1,29,   1438, 5, 1 },
31621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 2,28,   1438, 6, 1 },
31631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 3,29,   1438, 7, 1 },
31641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 4,27,   1438, 8, 1 },
31651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 5,27,   1438, 9, 1 },
31661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 6,25,   1438,10, 1 },
31671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 7,24,   1438,11, 1 },
31681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 8,23,   1438,12, 1 },
31691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017, 9,21,   1439, 1, 1 },
31701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017,10,21,   1439, 2, 1 },
31711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017,11,19,   1439, 3, 1 },
31721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2017,12,19,   1439, 4, 1 },
31731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 1,18,   1439, 5, 1 },
31741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 2,17,   1439, 6, 1 },
31751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 3,18,   1439, 7, 1 },
31761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 4,17,   1439, 8, 1 },
31771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 5,16,   1439, 9, 1 },
31781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 6,15,   1439,10, 1 },
31791b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 7,14,   1439,11, 1 },
31801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 8,12,   1439,12, 1 },
31811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2018, 9,11,   1440, 1, 1 },
31821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2019, 8,31,   1441, 1, 1 },
31831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2020, 8,20,   1442, 1, 1 },
31841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2021, 8, 9,   1443, 1, 1 },
31851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2022, 7,30,   1444, 1, 1 },
31861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2023, 7,19,   1445, 1, 1 },
31871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2024, 7, 7,   1446, 1, 1 },
31881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2025, 6,26,   1447, 1, 1 },
31891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2026, 6,16,   1448, 1, 1 },
31901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2027, 6, 6,   1449, 1, 1 },
31911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2028, 5,25,   1450, 1, 1 },
31921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2029, 5,14,   1451, 1, 1 },
31931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2030, 5, 4,   1452, 1, 1 },
31941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2031, 4,23,   1453, 1, 1 },
31951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2032, 4,11,   1454, 1, 1 },
31961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2033, 4, 1,   1455, 1, 1 },
31971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2034, 3,22,   1456, 1, 1 },
31981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2035, 3,11,   1457, 1, 1 },
31991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2036, 2,29,   1458, 1, 1 },
32001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2037, 2,17,   1459, 1, 1 },
32011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2038, 2, 6,   1460, 1, 1 },
32021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2039, 1,26,   1461, 1, 1 },
32031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2040, 1,15,   1462, 1, 1 },
32041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2041, 1, 4,   1463, 1, 1 },
32051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2041,12,25,   1464, 1, 1 },
32061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2042,12,14,   1465, 1, 1 },
32071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2043,12, 3,   1466, 1, 1 },
32081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2044,11,21,   1467, 1, 1 },
32091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2045,11,11,   1468, 1, 1 },
32101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2046,10,31,   1469, 1, 1 },
32111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2047,10,21,   1470, 1, 1 },
32121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2048,10, 9,   1471, 1, 1 },
32131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2049, 9,29,   1472, 1, 1 },
32141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2050, 9,18,   1473, 1, 1 },
32151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2051, 9, 7,   1474, 1, 1 },
32161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2052, 8,26,   1475, 1, 1 },
32171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2053, 8,15,   1476, 1, 1 },
32181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2054, 8, 5,   1477, 1, 1 },
32191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2055, 7,26,   1478, 1, 1 },
32201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2056, 7,14,   1479, 1, 1 },
32211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2057, 7, 3,   1480, 1, 1 },
32221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2058, 6,22,   1481, 1, 1 },
32231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2059, 6,11,   1482, 1, 1 },
32241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2061, 5,21,   1484, 1, 1 },
32251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2063, 4,30,   1486, 1, 1 },
32261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2065, 4, 7,   1488, 1, 1 },
32271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2067, 3,17,   1490, 1, 1 },
32281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2069, 2,23,   1492, 1, 1 },
32291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2071, 2, 2,   1494, 1, 1 },
32301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2073, 1,10,   1496, 1, 1 },
32311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2074,12,20,   1498, 1, 1 },
32321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  { 2076,11,28,   1500, 1, 1 },
32331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert  {    0, 0, 0,      0, 0, 0 }, // terminator
32341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert};
32351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
32361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic const UChar zoneSA[] = {0x41,0x73,0x69,0x61,0x2F,0x52,0x69,0x79,0x61,0x64,0x68,0}; // "Asia/Riyadh"
32371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
323859d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid CalendarTest::TestIslamicUmAlQura() {
323959d709d503bab6e2b61931737e662dd293b40578ccornelius
324059d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
32411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale umalquraLoc("ar_SA@calendar=islamic-umalqura");
32421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Locale gregoLoc("ar_SA@calendar=gregorian");
32431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    TimeZone* tzSA = TimeZone::createTimeZone(UnicodeString(TRUE, zoneSA, -1));
32441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Calendar* tstCal = Calendar::createInstance(*((const TimeZone *)tzSA), umalquraLoc, status);
32451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Calendar* gregCal = Calendar::createInstance(*((const TimeZone *)tzSA), gregoLoc, status);
3246fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
324759d709d503bab6e2b61931737e662dd293b40578ccornelius    IslamicCalendar* iCal = (IslamicCalendar*)tstCal;
324859d709d503bab6e2b61931737e662dd293b40578ccornelius    if(strcmp(iCal->getType(), "islamic-umalqura") != 0) {
324959d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("wrong type of calendar created - %s", iCal->getType());
325059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
325159d709d503bab6e2b61931737e662dd293b40578ccornelius
325259d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t firstYear = 1318;
325359d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t lastYear = 1368;    // just enough to be pretty sure
325459d709d503bab6e2b61931737e662dd293b40578ccornelius    //int32_t lastYear = 1480;    // the whole shootin' match
325559d709d503bab6e2b61931737e662dd293b40578ccornelius
325659d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->clear();
325759d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->setLenient(FALSE);
325859d709d503bab6e2b61931737e662dd293b40578ccornelius
325959d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t day=0, month=0, year=0, initDay = 27, initMonth = IslamicCalendar::RAJAB, initYear = 1434;
326059d709d503bab6e2b61931737e662dd293b40578ccornelius
326159d709d503bab6e2b61931737e662dd293b40578ccornelius    for( int32_t startYear = firstYear; startYear <= lastYear; startYear++) {
326259d709d503bab6e2b61931737e662dd293b40578ccornelius        setAndTestWholeYear(tstCal, startYear, status);
326359d709d503bab6e2b61931737e662dd293b40578ccornelius        status = U_ZERO_ERROR;
326459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
326559d709d503bab6e2b61931737e662dd293b40578ccornelius
326659d709d503bab6e2b61931737e662dd293b40578ccornelius    initMonth = IslamicCalendar::RABI_2;
326759d709d503bab6e2b61931737e662dd293b40578ccornelius    initDay = 5;
326859d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t loopCnt = 25;
326959d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->clear();
327059d709d503bab6e2b61931737e662dd293b40578ccornelius    setAndTestCalendar( tstCal, initMonth, initDay, initYear, status);
327159d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
327259d709d503bab6e2b61931737e662dd293b40578ccornelius
327359d709d503bab6e2b61931737e662dd293b40578ccornelius    for(int x=1; x<=loopCnt; x++) {
327459d709d503bab6e2b61931737e662dd293b40578ccornelius        day = tstCal->get(UCAL_DAY_OF_MONTH,status);
327559d709d503bab6e2b61931737e662dd293b40578ccornelius        month = tstCal->get(UCAL_MONTH,status);
327659d709d503bab6e2b61931737e662dd293b40578ccornelius        year = tstCal->get(UCAL_YEAR,status);
327759d709d503bab6e2b61931737e662dd293b40578ccornelius        TEST_CHECK_STATUS;
327859d709d503bab6e2b61931737e662dd293b40578ccornelius        tstCal->roll(UCAL_DAY_OF_MONTH, (UBool)TRUE, status);
327959d709d503bab6e2b61931737e662dd293b40578ccornelius        TEST_CHECK_STATUS;
328059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
328159d709d503bab6e2b61931737e662dd293b40578ccornelius
328259d709d503bab6e2b61931737e662dd293b40578ccornelius    if(day != (initDay + loopCnt - 1) || month != IslamicCalendar::RABI_2 || year != 1434)
328359d709d503bab6e2b61931737e662dd293b40578ccornelius      errln("invalid values for RABI_2 date after roll of %d", loopCnt);
328459d709d503bab6e2b61931737e662dd293b40578ccornelius
328559d709d503bab6e2b61931737e662dd293b40578ccornelius    status = U_ZERO_ERROR;
328659d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->clear();
328759d709d503bab6e2b61931737e662dd293b40578ccornelius    initMonth = 2;
328859d709d503bab6e2b61931737e662dd293b40578ccornelius    initDay = 30;
328959d709d503bab6e2b61931737e662dd293b40578ccornelius    setAndTestCalendar( tstCal, initMonth, initDay, initYear, status);
329059d709d503bab6e2b61931737e662dd293b40578ccornelius    if(U_SUCCESS(status)) {
329159d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("error NOT detected status %i",status);
329259d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("      init values:\tmonth %i\tday %i\tyear %i", initMonth, initDay, initYear);
329359d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t day = tstCal->get(UCAL_DAY_OF_MONTH, status);
329459d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t month = tstCal->get(UCAL_MONTH, status);
329559d709d503bab6e2b61931737e662dd293b40578ccornelius        int32_t year = tstCal->get(UCAL_YEAR, status);
329659d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("values post set():\tmonth %i\tday %i\tyear %i",month, day, year);
329759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
329859d709d503bab6e2b61931737e662dd293b40578ccornelius
329959d709d503bab6e2b61931737e662dd293b40578ccornelius    status = U_ZERO_ERROR;
330059d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->clear();
330159d709d503bab6e2b61931737e662dd293b40578ccornelius    initMonth = 3;
330259d709d503bab6e2b61931737e662dd293b40578ccornelius    initDay = 30;
330359d709d503bab6e2b61931737e662dd293b40578ccornelius    setAndTestCalendar( tstCal, initMonth, initDay, initYear, status);
330459d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
330559d709d503bab6e2b61931737e662dd293b40578ccornelius
330659d709d503bab6e2b61931737e662dd293b40578ccornelius    SimpleDateFormat* formatter = new SimpleDateFormat("yyyy-MM-dd", Locale::getUS(), status);
330759d709d503bab6e2b61931737e662dd293b40578ccornelius    UDate date = formatter->parse("1975-05-06", status);
33081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    Calendar* is_cal = Calendar::createInstance(umalquraLoc, status);
330959d709d503bab6e2b61931737e662dd293b40578ccornelius    is_cal->setTime(date, status);
331059d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_day = is_cal->get(UCAL_DAY_OF_MONTH,status);
331159d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_month = is_cal->get(UCAL_MONTH,status);
331259d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_year = is_cal->get(UCAL_YEAR,status);
331359d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
3314f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    if(is_day != 24 || is_month != IslamicCalendar::RABI_2 || is_year != 1395)
3315f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        errln("unexpected conversion date month %i not %i or day %i not 24 or year %i not 1395", is_month, IslamicCalendar::RABI_2, is_day, is_year);
331659d709d503bab6e2b61931737e662dd293b40578ccornelius
331759d709d503bab6e2b61931737e662dd293b40578ccornelius    UDate date2 = is_cal->getTime(status);
331859d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
331959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(date2 != date) {
332059d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("before(%f) and after(%f) dates don't match up!",date, date2);
332159d709d503bab6e2b61931737e662dd293b40578ccornelius    }
33221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert
33231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    // check against data
33241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    const GregoUmmAlQuraMap* guMapPtr;
33251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    gregCal->clear();
33261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    tstCal->clear();
33271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    for (guMapPtr = guMappings; guMapPtr->gYear != 0; guMapPtr++) {
33281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        status = U_ZERO_ERROR;
33291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        gregCal->set(guMapPtr->gYear, guMapPtr->gMon - 1, guMapPtr->gDay, 12, 0);
33301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        date = gregCal->getTime(status);
33311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        tstCal->setTime(date, status);
33321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t uYear = tstCal->get(UCAL_YEAR, status);
33331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t uMon = tstCal->get(UCAL_MONTH, status) + 1;
33341b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        int32_t uDay = tstCal->get(UCAL_DATE, status);
33351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        if(U_FAILURE(status)) {
33361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("For gregorian %4d-%02d-%02d, get status %s",
33371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    guMapPtr->gYear, guMapPtr->gMon, guMapPtr->gDay, u_errorName(status) );
33381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        } else if (uYear != guMapPtr->uYear || uMon != guMapPtr->uMon || uDay != guMapPtr->uDay) {
33391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert            errln("For gregorian %4d-%02d-%02d, expect umalqura %4d-%02d-%02d, get %4d-%02d-%02d",
33401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    guMapPtr->gYear, guMapPtr->gMon, guMapPtr->gDay,
33411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert                    guMapPtr->uYear, guMapPtr->uMon, guMapPtr->uDay, uYear, uMon, uDay );
33421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert        }
33431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    }
334459d709d503bab6e2b61931737e662dd293b40578ccornelius
334559d709d503bab6e2b61931737e662dd293b40578ccornelius    delete is_cal;
334659d709d503bab6e2b61931737e662dd293b40578ccornelius    delete formatter;
33471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    delete gregCal;
334859d709d503bab6e2b61931737e662dd293b40578ccornelius    delete tstCal;
33491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert    delete tzSA;
335059d709d503bab6e2b61931737e662dd293b40578ccornelius}
335159d709d503bab6e2b61931737e662dd293b40578ccornelius
335259d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid CalendarTest::TestIslamicTabularDates() {
335359d709d503bab6e2b61931737e662dd293b40578ccornelius    UErrorCode status = U_ZERO_ERROR;
335459d709d503bab6e2b61931737e662dd293b40578ccornelius    Locale islamicLoc("ar_SA@calendar=islamic-civil");
335559d709d503bab6e2b61931737e662dd293b40578ccornelius    Locale tblaLoc("ar_SA@calendar=islamic-tbla");
3356fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    SimpleDateFormat* formatter = new SimpleDateFormat("yyyy-MM-dd", Locale::getUS(), status);
335759d709d503bab6e2b61931737e662dd293b40578ccornelius    UDate date = formatter->parse("1975-05-06", status);
335859d709d503bab6e2b61931737e662dd293b40578ccornelius
335959d709d503bab6e2b61931737e662dd293b40578ccornelius    Calendar* tstCal = Calendar::createInstance(islamicLoc, status);
336059d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->setTime(date, status);
336159d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_day = tstCal->get(UCAL_DAY_OF_MONTH,status);
336259d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_month = tstCal->get(UCAL_MONTH,status);
336359d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t is_year = tstCal->get(UCAL_YEAR,status);
336459d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
336559d709d503bab6e2b61931737e662dd293b40578ccornelius    delete tstCal;
336659d709d503bab6e2b61931737e662dd293b40578ccornelius
336759d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal = Calendar::createInstance(tblaLoc, status);
336859d709d503bab6e2b61931737e662dd293b40578ccornelius    tstCal->setTime(date, status);
336959d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t tbla_day = tstCal->get(UCAL_DAY_OF_MONTH,status);
337059d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t tbla_month = tstCal->get(UCAL_MONTH,status);
337159d709d503bab6e2b61931737e662dd293b40578ccornelius    int32_t tbla_year = tstCal->get(UCAL_YEAR,status);
337259d709d503bab6e2b61931737e662dd293b40578ccornelius    TEST_CHECK_STATUS;
337359d709d503bab6e2b61931737e662dd293b40578ccornelius
337459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(tbla_month != is_month || tbla_year != is_year)
337559d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("unexpected difference between islamic and tbla month %d : %d and/or year %d : %d",tbla_month,is_month,tbla_year,is_year);
337659d709d503bab6e2b61931737e662dd293b40578ccornelius
337759d709d503bab6e2b61931737e662dd293b40578ccornelius    if(tbla_day - is_day != 1)
337859d709d503bab6e2b61931737e662dd293b40578ccornelius        errln("unexpected day difference between islamic and tbla: %d : %d ",tbla_day,is_day);
337959d709d503bab6e2b61931737e662dd293b40578ccornelius    delete tstCal;
338059d709d503bab6e2b61931737e662dd293b40578ccornelius    delete formatter;
338159d709d503bab6e2b61931737e662dd293b40578ccornelius}
338259d709d503bab6e2b61931737e662dd293b40578ccornelius
3383fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CalendarTest::TestHebrewMonthValidation() {
3384fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
3385fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    LocalPointer<Calendar>  cal(Calendar::createInstance(Locale::createFromName("he_IL@calendar=hebrew"), status));
3386fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (failure(status, "Calendar::createInstance, locale:he_IL@calendar=hebrew", TRUE)) return;
3387fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    Calendar *pCal = cal.getAlias();
3388fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UDate d;
3390fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    pCal->setLenient(FALSE);
3391fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3392fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // 5776 is a leap year and has month Adar I
3393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    pCal->set(5776, HebrewCalendar::ADAR_1, 1);
3394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    d = pCal->getTime(status);
3395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(status)) {
3396fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Fail: 5776 Adar I 1 is a valid date.");
3397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
3398fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    status = U_ZERO_ERROR;
3399fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3400fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // 5777 is NOT a lear year and does not have month Adar I
3401fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    pCal->set(5777, HebrewCalendar::ADAR_1, 1);
3402fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    d = pCal->getTime(status);
3403fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    (void)d;
3404fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (status == U_ILLEGAL_ARGUMENT_ERROR) {
3405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        logln("Info: U_ILLEGAL_ARGUMENT_ERROR, because 5777 Adar I 1 is not a valid date.");
3406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    } else {
3407fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        errln("Fail: U_ILLEGAL_ARGUMENT_ERROR should be set for input date 5777 Adar I 1.");
3408fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
3409fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
3410fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3411fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CalendarTest::TestWeekData() {
3412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Each line contains two locales using the same set of week rule data.
3413fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char* LOCALE_PAIRS[] = {
3414fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "en",       "en_US",
3415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "de",       "de_DE",
3416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "de_DE",    "en_DE",
3417fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "en_GB",    "und_GB",
3418fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "ar_EG",    "en_EG",
3419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        "ar_SA",    "fr_SA",
3420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        0
3421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    };
3422fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3423fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status;
3424fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3425fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (int32_t i = 0; LOCALE_PAIRS[i] != 0; i += 2) {
3426fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        status = U_ZERO_ERROR;
3427fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        LocalPointer<Calendar>  cal1(Calendar::createInstance(LOCALE_PAIRS[i], status));
3428fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        LocalPointer<Calendar>  cal2(Calendar::createInstance(LOCALE_PAIRS[i + 1], status));
3429f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius        TEST_CHECK_STATUS_LOCALE(LOCALE_PAIRS[i]);
3430fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3431fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // First day of week
3432fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UCalendarDaysOfWeek dow1 = cal1->getFirstDayOfWeek(status);
3433fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        UCalendarDaysOfWeek dow2 = cal2->getFirstDayOfWeek(status);
3434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        TEST_CHECK_STATUS;
3435fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        TEST_ASSERT(dow1 == dow2);
3436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // Minimum days in first week
3438fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        uint8_t minDays1 = cal1->getMinimalDaysInFirstWeek();
3439fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        uint8_t minDays2 = cal2->getMinimalDaysInFirstWeek();
3440fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        TEST_ASSERT(minDays1 == minDays2);
3441fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3442fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        // Weekdays and Weekends
3443fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        for (int32_t d = UCAL_SUNDAY; d <= UCAL_SATURDAY; d++) {
3444fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            status = U_ZERO_ERROR;
3445fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UCalendarWeekdayType wdt1 = cal1->getDayOfWeekType((UCalendarDaysOfWeek)d, status);
3446fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            UCalendarWeekdayType wdt2 = cal2->getDayOfWeekType((UCalendarDaysOfWeek)d, status);
3447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TEST_CHECK_STATUS;
3448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TEST_ASSERT(wdt1 == wdt2);
3449fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
3450fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
3451fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
3452fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliustypedef struct {
3454fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const char* zone;
3455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const CalFields base;
3456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    int32_t deltaDays;
3457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UCalendarWallTimeOption skippedWTOpt;
3458fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const CalFields expected;
3459fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} TestAddAcrossZoneTransitionData;
3460fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3461fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic const TestAddAcrossZoneTransitionData AAZTDATA[] =
3462fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
3463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Time zone                Base wall time                      day(s)  Skipped time options
3464fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    //                          Expected wall time
3465fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3466fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Add 1 day, from the date before DST transition
3467fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,1,59,59,999),    1,      UCAL_WALLTIME_FIRST,
3468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3470fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,1,59,59,999),    1,      UCAL_WALLTIME_LAST,
3471fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3472fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3473fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,1,59,59,999),    1,      UCAL_WALLTIME_NEXT_VALID,
3474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3477fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,0,0,0),        1,      UCAL_WALLTIME_FIRST,
3478fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,0,0,0)},
3479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3480fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,0,0,0),        1,      UCAL_WALLTIME_LAST,
3481fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3482fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3483fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,0,0,0),        1,      UCAL_WALLTIME_NEXT_VALID,
3484fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3486fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3487fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,30,0,0),       1,      UCAL_WALLTIME_FIRST,
3488fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,30,0,0)},
3489fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3490fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,30,0,0),       1,      UCAL_WALLTIME_LAST,
3491fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,30,0,0)},
3492fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3493fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,2,30,0,0),       1,      UCAL_WALLTIME_NEXT_VALID,
3494fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3495fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3496fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3497fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,3,0,0,0),        1,      UCAL_WALLTIME_FIRST,
3498fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3499fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3500fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,3,0,0,0),        1,      UCAL_WALLTIME_LAST,
3501fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3502fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,8,3,0,0,0),        1,      UCAL_WALLTIME_NEXT_VALID,
3504fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3505fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3506fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Subtract 1 day, from one day after DST transition
3507fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,1,59,59,999),   -1,     UCAL_WALLTIME_FIRST,
3508fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3510fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,1,59,59,999),   -1,     UCAL_WALLTIME_LAST,
3511fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3512fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3513fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,1,59,59,999),   -1,     UCAL_WALLTIME_NEXT_VALID,
3514fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,59,59,999)},
3515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3516fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3517fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,0,0,0),       -1,     UCAL_WALLTIME_FIRST,
3518fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,0,0,0)},
3519fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3520fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,0,0,0),       -1,     UCAL_WALLTIME_LAST,
3521fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3522fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3523fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,0,0,0),       -1,     UCAL_WALLTIME_NEXT_VALID,
3524fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3525fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3526fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3527fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,30,0,0),      -1,     UCAL_WALLTIME_FIRST,
3528fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,1,30,0,0)},
3529fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3530fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,30,0,0),      -1,     UCAL_WALLTIME_LAST,
3531fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,30,0,0)},
3532fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3533fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,2,30,0,0),      -1,     UCAL_WALLTIME_NEXT_VALID,
3534fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3535fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3536fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3537fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,3,0,0,0),       -1,     UCAL_WALLTIME_FIRST,
3538fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3539fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3540fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,3,0,0,0),       -1,     UCAL_WALLTIME_LAST,
3541fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3542fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3543fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Los_Angeles",     CalFields(2014,3,10,3,0,0,0),       -1,     UCAL_WALLTIME_NEXT_VALID,
3544fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2014,3,9,3,0,0,0)},
3545fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3546fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3547fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Test case for ticket#10544
3548fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,0,0,0),       134,    UCAL_WALLTIME_FIRST,
3549fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,7,23,0,0,0)},
3550fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3551fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,0,0,0),       134,    UCAL_WALLTIME_LAST,
3552fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,8,1,0,0,0)},
3553fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3554fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,0,0,0),       134,    UCAL_WALLTIME_NEXT_VALID,
3555fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,8,1,0,0,0)},
3556fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3557fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3558fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,30,0,0),      134,    UCAL_WALLTIME_FIRST,
3559fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,7,23,30,0,0)},
3560fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3561fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,30,0,0),      134,    UCAL_WALLTIME_LAST,
3562fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,8,1,30,0,0)},
3563fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3564fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"America/Santiago",        CalFields(2013,4,27,0,30,0,0),      134,    UCAL_WALLTIME_NEXT_VALID,
3565fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,9,8,1,0,0,0)},
3566fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3567fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3568fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Extreme transition - Pacific/Apia completely skips 2011-12-30
3569fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,29,0,0,0,0),      1,      UCAL_WALLTIME_FIRST,
3570fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,31,0,0,0,0)},
3571fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3572fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,29,0,0,0,0),      1,      UCAL_WALLTIME_LAST,
3573fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,31,0,0,0,0)},
3574fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3575fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,29,0,0,0,0),      1,      UCAL_WALLTIME_NEXT_VALID,
3576fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,31,0,0,0,0)},
3577fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3578fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3579fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,31,12,0,0,0),     -1,     UCAL_WALLTIME_FIRST,
3580fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,29,12,0,0,0)},
3581fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3582fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,31,12,0,0,0),     -1,     UCAL_WALLTIME_LAST,
3583fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,29,12,0,0,0)},
3584fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3585fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Pacific/Apia",            CalFields(2011,12,31,12,0,0,0),     -1,     UCAL_WALLTIME_NEXT_VALID,
3586fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2011,12,29,12,0,0,0)},
3587fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3588fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3589fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // 30 minutes DST - Australia/Lord_Howe
3590fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Australia/Lord_Howe",     CalFields(2013,10,5,2,15,0,0),      1,      UCAL_WALLTIME_FIRST,
3591fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,10,6,1,45,0,0)},
3592fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3593fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Australia/Lord_Howe",     CalFields(2013,10,5,2,15,0,0),      1,      UCAL_WALLTIME_LAST,
3594fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,10,6,2,45,0,0)},
3595fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3596fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {"Australia/Lord_Howe",     CalFields(2013,10,5,2,15,0,0),      1,      UCAL_WALLTIME_NEXT_VALID,
3597fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                                CalFields(2013,10,6,2,30,0,0)},
3598fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3599fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    {NULL, CalFields(0,0,0,0,0,0,0), 0, UCAL_WALLTIME_LAST, CalFields(0,0,0,0,0,0,0)}
3600fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius};
3601fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3602fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid CalendarTest::TestAddAcrossZoneTransition() {
3603fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UErrorCode status = U_ZERO_ERROR;
3604fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    GregorianCalendar cal(status);
3605fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    TEST_CHECK_STATUS;
3606fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3607fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    for (int32_t i = 0; AAZTDATA[i].zone; i++) {
3608fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        status = U_ZERO_ERROR;
3609fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        TimeZone *tz = TimeZone::createTimeZone(AAZTDATA[i].zone);
3610fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        cal.adoptTimeZone(tz);
3611fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        cal.setSkippedWallTimeOption(AAZTDATA[i].skippedWTOpt);
3612fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        AAZTDATA[i].base.setTo(cal);
3613fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        cal.add(UCAL_DATE, AAZTDATA[i].deltaDays, status);
3614fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        TEST_CHECK_STATUS;
3615fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
3616fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (!AAZTDATA[i].expected.isEquivalentTo(cal, status)) {
3617fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            CalFields res(cal, status);
3618fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            TEST_CHECK_STATUS;
3619fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            char buf[32];
3620fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            const char *optDisp = AAZTDATA[i].skippedWTOpt == UCAL_WALLTIME_FIRST ? "FIRST" :
3621fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                    AAZTDATA[i].skippedWTOpt == UCAL_WALLTIME_LAST ? "LAST" : "NEXT_VALID";
3622fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            dataerrln(UnicodeString("Error: base:") + AAZTDATA[i].base.toString(buf, sizeof(buf)) + ", tz:" + AAZTDATA[i].zone
3623fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        + ", delta:" + AAZTDATA[i].deltaDays + " day(s), opt:" + optDisp
3624fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        + ", result:" + res.toString(buf, sizeof(buf))
3625fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                        + " - expected:" + AAZTDATA[i].expected.toString(buf, sizeof(buf)));
3626fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        }
3627fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
3628fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
362959d709d503bab6e2b61931737e662dd293b40578ccornelius
3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
3633