// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
package com.ibm.icu.dev.test.calendar;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.impl.CalType;
import com.ibm.icu.impl.EraRules;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.JapaneseCalendar;
import com.ibm.icu.util.ULocale;
import com.ibm.icu.util.TimeZone;

/**
 * Tests for EraRules class
 */
@RunWith(JUnit4.class)
public class EraRulesTest extends TestFmwk {
    @Test
    public void testAPIs() {
        for (CalType calType : CalType.values()) {
            String calId = calType.getId();
            if (calId.equals("iso8601") || calId.equals("unknown")) {
                continue;
            }
            EraRules rules1 = EraRules.getInstance(calType, false);
            if (rules1 == null) {
                errln("Era rules for " + calId + " is not available.");
            }

            EraRules rules2 = EraRules.getInstance(calType, true);
            if (rules2 == null) {
                errln("Era rules for " + calId + " (including tentative eras) is not available.");
            }
            int numEras1 = rules1.getNumberOfEras();
            if (numEras1 <= 0) {
                errln("Number of era rules for " + calId + " is " + numEras1);
            }
            int numEras2 = rules2.getNumberOfEras();
            if (numEras2 < numEras1) {
                errln("Number of era including tentative eras is fewer than one without tentative eras in calendar: "
                        + calId);
            }

            Calendar cal = Calendar.getInstance(TimeZone.GMT_ZONE, new ULocale("en"));
            int currentIdx = rules1.getCurrentEraIndex();
            int currentYear = cal.get(Calendar.YEAR);
            int idx = rules1.getEraIndex(currentYear, cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DATE));
            if (idx != currentIdx) {
                errln("Current era index:" + currentIdx + " is different from era index of now:" + idx
                        + " in calendar:" + calId);
            }

            int eraStartYear = rules1.getStartYear(currentIdx);
            if (currentYear < eraStartYear) {
                errln("Current era's start year is after the current year in calendar:" + calId);
            }
        }
    }

    @Test
    public void testJapanese() {
        EraRules rules = EraRules.getInstance(CalType.JAPANESE, true);
        // Rules should have an era after Heisei
        int numRules = rules.getNumberOfEras();
        if (numRules <= JapaneseCalendar.HEISEI) {
            errln("Era after Heisei is not available.");
        }
        int postHeiseiStartYear = rules.getStartYear(JapaneseCalendar.HEISEI + 1);
        if (postHeiseiStartYear != 2019) {
            errln("Era after Heisei should start in 2019, but got " + postHeiseiStartYear);
        }
    }
}
