/* Copyright (c) 2011 Danish Maritime Authority.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dk.dma.ais.tracker.scenarioTracker;
import dk.dma.ais.packet.AisPacket;
import dk.dma.ais.packet.AisPacketReader;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
/**
* Created by tbsalling on 07/04/14.
*/
public class ScenarioTrackerTest {
AisPacketReader packetReader;
ScenarioTracker scenarioTracker;
@Before
public void setUp() throws Exception {
Path testdata = Paths.get("src/test/resources/replay_dump.txt");
packetReader = AisPacketReader.createFromFile(testdata, true);
scenarioTracker = new ScenarioTracker();
}
@Test
public void testScenarioBegin() throws IOException {
scenarioTracker.subscribeToPacketReader(packetReader);
Date scenarioBegin = scenarioTracker.scenarioBegin();
System.out.println("Scenario begin: " + scenarioBegin.toString());
assertEquals(1363598349499L, scenarioBegin.getTime());
}
@Test
public void testScenarioEnd() throws IOException {
scenarioTracker.subscribeToPacketReader(packetReader);
Date scenarioEnd = scenarioTracker.scenarioEnd();
System.out.println("Scenario end: " + scenarioEnd.toString());
assertEquals(1363598370922L, scenarioEnd.getTime());
}
@Test
public void testGetTargets() throws IOException {
scenarioTracker.subscribeToPacketReader(packetReader);
Set<ScenarioTracker.Target> scenario = scenarioTracker.getTargets();
assertEquals(34, scenario.size());
}
@Test
public void testDimensions() throws IOException {
scenarioTracker.subscribeToPacketReader(packetReader);
Set<ScenarioTracker.Target> scenario = scenarioTracker.getTargets();
ScenarioTracker.Target[] targets = scenario.toArray(new ScenarioTracker.Target[0]);
assertEquals(72, targets[30].getToBow());
assertEquals(10, targets[30].getToStern());
assertEquals(8, targets[30].getToPort());
assertEquals(4, targets[30].getToStarboard());
}
@Test
public void testGetName() throws IOException {
scenarioTracker.subscribeToPacketReader(packetReader);
Set<ScenarioTracker.Target> scenario = scenarioTracker.getTargets();
ScenarioTracker.Target[] targets = scenario.toArray(new ScenarioTracker.Target[0]);
assertEquals("2190048", targets[0].getName());
assertEquals("2655135", targets[1].getName());
assertEquals("212204000", targets[2].getName());
assertEquals("219000119", targets[3].getName());
assertEquals("MOSVIK", targets[30].getName());
}
@Test
public void testGetPositionReportAt() {
final String[] NMEA_TEST_STRINGS = {
// GatehouseSourceTag [baseMmsi=2190067, country=DK, region=, timestamp=Thu Apr 10 15:30:38 CEST 2014]
// [msgId=1, repeat=0, userId=219000606, cog=2010, navStatus=0, pos=(33024530,6010902) = (33024530,6010902), posAcc=1, raim=0, specialManIndicator=0, rot=0, sog=108, spare=0, syncState=1, trueHeading=200, utcSec=60, slotTimeout=2, subMessage=1427]
"$PGHP,1,2014,4,10,13,30,38,88,219,,2190067,1,26*1E\r\n" +
"!BSVDM,1,1,,B,13@ng7P01dPeo0dOOb4WnVAp0`FC,0*26",
// GatehouseSourceTag [baseMmsi=2190067, country=DK, region=, timestamp=Thu Apr 10 15:31:18 CEST 2014]
// [msgId=1, repeat=0, userId=219000606, cog=2010, navStatus=0, pos=(33023417,6010117) = (33023417,6010117), posAcc=1, raim=0, specialManIndicator=0, rot=0, sog=108, spare=0, syncState=1, trueHeading=199, utcSec=60, slotTimeout=0, subMessage=2263]
"$PGHP,1,2014,4,10,13,31,18,678,219,,2190067,1,03*23\r\n" +
"!BSVDM,1,1,,B,13@ng7P01dPen`:OOUfGnV?p0PSG,0*03"
};
assertEquals(0, scenarioTracker.getTargets().size());
scenarioTracker.update(AisPacket.from(NMEA_TEST_STRINGS[0]));
scenarioTracker.update(AisPacket.from(NMEA_TEST_STRINGS[1]));
assertEquals(1, scenarioTracker.getTargets().size());
ScenarioTracker.Target target = scenarioTracker.getTargets().iterator().next();
Iterator<ScenarioTracker.Target.PositionReport> positionReportIterator = target.getPositionReports().iterator();
ScenarioTracker.Target.PositionReport pr1 = positionReportIterator.next();
ScenarioTracker.Target.PositionReport pr2 = positionReportIterator.next();
final long t1 = pr1.getTimestamp();
final long t2 = pr2.getTimestamp();
assertNotEquals(pr1.getLatitude(), pr2.getLatitude(), 0.001);
assertNotEquals(pr1.getLongitude(), pr2.getLongitude(), 0.001);
assertEquals(1397136638088L, t1);
assertEquals(1397136678678L, t2);
assertEquals(false, pr1.isEstimated());
assertEquals(false, pr2.isEstimated());
final long t = (t2-t1)/2 + t1; // Half-way between t1 and t2
assertEquals(1397136658383L, t);
ScenarioTracker.Target.PositionReport interpolatedPosition = target.getPositionReportAt(new Date(t), 5);
assertEquals((pr1.getLatitude() + pr2.getLatitude())/2, interpolatedPosition.getLatitude(), 1e-16);
assertEquals((pr1.getLongitude() + pr2.getLongitude())/2, interpolatedPosition.getLongitude(), 1e-16);
assertEquals(200, interpolatedPosition.getHeading());
assertEquals(t, interpolatedPosition.getTimestamp());
assertEquals(true, interpolatedPosition.isEstimated());
ScenarioTracker.Target.PositionReport estimatedPosition = target.getPositionReportAt(new Date(t), 20);
assertEquals(true, estimatedPosition.isEstimated());
ScenarioTracker.Target.PositionReport reportedPosition = target.getPositionReportAt(new Date(t), 21);
assertEquals(false, reportedPosition.isEstimated());
assertEquals(pr1, reportedPosition);
}
}