// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT:
 * Copyright (c) 1997-2012, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/

#ifndef _CALENDARREGRESSIONTEST_
#define _CALENDARREGRESSIONTEST_

#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING

#include "unicode/calendar.h"
#include "unicode/gregocal.h"
#include "intltest.h"

/**
 * Performs regression test for Calendar
 **/
class CalendarRegressionTest: public IntlTest {

    // IntlTest override
    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par ) override;
public:
    void test4100311(void);
    void test4074758(void);
    void test4028518(void);
    void test4031502(void) ;
    void test4035301(void) ;
    void test4040996(void) ;
    void test4051765(void) ;
    void test4059654(void) ;
    void test4061476(void) ;
    void test4070502(void) ;
    void test4071197(void) ;
    void test4071385(void) ;
    void test4073929(void) ;
    void test4083167(void) ;
    void test4086724(void) ;
    void test4092362(void) ;
    void test4095407(void) ;
    void test4096231(void) ;
    void test4096539(void) ;
    void test41003112(void) ;
    void test4103271(void) ;
    void test4106136(void) ;
    void test4108764(void) ;
    void test4114578(void) ;
    void test4118384(void) ;
    void test4125881(void) ;
    void test4125892(void) ;
    void test4141665(void) ;
    void test4142933(void) ;
    void test4145158(void) ;
    void test4145983(void) ;
    void test4147269(void) ;

    void Test4149677(void) ;
    void Test4162587(void) ;
    void Test4165343(void) ;
    void Test4166109(void) ;
    void Test4167060(void) ;
    void Test4197699(void);
    void TestJ81(void);
    void TestJ438(void);
    void TestT5555(void);
    void TestT6745(void);
	void TestT8057(void);
    void TestLeapFieldDifference(void);
    void TestMalaysianInstance(void);
    void TestWeekShift(void);
    void TestTimeZoneTransitionAdd(void);
    void TestDeprecates(void);
    void TestT8596(void);
    void Test9019(void);
    void TestT9452(void);
    void TestT11632(void);
    void TestPersianCalOverflow(void);
    void TestIslamicCalOverflow(void);
    void TestWeekOfYear13548(void);
    void TestUTCWrongAMPM22023(void);
    void TestAsiaManilaAfterSetGregorianChange22043(void);

    void Test13745(void);
    void TestRespectUExtensionFw(void);

    void printdate(GregorianCalendar *cal, const char *string);
    void dowTest(UBool lenient) ;

    void VerifyGetStayInBound(double test_value);
    void VerifyNoAssertWithSetGregorianChange(const char* timezone);

    static UDate getAssociatedDate(UDate d, UErrorCode& status);
    static UDate makeDate(int32_t y, int32_t m = 0, int32_t d = 0, int32_t hr = 0, int32_t min = 0, int32_t sec = 0);

    static const UDate EARLIEST_SUPPORTED_MILLIS;
    static const UDate LATEST_SUPPORTED_MILLIS;
    static const char* FIELD_NAME[];

protected:
    UBool failure(UErrorCode status, const char* msg);
};

#endif /* #if !UCONFIG_NO_FORMATTING */

#endif // _CALENDARREGRESSIONTEST_
//eof
