package net.time4j.history; import net.time4j.PlainDate; import net.time4j.format.Leniency; 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.JUnit4; 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 DayOfYearTest { @Test public void printJulian() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMAN) .addPattern("(D) yyyy G", PatternType.CLDR) .build() .with(ChronoHistory.PROLEPTIC_JULIAN); assertThat( formatter.format(PlainDate.of(1752, 9, 13)), is("(246) 1752 n. Chr.")); } @Test public void parseJulian() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMAN) .addPattern("(D) yyyy G", PatternType.CLDR) .build() .with(ChronoHistory.PROLEPTIC_JULIAN); assertThat( formatter.parse("(246) 1752 n. Chr."), is(PlainDate.of(1752, 9, 13))); } @Test public void printEngland1() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("(D) G yyyy", PatternType.CLDR) .build(); assertThat( formatter.format(PlainDate.of(1751, 5, 20)), is("(46) AD 1751")); assertThat( PlainDate.of(1751, 5, 20).getMinimum(ChronoHistory.of(Locale.UK).dayOfYear()), is(1)); assertThat( PlainDate.of(1751, 5, 20).getMaximum(ChronoHistory.of(Locale.UK).dayOfYear()), is(365 - 31 - 28 - 24)); } @Test public void parseEngland1() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("(D) G yyyy", PatternType.CLDR) .build(); assertThat( formatter.parse("(46) AD 1751"), is(PlainDate.of(1751, 5, 20))); } @Test public void printEngland2() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMANY) .addPattern("(D) yyyy G", PatternType.CLDR) .build() .withGregorianCutOver(PlainDate.of(1752, 9, 14)); assertThat( formatter.format(PlainDate.of(1752, 9, 14)), is("(247) 1752 n. Chr.")); assertThat( PlainDate.of(1752, 9, 14).getMinimum(ChronoHistory.of(Locale.UK).dayOfYear()), is(1)); assertThat( PlainDate.of(1752, 9, 14).getMaximum(ChronoHistory.of(Locale.UK).dayOfYear()), is(366 - 11)); } @Test public void parseEngland2() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMANY) .addPattern("(D) yyyy G", PatternType.CLDR) .build() .withGregorianCutOver(PlainDate.of(1752, 9, 14)); assertThat( formatter.parse("(247) 1752 n. Chr."), is(PlainDate.of(1752, 9, 14))); } @Test public void printEngland3() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("(D) GGGG yyyy", PatternType.CLDR, Locale.UK).with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1603, 4, 3)), is("(365) Anno Domini 1602/03")); // death of Queen Elizabeth I. assertThat( PlainDate.of(1603, 4, 3).getMinimum(ChronoHistory.of(Locale.UK).dayOfYear()), is(1)); assertThat( PlainDate.of(1603, 4, 3).getMaximum(ChronoHistory.of(Locale.UK).dayOfYear()), is(365)); } @Test public void parseEngland3() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("(D) GGGG yyyy", PatternType.CLDR, Locale.UK).with(Leniency.STRICT); assertThat( formatter.parse("(365) Anno Domini 1602/03"), // death of Queen Elizabeth I. (officially 1602) is(PlainDate.of(1603, 4, 3))); } @Test public void printEngland4() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("(D) GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1603, 4, 4)), is("(1) Anno Domini 1603")); // new year assertThat( PlainDate.of(1603, 4, 4).getMinimum(ChronoHistory.of(Locale.UK).dayOfYear()), is(1)); assertThat( PlainDate.of(1603, 4, 4).getMaximum(ChronoHistory.of(Locale.UK).dayOfYear()), is(366)); } @Test public void parseEngland4() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("(D) GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); assertThat( formatter.parse("(1) Anno Domini 1603"), // new year is(PlainDate.of(1603, 4, 4))); } @Test public void printSweden() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv")) .addPattern("(D) yyyy", PatternType.CLDR) .build() .with(ChronoHistory.ofSweden()); assertThat( formatter.format(PlainDate.of(1712, 3, 11)), is("(61) 1712")); assertThat( PlainDate.of(1712, 3, 11).getMinimum(ChronoHistory.ofSweden().dayOfYear()), is(1)); assertThat( PlainDate.of(1712, 3, 11).getMaximum(ChronoHistory.ofSweden().dayOfYear()), is(367)); } @Test public void parseSweden() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv")) .addPattern("(D) yyyy", PatternType.CLDR) .build() .with(ChronoHistory.ofSweden()) .withDefault(ChronoHistory.ofSweden().era(), HistoricEra.AD); assertThat( formatter.parse("(61) 1712"), is(PlainDate.of(1712, 3, 11))); } @Test public void printPisa() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G yyyy (D)", PatternType.CLDR, new Locale("en", "IT", "PISA")) .with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1700, 1, 30)), is("AD 1698/1700 (312)")); } @Test public void parsePisa() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G yyyy (D)", PatternType.CLDR, new Locale("en", "IT", "PISA")) .with(Leniency.STRICT); assertThat( formatter.parse("AD 1698/1700 (312)"), is(PlainDate.of(1700, 1, 30))); } @Test(expected=ParseException.class) public void parseEnglandNonDualDate() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("(D) GGGG yyyy", PatternType.CLDR, Locale.UK).with(Leniency.STRICT); formatter.parse("(365) Anno Domini 1602"); // conflict: text-year=1602, parsed-year=1603 } @Test(expected=ParseException.class) public void parsePisaNonDualDate() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G yyyy (D)", PatternType.CLDR, new Locale("en", "IT", "PISA")) .with(Leniency.STRICT); formatter.parse("AD 1698 (312)"); // conflict: text-year=1698, parsed-year=1700 } }