package net.time4j;
import net.time4j.base.MathUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import static net.time4j.ClockUnit.HOURS;
import static net.time4j.ClockUnit.MICROS;
import static net.time4j.ClockUnit.MILLIS;
import static net.time4j.ClockUnit.MINUTES;
import static net.time4j.ClockUnit.NANOS;
import static net.time4j.ClockUnit.SECONDS;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class TimeArithmeticTest {
private static final PlainTime ANY_TIME =
PlainTime.of(17, 45, 10, 123456789);
@Test
public void rollAnyTimeBy5Hours() {
DayCycles cycles = ANY_TIME.roll(5, HOURS);
assertThat(cycles.getDayOverflow(), is(0L));
assertThat(
cycles.getWallTime(),
is(PlainTime.of(22, 45, 10, 123456789)));
}
@Test
public void rollAnyTimeBy7Hours() {
DayCycles cycles = ANY_TIME.roll(7, HOURS);
assertThat(cycles.getDayOverflow(), is(1L));
assertThat(
cycles.getWallTime(),
is(PlainTime.of(0, 45, 10, 123456789)));
}
@Test
public void rollAnyTimeBy24Hours() {
DayCycles cycles = ANY_TIME.roll(24, HOURS);
assertThat(cycles.getDayOverflow(), is(1L));
assertThat(
cycles.getWallTime(),
is(PlainTime.of(17, 45, 10, 123456789)));
}
@Test
public void rollStartingMidnightBy48HoursForward() {
DayCycles cycles = PlainTime.midnightAtStartOfDay().roll(48, HOURS);
assertThat(
cycles.getDayOverflow(),
is(2L));
assertThat(
cycles.getWallTime(),
is(PlainTime.midnightAtStartOfDay()));
}
@Test
public void rollEndingMidnightBy48HoursForward() {
DayCycles cycles = PlainTime.midnightAtEndOfDay().roll(48, HOURS);
assertThat(
cycles.getDayOverflow(),
is(3L));
assertThat(
cycles.getWallTime(),
is(PlainTime.midnightAtStartOfDay()));
}
@Test
public void rollEndingMidnightBy48HoursBack() {
DayCycles cycles = PlainTime.midnightAtEndOfDay().roll(-48, HOURS);
assertThat(
cycles.getDayOverflow(),
is(-1L));
assertThat(
cycles.getWallTime(),
is(PlainTime.midnightAtStartOfDay()));
}
@Test
public void plus24Hours() {
assertThat(
PlainTime.of(0).plus(24, HOURS),
is(PlainTime.of(24)));
assertThat(
PlainTime.of(0).plus(48, HOURS),
is(PlainTime.of(24)));
assertThat(
PlainTime.of(24).plus(24, HOURS),
is(PlainTime.of(24)));
assertThat(
ANY_TIME.plus(24, HOURS),
is(ANY_TIME));
}
@Test
public void minus24Hours() {
assertThat(
PlainTime.of(0).minus(24, HOURS),
is(PlainTime.of(0)));
assertThat(
PlainTime.of(0).minus(48, HOURS),
is(PlainTime.of(0)));
assertThat(
PlainTime.of(24).minus(24, HOURS),
is(PlainTime.of(0)));
assertThat(
ANY_TIME.minus(24, HOURS),
is(ANY_TIME));
}
@Test
public void plusSomeMinutes() {
assertThat(
PlainTime.of(23, 59).plus(1, MINUTES),
is(PlainTime.midnightAtEndOfDay()));
assertThat(
PlainTime.of(0).plus(24 * 60 + 1, MINUTES),
is(PlainTime.of(0, 1)));
assertThat(
ANY_TIME.plus(15, MINUTES),
is(PlainTime.of(18, 0, 10, 123456789)));
assertThat(
ANY_TIME.plus(61, MINUTES),
is(PlainTime.of(18, 46, 10, 123456789)));
}
@Test
public void minusSomeMinutes() {
assertThat(
PlainTime.of(0).minus(24 * 60 + 1, MINUTES),
is(PlainTime.of(23, 59)));
assertThat(
ANY_TIME.minus(45, MINUTES),
is(PlainTime.of(17, 0, 10, 123456789)));
assertThat(
ANY_TIME.minus(61, MINUTES),
is(PlainTime.of(16, 44, 10, 123456789)));
}
@Test
public void plusSomeSeconds() {
assertThat(
PlainTime.of(0).plus(86401, SECONDS),
is(PlainTime.of(0, 0, 1)));
assertThat(
ANY_TIME.plus(15, SECONDS),
is(PlainTime.of(17, 45, 25, 123456789)));
assertThat(
ANY_TIME.plus(4000, SECONDS),
is(PlainTime.of(18, 51, 50, 123456789)));
}
@Test
public void minusSomeSeconds() {
assertThat(
PlainTime.of(0).minus(86401, SECONDS),
is(PlainTime.of(23, 59, 59)));
assertThat(
ANY_TIME.minus(45, SECONDS),
is(PlainTime.of(17, 44, 25, 123456789)));
assertThat(
ANY_TIME.minus(3661, SECONDS),
is(PlainTime.of(16, 44, 9, 123456789)));
}
@Test
public void plusSomeMillis() {
assertThat(
PlainTime.of(0).plus(1, MILLIS),
is(PlainTime.of(0, 0, 0, 1000000)));
assertThat(
ANY_TIME.plus(11, MILLIS),
is(PlainTime.of(17, 45, 10, 134456789)));
}
@Test
public void minusSomeMillis() {
assertThat(
PlainTime.of(0).minus(1, MILLIS),
is(PlainTime.of(23, 59, 59, 999000000)));
assertThat(
ANY_TIME.minus(1001, MILLIS),
is(PlainTime.of(17, 45, 9, 122456789)));
}
@Test
public void plusSomeMicros() {
assertThat(
PlainTime.of(0).plus(1, MICROS),
is(PlainTime.of(0, 0, 0, 1000)));
assertThat(
ANY_TIME.plus(11, MICROS),
is(PlainTime.of(17, 45, 10, 123467789)));
}
@Test
public void minusSomeMicros() {
assertThat(
PlainTime.of(0).minus(1, MICROS),
is(PlainTime.of(23, 59, 59, 999999000)));
assertThat(
ANY_TIME.minus(123456, MICROS),
is(PlainTime.of(17, 45, 10, 789)));
}
@Test
public void plusSomeNanos() {
assertThat(
PlainTime.of(0).plus(1, NANOS),
is(PlainTime.of(0, 0, 0, 1)));
assertThat(
ANY_TIME.plus(11, NANOS),
is(PlainTime.of(17, 45, 10, 123456800)));
}
@Test
public void minusSomeNanos() {
assertThat(
PlainTime.of(0).minus(1, NANOS),
is(PlainTime.of(23, 59, 59, 999999999)));
assertThat(
ANY_TIME.minus(123456790, NANOS),
is(PlainTime.of(17, 45, 9, 999999999)));
}
@Test
public void plusZero() {
assertThat(ANY_TIME.plus(0, HOURS) == ANY_TIME, is(true));
}
@Test
public void minusZero() {
assertThat(ANY_TIME.minus(0, HOURS) == ANY_TIME, is(true));
}
@Test
public void hoursBetween() {
assertThat(
HOURS.between(
PlainTime.of(0),
PlainTime.of(24)
),
is(24L));
assertThat(
HOURS.between(
PlainTime.of(24),
PlainTime.of(0)
),
is(-24L));
assertThat(
HOURS.between(
PlainTime.of(0),
ANY_TIME
),
is(17L));
assertThat(
HOURS.between(
ANY_TIME,
PlainTime.of(0)
),
is(-17L));
}
@Test
public void minutesBetween() {
assertThat(
MINUTES.between(
PlainTime.of(0),
PlainTime.of(24)
),
is(1440L));
assertThat(
MINUTES.between(
PlainTime.of(24),
PlainTime.of(0)
),
is(-1440L));
assertThat(
MINUTES.between(
PlainTime.of(0),
ANY_TIME
),
is(17L * 60 + 45));
assertThat(
MINUTES.between(
ANY_TIME,
PlainTime.of(0)
),
is(-17L * 60 - 45));
}
@Test
public void secondsBetween() {
assertThat(
SECONDS.between(
PlainTime.of(0),
PlainTime.of(24)
),
is(86400L));
assertThat(
SECONDS.between(
PlainTime.of(24),
PlainTime.of(0)
),
is(-86400L));
assertThat(
SECONDS.between(
PlainTime.of(0),
ANY_TIME
),
is(17L * 3600 + 45 * 60 + 10));
assertThat(
SECONDS.between(
ANY_TIME,
PlainTime.of(0)
),
is(-17L * 3600 - 45 * 60 - 10));
assertThat(
SECONDS.between(
PlainTime.of(2, 30, 5, 123),
PlainTime.of(2, 30, 8, 122)
),
is(2L));
assertThat(
SECONDS.between(
PlainTime.of(2, 30, 5, 123),
PlainTime.of(2, 30, 8, 123)
),
is(3L));
assertThat(
SECONDS.between(
PlainTime.of(2, 30, 5, 123),
PlainTime.of(2, 30, 8, 124)
),
is(3L));
}
@Test
public void millisBetween() {
long expected = (17L * 3600 + 45 * 60 + 10) * 1000 + 123;
assertThat(
MILLIS.between(PlainTime.of(0), ANY_TIME),
is(expected));
assertThat(
MILLIS.between(ANY_TIME, PlainTime.of(0)),
is(-expected));
}
@Test
public void microsBetween() {
long expected = (17L * 3600 + 45 * 60 + 10) * 1000000 + 123456;
assertThat(
MICROS.between(PlainTime.of(0), ANY_TIME),
is(expected));
assertThat(
MICROS.between(ANY_TIME, PlainTime.of(0)),
is(-expected));
}
@Test
public void nanosBetween() {
long expected = (17L * 3600 + 45 * 60 + 10) * 1000000000 + 123456789;
assertThat(
NANOS.between(PlainTime.of(0), ANY_TIME),
is(expected));
assertThat(
NANOS.between(ANY_TIME, PlainTime.of(0)),
is(-expected));
}
@Test(expected=ArithmeticException.class)
public void overflow() {
PlainTime.of(1).plus(Long.MAX_VALUE, HOURS);
}
@Test
public void plusLongMaxHours() {
assertThat(
PlainTime.of(0).plus(Long.MAX_VALUE, HOURS),
is(PlainTime.of(MathUtils.floorModulo(Long.MAX_VALUE, 24))));
}
@Test
public void plusLongMinHours() {
assertThat(
PlainTime.of(0).plus(Long.MIN_VALUE, HOURS),
is(PlainTime.of(MathUtils.floorModulo(Long.MIN_VALUE, 24))));
}
}