1/***********************************************************************
2 * Copyright (c) 1997-2013, International Business Machines Corporation
3 * and others. All Rights Reserved.
4 ***********************************************************************/
5
6#ifndef __CalendarTest__
7#define __CalendarTest__
8
9#include "unicode/utypes.h"
10
11#if !UCONFIG_NO_FORMATTING
12
13#include "unicode/calendar.h"
14#include "unicode/smpdtfmt.h"
15#include "caltztst.h"
16
17class CalendarTest: public CalendarTimeZoneTest {
18public:
19    // IntlTest override
20    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
21public:
22    /**
23     * This test confirms the correct behavior of add when incrementing
24     * through subsequent days.
25     */
26    virtual void TestRog(void);
27    /**
28     * Test the handling of the day of the week, checking for correctness and
29     * for correct minimum and maximum values.
30     */
31    virtual void TestDOW943(void);
32    /**
33     * test subroutine use by TestDOW943
34     */
35    void dowTest(UBool lenient);
36    /**
37     * Confirm that cloned Calendar objects do not inadvertently share substructures.
38     */
39    virtual void TestClonesUnique908(void);
40    /**
41     * Confirm that the Gregorian cutoff value works as advertised.
42     */
43    virtual void TestGregorianChange768(void);
44    /**
45     * Confirm the functioning of the field disambiguation algorithm.
46     */
47    virtual void TestDisambiguation765(void);
48    /**
49     * Test various API methods for API completeness.
50     */
51    virtual void TestGenericAPI(void); // New to C++ -- needs to be back ported to Java
52
53    virtual void TestWOY(void);
54
55    virtual void TestDebug(void);
56
57public: // package
58    /**
59     * test subroutine used by TestDisambiguation765
60     */
61    virtual void verify765(const UnicodeString& msg, Calendar* c, int32_t year, int32_t month, int32_t day);
62    /**
63     * test subroutine used by TestDisambiguation765
64     */
65    virtual void verify765(const UnicodeString& msg/*, IllegalArgumentException e*/, UErrorCode status);
66
67public:
68    /**
69     * Confirm that the offset between local time and GMT behaves as expected.
70     */
71    virtual void TestGMTvsLocal4064654(void);
72
73public: // package
74    /**
75     * test subroutine used by TestGMTvsLocal4064654
76     */
77    virtual void test4064654(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn, int32_t sc);
78
79public:
80    /**
81     * The operations of adding and setting should not exhibit pathological
82     * dependence on the order of operations.  This test checks for this.
83     */
84    virtual void TestAddSetOrder621(void);
85    /**
86     * Confirm that adding to various fields works.
87     */
88    virtual void TestAdd520(void);
89    /**
90     * Execute and test adding and rolling in GregorianCalendar extensively.
91     */
92    virtual void TestAddRollExtensive(void);
93
94public: // package
95    // internal utility routine for checking date
96    virtual void check520(Calendar* c,
97                            int32_t y, int32_t m, int32_t d,
98                            int32_t hr, int32_t min, int32_t sec,
99                            int32_t ms, UCalendarDateFields field);
100
101    virtual void check520(Calendar* c,
102                            int32_t y, int32_t m, int32_t d);
103
104public:
105    /**
106     * Test that setting of fields works.  In particular, make sure that all instances
107     * of GregorianCalendar don't share a static instance of the fields array.
108     */
109    virtual void TestFieldSet4781(void);
110/*    virtual void TestSerialize337();
111
112public: // package
113    static UnicodeString& PREFIX;
114    static UnicodeString& POSTFIX;
115    static UnicodeString& FILENAME;
116*/
117public:
118    /**
119     * Verify that the seconds of a Calendar can be zeroed out through the
120     * expected sequence of operations.
121     */
122    virtual void TestSecondsZero121(void);
123    /**
124     * Verify that a specific sequence of adding and setting works as expected;
125     * it should not vary depending on when and whether the get method is
126     * called.
127     */
128    virtual void TestAddSetGet0610(void);
129
130public: // package
131    // internal routine for checking date
132    static UnicodeString value(Calendar* calendar);
133
134public:
135    /**
136     * Verify that various fields on a known date are set correctly.
137     */
138    virtual void TestFields060(void);
139
140public: // package
141    static int32_t EXPECTED_FIELDS[];
142    static const int32_t EXPECTED_FIELDS_length;
143
144public:
145    /**
146     * Verify that various fields on a known date are set correctly.  In this
147     * case, the start of the epoch (January 1 1970).
148     */
149    virtual void TestEpochStartFields(void);
150
151public: // package
152    static int32_t EPOCH_FIELDS[];
153
154public:
155    /**
156     * Test that the days of the week progress properly when add is called repeatedly
157     * for increments of 24 days.
158     */
159    virtual void TestDOWProgression(void);
160    /**
161     * Test newly added fields - DOW_LOCAL and YEAR_WOY
162     */
163    virtual void TestDOW_LOCALandYEAR_WOY(void);
164    // test subroutine used by TestDOW_LOCALandYEAR_WOY
165    virtual void doYEAR_WOYLoop(Calendar *cal,
166        SimpleDateFormat *sdf, int32_t times, UErrorCode& status);
167    // test subroutine used by TestDOW_LOCALandYEAR_WOY
168    virtual void loop_addroll(Calendar *cal, /*SimpleDateFormat *sdf, */
169        int times, UCalendarDateFields field, UCalendarDateFields field2,
170        UErrorCode& errorCode);
171
172    void TestYWOY(void);
173    void TestJD(void);
174
175    void yearAddTest(Calendar& cal, UErrorCode& status);
176
177public: // package
178    // test subroutine use by TestDOWProgression
179    virtual void marchByDelta(Calendar* cal, int32_t delta);
180
181 public:
182    // for other tests' use
183    static UnicodeString fieldName(UCalendarDateFields f);
184    static UnicodeString calToStr(const Calendar & cal);
185
186    // List of non-installed locales with interesting calendars
187
188    /**
189     * @return the count of 'other' locales to test
190     */
191    static int32_t testLocaleCount();
192
193    /**
194     * @param i index of 'other' locale to return
195     * @return locale ID
196     */
197    static const char* testLocaleID(int32_t i);
198
199    /**
200     * Clone the specified calendar, and determine its earliest supported date
201     * by setting the extended year to the minimum value.
202     * @param cal Calendar (will be cloned)
203     * @param isGregorian output: returns 'TRUE' if the calendar's class is GregorianCalendar
204     * @param status error code
205     */
206    static UDate minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status);
207
208    /**
209     * Construct a calendar of the specified locale, and determine its earliest supported date
210     * by setting the extended year to the minimum value.
211     * @param locale locale of calendar to check
212     * @param isGregorian output: returns 'TRUE' if the calendar's class is GregorianCalendar
213     * @param status error code
214     */
215    static UDate minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status);
216
217  // internal - for other test use
218 public:
219    void Test6703(void);
220    void Test3785(void);
221    void Test1624(void);
222    void TestIslamicUmAlQura(void);
223    void TestIslamicTabularDates(void);
224
225    /**
226     * Test the time stamp array recalculation during heavy Calendar usage
227     */
228    void TestTimeStamp(void);
229    /**
230     * Test the ISO8601 calendar type
231     */
232    void TestISO8601(void);
233
234    /**
235     * Test cases for [set|get][Repeated|Skipped]WallTimeOption
236     */
237    void TestAmbiguousWallTimeAPIs(void);
238    void TestRepeatedWallTime(void);
239    void TestSkippedWallTime(void);
240
241    void TestCloneLocale(void);
242
243    /*
244     * utility methods for TestIslamicUmAlQura
245     */
246    void setAndTestCalendar(Calendar* cal, int32_t initMonth, int32_t initDay, int32_t initYear, UErrorCode& status);
247    void setAndTestWholeYear(Calendar* cal, int32_t startYear, UErrorCode& status);
248
249};
250
251#endif /* #if !UCONFIG_NO_FORMATTING */
252
253#endif // __CalendarTest__
254