// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 2003-2008, International Business Machines Corporation 
 * and others. All Rights Reserved.
 ********************************************************************
 * Calendar Case Test is a type of CalendarTest which compares the 
 * behavior of a calendar to a certain set of 'test cases', involving
 * conversion between julian-day to fields and vice versa.
 ********************************************************************/

#ifndef __CalendarCaseTest__
#define __CalendarCaseTest__
 
#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING

#include "unicode/calendar.h"
#include "unicode/smpdtfmt.h"
#include "caltest.h"

class CalendarCaseTest: public CalendarTest {
 public:
  virtual void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par );

  /* Test case struct */
  struct TestCase {
    double julian; // Julian Date
    int32_t era;
    int32_t year;
    int32_t month;
    int32_t day;
    int32_t dayOfWeek;
    int32_t hour;
    int32_t min;
    int32_t sec;
  };
  
  /**
   * @param cases array of items to test.  Terminate with a "-1" for era.
   */
  void doTestCases(const TestCase *cases, Calendar *cal);

 private:
  /**
   * Utility function to test out a specific field
   * @param cal calendar
   * @param field which field
   * @param value expected value
   * @param status err status 
   * @return boolean indicating success (TRUE) or failure (FALSE) of the test.
   */
  UBool checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status);

 private:
  // test cases
  void IslamicCivil();
  void Hebrew();
  void Indian();
  void Coptic();
  void Ethiopic();
};

#endif
#endif
