1/********************************************************************
2 * COPYRIGHT:
3 * Copyright (c) 1997-2010, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 ********************************************************************/
6
7#ifndef __CalendarLimitTest__
8#define __CalendarLimitTest__
9
10#include "unicode/utypes.h"
11
12#if !UCONFIG_NO_FORMATTING
13
14#include "caltztst.h"
15
16/**
17 * This test verifies the behavior of Calendar around the very earliest limits
18 * which it can handle.  It also verifies the behavior for large values of millis.
19 *
20 * Bug ID 4033662.
21 */
22class CalendarLimitTest: public CalendarTimeZoneTest {
23    // IntlTest override
24    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
25public: // package
26    //test routine used by TestCalendarLimit
27    virtual void test(UDate millis, Calendar *cal, DateFormat *fmt);
28
29    // bug 986c: deprecate nextDouble/previousDouble
30    //static double nextDouble(double a);
31    //static double previousDouble(double a);
32    static UBool withinErr(double a, double b, double err);
33
34public:
35    // test behaviour and error reporting at boundaries of defined range
36    virtual void TestCalendarExtremeLimit(void);
37
38    void TestLimits(void);
39
40private:
41    /*
42     * Test the functions getMaximum/getGeratestMinimum logically correct.
43     * This method assumes day of week cycle is consistent.
44     * @param cal The calendar instance to be tested.
45     * @param leapMonth true if the calendar system has leap months
46     */
47    void doTheoreticalLimitsTest(Calendar& cal, UBool leapMonth);
48
49    /*
50     * Test the functions getXxxMinimum() and getXxxMaximum() by marching a
51     * test calendar 'cal' through 'numberOfDays' sequential days starting
52     * with 'startDate'.  For each date, read a field value along with its
53     * reported actual minimum and actual maximum.  These values are
54     * checked against one another as well as against getMinimum(),
55     * getGreatestMinimum(), getLeastMaximum(), and getMaximum().  We
56     * expect to see:
57     *
58     * 1. minimum <= actualMinimum <= greatestMinimum <=
59     *    leastMaximum <= actualMaximum <= maximum
60     *
61     * 2. actualMinimum <= value <= actualMaximum
62     *
63     * Note: In addition to outright failures, this test reports some
64     * results as warnings.  These are not generally of concern, but they
65     * should be evaluated by a human.  To see these, run this test in
66     * verbose mode.
67     * @param cal the calendar to be tested
68     * @param fieldsToTest an array of field values to be tested, e.g., new
69     * int[] { UCAL_MONTH, UCAL_DAY_OF_MONTH }.  It only makes
70     * sense to test the day fields; the time fields are not tested by this
71     * method.  If null, then test all standard fields.
72     * @param startDate the first date to test
73     * @param testDuration if positive, the number of days to be tested.
74     * If negative, the number of seconds to run the test.
75     */
76    void doLimitsTest(Calendar& cal, const int32_t* fieldsToTest, UDate startDate, int32_t testDuration);
77
78    /**
79     * doLimitsTest with default test duration and fields
80     */
81    void doLimitsTest(Calendar& cal, UDate startDate, int32_t endTime);
82
83    UnicodeString& ymdToString(const Calendar& cal, UnicodeString& str);
84};
85
86#endif /* #if !UCONFIG_NO_FORMATTING */
87
88#endif // __CalendarLimitTest__
89