package net.time4j.history;
import net.time4j.PlainDate;
import net.time4j.engine.EpochDays;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(Parameterized.class)
public class ComputusTest {
@Parameterized.Parameters(name= "{index}: easter-date(julian/gregorian)({0}/{1}")
public static Iterable<Object[]> data() {
return Arrays.asList(
new Object[][]{
// original data from Dionysius Exiguus
{"532-04-11", null},
{"533-03-27", null},
{"534-04-16", null},
{"535-04-08", null},
{"536-03-23", null},
{"537-04-12", null},
{"538-04-04", null},
{"539-04-24", null},
{"540-04-08", null},
{"541-03-31", null},
{"542-04-20", null},
{"543-04-05", null},
{"544-03-27", null},
{"545-04-16", null},
{"546-04-08", null},
{"547-03-24", null},
{"548-04-12", null},
{"549-04-04", null},
{"550-04-24", null},
{"551-04-09", null},
{"552-03-31", null},
{"553-04-20", null},
{"554-04-05", null},
{"555-03-28", null},
{"556-04-16", null},
{"557-04-01", null},
{"558-04-21", null},
{"559-04-13", null},
{"560-03-28", null},
{"561-04-17", null},
{"562-04-09", null},
{"563-03-25", null},
{"564-04-13", null},
{"565-04-05", null},
{"566-03-28", null},
{"567-04-10", null},
{"568-04-01", null},
{"569-04-21", null},
{"570-04-06", null},
{"571-03-29", null},
{"572-04-17", null},
{"573-04-09", null},
{"574-03-25", null},
{"575-04-14", null},
{"576-04-05", null},
{"577-04-25", null},
{"578-04-10", null},
{"579-04-02", null},
{"580-04-21", null},
{"581-04-06", null},
{"582-03-29", null},
{"583-04-18", null},
{"584-04-02", null},
{"585-03-25", null},
{"586-04-14", null},
{"587-03-30", null},
{"588-04-18", null},
{"589-04-10", null},
{"590-03-26", null},
{"591-04-15", null},
{"592-04-06", null},
{"593-03-29", null},
{"594-04-11", null},
{"595-04-03", null},
{"596-04-22", null},
{"597-04-14", null},
{"598-03-30", null},
{"599-04-19", null},
{"600-04-10", null},
{"601-03-26", null},
{"602-04-15", null},
{"603-04-07", null},
{"604-03-22", null},
{"605-04-11", null},
{"606-04-03", null},
{"607-04-23", null},
{"608-04-07", null},
{"609-03-30", null},
{"610-04-19", null},
{"611-04-04", null},
{"612-03-26", null},
{"613-04-15", null},
{"614-03-31", null},
{"615-04-20", null},
{"616-04-11", null},
{"617-04-03", null},
{"618-04-16", null},
{"619-04-08", null},
{"620-03-30", null},
{"621-04-19", null},
{"622-04-04", null},
{"623-03-27", null},
{"624-04-15", null},
{"625-03-31", null},
{"626-04-20", null},
// all dates are interpreted as gregorian (from WCC)
{"2001-04-15", "2001-04-15"},
{"2002-05-05", "2002-03-31"},
{"2003-04-27", "2003-04-20"},
{"2004-04-11", "2004-04-11"},
{"2005-05-01", "2005-03-27"},
{"2006-04-23", "2006-04-16"},
{"2007-04-08", "2007-04-08"},
{"2008-04-27", "2008-03-23"},
{"2009-04-19", "2009-04-12"},
{"2010-04-04", "2010-04-04"},
{"2011-04-24", "2011-04-24"},
{"2012-04-15", "2012-04-08"},
{"2013-05-05", "2013-03-31"},
{"2014-04-20", "2014-04-20"},
{"2015-04-12", "2015-04-05"},
{"2016-05-01", "2016-03-27"},
{"2017-04-16", "2017-04-16"},
{"2018-04-08", "2018-04-01"},
{"2019-04-28", "2019-04-21"},
{"2020-04-19", "2020-04-12"},
{"2021-05-02", "2021-04-04"},
}
);
}
private PlainDate julianDate;
private PlainDate gregorianDate;
public ComputusTest(
String julian,
String gregorian
) throws ParseException {
super();
String[] values = julian.split("-");
int year = Integer.valueOf(values[0]);
int month = Integer.valueOf(values[1]);
int dom = Integer.valueOf(values[2]);
if (year <= 1582) {
long mjd = JulianMath.toMJD(year, month, dom);
this.julianDate = PlainDate.of(mjd, EpochDays.MODIFIED_JULIAN_DATE);
} else {
this.julianDate = ChronoFormatter.ofDatePattern("y-MM-dd", PatternType.CLDR, Locale.ROOT).parse(julian);
}
this.gregorianDate = (
(gregorian == null)
? null
: ChronoFormatter.ofDatePattern("y-MM-dd", PatternType.CLDR, Locale.ROOT).parse(gregorian));
}
@Test
public void eastern() {
assertThat(
Computus.EASTERN.easterSunday(this.julianDate.getYear()),
is(this.julianDate));
}
@Test
public void western() {
if (this.gregorianDate != null) {
assertThat(
Computus.WESTERN.easterSunday(this.gregorianDate.getYear()),
is(this.gregorianDate));
}
assertThat(
Computus.WESTERN.easterSunday(this.julianDate.getYear()),
is(this.julianDate.getYear() > 1582 ? this.gregorianDate : this.julianDate));
}
}