package pl.edu.agh.logic;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import pl.edu.agh.model.SpeedInfo;
import pl.edu.agh.spatial.WGS84GeometryFactory;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
public class SpeedInfoProcessorTest {
private static final double TOLERANCE = 1.0;
private WGS84GeometryFactory geometryFactory = new WGS84GeometryFactory();
private SpeedInfoProcessor speedInfoProcessor = new SpeedInfoProcessor();
@Test
public void correctlyRetrievesSpeedInfoForPathWith2Segments() {
LineString l1 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-7, 0.3),
new Coordinate(-5, 0.3) });
LineString l2 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-5, 0.3),
new Coordinate(0, 0.3) });
Road road1 = new Road(Arrays.asList(l1, l2), 1, 1, 2, false);
LineString l3 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(0, -0.3),
new Coordinate(5, -0.3) });
Road road2 = new Road(Arrays.asList(l3), 2, 2, 3, false);
Clock clock = new Clock();
Path path = Path.createPath(new Coordinate(-6, 0), road1, clock.nextSecond())
.matchPointToLastRoad(new Coordinate(-4, 0), clock.nextSecond())
.matchPointToLastRoad(new Coordinate(-2, 0), clock.nextSecond())
.matchPointToRoad(new Coordinate(3, 0), road2, clock.nextSecond());
List<SpeedInfo> infos = speedInfoProcessor.retrieveSpeedInfoFromPath(path);
assertEquals(infos.size(), 2);
assertEquals(277983.5, infos.get(0).getDirectWaySpeed(), TOLERANCE);
assertNull(infos.get(0).getReverseWaySpeed());
assertEquals(555967.0, infos.get(1).getDirectWaySpeed(), TOLERANCE);
assertNull(infos.get(1).getReverseWaySpeed());
}
@Test
public void correctlyRetrievesSpeedInfoForPathWith3Segments() {
LineString l1 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-7, 0.3),
new Coordinate(-5, 0.3) });
LineString l2 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-5, 0.3),
new Coordinate(0, 0.3) });
Road road1 = new Road(Arrays.asList(l1, l2), 1, 1, 2, false);
LineString l3 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(0, -0.3),
new Coordinate(5, -0.3) });
Road road2 = new Road(Arrays.asList(l3), 2, 2, 3, true);
LineString l4 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(5, 0.3),
new Coordinate(7, 0.3) });
Road road3 = new Road(Arrays.asList(l4), 3, 3, 4, false);
Clock clock = new Clock();
Path path = Path.createPath(new Coordinate(-6, 0), road1, clock.nextSecond())
.matchPointToLastRoad(new Coordinate(-4, 0), clock.nextSecond())
.matchPointToLastRoad(new Coordinate(-5, 0), clock.nextSecond())
.matchPointToLastRoad(new Coordinate(-2, 0), clock.nextSecond())
.matchPointToRoad(new Coordinate(3, 0), road2, clock.nextSecond())
.matchPointToRoad(new Coordinate(6, 0), road3, clock.nextSecond());
List<SpeedInfo> infos = speedInfoProcessor.retrieveSpeedInfoFromPath(path);
assertEquals(infos.size(), 3);
assertEquals(261631.5, infos.get(0).getDirectWaySpeed(), TOLERANCE);
assertNull(infos.get(0).getReverseWaySpeed());
assertNull(infos.get(1).getDirectWaySpeed());
assertEquals(438805.8, infos.get(1).getReverseWaySpeed(), TOLERANCE);
assertEquals(333914.1, infos.get(2).getDirectWaySpeed(), TOLERANCE);
assertNull(infos.get(2).getReverseWaySpeed());
}
@Test
public void forPathWithOneMatchingsReuturnsEmptyList() {
LineString l1 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-7, 0.3),
new Coordinate(-5, 0.3) });
LineString l2 = geometryFactory.createLineString(new Coordinate[] { new Coordinate(-5, 0.3),
new Coordinate(0, 0.3) });
Road road1 = new Road(Arrays.asList(l1, l2), 1, 1, 2, false);
Clock clock = new Clock();
Path path = Path.createPath(new Coordinate(-6, 0), road1, clock.nextSecond());
List<SpeedInfo> infos = speedInfoProcessor.retrieveSpeedInfoFromPath(path);
Assert.assertTrue(infos.isEmpty());
}
}