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