package dk.dma.ais.abnormal.analyzer;
import com.google.inject.Injector;
import dk.dma.ais.abnormal.analyzer.analysis.Analysis;
import dk.dma.ais.abnormal.analyzer.analysis.CloseEncounterAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.CourseOverGroundAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.DriftAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.FreeFlowAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.ShipTypeAndSizeAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.SpeedOverGroundAnalysis;
import dk.dma.ais.abnormal.analyzer.analysis.SuddenSpeedChangeAnalysis;
import dk.dma.ais.abnormal.analyzer.services.SafetyZoneService;
import dk.dma.ais.tracker.eventEmittingTracker.EventEmittingTracker;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.jmock.Expectations;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.Test;
import java.util.Set;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_CLOSEENCOUNTER_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_COG_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_DRIFT_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_FREEFLOW_BBOX;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_FREEFLOW_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_SOG_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_SUDDENSPEEDCHANGE_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_ANALYSIS_TYPESIZE_ENABLED;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH;
import static dk.dma.ais.abnormal.analyzer.config.Configuration.CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH;
import static org.junit.Assert.assertEquals;
public class PacketHandlerImplTest {
@Test
public void initNoAnalyses() throws Exception {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty(CONFKEY_ANALYSIS_COG_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_SOG_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_TYPESIZE_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_DRIFT_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_SUDDENSPEEDCHANGE_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_CLOSEENCOUNTER_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_FREEFLOW_ENABLED, false);
final JUnit4Mockery context = new JUnit4Mockery();
Injector injectorMock = context.mock(Injector.class);
context.checking(new Expectations() {{
}});
PacketHandlerImpl sut = new PacketHandlerImpl(configuration, injectorMock, null, null, null, null);
Set<Analysis> analyses = sut.getAnalyses();
assertEquals(0, analyses.size());
}
@Test
public void initAllAnalyses() throws Exception {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty(CONFKEY_ANALYSIS_COG_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_SOG_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_TYPESIZE_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_DRIFT_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_SUDDENSPEEDCHANGE_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_CLOSEENCOUNTER_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_FREEFLOW_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_FREEFLOW_BBOX, new Integer[] {1, 2, 3, 4});
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH, 2.0);
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH, 3.0);
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND, 0.25);
final JUnit4Mockery context = new JUnit4Mockery();
Injector injectorMock = context.mock(Injector.class);
EventEmittingTracker trackingServiceMock = context.mock(EventEmittingTracker.class);
SafetyZoneService safetyZoneService = new SafetyZoneService(configuration);
context.checking(new Expectations() {{
ignoring(trackingServiceMock);
oneOf(injectorMock).getInstance(with(CourseOverGroundAnalysis.class)); will(returnValue(new CourseOverGroundAnalysis(configuration, null, null, trackingServiceMock, null, null)));
oneOf(injectorMock).getInstance(with(SpeedOverGroundAnalysis.class)); will(returnValue(new SpeedOverGroundAnalysis(configuration, null, null, trackingServiceMock, null, null)));
oneOf(injectorMock).getInstance(with(ShipTypeAndSizeAnalysis.class)); will(returnValue(new ShipTypeAndSizeAnalysis(configuration, null, null, trackingServiceMock, null, null)));
oneOf(injectorMock).getInstance(with(DriftAnalysis.class)); will(returnValue(new DriftAnalysis(configuration, null, trackingServiceMock, null)));
oneOf(injectorMock).getInstance(with(SuddenSpeedChangeAnalysis.class)); will(returnValue(new SuddenSpeedChangeAnalysis(configuration, null, trackingServiceMock, null)));
oneOf(injectorMock).getInstance(with(CloseEncounterAnalysis.class)); will(returnValue(new CloseEncounterAnalysis(configuration, null, trackingServiceMock, null, safetyZoneService)));
oneOf(injectorMock).getInstance(with(FreeFlowAnalysis.class)); will(returnValue(new FreeFlowAnalysis(configuration, null, trackingServiceMock, null)));
}});
PacketHandlerImpl sut = new PacketHandlerImpl(configuration, injectorMock, null, null, null, null);
Set<Analysis> analyses = sut.getAnalyses();
assertEquals(7, analyses.size());
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof CourseOverGroundAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof SpeedOverGroundAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof ShipTypeAndSizeAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof DriftAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof SuddenSpeedChangeAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof CloseEncounterAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof FreeFlowAnalysis));
}
@Test
public void initSelectedAnalyses() throws Exception {
PropertiesConfiguration configuration = new PropertiesConfiguration();
configuration.addProperty(CONFKEY_ANALYSIS_COG_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_SOG_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_TYPESIZE_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_DRIFT_ENABLED, false);
configuration.addProperty(CONFKEY_ANALYSIS_SUDDENSPEEDCHANGE_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_CLOSEENCOUNTER_ENABLED, true);
configuration.addProperty(CONFKEY_ANALYSIS_FREEFLOW_ENABLED, false);
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH, 2.0);
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH, 3.0);
configuration.addProperty(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND, 0.25);
final JUnit4Mockery context = new JUnit4Mockery();
Injector injectorMock = context.mock(Injector.class);
EventEmittingTracker trackingServiceMock = context.mock(EventEmittingTracker.class);
SafetyZoneService safetyZoneService = new SafetyZoneService(configuration);
context.checking(new Expectations() {{
ignoring(trackingServiceMock);
oneOf(injectorMock).getInstance(with(SuddenSpeedChangeAnalysis.class)); will(returnValue(new SuddenSpeedChangeAnalysis(configuration, null, trackingServiceMock, null)));
oneOf(injectorMock).getInstance(with(CloseEncounterAnalysis.class)); will(returnValue(new CloseEncounterAnalysis(configuration, null, trackingServiceMock, null, safetyZoneService)));
}});
PacketHandlerImpl sut = new PacketHandlerImpl(configuration, injectorMock, null, null, null, null);
Set<Analysis> analyses = sut.getAnalyses();
assertEquals(2, analyses.size());
assertEquals(false, analyses.stream().anyMatch(a -> a instanceof CourseOverGroundAnalysis));
assertEquals(false, analyses.stream().anyMatch(a -> a instanceof SpeedOverGroundAnalysis));
assertEquals(false, analyses.stream().anyMatch(a -> a instanceof ShipTypeAndSizeAnalysis));
assertEquals(false, analyses.stream().anyMatch(a -> a instanceof DriftAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof SuddenSpeedChangeAnalysis));
assertEquals(true, analyses.stream().anyMatch(a -> a instanceof CloseEncounterAnalysis));
assertEquals(false, analyses.stream().anyMatch(a -> a instanceof FreeFlowAnalysis));
}
}