package org.croudtrip.trips; import com.google.common.collect.Lists; import junit.framework.TestCase; import org.croudtrip.api.account.User; import org.croudtrip.api.directions.NavigationResult; import org.croudtrip.api.directions.Route; import org.croudtrip.api.directions.RouteLocation; import org.croudtrip.api.trips.JoinTripRequest; import org.croudtrip.api.trips.SuperTrip; import org.croudtrip.api.trips.TripOffer; import org.croudtrip.api.trips.TripQuery; import org.croudtrip.api.trips.UserWayPoint; import org.croudtrip.db.JoinTripRequestDAO; import org.croudtrip.directions.DirectionsManager; import org.croudtrip.directions.RouteNotFoundException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; import mockit.Delegate; import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit4.JMockit; @RunWith(JMockit.class) public class TripsNavigationManagerTest extends TestCase { private static final User passenger = new User.Builder().setId(0).build(), driver = new User.Builder().setId(1).build(); private static final Route driverRoute = new Route.Builder() .wayPoints(Lists.newArrayList(new RouteLocation(45, 45), new RouteLocation(50, 50))) .build(); private static final TripOffer offer = new TripOffer( 0, driverRoute, 0, null, 1000, 0, driver, null, null, 0); private static final TripQuery query = new TripQuery( null, new RouteLocation(45, 45), new RouteLocation(50, 50), 10, System.currentTimeMillis() / 1000, passenger); private static final JoinTripRequest joinTripRequest = new JoinTripRequest.Builder() .setOffer(offer) .setSuperTrip(new SuperTrip.Builder().setQuery(query).build()) .build(); @Mocked TspSolver tspSolver; @Mocked JoinTripRequestDAO joinTripRequestDAO; @Mocked DirectionsManager directionsManager; TripsNavigationManager tripsNavigationManager; @Before public void setupManager() { tripsNavigationManager = new TripsNavigationManager(tspSolver, joinTripRequestDAO, directionsManager); } @Test @SuppressWarnings("unchecked") public void testGetRouteWaypointsForOffer() { new Expectations() {{ joinTripRequestDAO.findByOfferId(offer.getId()); result = Lists.newArrayList(joinTripRequest); directionsManager.getDirections( driverRoute.getWayPoints().get(0), driverRoute.getWayPoints().get(1), (List<RouteLocation>) any); result = Lists.newArrayList(new Route.Builder() .wayPoints(driverRoute.getWayPoints()) .legDurationInSeconds(Lists.newArrayList(1l, 1l, 1l)) .legDistancesInMeters(Lists.newArrayList(1l, 1l, 1l)) .build()); tspSolver.getBestOrder((List<JoinTripRequest>) any, offer); List<List<TspSolver.TspWayPoint>> routesList = new ArrayList<>(); routesList.add(Lists.newArrayList( new TspSolver.TspWayPoint(driver, driverRoute.getWayPoints().get(0), true), new TspSolver.TspWayPoint(passenger, query.getStartLocation(), true), new TspSolver.TspWayPoint(passenger, query.getDestinationLocation(), false), new TspSolver.TspWayPoint(driver, driverRoute.getWayPoints().get(1), false))); result = routesList; }}; List<UserWayPoint> userWayPoints = tripsNavigationManager.getRouteWaypointsForOffer(offer); Assert.assertEquals(4, userWayPoints.size()); Assert.assertEquals(driver, userWayPoints.get(0).getUser()); Assert.assertEquals(passenger, userWayPoints.get(1).getUser()); Assert.assertEquals(passenger, userWayPoints.get(2).getUser()); Assert.assertEquals(driver, userWayPoints.get(3).getUser()); long arrivalTime = Long.MIN_VALUE; long distanceToDriver = Long.MIN_VALUE; for (UserWayPoint wayPoint : userWayPoints) { Assert.assertTrue(wayPoint.getArrivalTimestamp() > arrivalTime); arrivalTime = wayPoint.getArrivalTimestamp(); Assert.assertTrue(wayPoint.getDistanceToDriverInMeters() > distanceToDriver); distanceToDriver = wayPoint.getDistanceToDriverInMeters(); } } @Test public void getRouteForOffer() { new Expectations() {{ joinTripRequestDAO.findByOfferId(offer.getId()); result = Lists.newArrayList(joinTripRequest); final TspSolver.TspWayPoint wp0 = new TspSolver.TspWayPoint(driver, driverRoute.getWayPoints().get(0), true); final TspSolver.TspWayPoint wp1 = new TspSolver.TspWayPoint(passenger, query.getStartLocation(), true); final TspSolver.TspWayPoint wp2 = new TspSolver.TspWayPoint(passenger, query.getDestinationLocation(), false); final TspSolver.TspWayPoint wp3 = new TspSolver.TspWayPoint(driver, driverRoute.getWayPoints().get(1), false); directionsManager.getDirections( driverRoute.getWayPoints().get(0), driverRoute.getWayPoints().get(1), (List<RouteLocation>) any); result = new Delegate() { public List<Route> getDirections( RouteLocation start, RouteLocation dest, List<RouteLocation> wps ) { Assert.assertTrue( wps.size() == 2 ); Assert.assertEquals(wp0.getLocation(), start); Assert.assertEquals(wp3.getLocation(), dest); Assert.assertEquals(wp1.getLocation(), wps.get(0)); Assert.assertEquals(wp2.getLocation(), wps.get(1)); return Lists.newArrayList(new Route.Builder() .wayPoints(driverRoute.getWayPoints()) .durationInSeconds(33) .distanceInMeters(33) .legDurationInSeconds(Lists.newArrayList(1l, 1l, 1l)) .legDistancesInMeters(Lists.newArrayList(1l, 1l, 1l)) .build()); } }; tspSolver.getBestOrder((List<JoinTripRequest>) any, offer); List<List<TspSolver.TspWayPoint>> routesList = new ArrayList<>(); routesList.add(Lists.newArrayList(wp0, wp1, wp2, wp3)); result = routesList; }}; NavigationResult navigationResult = null; try { navigationResult = tripsNavigationManager.getNavigationResultForOffer(offer); } catch (RouteNotFoundException e) { Assert.fail(e.getMessage()); } Assert.assertNotNull( navigationResult ); Assert.assertNotNull( navigationResult.getRoute() ); Assert.assertNotNull( navigationResult.getUserWayPoints() ); Assert.assertEquals(33, navigationResult.getRoute().getDurationInSeconds()); Assert.assertEquals(33, navigationResult.getRoute().getDistanceInMeters()); Assert.assertEquals(4, navigationResult.getUserWayPoints().size()); } }