package net.time4j.xml;
import net.time4j.Month;
import net.time4j.PlainDate;
import net.time4j.SystemClock;
import net.time4j.ZonalClock;
import net.time4j.engine.ChronoOperator;
import net.time4j.format.DisplayMode;
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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.time.MonthDay;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class AnnualDateTest {
@Test
public void toStringXML() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).toString(),
is("--02-29"));
}
@Test
public void parseXML() throws ParseException {
assertThat(
AnnualDate.parseXML("--02-29"),
is(AnnualDate.of(Month.FEBRUARY, 29)));
}
@Test
public void getMonth() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).getMonth(),
is(Month.FEBRUARY));
assertThat(
AnnualDate.of(2, 29).getMonth(),
is(Month.FEBRUARY));
}
@Test
public void getDayOfMonth() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).getDayOfMonth(),
is(29));
}
@Test
public void isBefore() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).isBefore(AnnualDate.of(2, 29)),
is(false));
assertThat(
AnnualDate.of(Month.FEBRUARY, 28).isBefore(AnnualDate.of(2, 29)),
is(true));
}
@Test
public void isAfter() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).isAfter(AnnualDate.of(2, 29)),
is(false));
assertThat(
AnnualDate.of(Month.FEBRUARY, 28).isAfter(AnnualDate.of(2, 27)),
is(true));
}
@Test
public void isSimultaneous() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).isSimultaneous(AnnualDate.of(2, 29)),
is(true));
assertThat(
AnnualDate.of(Month.FEBRUARY, 28).isSimultaneous(AnnualDate.of(2, 29)),
is(false));
}
@Test
public void atYear() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).atYear(2016),
is(PlainDate.of(2016, 2, 29)));
}
@Test(expected=IllegalArgumentException.class)
public void atYearInvalid() {
AnnualDate.of(Month.FEBRUARY, 29).atYear(2015);
}
@Test
public void isValidDate() {
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).isValidDate(2016),
is(true));
assertThat(
AnnualDate.of(Month.FEBRUARY, 29).isValidDate(2015),
is(false));
}
@Test
public void format() {
ChronoFormatter<AnnualDate> usStyle =
ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.US, AnnualDate.chronology());
assertThat(
usStyle.format(AnnualDate.of(9, 11)),
is("9/11"));
ChronoFormatter<AnnualDate> germanStyle =
ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.GERMANY, AnnualDate.chronology());
assertThat(
germanStyle.format(AnnualDate.of(9, 11)),
is("11.9."));
ChronoFormatter<MonthDay> patternBased = // style-based is not possible here
ChronoFormatter.ofPattern("d. MMMM", PatternType.CLDR, Locale.GERMAN, AnnualDate.threeten());
assertThat(
patternBased.format(MonthDay.of(10, 1)),
is("1. Oktober"));
}
@Test
public void accessMonthOfYear() {
AnnualDate ad = AnnualDate.of(Month.FEBRUARY, 29);
assertThat(ad.get(AnnualDate.MONTH_OF_YEAR), is(Month.FEBRUARY));
assertThat(ad.getMinimum(AnnualDate.MONTH_OF_YEAR), is(Month.JANUARY));
assertThat(ad.getMaximum(AnnualDate.MONTH_OF_YEAR), is(Month.DECEMBER));
assertThat(ad.isValid(AnnualDate.MONTH_OF_YEAR, Month.JANUARY), is(true));
assertThat(AnnualDate.of(3, 31).with(AnnualDate.MONTH_OF_YEAR, Month.FEBRUARY), is(ad));
}
@Test
public void accessMonthAsNumber() {
AnnualDate ad = AnnualDate.of(Month.FEBRUARY, 29);
assertThat(ad.getInt(AnnualDate.MONTH_AS_NUMBER), is(2));
assertThat(ad.getMinimum(AnnualDate.MONTH_AS_NUMBER), is(1));
assertThat(ad.getMaximum(AnnualDate.MONTH_AS_NUMBER), is(12));
assertThat(ad.isValid(AnnualDate.MONTH_AS_NUMBER, 1), is(true));
assertThat(AnnualDate.of(3, 31).with(AnnualDate.MONTH_AS_NUMBER, 2), is(ad));
}
@Test
public void accessDayOfMonth() {
AnnualDate ad = AnnualDate.of(Month.FEBRUARY, 21);
assertThat(ad.getInt(AnnualDate.DAY_OF_MONTH), is(21));
assertThat(ad.getMinimum(AnnualDate.DAY_OF_MONTH), is(1));
assertThat(ad.getMaximum(AnnualDate.DAY_OF_MONTH), is(29));
assertThat(ad.isValid(AnnualDate.DAY_OF_MONTH, 29), is(true));
assertThat(AnnualDate.of(2, 29).with(AnnualDate.DAY_OF_MONTH, 21), is(ad));
}
@Test
public void today() {
ZonalClock clock = SystemClock.inLocalView();
PlainDate date = clock.today();
assertThat(
clock.now(AnnualDate.chronology()).atYear(date.getYear()),
is(date));
}
@Test
public void serialization()
throws IOException, ClassNotFoundException {
AnnualDate ad = AnnualDate.of(Month.FEBRUARY, 29);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(ad);
byte[] data = baos.toByteArray();
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
AnnualDate ser = (AnnualDate) ois.readObject();
assertThat(ser, is(ad));
ois.close();
}
@Test
public void fromThreeten() {
assertThat(AnnualDate.from(MonthDay.of(2, 29)), is(AnnualDate.of(2, 29)));
}
@Test
public void asNextExactEvent() {
ChronoOperator<PlainDate> op = AnnualDate.of(Month.FEBRUARY, 29).asNextExactEvent();
assertThat(PlainDate.of(2015, 2, 28).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2015, 12, 31).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 1, 15).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 2, 28).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 2, 29).with(op), is(PlainDate.of(2020, 2, 29)));
assertThat(PlainDate.of(2016, 3, 1).with(op), is(PlainDate.of(2020, 2, 29)));
}
@Test
public void asNextRoundedEvent() {
ChronoOperator<PlainDate> op = AnnualDate.of(Month.FEBRUARY, 29).asNextRoundedEvent();
assertThat(PlainDate.of(2015, 2, 28).with(op), is(PlainDate.of(2015, 3, 1)));
assertThat(PlainDate.of(2015, 3, 1).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2015, 12, 31).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 1, 15).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 2, 28).with(op), is(PlainDate.of(2016, 2, 29)));
assertThat(PlainDate.of(2016, 2, 29).with(op), is(PlainDate.of(2017, 3, 1)));
assertThat(PlainDate.of(2016, 3, 1).with(op), is(PlainDate.of(2017, 3, 1)));
}
}