package net.time4j;
import net.time4j.engine.ChronoException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static net.time4j.CalendarUnit.DAYS;
import static net.time4j.CalendarUnit.MONTHS;
import static net.time4j.CalendarUnit.YEARS;
import static net.time4j.PlainDate.YEAR_OF_WEEKDATE;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class SpecialUnitTest {
@Test
public void atEndOfMonth() {
assertThat(
PlainDate.of(2011, 2, 28).plus(1, YEARS.atEndOfMonth()),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2011, 7, 1).plus(7, MONTHS.atEndOfMonth()),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2011, 6, 30).plus(7, DAYS.atEndOfMonth()),
is(PlainDate.of(2011, 7, 31)));
}
@Test
public void atEndOfMonthAsDuration() {
assertThat(
PlainDate.of(2011, 2, 28)
.plus(Duration.of(1, YEARS.atEndOfMonth())),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2011, 7, 1)
.plus(Duration.of(7, MONTHS.atEndOfMonth())),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2011, 6, 30)
.plus(Duration.of(7, DAYS.atEndOfMonth())),
is(PlainDate.of(2011, 7, 31)));
assertThat(
PlainDate.of(2015, 1, 30).plus(1, MONTHS.atEndOfMonth()),
is(PlainDate.of(2015, 2, 28)));
}
@Test
public void keepingEndOfMonth() {
assertThat(
PlainDate.of(2015, 2, 27).plus(2, MONTHS.keepingEndOfMonth()),
is(PlainDate.of(2015, 4, 27)));
assertThat(
PlainDate.of(2015, 2, 28).plus(2, MONTHS.keepingEndOfMonth()),
is(PlainDate.of(2015, 4, 30)));
assertThat(
PlainDate.of(2015, 1, 31).plus(1, MONTHS.keepingEndOfMonth()),
is(PlainDate.of(2015, 2, 28)));
}
@Test(expected=ChronoException.class)
public void unlessInvalidAbort() {
PlainDate.of(2014, 1, 29).plus(1, MONTHS.unlessInvalid());
}
@Test
public void unlessInvalidOK() {
assertThat(
PlainDate.of(2012, 1, 29).plus(1, MONTHS.unlessInvalid()),
is(PlainDate.of(2012, 2, 29)));
}
@Test
public void nextValidDate() {
assertThat(
PlainDate.of(2012, 1, 29).plus(1, MONTHS.nextValidDate()),
is(PlainDate.of(2012, 2, 29)));
assertThat(
PlainDate.of(2012, 1, 30).plus(1, MONTHS.nextValidDate()),
is(PlainDate.of(2012, 3, 1)));
assertThat(
PlainDate.of(2012, 1, 31).plus(1, MONTHS.nextValidDate()),
is(PlainDate.of(2012, 3, 1)));
}
@Test
public void withCarryOver() {
assertThat(
PlainDate.of(2012, 1, 31).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2012, 3, 2)));
assertThat(
PlainDate.of(2013, 1, 28).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2013, 2, 28)));
assertThat(
PlainDate.of(2013, 1, 29).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2013, 3, 1)));
assertThat(
PlainDate.of(2013, 1, 30).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2013, 3, 2)));
assertThat(
PlainDate.of(2013, 1, 31).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2013, 3, 3)));
assertThat(
PlainDate.of(2012, 3, 31).plus(1, MONTHS.withCarryOver()),
is(PlainDate.of(2012, 5, 1)));
}
@Test
public void weekBasedYears() {
assertThat(
PlainDate.of(2000, 2, 29).plus(14, CalendarUnit.weekBasedYears()),
is(PlainDate.of(2014, 2, 25)));
IsoDateUnit unit =
PlainDate.of(1, 1).getChronology().getBaseUnit(YEAR_OF_WEEKDATE);
assertThat(
(unit == CalendarUnit.weekBasedYears()),
is(true));
}
@Test
public void weekBasedYearsAsDuration() {
Duration<IsoDateUnit> duration1 =
Duration.of(14, CalendarUnit.weekBasedYears());
assertThat(
PlainDate.of(2000, 2, 29).plus(duration1),
is(PlainDate.of(2014, 2, 25)));
Duration<IsoDateUnit> duration2 =
duration1.plus(4, DAYS);
System.out.println(duration2);
assertThat(
PlainDate.of(2000, 2, 29).plus(duration2),
is(PlainDate.of(2014, 3, 1)));
}
}