Skip to content

Commit 6d30dd1

Browse files
author
David Legg
committed
Add SimulationClockTest
1 parent 7e85f30 commit 6d30dd1

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

contrib/src/main/java/gov/nasa/jpl/aerie/contrib/streamline/modeling/clocks/InstantClock.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public InstantClock step(Duration t) {
1818
return new InstantClock(addToInstant(extract, t));
1919
}
2020

21+
// TODO - this method belongs somewhere else...
22+
// Making it package-private at least lets us move it later without dependency issues outside the library.
2123
static Duration durationBetween(Instant start, Instant end) {
2224
return Duration.of(ChronoUnit.MICROS.between(start, end), Duration.MICROSECONDS);
2325
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package gov.nasa.jpl.aerie.contrib.streamline.modeling.clocks;
2+
3+
import gov.nasa.jpl.aerie.contrib.streamline.core.Resources;
4+
import gov.nasa.jpl.aerie.merlin.framework.junit.MerlinExtension;
5+
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.TestInstance;
8+
import org.junit.jupiter.api.extension.ExtendWith;
9+
10+
import java.time.Instant;
11+
import java.time.temporal.ChronoUnit;
12+
13+
import static gov.nasa.jpl.aerie.contrib.streamline.core.Resources.*;
14+
import static gov.nasa.jpl.aerie.merlin.framework.ModelActions.delay;
15+
import static gov.nasa.jpl.aerie.merlin.protocol.types.Duration.HOUR;
16+
import static gov.nasa.jpl.aerie.merlin.protocol.types.Duration.ZERO;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
19+
@ExtendWith(MerlinExtension.class)
20+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
21+
public class SimulationClockTest {
22+
// This time is unlikely to be a hard-coded default anywhere
23+
public static final Instant PLAN_START = Instant.parse("2020-01-02T03:04:05Z");
24+
25+
public SimulationClockTest() {
26+
Resources.init(PLAN_START);
27+
}
28+
29+
@Test
30+
public void relative_clock_starts_at_zero() {
31+
assertEquals(ZERO, currentTime());
32+
assertEquals(ZERO, currentValue(simulationClock()));
33+
}
34+
35+
@Test
36+
public void absolute_clock_starts_at_plan_start() {
37+
assertEquals(PLAN_START, currentInstant());
38+
assertEquals(PLAN_START, currentValue(absoluteClock()));
39+
}
40+
41+
@Test
42+
public void relative_clock_advances_at_unit_rate() {
43+
delay(1, HOUR);
44+
assertEquals(Duration.of(1, HOUR), currentTime());
45+
assertEquals(Duration.of(1, HOUR), currentValue(simulationClock()));
46+
delay(1, HOUR);
47+
assertEquals(Duration.of(2, HOUR), currentTime());
48+
assertEquals(Duration.of(2, HOUR), currentValue(simulationClock()));
49+
delay(1, HOUR);
50+
assertEquals(Duration.of(3, HOUR), currentTime());
51+
assertEquals(Duration.of(3, HOUR), currentValue(simulationClock()));
52+
}
53+
54+
@Test
55+
public void absolute_clock_advances_at_unit_rate() {
56+
delay(1, HOUR);
57+
assertEquals(PLAN_START.plus(1, ChronoUnit.HOURS), currentInstant());
58+
assertEquals(PLAN_START.plus(1, ChronoUnit.HOURS), currentValue(absoluteClock()));
59+
delay(1, HOUR);
60+
assertEquals(PLAN_START.plus(2, ChronoUnit.HOURS), currentInstant());
61+
assertEquals(PLAN_START.plus(2, ChronoUnit.HOURS), currentValue(absoluteClock()));
62+
delay(1, HOUR);
63+
assertEquals(PLAN_START.plus(3, ChronoUnit.HOURS), currentInstant());
64+
assertEquals(PLAN_START.plus(3, ChronoUnit.HOURS), currentValue(absoluteClock()));
65+
}
66+
}

0 commit comments

Comments
 (0)