package net.time4j.calendar;
import net.time4j.GeneralTimestamp;
import net.time4j.Moment;
import net.time4j.Month;
import net.time4j.PlainDate;
import net.time4j.PlainTimestamp;
import net.time4j.engine.StartOfDay;
import net.time4j.format.Leniency;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import net.time4j.tz.OffsetSign;
import net.time4j.tz.Timezone;
import net.time4j.tz.ZonalOffset;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.text.ParseException;
import java.util.Collections;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class CalendarOverrideTest {
@Test
public void formatGeneralTimestamp() {
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, HijriCalendar.family())
.addPattern("G-yyyy-MM-dd HH:mm", PatternType.CLDR)
.build()
.withCalendarVariant(HijriCalendar.VARIANT_UMALQURA);
Moment m = PlainTimestamp.of(2015, 11, 19, 21, 45).at(offset);
GeneralTimestamp<HijriCalendar> tsp =
m.toGeneralTimestamp(HijriCalendar.family(), HijriCalendar.VARIANT_UMALQURA, offset, StartOfDay.EVENING);
assertThat(
f.format(tsp),
is("AH-1437-02-08 21:45")
);
}
@Test
public void printHijri() {
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, HijriCalendar.family())
.addPattern("G-yyyy-MM-dd HH:mmXXX", PatternType.CLDR)
.build()
.withCalendarVariant(HijriCalendar.VARIANT_UMALQURA)
.withTimezone(offset);
Moment m = PlainTimestamp.of(2015, 11, 19, 21, 45).at(offset);
GeneralTimestamp<HijriCalendar> tsp =
m.toGeneralTimestamp(HijriCalendar.family(), HijriCalendar.VARIANT_UMALQURA, offset, StartOfDay.EVENING);
HijriCalendar date = tsp.toDate();
assertThat(date.getDayOfMonth(), is(8));
assertThat(date.getMonth(), is(HijriMonth.SAFAR));
assertThat(date.getYear(), is(1437));
assertThat(
PlainDate.of(2015, 11, 19).transform(HijriCalendar.class, HijriCalendar.VARIANT_UMALQURA),
is(HijriCalendar.ofUmalqura(1437, 2, 7)));
assertThat(
f.format(m),
is("AH-1437-02-08 21:45+03:00"));
}
@Test
public void parseHijri() throws ParseException {
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, HijriCalendar.family())
.addPattern("G-yyyy-MM-dd HH:mmXXX", PatternType.CLDR)
.build()
.withCalendarVariant(HijriCalendar.VARIANT_UMALQURA)
.withTimezone(offset);
assertThat(
f.parse("AH-1437-02-08 21:45+03:00"),
is(PlainTimestamp.of(2015, 11, 19, 21, 45).at(offset))
);
}
@Test
public void printEthiopian() {
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, EthiopianCalendar.axis())
.addPattern("G, yyyy-MM-dd hh:mm a XXX", PatternType.CLDR)
.build()
.withTimezone(offset);
Moment m = PlainTimestamp.of(2015, 11, 19, 21, 45).at(offset);
assertThat(
f.format(m),
is("Amete Mihret, 2008-03-09 09:45 pm +03:00"));
}
@Test
public void parseEthiopian1() throws ParseException {
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, EthiopianCalendar.axis())
.addPattern("G, yyyy-MM-dd hh:mm a XXX", PatternType.CLDR)
.build()
.withTimezone(offset);
assertThat(
f.parse("Amete Mihret, 2008-03-09 09:45 pm +03:00"),
is(PlainTimestamp.of(2015, 11, 19, 21, 45).at(offset))
);
}
@Test
public void parseEthiopian2() throws ParseException {
String input = "ሐሙስ፣ ጥቅምት 11 ቀን (ሐና፡ማርያም) 10:15:44 ንጋት EAT ፲፱፻፺፯ (ማቴዎስ) ዓ/ም";
String preferredZone = "Africa/Addis_Ababa";
ZonalOffset offset = ZonalOffset.ofHours(OffsetSign.AHEAD_OF_UTC, 3);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(new Locale("am"), EthiopianCalendar.axis())
.addPattern("EEEE'፣' MMMM d 'ቀን' (", PatternType.CLDR)
.addText(EthiopianCalendar.TABOT)
.addPattern(") h:mm:ss B ", PatternType.CLDR)
.addShortTimezoneName(Collections.singleton(Timezone.of(preferredZone).getID()))
.addPattern(" yyyy (", PatternType.CLDR)
.addText(EthiopianCalendar.EVANGELIST)
.addPattern(") G", PatternType.CLDR)
.build()
.withTimezone(offset)
.with(Leniency.STRICT);
assertThat(
f.parse(input), // 2004-10-22T01:15:44Z
is(PlainTimestamp.of(2004, 10, 22, 4, 15, 44).at(offset))
);
assertThat(
EthiopianCalendar.of(EthiopianEra.AMETE_MIHRET, 1997, EthiopianMonth.TEKEMT, 11),
is(PlainDate.of(2004, 10, 21).transform(EthiopianCalendar.class)));
}
@Test
public void printMinguo() {
ZonalOffset offset = ZonalOffset.ofHoursMinutes(OffsetSign.AHEAD_OF_UTC, 5, 30);
ChronoFormatter<Moment> f =
ChronoFormatter.setUpWithOverride(Locale.ENGLISH, MinguoCalendar.axis())
.addPattern("G-y-MM-dd HH:mm z", PatternType.CLDR)
.build()
.withTimezone("Asia/Kolkata");
Moment m = PlainTimestamp.of(2015, 2, 19, 21, 45).at(offset);
GeneralTimestamp<MinguoCalendar> tsp =
m.toGeneralTimestamp(MinguoCalendar.axis(), offset, StartOfDay.MIDNIGHT);
MinguoCalendar date = tsp.toDate();
assertThat(date.getDayOfMonth(), is(19));
assertThat(date.getMonth(), is(Month.FEBRUARY));
assertThat(date.getYear(), is(104));
assertThat(
PlainDate.of(2015, 2, 19).transform(MinguoCalendar.class),
is(MinguoCalendar.of(MinguoEra.ROC, 104, 2, 19)));
assertThat(
f.format(m),
is("Minguo-104-02-19 21:45 IST"));
}
}