package net.time4j.history; import net.time4j.CalendarUnit; import net.time4j.PlainDate; import net.time4j.PlainTimestamp; 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 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 EraFormatTest { @Test public void printStdEraName() { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy GGGG HH:mm", PatternType.CLDR).build(); assertThat( formatter.format(PlainTimestamp.of(1582, 10, 14, 0, 0)), is("4. Oktober 1582 n. Chr. 00:00")); } @Test public void parseStdEraName() throws ParseException { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy GGGG HH:mm", PatternType.CLDR).build(); assertThat( formatter.parse("4. Oktober 1582 n. Chr. 00:00"), is(PlainTimestamp.of(1582, 10, 14, 0, 0))); } @Test public void printAlternative() { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy G HH:mm", PatternType.CLDR) .build() .withAlternativeEraNames(); assertThat( formatter.format(PlainTimestamp.of(1582, 10, 14, 0, 0)), is("4. Oktober 1582 u. Z. 00:00")); } @Test public void parseAlternative() throws ParseException { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy G HH:mm", PatternType.CLDR) .build() .withAlternativeEraNames(); assertThat( formatter.parse("4. Oktober 1582 u. Z. 00:00"), is(PlainTimestamp.of(1582, 10, 14, 0, 0))); } @Test public void printGermanWithLatinEra() { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy GGGG HH:mm", PatternType.CLDR) .build() .withLatinEraNames(); assertThat( formatter.format(PlainTimestamp.of(1582, 10, 14, 0, 0)), is("4. Oktober 1582 Anno Domini 00:00")); } @Test public void parseGermanWithLatinEra() throws ParseException { ChronoFormatter<PlainTimestamp> formatter = ChronoFormatter.setUp(PlainTimestamp.class, Locale.GERMANY) .addPattern("d. MMMM yyyy GGGG HH:mm", PatternType.CLDR) .build() .withLatinEraNames(); assertThat( formatter.parse("4. Oktober 1582 Anno Domini 00:00"), is(PlainTimestamp.of(1582, 10, 14, 0, 0))); } @Test public void printJulian() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMAN) .addPattern("d. MMMM yyyy G", PatternType.CLDR) .build() .with(ChronoHistory.PROLEPTIC_JULIAN); assertThat( formatter.format(PlainDate.of(1752, 9, 13)), is("2. September 1752 n. Chr.")); } @Test public void parseJulian() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMAN) .addPattern("d. MMMM yyyy G", PatternType.CLDR) .build() .with(ChronoHistory.PROLEPTIC_JULIAN); assertThat( formatter.parse("2. September 1752 n. Chr."), is(PlainDate.of(1752, 9, 13))); } @Test public void printEngland1() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMANY) .addPattern("d. MMMM yyyy G", PatternType.CLDR) .build() .withGregorianCutOver(PlainDate.of(1752, 9, 14)); assertThat( formatter.format(PlainDate.of(1752, 9, 13)), is("2. September 1752 n. Chr.")); } @Test public void parseEngland1() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.GERMANY) .addPattern("d. MMMM yyyy G", PatternType.CLDR) .build() .withGregorianCutOver(PlainDate.of(1752, 9, 14)); assertThat( formatter.parse("2. September 1752 n. Chr."), is(PlainDate.of(1752, 9, 13))); } @Test public void printEngland2() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("d. MMMM G yyyy", PatternType.CLDR) .build(); assertThat( formatter.format(PlainDate.of(1752, 9, 13)), is("2. September AD 1752")); } @Test public void parseEngland2() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("d. MMMM G yyyy", PatternType.CLDR) .build(); assertThat( formatter.parse("2. September AD 1752"), is(PlainDate.of(1752, 9, 13))); } @Test public void printEngland3() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("d. MMMM GGGG yyyy", PatternType.CLDR, Locale.UK).with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1603, 4, 3)), is("24. March Anno Domini 1602/03")); // death of Queen Elizabeth I. } @Test public void printEngland3Roman() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH) .addPattern("d. MMMM GGGG ", PatternType.CLDR) .startSection(Attributes.NUMBER_SYSTEM, NumberSystem.ROMAN) .addPattern("yyyy", PatternType.CLDR) .endSection() .build() .with(ChronoHistory.of(Locale.UK)) .with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1603, 4, 3)), is("24. March Anno Domini MDCII/MDCIII")); // death of Queen Elizabeth I. } @Test public void parseEngland3() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("d. MMMM GGGG yyyy", PatternType.CLDR, Locale.UK).with(Leniency.STRICT); assertThat( formatter.parse("24. March Anno Domini 1602/03"), // death of Queen Elizabeth I. (officially 1602) is(PlainDate.of(1603, 4, 3))); assertThat( formatter.parse("24. March Anno Domini 1602/3"), // test for year-of-era-part < 10 is(PlainDate.of(1603, 4, 3))); assertThat( formatter.parse("24. March Anno Domini 1751/2"), // test for year-of-era-part < 10 is(PlainDate.of(1752, 4, 4))); } @Test public void parseEngland3Roman() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH) .addPattern("d. MMMM GGGG ", PatternType.CLDR) .startSection(Attributes.NUMBER_SYSTEM, NumberSystem.ROMAN) .addPattern("yyyy", PatternType.CLDR) .endSection() .build() .with(ChronoHistory.of(Locale.UK)) .with(Leniency.STRICT); assertThat( formatter.parse("24. March Anno Domini MDCII/MDCIII"), // 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. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1603, 4, 4)), is("25. March Anno Domini 1603")); // new year } @Test public void parseEngland4() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); assertThat( formatter.parse("25. March Anno Domini 1603"), // new year is(PlainDate.of(1603, 4, 4))); assertThat( formatter.parse("24. March Anno Domini 1603"), // death of Queen Elizabeth I. using year-of-era only is(PlainDate.of(1603, 4, 3))); } @Test(expected=ParseException.class) // due to trailing chars "/4" public void parseEngland5() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.UK) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); formatter.parse("24. March Anno Domini 1602/4"); // inplausible difference in year part } @Test public void printSweden1() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv", "SE")) .addPattern("d. MMMM yyyy GGGG", PatternType.CLDR) .build(); assertThat( formatter.format(PlainDate.of(1712, 3, 11)), is("30. februari 1712 efter Kristus")); } @Test public void parseSweden1() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv", "SE")) .addPattern("d. MMMM yyyy GGGG", PatternType.CLDR) .build(); assertThat( formatter.parse("30. februari 1712 efter Kristus"), is(PlainDate.of(1712, 3, 11))); } @Test public void printSweden2() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv")) .addPattern("d. MMMM yyyy", PatternType.CLDR) .build() .with(ChronoHistory.ofSweden()); assertThat( formatter.format(PlainDate.of(1712, 3, 11)), is("30. februari 1712")); } @Test public void parseSweden2() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("sv")) .addPattern("d. MMMM yyyy", PatternType.CLDR) .build() .with(ChronoHistory.ofSweden()) .withDefault(ChronoHistory.ofSweden().era(), HistoricEra.AD); assertThat( formatter.parse("30. februari 1712"), is(PlainDate.of(1712, 3, 11))); } @Test public void printRedOctober() { Locale russia = new Locale("en", "RU"); ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, russia) .addPattern("d. MMMM yyyy", PatternType.CLDR) .build() .withGregorianCutOver(ChronoHistory.of(russia).getGregorianCutOverDate()); assertThat( formatter.format(PlainDate.of(1917, 11, 7)), is("25. October 1917")); } @Test public void parseRedOctober1() throws ParseException { Locale russia = new Locale("en", "RU"); ChronoHistory history = ChronoHistory.of(russia); ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, russia) .addPattern("d. MMMM yyyy", PatternType.CLDR) .build() .with(history) .withDefault(history.era(), HistoricEra.AD); assertThat( formatter.parse("25. October 1917"), is(PlainDate.of(1917, 11, 7))); } @Test public void parseRedOctober2() throws ParseException { Locale russia = new Locale("en", "RU"); ChronoHistory history = ChronoHistory.of(russia); ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, russia) .addInteger(history.dayOfMonth(), 1, 2) .addLiteral(". ") .addText(history.month()) .addLiteral(' ') .addFixedInteger(history.yearOfEra(), 4) .build() .withDefault(history.era(), HistoricEra.AD); assertThat( formatter.parse("25. October 1917"), is(PlainDate.of(1917, 11, 7))); } @Test public void printRussiaByzantine() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("en", "RU")) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); PlainDate ad1523 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 1523, 8, 31)); assertThat( formatter.format(ad1523), is("31. August Anno Mundi 7031")); assertThat( formatter.format(ad1523.plus(1, CalendarUnit.DAYS)), is("1. September Anno Mundi 7032/31")); PlainDate ad1699 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 1699, 12, 20)); assertThat( formatter.format(ad1699), is("20. December Anno Mundi 7208/07")); // decree of Peter I. } @Test public void parseRussiaByzantine() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, new Locale("en", "RU")) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT); PlainDate ad1523 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 1523, 8, 31)); assertThat( formatter.parse("31. August Anno Mundi 7031"), is(ad1523)); assertThat( formatter.parse("1. September Anno Mundi 7031"), is(ad1523.plus(1, CalendarUnit.DAYS))); assertThat( formatter.parse("1. September Anno Mundi 7032/31"), is(ad1523.plus(1, CalendarUnit.DAYS))); PlainDate ad1699 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 1699, 12, 20)); assertThat( formatter.parse("20. December Anno Mundi 7208/07"), is(ad1699)); assertThat( formatter.parse("20. December Anno Mundi 7207"), is(ad1699)); } @Test public void printByzantine() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT) .with(ChronoHistory.PROLEPTIC_BYZANTINE); PlainDate ad2016 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 2016, 8, 31)); assertThat( formatter.format(ad2016), is("31. August Anno Mundi 7524")); assertThat( formatter.format(ad2016.plus(1, CalendarUnit.DAYS)), is("1. September Anno Mundi 7525/24")); } @Test public void parseByzantine() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.ENGLISH) .addPattern("d. MMMM GGGG yyyy", PatternType.CLDR) .build() .with(Leniency.STRICT) .with(ChronoHistory.PROLEPTIC_BYZANTINE); PlainDate ad2016 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 2016, 8, 31)); assertThat( formatter.parse("31. August Anno Mundi 7524"), is(ad2016)); assertThat( formatter.parse("1. September Anno Mundi 7524"), is(ad2016.plus(1, CalendarUnit.DAYS))); assertThat( formatter.parse("1. September Anno Mundi 7525/24"), is(ad2016.plus(1, CalendarUnit.DAYS))); } @Test public void printAUC() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.US) .addPattern("MM/dd/y G", PatternType.CLDR) .build() .with(Leniency.STRICT) .with(ChronoHistory.ofFirstGregorianReform().with(EraPreference.abUrbeCondita())); PlainDate ad1 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.AD, 1, 1, 1)); assertThat( formatter.format(ad1), is("01/01/754 a.u.c.")); } @Test public void parseAUC() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.setUp(PlainDate.class, Locale.US) .addPattern("MM/dd/", PatternType.CLDR) .addInteger(PlainDate.YEAR, 2, 4) // test for min-width of 2 digits .addPattern(" G", PatternType.CLDR) .build() .with(Leniency.STRICT) .with(ChronoHistory.ofFirstGregorianReform().with(EraPreference.abUrbeCondita())); PlainDate ad1 = ChronoHistory.PROLEPTIC_JULIAN.convert(HistoricDate.of(HistoricEra.BC, 753, 1, 1)); assertThat( formatter.format(ad1), is("01/01/01 a.u.c.")); } @Test public void printFrance() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("d. MMMM GGGG yyyy", PatternType.CLDR, Locale.FRANCE).with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1565, 4, 3)), is("24. mars après Jésus-Christ 1564/65")); // before Easter } @Test public void parseFrance() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("d. MMMM GGGG yyyy", PatternType.CLDR, Locale.FRANCE).with(Leniency.STRICT); assertThat( formatter.parse("24. mars après Jésus-Christ 1564/65"), is(PlainDate.of(1565, 4, 3))); assertThat( formatter.parse("24. mars après Jésus-Christ 1564/5"), // test for year-of-era-part < 10 is(PlainDate.of(1565, 4, 3))); } @Test public void printPisa1700() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G-yyyy-MM-dd", PatternType.CLDR, new Locale("en", "IT", "PISA")).with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1700, 1, 30)), is("AD-1698/1700-01-30")); } @Test public void parsePisa1700() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G-yyyy-MM-dd", PatternType.CLDR, new Locale("en", "IT", "PISA")).with(Leniency.STRICT); assertThat( formatter.parse("AD-1698/1700-01-30"), is(PlainDate.of(1700, 1, 30))); assertThat( formatter.parse("AD-1700-01-30"), is(PlainDate.of(1700, 1, 30))); } @Test public void printPisa1713() { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G-yyyy-MM-dd", PatternType.CLDR, new Locale("en", "IT", "PISA")).with(Leniency.STRICT); assertThat( formatter.format(PlainDate.of(1713, 1, 30)), is("AD-1711/13-01-30")); } @Test public void parsePisa1713() throws ParseException { ChronoFormatter<PlainDate> formatter = ChronoFormatter.ofDatePattern("G-yyyy-MM-dd", PatternType.CLDR, new Locale("en", "IT", "PISA")).with(Leniency.STRICT); assertThat( formatter.parse("AD-1711/13-01-30"), is(PlainDate.of(1713, 1, 30))); assertThat( formatter.parse("AD-1713-01-30"), is(PlainDate.of(1713, 1, 30))); } }