ImmutableList<ImmutableList<Parcel>> getCurrentRoutes() { // gather current routes final ImmutableList.Builder<ImmutableList<Parcel>> currentRouteBuilder = ImmutableList.builder(); for (final RouteFollowingVehicle vehicle : vehicles) { final ImmutableList<Parcel> l = ImmutableList.copyOf(vehicle.getRoute()); currentRouteBuilder.add(l); } return currentRouteBuilder.build(); }
@Override public void handleEvent(Event e) { if (!(e instanceof PDPModelEvent)) { return; } final List<Parcel> route = new ArrayList<>(vehicle.getRoute()); final Parcel newlyAddedParcel = ((PDPModelEvent) e).parcel; route.add(newlyAddedParcel); route.add(newlyAddedParcel); vehicle.setRoute(route); } }, PDPModelEventType.NEW_PARCEL);
@Override public void handleEvent(Event e) { if (!(e instanceof PDPModelEvent)) { return; } final List<Parcel> route = new ArrayList<>(vehicle.getRoute()); final Parcel newlyAddedParcel = ((PDPModelEvent) e).parcel; route.add(newlyAddedParcel); route.add(newlyAddedParcel); vehicle.setRoute(route); } }, PDPModelEventType.NEW_PARCEL);
@Override public void render() { if (table.getItemCount() < list.size()) { for (int i = table.getItemCount(); i < list.size(); i++) { createItem(list.get(i)); } } for (int i = 0; i < table.getItemCount(); i++) { final RouteFollowingVehicle v = list.get(i); table.getItem(i).setText(1, Integer.toString(v.getRoute().size())); table.getItem(i).setText(2, v.getRoute().toString()); } table.getParent().redraw(); table.getParent().layout(); }
@Override public void render() { if (table.getItemCount() < list.size()) { for (int i = table.getItemCount(); i < list.size(); i++) { createItem(list.get(i)); } } for (int i = 0; i < table.getItemCount(); i++) { final RouteFollowingVehicle v = list.get(i); table.getItem(i).setText(1, Integer.toString(v.getRoute().size())); table.getItem(i).setText(2, v.getRoute().toString()); } table.getParent().redraw(); table.getParent().layout(); }
@Override public void tick(TimeLapse timeLapse) { if (hasChanged) { hasChanged = false; // TODO check to see that this is called the first possible moment after // the add parcel event was dispatched // TODO it must be checked whether the calculated routes end up in the // correct vehicles final Set<RouteFollowingVehicle> vehicles = roadModel .getObjectsOfType(RouteFollowingVehicle.class); // gather current routes final ImmutableList.Builder<ImmutableList<Parcel>> currentRouteBuilder = ImmutableList .builder(); for (final RouteFollowingVehicle vehicle : vehicles) { final ImmutableList<Parcel> l = ImmutableList.copyOf(vehicle .getRoute()); currentRouteBuilder.add(l); } final Iterator<ImmutableList<Parcel>> routes = solverAdapter .solve( SolveArgs.create() .useAllParcels() .useCurrentRoutes(currentRouteBuilder.build())) .iterator(); for (final RouteFollowingVehicle vehicle : vehicles) { vehicle.setRoute(routes.next()); } } }
@Override public void afterTick(TimeLapse timeLapse) { if (timeLapse.getStartTime() == 200) { // this is the tick in which the new order event was dispatched. This // check is to ensure that the vehicle moves at the earliest possible // time (which is in the same tick) towards the new order. assertThat(rm.getPosition(vehicles.get(0))) .isNotEqualTo(new Point(0, 0)); assertThat(vehicles.get(0).getRoute()).hasSize(2); assertThat(vehicles.get(1).getRoute()).isEmpty(); } } });
@Override public void renderDynamic(GC gc, ViewPort vp, long time) { final Set<RouteFollowingVehicle> vehicles = roadModel.getObjectsOfType( RouteFollowingVehicle.class); for (final RouteFollowingVehicle v : vehicles) { final Set<Parcel> seen = newHashSet(); final Point from = roadModel.getPosition(v); int prevX = vp.toCoordX(from.x); int prevY = vp.toCoordY(from.y); for (final Parcel parcel : ImmutableList.copyOf(v.getRoute())) { final Point to; if (pdpModel.getParcelState(parcel).isPickedUp() || seen.contains(parcel)) { to = parcel.getDto().getDeliveryLocation(); } else { to = parcel.getDto().getPickupLocation(); } seen.add(parcel); final int x = vp.toCoordX(to.x); final int y = vp.toCoordY(to.y); gc.drawLine(prevX, prevY, x, y); prevX = x; prevY = y; } } }
@Override public void tick(TimeLapse timeLapse) { if (timeLapse.getStartTime() == 100) { assertThat(clock.getClockMode()).isSameAs(ClockMode.SIMULATED); assertThat(rm.getPosition(vehicles.get(0))) .isEqualTo(new Point(0, 0)); assertThat(vehicles.get(0).getRoute()).isEmpty(); assertThat(vehicles.get(1).getRoute()).isEmpty(); } else if (timeLapse.getStartTime() == 200) { assertThat(clock.getClockMode()).isSameAs(ClockMode.REAL_TIME); // this is the tick in which the new order event is dispatched. This // code is executed just before the tick implementation of the // vehicle, therefore the vehicle should not have moved yet. assertThat(rm.getPosition(vehicles.get(0))) .isEqualTo(new Point(0, 0)); assertThat(vehicles.get(0).getRoute()).hasSize(2); assertThat(vehicles.get(1).getRoute()).isEmpty(); } else if (timeLapse.getStartTime() == 59900) { assertThat(clock.getClockMode()).isSameAs(ClockMode.SIMULATED); assertThat(vehicles.get(0).getRoute()).hasSize(2); assertThat(vehicles.get(1).getRoute()).isEmpty(); } else if (timeLapse.getStartTime() == 60000) { assertThat(clock.getClockMode()).isSameAs(ClockMode.REAL_TIME); assertThat(vehicles.get(0).getRoute()).hasSize(4); assertThat(vehicles.get(1).getRoute()).isEmpty(); } }
@Override public void renderDynamic(GC gc, ViewPort vp, long time) { final Set<RouteFollowingVehicle> vehicles = roadModel.getObjectsOfType( RouteFollowingVehicle.class); for (final RouteFollowingVehicle v : vehicles) { final Set<Parcel> seen = newHashSet(); final Point from = roadModel.getPosition(v); int prevX = vp.toCoordX(from.x); int prevY = vp.toCoordY(from.y); for (final Parcel parcel : ImmutableList.copyOf(v.getRoute())) { final Point to; if (pdpModel.getParcelState(parcel).isPickedUp() || seen.contains(parcel)) { to = parcel.getDto().getDeliveryLocation(); } else { to = parcel.getDto().getPickupLocation(); } seen.add(parcel); final int x = vp.toCoordX(to.x); final int y = vp.toCoordY(to.y); gc.drawLine(prevX, prevY, x, y); prevX = x; prevY = y; } } }
/** * Test for: A parcel in the route that is being picked up by another vehicle. */ @Test public void setRouteSafeTest4() { d.setRoute(asList(p1, p1)); tick(0, 7); assertThat(pm.getParcelState(p1)).isSameAs(ParcelState.PICKING_UP); assertThat(d.getRoute()).containsExactly(p1, p1); boolean fail = false; try { // it is being picked up by the other vehicle, so this should be ignored d2.setRoute(asList(p1, p1)); assertThat(d2.getRoute()).isEmpty(); } catch (final IllegalArgumentException e) { assertThat(e.getMessage()).contains( "When a parcel in the route is in PICKING UP state the vehicle " + "must also be in that state"); fail = true; } assertThat(routeAdjuster == RouteAdjusters.NOP).isEqualTo(fail); }
/** * Tests that the delay adjuster adds parcels in cargo. */ @Test public void setRouteSafeTest6() { d.setRoute(asList(p1, p1)); tick(0, 8); assertThat(pm.getParcelState(p1)).isSameAs(ParcelState.IN_CARGO); d.setRoute(asList(p2, p2)); if (routeAdjuster == RouteAdjusters.DELAY_ADJUSTER) { assertThat(d.getRoute()).containsExactly(p2, p2, p1).inOrder(); } else { assertThat(d.getRoute()).containsExactly(p2, p2).inOrder(); } }
/** * Test for: A parcel that occurs twice in the route but has already been * picked up by this vehicle, the first occurrence in the route will be * removed. */ @Test public void setRouteSafeTest3() { d.setRoute(asList(p1, p1)); tick(0, 8); assertThat(pm.getParcelState(p1)).isSameAs(ParcelState.IN_CARGO); assertThat(d.getRoute()).containsExactly(p1); boolean fail = false; // p1 is already in cargo, therefore it can occur only once in the route try { d.setRoute(asList(p1, p2, p1, p2)); assertThat(d.getRoute()).containsExactly(p2, p1, p2).inOrder(); } catch (final IllegalArgumentException e) { fail = true; assertThat(e.getMessage()).contains( "A parcel that is in cargo may not occur more than once in a route"); } assertThat(routeAdjuster == RouteAdjusters.NOP).isEqualTo(fail); d.setRoute(asList(p1, p2, p2)); assertThat(d.getRoute()).containsExactly(p1, p2, p2).inOrder(); }
/** * Test for: A parcel that occurs in the route has been delivered, all * occurrences of this parcel will be removed from the route. */ @Test public void setRouteSafeTest1() { d.setRoute(asList(p1, p1)); tick(0, 17); assertThat(pm.getParcelState(p1)).isSameAs(ParcelState.DELIVERED); assertThat(d.getRoute()).isEmpty(); // p1 is already delivered, therefore it can not occur in the route boolean fail = false; try { d.setRoute(asList(p1, p2, p1, p2)); assertThat(d.getRoute()).containsExactly(p2, p2).inOrder(); } catch (final IllegalArgumentException e) { assertThat(e.getMessage()).contains( "A parcel that is already delivered can not be part of a route."); fail = true; } assertThat(routeAdjuster == RouteAdjusters.NOP).isEqualTo(fail); }
assertThat(pm.getParcelState(p1)).isSameAs(ParcelState.IN_CARGO); assertThat(pm.getContents(d)).containsExactly(p1); assertThat(d.getRoute()).containsExactly(p1); assertThat(d.getRoute()).containsExactly(p2, p1, p2).inOrder(); } catch (final IllegalArgumentException e) { fail = true; assertThat(d2.getRoute()).containsExactly(p2, p2).inOrder(); } catch (final IllegalArgumentException e) { assertThat(e.getMessage()).contains(
assertThat(pm.getVehicleActionInfo(d).getParcel()).isSameAs(p1); assertThat(pm.getVehicleActionInfo(d2).getParcel()).isSameAs(p4); assertThat(d.getRoute()).containsExactly(p1, p1); assertThat(d2.getRoute()).containsExactly(p4, p4); assertThat(d.getRoute()).containsExactly(p1, p1); } catch (final IllegalArgumentException e) { fail = true; try { d2.setRoute(asList(p1, p4, p4, p1)); assertThat(d2.getRoute()).containsExactly(p4, p4); } catch (final IllegalArgumentException e) { fail = true;