package net.time4j;
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.WEEKS;
import static net.time4j.CalendarUnit.YEARS;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class DurationUntilTest {
@Test
public void untilInYearsMonthsDays() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2005, 2, 26);
assertThat(
start.until(end, Duration.in(YEARS, MONTHS, DAYS)),
is(Duration.ofCalendarUnits(1, 11, 30)));
}
@Test
public void untilInYearsMonths() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
assertThat(
start.until(end, Duration.in(YEARS, MONTHS)),
is(Duration.ofCalendarUnits(4, 11, 0)));
}
@Test
public void untilInMonthsDays() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2005, 2, 26);
assertThat(
start.until(end, Duration.in(MONTHS, DAYS)),
is(Duration.ofCalendarUnits(0, 23, 30)));
start = PlainDate.of(2013, 1, 31);
end = PlainDate.of(2013, 2, 28);
assertThat(
start.until(end, Duration.in(MONTHS, DAYS)),
is(Duration.ofCalendarUnits(0, 0, 28)));
start = PlainDate.of(2013, 1, 31);
end = PlainDate.of(2013, 3, 30);
assertThat(
start.until(end, Duration.in(MONTHS, DAYS)),
is(Duration.ofCalendarUnits(0, 1, 30)));
start = PlainDate.of(2013, 5, 29);
end = PlainDate.of(2014, 2, 28);
assertThat(
start.until(end, Duration.in(MONTHS, DAYS)),
is(Duration.ofCalendarUnits(0, 8, 30)));
start = PlainDate.of(2003, 2, 27);
end = PlainDate.of(2008, 2, 26);
assertThat(
start.until(end, Duration.in(MONTHS, DAYS)),
is(Duration.ofCalendarUnits(0, 59, 30)));
}
@Test
public void untilInMonthsWeeksDays() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
assertThat(
start.until(end, Duration.in(MONTHS, WEEKS, DAYS)),
is(Duration.ofCalendarUnits(0, 59, 2).plus(4, WEEKS)));
}
@Test
public void untilInWeeksDays() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
long days = end.getDaysSinceUTC() - start.getDaysSinceUTC();
long weeks = days / 7;
days = days % 7;
assertThat(
start.until(end, Duration.in(WEEKS, DAYS)),
is(Duration.of(days, DAYS).plus(weeks, WEEKS)));
}
@Test
public void untilInWeeks() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
long days = end.getDaysSinceUTC() - start.getDaysSinceUTC();
long weeks = days / 7;
assertThat(
start.until(end, Duration.in(WEEKS)),
is(Duration.of(weeks, WEEKS)));
}
@Test
public void untilInMonths() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
assertThat(
start.until(end, Duration.in(MONTHS)),
is(Duration.of(59, MONTHS)));
}
@Test(expected=IllegalArgumentException.class)
public void untilInDuplicateUnits() {
PlainDate start = PlainDate.of(2003, 2, 27);
PlainDate end = PlainDate.of(2008, 2, 26);
start.until(end, Duration.in(MONTHS, MONTHS));
}
@Test
public void betweenTimestamps1() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 1, 31, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 4, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, CalendarUnit.DAYS,
ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(
Duration.ofPositive().months(1).days(3)
.hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps2() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 1, 1, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 31, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, CalendarUnit.DAYS,
ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(
Duration.ofPositive().months(2).days(29)
.hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps3() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 1, 31, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 1, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, CalendarUnit.DAYS,
ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(
Duration.ofPositive().months(1).days(0)
.hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps4() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 1, 31, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 2, 28, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, CalendarUnit.DAYS,
ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(
Duration.ofPositive().months(0).days(27)
.hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps5() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 1, 31, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 1, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(Duration.ofPositive().months(1).hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps6() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 2, 1, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 2, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(Duration.ofPositive().months(1).hours(9).minutes(15).build()));
}
@Test
public void betweenTimestamps7() {
PlainTimestamp t1 = PlainTimestamp.of(2014, 2, 1, 21, 45);
PlainTimestamp t2 = PlainTimestamp.of(2014, 3, 1, 7, 0);
IsoUnit[] units = {
CalendarUnit.MONTHS, ClockUnit.HOURS, ClockUnit.MINUTES};
assertThat(
Duration.in(units).between(t1, t2),
is(Duration.ofPositive().hours(27 * 24 + 9).minutes(15).build()));
}
@Test
public void betweenWeekBased() {
PlainDate d1 = PlainDate.of(2012, 1, 1); // Sunday
PlainDate d2 = PlainDate.of(2016, 3, 1); // Tuesday
Duration<IsoDateUnit> expected = Duration.of(4, CalendarUnit.weekBasedYears()).plus(9, WEEKS).plus(2, DAYS);
assertThat(
Duration.inWeekBasedUnits().between(d1, d2),
is(expected));
assertThat(
d1.plus(expected),
is(d2));
}
}