@Override public ClockMode getClockMode() { return ((ClockState) stateMachine.getCurrentState()).getClockMode(); }
public State<StateEvent, RouteFollowingVehicle> getState() { return stateMachine.getCurrentState(); }
@Override public void stop() { LOGGER.trace("stop"); checkState(stateMachine.isSupported(Trigger.STOP), "Can not stop time in current state: %s", stateMachine.getCurrentState().name()); final boolean rt = stateMachine.stateIs(realtimeState); stateMachine.handle(Trigger.STOP, this); if (!rt) { shutdownExecutor(); } }
/** * Tests agent behavior when diversion is attempted in the wait state. This is * always allowed. */ @Test public void diversionTestInWaitState() { assertEquals(d.waitState, d.stateMachine.getCurrentState()); d.setRoute(asList(p1)); assertEquals(Optional.absent(), d.newRoute); assertEquals(new LinkedList<>(asList(p1)), d.route); d.setRoute(asList(p1, p2, p1, p2)); assertEquals(Optional.absent(), d.newRoute); assertEquals(new LinkedList<>(asList(p1, p2, p1, p2)), d.route); d.setRoute(asList(p2, p2, p1, p1)); assertEquals(Optional.absent(), d.newRoute); assertEquals(new LinkedList<>(asList(p2, p2, p1, p1)), d.route); }
/** * Tests the REROUTE event. */ @Test public void testRerouteEvent() { d.setRoute(asList(p1)); tick(0, 5, 20); assertEquals(d.waitForServiceState, d.stateMachine.getCurrentState()); boolean exception = false; try { d.setRoute(Arrays.<Parcel>asList(p2)); tick(12, 13); if (diversionIsAllowed) { // route has changed, here the actual REROUTE event will be sent assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(new LinkedList<>(asList(p2)), d.route); assertFalse(d.newRoute.isPresent()); } else { // route has not yet changed assertEquals(d.serviceState, d.stateMachine.getCurrentState()); assertEquals(new LinkedList<>(asList(p1)), d.route); assertEquals(asList(p2), d.newRoute.get()); } } catch (final IllegalArgumentException e) { exception = true; } assertEquals(!allowDelayedRouteChanges && !diversionIsAllowed, exception); }
/** * Tests the NOGO event. */ @Test public void testNogoEvent() { d.setRoute(asList(p2)); tick(0, 11); tick(11, 12); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); boolean exception = false; try { d.setRoute(Arrays.<Parcel>asList()); tick(12, 13); if (diversionIsAllowed) { // route has changed, here the actual NOGO event will be sent assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(new LinkedList<>(), d.route); assertFalse(d.newRoute.isPresent()); } else { // route has not yet changed assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(new LinkedList<>(asList(p2)), d.route); assertEquals(asList(), d.newRoute.get()); } } catch (final IllegalArgumentException e) { exception = true; } assertEquals(!allowDelayedRouteChanges && !diversionIsAllowed, exception); }
assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.waitForServiceState, d.stateMachine.getCurrentState()); assertEquals(d.waitState, d.stateMachine.getCurrentState()); } else { assertEquals(d.waitForServiceState, d.stateMachine.getCurrentState());
assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.serviceState, d.stateMachine.getCurrentState()); assertEquals(d.serviceState, d.stateMachine.getCurrentState()); tick(7, 8); assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(asList(p1), pm.getContents(d).asList()); assertEquals(d.waitState, d.stateMachine.getCurrentState()); if (allowDelayedRouteChanges) { if (routeAdjuster == RouteAdjusters.DELAY_ADJUSTER) {
assertEquals(stopState, fsm.getCurrentState()); fsm.handle(Events.START, CONTEXT); assertEquals(startState, fsm.getCurrentState()); assertEquals(startState, fsm.getCurrentState()); assertEquals(startState, fsm.getCurrentState()); assertEquals(2, history.getHistory().size()); assertTrue(((StateTransitionEvent) history.getHistory().get(0)) assertEquals(specialState, fsm.getCurrentState()); assertEquals(specialState, fsm.getCurrentState()); assertEquals(startState, fsm.getCurrentState());
assertEquals(stopState, fsm.getCurrentState()); assertTrue(stopState.handleHistory().isEmpty()); assertTrue(stopState.onEntryHistory().isEmpty()); assertEquals(stopState, fsm.getCurrentState());
assertEquals(Optional.absent(), d.newRoute); tick(2, 3); assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(new Point(1, 1), rm.getPosition(d)); assertEquals(d.gotoState, d.stateMachine.getCurrentState());
/** * Tests a subclass that changes the state machine. */ @Test public void testExtension() { final VehicleDTO v = VehicleDTO.builder() .startPosition(new Point(1, 1)) .speed(30d) .capacity(1) .availabilityTimeWindow(TimeWindow.create(0, minute(30))) .build(); final SubVehicle vehicle = new SubVehicle(v, allowDelayedRouteChanges); d = vehicle; PDPTWTestUtil.register(rm, pm, vehicle); tick(0, 1); assertEquals(vehicle.waitState, vehicle.stateMachine.getCurrentState()); vehicle.stateMachine.handle(ExtraEvent.TEST_EVENT, vehicle); assertEquals(vehicle.extraState, vehicle.stateMachine.getCurrentState()); tick(1, 2); assertEquals(vehicle.waitState, vehicle.stateMachine.getCurrentState()); }
void tick(long beginMinute, long endMinute, long consumeSeconds) { final TimeLapse tl = time(minute(beginMinute), minute(endMinute)); if (consumeSeconds > 0) { tl.consume(consumeSeconds * 1000); } pm.tick(copy(tl)); final TimeLapse dtl = copy(tl); d.tick(dtl); assertSame(dtl, d.getCurrentTimeLapse()); assertFalse(dtl.hasTimeLeft()); // tests whether internal states of vehicle match the state of the pdp model // at all times if (pm.getVehicleState(d) == VehicleState.DELIVERING || pm.getVehicleState(d) == VehicleState.PICKING_UP) { assertSame(d.serviceState, d.stateMachine.getCurrentState()); } else { assertThat(d.serviceState).isNotSameAs(d.stateMachine.getCurrentState()); } }
assertEquals(Optional.absent(), d.newRoute); tick(5, 6); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(1, leh.getHistory().size()); assertEquals(p1, d.gotoState.getDestination()); assertEquals(d.gotoState, ev1.newState); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(p1, d.getRoute().iterator().next()); assertEquals(d.gotoState, d.stateMachine.getCurrentState());
/** * */ @Test public void brokenWaitState() { d.setRoute(asList(p1)); tick(4, 5, 30); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); if (allowDelayedRouteChanges) { d.setRoute(Arrays.<Parcel>asList()); rm.moveTo(d, p1, time(minute(0), minute(10))); assertTrue(rm.equalPosition(d, p1)); pm.pickup(d, p1, time(minute(16), minute(17))); assertEquals(VehicleState.PICKING_UP, pm.getVehicleState(d)); if (diversionIsAllowed) { boolean exception = false; try { tick(5, 6); } catch (final IllegalStateException e) { exception = true; } assertTrue(exception); } } }
tick(1, 2); tick(2, 3); assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(new Point(1, 1), rm.getPosition(d)); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.serviceState, d.stateMachine.getCurrentState());
tick(1, 2); tick(2, 3); assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(new Point(1, 1), rm.getPosition(d)); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.serviceState, d.stateMachine.getCurrentState());
tick(1, 2); tick(2, 3); assertEquals(d.waitState, d.stateMachine.getCurrentState()); assertEquals(new Point(1, 1), rm.getPosition(d)); assertEquals(d.gotoState, d.stateMachine.getCurrentState()); assertEquals(d.waitForServiceState, d.stateMachine.getCurrentState()); assertEquals(d.serviceState, d.stateMachine.getCurrentState()); tick(6, 7);