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