Home | History | Annotate | Download | only in intltest
      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  */
     22 class CalendarLimitTest: public CalendarTimeZoneTest {
     23     // IntlTest override
     24     void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );
     25 public: // 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 
     34 public:
     35     // test behaviour and error reporting at boundaries of defined range
     36     virtual void TestCalendarExtremeLimit(void);
     37 
     38     void TestLimits(void);
     39 
     40 private:
     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