package dk.dma.ais.abnormal.analyzer.services; import dk.dma.enav.model.geometry.Ellipse; import dk.dma.enav.model.geometry.Position; import org.apache.commons.configuration.Configuration; import org.jmock.Expectations; import org.jmock.integration.junit4.JUnit4Mockery; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; 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 java.lang.Math.abs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class SafetyZoneServiceTest { private final Position position = Position.create(56, 12); SafetyZoneService sut; @Before public void setup() { JUnit4Mockery context = new JUnit4Mockery(); Configuration configurationMock = context.mock(Configuration.class); context.checking(new Expectations() {{ oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH)); will(returnValue(2.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH)); will(returnValue(3.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND)); will(returnValue(0.25)); }}); sut = new SafetyZoneService(configurationMock); } @Test public void safetyZoneXYAreTranslatedForwardX() { Ellipse ellipse = sut.safetyZone(position, position, 90.0f, 0.0f, 100.0f, 15.0f, 33, 6); assertEquals(42.0, ellipse.getX(), 1e-6); assertEquals(-1.5, ellipse.getY(), 1e-6); } @Test public void safetyZoneXYAreTranslatedForwardY() { Ellipse ellipse = sut.safetyZone(position, position, 0.0f, 0.0f, 100.0f, 15.0f, 33, 6); assertEquals(1.5, ellipse.getX(), 1e-6); // Small number assertEquals(42.0, ellipse.getY(), 1e-6); // Large number } @Test @Ignore public void safetyZoneAtSpeedZeroIsSameSizeAsShip() { // TODO Make safety zone depend on sog } @Test @Ignore public void safetyZoneAtPositiveSpeedIsBiggerThanSizeAsShip() { // TODO Make safety zone depend on sog } @Test public void safetyZoneXYAreBigForDistantPositions() { Ellipse ellipse1 = sut.safetyZone(Position.create(57, 12), Position.create(56, 12), 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertTrue(abs(ellipse1.getX()) < 1000); assertTrue(abs(ellipse1.getY()) > 10000); Ellipse ellipse2 = sut.safetyZone(Position.create(56, 13), Position.create(56, 12), 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertTrue(abs(ellipse2.getX()) > 10000); assertTrue(abs(ellipse2.getY()) < 1000); } @Test public void testComputeSafetyZoneCog45() { Ellipse safetyEllipse = sut.safetyZone(position, position, 45.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertEquals(8.485281374238571, safetyEllipse.getX(), 1e-6); assertEquals(5.65685424949238, safetyEllipse.getY(), 1e-6); assertEquals(22.5, safetyEllipse.getBeta(), 1e-6); assertEquals(100.0, safetyEllipse.getAlpha(), 1e-6); assertEquals(45.0, safetyEllipse.getThetaDeg(), 1e-6); } @Test public void testComputeSafetyZoneCog90() { Ellipse safetyEllipse = sut.safetyZone(position, position, 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertEquals(10.0, safetyEllipse.getX(), 1e-6); assertEquals(-2.0, safetyEllipse.getY(), 1e-6); assertEquals(22.5, safetyEllipse.getBeta(), 1e-6); assertEquals(100.0, safetyEllipse.getAlpha(), 1e-6); assertEquals(0.0, safetyEllipse.getThetaDeg(), 1e-6); } @Test public void testComputeSafetyZoneWithAlternativeConfigurationParameterEllipseLength() { JUnit4Mockery context = new JUnit4Mockery(); Configuration configurationMock = context.mock(Configuration.class); context.checking(new Expectations() {{ oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH)); will(returnValue(1.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH)); will(returnValue(3.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND)); will(returnValue(0.25)); }}); SafetyZoneService sut = new SafetyZoneService(configurationMock); Ellipse safetyEllipse = sut.safetyZone(position, position, 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertEquals(-15.0, safetyEllipse.getX(), 1e-6); assertEquals(-2.0, safetyEllipse.getY(), 1e-6); assertEquals(22.5, safetyEllipse.getBeta(), 1e-6); assertEquals(75.0, safetyEllipse.getAlpha(), 1e-6); assertEquals(0.0, safetyEllipse.getThetaDeg(), 1e-6); } @Test public void testComputeSafetyZoneWithAlternativeConfigurationParameterEllipseBreadth() { JUnit4Mockery context = new JUnit4Mockery(); Configuration configurationMock = context.mock(Configuration.class); context.checking(new Expectations() {{ oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH)); will(returnValue(2.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH)); will(returnValue(5.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND)); will(returnValue(0.25)); }}); SafetyZoneService sut = new SafetyZoneService(configurationMock); Ellipse safetyEllipse = sut.safetyZone(position, position, 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertEquals(10.0, safetyEllipse.getX(), 1e-6); assertEquals(-2.0, safetyEllipse.getY(), 1e-6); assertEquals(37.5, safetyEllipse.getBeta(), 1e-6); assertEquals(100.0, safetyEllipse.getAlpha(), 1e-6); assertEquals(0.0, safetyEllipse.getThetaDeg(), 1e-6); } @Test public void testComputeSafetyZoneWithAlternativeConfigurationParameterEllipseBehind() { JUnit4Mockery context = new JUnit4Mockery(); Configuration configurationMock = context.mock(Configuration.class); context.checking(new Expectations() {{ oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_LENGTH)); will(returnValue(2.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BREADTH)); will(returnValue(3.0)); oneOf(configurationMock).getDouble(with(CONFKEY_SAFETYZONES_SAFETY_ELLIPSE_BEHIND)); will(returnValue(0.75)); }}); SafetyZoneService sut = new SafetyZoneService(configurationMock); Ellipse safetyEllipse = sut.safetyZone(position, position, 90.0f, 0.0f, 100.0f, 15.0f, 65.0f, 5.5f); assertEquals(-15.0, safetyEllipse.getX(), 1e-6); assertEquals(-2.0, safetyEllipse.getY(), 1e-6); assertEquals(22.5, safetyEllipse.getBeta(), 1e-6); assertEquals(125.0, safetyEllipse.getAlpha(), 1e-6); assertEquals(0.0, safetyEllipse.getThetaDeg(), 1e-6); } }