blob: cd1576a68d2706460d1ee59043968cdc4f645a45 [file] [log] [blame]
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/***********************************************************************
* Copyright (c) 1997-2016, International Business Machines Corporation
* and others. All Rights Reserved.
***********************************************************************/
#ifndef __CalendarTest__
#define __CalendarTest__
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/calendar.h"
#include "unicode/smpdtfmt.h"
#include "caltztst.h"
class CalendarTest: public CalendarTimeZoneTest {
public:
// IntlTest override
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) override;
public:
/**
* This test confirms the correct behavior of add when incrementing
* through subsequent days.
*/
virtual void TestRog();
/**
* Test the handling of the day of the week, checking for correctness and
* for correct minimum and maximum values.
*/
virtual void TestDOW943();
/**
* test subroutine use by TestDOW943
*/
void dowTest(UBool lenient);
/**
* Confirm that cloned Calendar objects do not inadvertently share substructures.
*/
virtual void TestClonesUnique908();
/**
* Confirm that the Gregorian cutoff value works as advertised.
*/
virtual void TestGregorianChange768();
/**
* Confirm the functioning of the field disambiguation algorithm.
*/
virtual void TestDisambiguation765();
/**
* Test various API methods for API completeness.
*/
virtual void TestGenericAPI(); // New to C++ -- needs to be back ported to Java
virtual void TestWOY();
virtual void TestDebug();
virtual void TestClearMonth();
public: // package
/**
* test subroutine used by TestDisambiguation765
*/
virtual void verify765(const UnicodeString& msg, Calendar* c, int32_t year, int32_t month, int32_t day);
/**
* test subroutine used by TestDisambiguation765
*/
virtual void verify765(const UnicodeString& msg/*, IllegalArgumentException e*/, UErrorCode status);
public:
/**
* Confirm that the offset between local time and GMT behaves as expected.
*/
virtual void TestGMTvsLocal4064654();
public: // package
/**
* test subroutine used by TestGMTvsLocal4064654
*/
virtual void test4064654(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn, int32_t sc);
public:
/**
* The operations of adding and setting should not exhibit pathological
* dependence on the order of operations. This test checks for this.
*/
virtual void TestAddSetOrder621();
/**
* Confirm that adding to various fields works.
*/
virtual void TestAdd520();
/**
* Execute and test adding and rolling in GregorianCalendar extensively.
*/
virtual void TestAddRollExtensive();
public: // package
// internal utility routine for checking date
virtual void check520(Calendar* c,
int32_t y, int32_t m, int32_t d,
int32_t hr, int32_t min, int32_t sec,
int32_t ms, UCalendarDateFields field);
virtual void check520(Calendar* c,
int32_t y, int32_t m, int32_t d);
public:
/**
* Test that setting of fields works. In particular, make sure that all instances
* of GregorianCalendar don't share a static instance of the fields array.
*/
virtual void TestFieldSet4781();
/* virtual void TestSerialize337();
public: // package
static UnicodeString& PREFIX;
static UnicodeString& POSTFIX;
static UnicodeString& FILENAME;
*/
public:
/**
* Verify that the seconds of a Calendar can be zeroed out through the
* expected sequence of operations.
*/
virtual void TestSecondsZero121();
/**
* Verify that a specific sequence of adding and setting works as expected;
* it should not vary depending on when and whether the get method is
* called.
*/
virtual void TestAddSetGet0610();
public: // package
// internal routine for checking date
static UnicodeString value(Calendar* calendar);
public:
/**
* Verify that various fields on a known date are set correctly.
*/
virtual void TestFields060();
public: // package
static int32_t EXPECTED_FIELDS[];
static const int32_t EXPECTED_FIELDS_length;
public:
/**
* Verify that various fields on a known date are set correctly. In this
* case, the start of the epoch (January 1 1970).
*/
virtual void TestEpochStartFields();
public: // package
static int32_t EPOCH_FIELDS[];
public:
/**
* Test that the days of the week progress properly when add is called repeatedly
* for increments of 24 days.
*/
virtual void TestDOWProgression();
/**
* Test newly added fields - DOW_LOCAL and YEAR_WOY
*/
virtual void TestDOW_LOCALandYEAR_WOY();
// test subroutine used by TestDOW_LOCALandYEAR_WOY
virtual void doYEAR_WOYLoop(Calendar *cal,
SimpleDateFormat *sdf, int32_t times, UErrorCode& status);
// test subroutine used by TestDOW_LOCALandYEAR_WOY
virtual void loop_addroll(Calendar *cal, /*SimpleDateFormat *sdf, */
int times, UCalendarDateFields field, UCalendarDateFields field2,
UErrorCode& errorCode);
void TestYWOY();
void TestJD();
void yearAddTest(Calendar& cal, UErrorCode& status);
public: // package
// test subroutine use by TestDOWProgression
virtual void marchByDelta(Calendar* cal, int32_t delta);
public:
// for other tests' use
static UnicodeString fieldName(UCalendarDateFields f);
static UnicodeString calToStr(const Calendar & cal);
// List of non-installed locales with interesting calendars
/**
* @return the count of 'other' locales to test
*/
static int32_t testLocaleCount();
/**
* @param i index of 'other' locale to return
* @return locale ID
*/
static const char* testLocaleID(int32_t i);
/**
* Clone the specified calendar, and determine its earliest supported date
* by setting the extended year to the minimum value.
* @param cal Calendar (will be cloned)
* @param isGregorian output: returns 'true' if the calendar's class is GregorianCalendar
* @param status error code
*/
static UDate minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status);
/**
* Construct a calendar of the specified locale, and determine its earliest supported date
* by setting the extended year to the minimum value.
* @param locale locale of calendar to check
* @param isGregorian output: returns 'true' if the calendar's class is GregorianCalendar
* @param status error code
*/
static UDate minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status);
// internal - for other test use
public:
void Test6703();
void Test3785();
void Test1624();
void TestIslamicUmAlQura();
void TestIslamicTabularDates();
/**
* Test the time stamp array recalculation during heavy Calendar usage
*/
void TestTimeStamp();
/**
* Test the ISO8601 calendar type
*/
void TestISO8601();
/**
* Test cases for [set|get][Repeated|Skipped]WallTimeOption
*/
void TestAmbiguousWallTimeAPIs();
void TestRepeatedWallTime();
void TestSkippedWallTime();
void TestCloneLocale();
void TestTimeZoneInLocale();
void TestHebrewMonthValidation();
/*
* utility methods for TestIslamicUmAlQura
*/
void setAndTestCalendar(Calendar* cal, int32_t initMonth, int32_t initDay, int32_t initYear, UErrorCode& status);
void setAndTestWholeYear(Calendar* cal, int32_t startYear, UErrorCode& status);
void TestWeekData();
void TestAddAcrossZoneTransition();
void TestChineseCalendarMapping();
void TestBasicConversionGregorian();
void TestBasicConversionISO8601();
void TestBasicConversionJapanese();
void TestBasicConversionBuddhist();
void TestBasicConversionTaiwan();
void TestBasicConversionPersian();
void TestBasicConversionIslamic();
void TestBasicConversionIslamicTBLA();
void TestBasicConversionIslamicCivil();
void TestBasicConversionIslamicRGSA();
void TestBasicConversionIslamicUmalqura();
void TestBasicConversionHebrew();
void TestBasicConversionChinese();
void TestBasicConversionDangi();
void TestBasicConversionIndian();
void TestBasicConversionCoptic();
void TestBasicConversionEthiopic();
void TestBasicConversionEthiopicAmeteAlem();
void AsssertCalendarFieldValue(
Calendar* cal, double time, const char* type,
int32_t era, int32_t year, int32_t month, int32_t week_of_year,
int32_t week_of_month, int32_t date, int32_t day_of_year, int32_t day_of_week,
int32_t day_of_week_in_month, int32_t am_pm, int32_t hour, int32_t hour_of_day,
int32_t minute, int32_t second, int32_t millisecond, int32_t zone_offset,
int32_t dst_offset, int32_t year_woy, int32_t dow_local, int32_t extended_year,
int32_t julian_day, int32_t milliseconds_in_day, int32_t is_leap_month);
void TestChineseCalendarMonthInSpecialYear();
void TestGregorianCalendarInTemporalLeapYear();
void TestChineseCalendarInTemporalLeapYear();
void TestDangiCalendarInTemporalLeapYear();
void TestHebrewCalendarInTemporalLeapYear();
void TestIslamicCalendarInTemporalLeapYear();
void TestIslamicCivilCalendarInTemporalLeapYear();
void TestIslamicUmalquraCalendarInTemporalLeapYear();
void TestIslamicRGSACalendarInTemporalLeapYear();
void TestIslamicTBLACalendarInTemporalLeapYear();
void TestPersianCalendarInTemporalLeapYear();
void TestIndianCalendarInTemporalLeapYear();
void TestTaiwanCalendarInTemporalLeapYear();
void TestJapaneseCalendarInTemporalLeapYear();
void TestBuddhistCalendarInTemporalLeapYear();
void TestCopticCalendarInTemporalLeapYear();
void TestEthiopicCalendarInTemporalLeapYear();
void TestEthiopicAmeteAlemCalendarInTemporalLeapYear();
void TestChineseCalendarGetTemporalMonthCode();
void TestDangiCalendarGetTemporalMonthCode();
void TestHebrewCalendarGetTemporalMonthCode();
void TestCopticCalendarGetTemporalMonthCode();
void TestEthiopicCalendarGetTemporalMonthCode();
void TestEthiopicAmeteAlemCalendarGetTemporalMonthCode();
void TestGregorianCalendarSetTemporalMonthCode();
void TestChineseCalendarSetTemporalMonthCode();
void TestHebrewCalendarSetTemporalMonthCode();
void TestCopticCalendarSetTemporalMonthCode();
void TestEthiopicCalendarSetTemporalMonthCode();
void TestMostCalendarsOrdinalMonthSet();
void TestChineseCalendarOrdinalMonthSet();
void TestDangiCalendarOrdinalMonthSet();
void TestHebrewCalendarOrdinalMonthSet();
void TestCalendarAddOrdinalMonth();
void TestCalendarRollOrdinalMonth();
void TestLimitsOrdinalMonth();
void TestActualLimitsOrdinalMonth();
void TestDangiOverflowIsLeapMonthBetween22507();
void TestFWWithISO8601();
void TestAddOverflow();
void TestRollWeekOfYear();
void Test22633ChineseOverflow();
void Test22633IndianOverflow();
void Test22633IslamicUmalquraOverflow();
void Test22633PersianOverflow();
void Test22633HebrewOverflow();
void Test22633AMPMOverflow();
void Test22633SetGetTimeOverflow();
void Test22633Set2FieldsGetTimeOverflow();
void Test22633SetAddGetTimeOverflow();
void Test22633SetRollGetTimeOverflow();
void Test22633AddTwiceGetTimeOverflow();
void Test22633RollTwiceGetTimeOverflow();
void Test22730JapaneseOverflow();
void Test22750Roll();
void RunTestOnCalendars(void(TestFunc)(Calendar*, UCalendarDateFields));
void verifyFirstDayOfWeek(const char* locale, UCalendarDaysOfWeek expected);
void TestFirstDayOfWeek();
void TestChineseCalendarComputeMonthStart();
void Test22633HebrewLargeNegativeDay();
void RunChineseCalendarInTemporalLeapYearTest(Calendar* cal);
void RunIslamicCalendarInTemporalLeapYearTest(Calendar* cal);
void Run366DaysIsLeapYearCalendarInTemporalLeapYearTest(Calendar* cal);
void RunChineseCalendarGetTemporalMonthCode(Calendar* cal);
void RunCECalendarGetTemporalMonthCode(Calendar* cal);
};
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif // __CalendarTest__