/********************************************************************
* COPYRIGHT:
* Copyright (c) 1997-2010, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
#ifndef __CalendarLimitTest__
#define __CalendarLimitTest__
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "caltztst.h"
/**
* This test verifies the behavior of Calendar around the very earliest limits
* which it can handle. It also verifies the behavior for large values of millis.
*
* Bug ID 4033662.
*/
class CalendarLimitTest: public CalendarTimeZoneTest {
// IntlTest override
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
public: // package
//test routine used by TestCalendarLimit
virtual void test(UDate millis, Calendar *cal, DateFormat *fmt);
// bug 986c: deprecate nextDouble/previousDouble
//static double nextDouble(double a);
//static double previousDouble(double a);
static UBool withinErr(double a, double b, double err);
public:
// test behaviour and error reporting at boundaries of defined range
virtual void TestCalendarExtremeLimit(void);
void TestLimits(void);
private:
/*
* Test the functions getMaximum/getGeratestMinimum logically correct.
* This method assumes day of week cycle is consistent.
* @param cal The calendar instance to be tested.
* @param leapMonth true if the calendar system has leap months
*/
void doTheoreticalLimitsTest(Calendar& cal, UBool leapMonth);
/*
* Test the functions getXxxMinimum() and getXxxMaximum() by marching a
* test calendar 'cal' through 'numberOfDays' sequential days starting
* with 'startDate'. For each date, read a field value along with its
* reported actual minimum and actual maximum. These values are
* checked against one another as well as against getMinimum(),
* getGreatestMinimum(), getLeastMaximum(), and getMaximum(). We
* expect to see:
*
* 1. minimum <= actualMinimum <= greatestMinimum <=
* leastMaximum <= actualMaximum <= maximum
*
* 2. actualMinimum <= value <= actualMaximum
*
* Note: In addition to outright failures, this test reports some
* results as warnings. These are not generally of concern, but they
* should be evaluated by a human. To see these, run this test in
* verbose mode.
* @param cal the calendar to be tested
* @param fieldsToTest an array of field values to be tested, e.g., new
* int[] { UCAL_MONTH, UCAL_DAY_OF_MONTH }. It only makes
* sense to test the day fields; the time fields are not tested by this
* method. If null, then test all standard fields.
* @param startDate the first date to test
* @param testDuration if positive, the number of days to be tested.
* If negative, the number of seconds to run the test.
*/
void doLimitsTest(Calendar& cal, const int32_t* fieldsToTest, UDate startDate, int32_t testDuration);
/**
* doLimitsTest with default test duration and fields
*/
void doLimitsTest(Calendar& cal, UDate startDate, int32_t endTime);
UnicodeString& ymdToString(const Calendar& cal, UnicodeString& str);
};
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif // __CalendarLimitTest__