package net.time4j.calendar;
import net.time4j.base.GregorianMath;
import net.time4j.engine.CalendarDays;
import net.time4j.format.Attributes;
import net.time4j.format.Leniency;
import net.time4j.format.NumberSystem;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import net.time4j.history.HistoricEra;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class RelatedGregorianYearTest {
@Test
public void coptic() {
assertThat(
CopticCalendar.of(1724, 1, 1).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2007-09-12
is(2007));
assertThat(
CopticCalendar.of(1724, 6, 1).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2008-02-09
is(2007));
assertThat(
CopticCalendar.of(1724, 13, 5).get(CommonElements.RELATED_GREGORIAN_YEAR),
is(2007));
assertThat(
CopticCalendar.of(1724, 13, 5).plus(CalendarDays.ONE).get(CommonElements.RELATED_GREGORIAN_YEAR),
is(2008));
}
@Test
public void copticMinimum() {
CopticCalendar date = CopticCalendar.of(1724, 13, 5);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(284));
}
@Test
public void copticMaximum() {
CopticCalendar date = CopticCalendar.of(1724, 13, 5);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(10282));
}
@Test
public void formatCoptic() {
ChronoFormatter<CopticCalendar> f =
ChronoFormatter.ofPattern("d. MMMM yyyy (r)", PatternType.CLDR, Locale.ENGLISH, CopticCalendar.axis());
assertThat(
f.format(CopticCalendar.of(1724, 6, 1)),
is("1. Amshir 1724 (2007)"));
}
@Test
public void parseCoptic() throws ParseException {
ChronoFormatter<CopticCalendar> f =
ChronoFormatter.ofPattern("d. MMMM yyyy (r)", PatternType.CLDR, Locale.ENGLISH, CopticCalendar.axis())
.with(Leniency.STRICT);
assertThat(
f.parse("1. Amshir 1724 (2007)"),
is(CopticCalendar.of(1724, 6, 1)));
}
@Test
public void ethiopian() {
assertThat(
EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 2009, 1, 2).get(CommonElements.RELATED_GREGORIAN_YEAR),
is(2016));
assertThat(
EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 2009, 6, 2).get(CommonElements.RELATED_GREGORIAN_YEAR),
is(2016));
}
@Test
public void ethiopianMinimum() {
EthiopianCalendar date = EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 2009, 6, 2);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(-5492));
}
@Test
public void ethiopianMaximum() {
EthiopianCalendar date = EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 2009, 6, 2);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(10006));
}
@Test
public void formatEthiopianWithAmharicYear() {
EthiopianCalendar date = EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 2009, 6, 4);
ChronoFormatter<EthiopianCalendar> f =
ChronoFormatter.setUp(EthiopianCalendar.axis(), Locale.ENGLISH)
.startSection(Attributes.NUMBER_SYSTEM, NumberSystem.ARABIC)
.addPattern("d. MMMM ", PatternType.CLDR)
.endSection()
.addPattern("yyyy (r)", PatternType.CLDR)
.build()
.with(Attributes.NUMBER_SYSTEM, NumberSystem.ETHIOPIC);
assertThat(
f.format(date),
is("4. Yekatit " + NumberSystem.ETHIOPIC.toNumeral(2009) + " (2016)"));
}
@Test
public void thaisolar() {
assertThat(
ThaiSolarCalendar.ofBuddhist(2482, 5, 10).get(CommonElements.RELATED_GREGORIAN_YEAR), // 1939-05-10
is(1939));
assertThat(
ThaiSolarCalendar.ofBuddhist(2482, 3, 31).get(CommonElements.RELATED_GREGORIAN_YEAR), // 1940-03-31
is(1939));
assertThat(
ThaiSolarCalendar.ofBuddhist(2558, 3, 15).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2015-03-15
is(2015));
}
@Test
public void thaisolarMinimum() {
ThaiSolarCalendar date = ThaiSolarCalendar.ofBuddhist(2482, 3, 31);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(-542));
}
@Test
public void thaisolarMaximum() {
ThaiSolarCalendar date = ThaiSolarCalendar.ofBuddhist(2482, 3, 31);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(GregorianMath.MAX_YEAR));
}
@Test
public void hijri() {
assertThat(
HijriCalendar.ofUmalqura(1411, 4, 30).get(CommonElements.RELATED_GREGORIAN_YEAR), // 1990-11-18
is(1990));
assertThat(
HijriCalendar.ofUmalqura(1411, 11, 30).get(CommonElements.RELATED_GREGORIAN_YEAR), // 1991-06-13
is(1990));
}
@Test
public void hijriMinimum() {
HijriCalendar date = HijriCalendar.ofUmalqura(1436, 4, 25);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(1882));
assertThat(
date.withVariant(HijriAlgorithm.WEST_ISLAMIC_ASTRO).getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(622));
}
@Test
public void hijriMaximum() {
HijriCalendar date = HijriCalendar.ofUmalqura(1436, 4, 25);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(2076));
assertThat(
date.withVariant(HijriAlgorithm.WEST_ISLAMIC_ASTRO).getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(2173));
}
@Test
public void persian() {
assertThat(
PersianCalendar.of(1394, 6, 27).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2015-09-18
is(2015));
assertThat(
PersianCalendar.of(1394, 10, 30).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2016-01-20
is(2015));
}
@Test
public void persianMinimum() {
PersianCalendar date = PersianCalendar.of(1394, 10, 30);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(622));
}
@Test
public void persianMaximum() {
PersianCalendar date = PersianCalendar.of(1394, 10, 30);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(3621));
}
@Test
public void minguo() {
assertThat(
MinguoCalendar.of(MinguoEra.ROC, 104, 2, 15).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2015-02-15
is(2015));
}
@Test
public void minguoMinimum() {
MinguoCalendar date = MinguoCalendar.of(MinguoEra.ROC, 104, 2, 15);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(GregorianMath.MIN_YEAR));
}
@Test
public void minguoMaximum() {
MinguoCalendar date = MinguoCalendar.of(MinguoEra.ROC, 104, 2, 15);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(GregorianMath.MAX_YEAR));
}
@Test
public void julian() {
assertThat(
JulianCalendar.of(HistoricEra.AD, 2015, 1, 1).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2016-01-13
is(2015));
assertThat(
JulianCalendar.of(HistoricEra.AD, 2015, 12, 31).get(CommonElements.RELATED_GREGORIAN_YEAR), // 2016-01-13
is(2015));
}
@Test
public void julianMinimum() {
JulianCalendar date = JulianCalendar.of(HistoricEra.AD, 1394, 10, 30);
assertThat(
date.getMinimum(CommonElements.RELATED_GREGORIAN_YEAR),
is(-1000020533));
}
@Test
public void julianMaximum() {
JulianCalendar date = JulianCalendar.of(HistoricEra.AD, 1394, 10, 30);
assertThat(
date.getMaximum(CommonElements.RELATED_GREGORIAN_YEAR),
is(1000020533));
}
@Test
public void readOnlyElement1() {
CopticCalendar date = CopticCalendar.of(1724, 13, 5);
assertThat(
date.isValid(CommonElements.RELATED_GREGORIAN_YEAR, 2007),
is(true));
assertThat(
date.with(CommonElements.RELATED_GREGORIAN_YEAR, 2007),
is(date));
}
@Test
public void readOnlyElement2() {
CopticCalendar date = CopticCalendar.of(1724, 13, 5);
assertThat(
date.isValid(CommonElements.RELATED_GREGORIAN_YEAR, 2008),
is(false));
}
@Test(expected=IllegalArgumentException.class)
public void readOnlyElement3() {
CopticCalendar date = CopticCalendar.of(1724, 13, 5);
date.with(CommonElements.RELATED_GREGORIAN_YEAR, 2008);
}
// --- basic element tests ---
@Test
public void name() {
assertThat(CommonElements.RELATED_GREGORIAN_YEAR.name(), is("RELATED_GREGORIAN_YEAR"));
}
@Test
public void isDateElement() {
assertThat(CommonElements.RELATED_GREGORIAN_YEAR.isDateElement(), is(true));
}
@Test
public void isTimeElement() {
assertThat(CommonElements.RELATED_GREGORIAN_YEAR.isTimeElement(), is(false));
}
@Test
public void getSymbol() {
assertThat(CommonElements.RELATED_GREGORIAN_YEAR.getSymbol(), is('r'));
}
@Test
public void serialization() throws IOException, ClassNotFoundException {
roundtrip(CommonElements.RELATED_GREGORIAN_YEAR);
}
private static void roundtrip(Object obj)
throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
byte[] data = baos.toByteArray();
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
assertThat(ois.readObject(), is(obj));
ois.close();
}
}