package org.orekit.propagation.events; import java.util.Collections; import java.util.NoSuchElementException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.orekit.errors.OrekitException; import org.orekit.propagation.SpacecraftState; import org.orekit.propagation.events.handlers.EventHandler.Action; import org.orekit.time.AbsoluteDate; /** * Unit tests for {@link BooleanDetector}. * * @author Evan Ward */ public class AndDetectorTest { /** first operand. */ private MockDetector a; /** second operand. */ private MockDetector b; /** null */ private SpacecraftState s; /** subject under test */ private BooleanDetector and; /** create subject under test and dependencies. */ @Before public void setUp() { a = new MockDetector(); b = new MockDetector(); s = null; and = BooleanDetector.and(a, b); } /** * check {@link BooleanDetector#g(SpacecraftState)}. * * @throws OrekitException on error */ @Test public void testG() throws OrekitException { // test both zero a.g = b.g = 0.0; Assert.assertEquals(0.0, and.g(s), 0); // test either zero a.g = 1; b.g = 0; Assert.assertEquals(0.0, and.g(s), 0); a.g = 0; b.g = 1; Assert.assertEquals(0.0, and.g(s), 0); // test either negative a.g = 0; b.g = -1; Assert.assertTrue("negative", and.g(s) < 0); a.g = 1; b.g = -1; Assert.assertTrue("negative", and.g(s) < 0); a.g = -1; b.g = 0; Assert.assertTrue("negative", and.g(s) < 0); a.g = -1; b.g = 1; Assert.assertTrue("negative", and.g(s) < 0); a.g = -1; b.g = -1; Assert.assertTrue("negative", and.g(s) < 0); // test both positive a.g = 1; b.g = 1; Assert.assertTrue("positive", and.g(s) > 0); } /** * check {@link BooleanDetector} for cancellation. * * @throws OrekitException on error. */ @Test public void testCancellation() throws OrekitException { a.g = -1e-10; b.g = 1e10; Assert.assertTrue("negative", and.g(s) < 0); a.g = 1e10; b.g = -1e-10; Assert.assertTrue("negative", and.g(s) < 0); a.g = 1e10; b.g = 1e-10; Assert.assertTrue("positive", and.g(s) > 0); a.g = 1e-10; b.g = 1e10; Assert.assertTrue("positive", and.g(s) > 0); } /** Check wrapped detectors are initialized. */ @Test public void testInit() { // setup EventDetector a = Mockito.mock(EventDetector.class); EventDetector b = Mockito.mock(EventDetector.class); BooleanDetector and = BooleanDetector.and(a, b); AbsoluteDate t = AbsoluteDate.CCSDS_EPOCH; s = Mockito.mock(SpacecraftState.class); Mockito.when(s.getDate()).thenReturn(t.shiftedBy(60.0)); // action and.init(s, t); // verify Mockito.verify(a).init(s, t); Mockito.verify(b).init(s, t); } /** check when no operands are passed to the constructor. */ @Test public void testZeroDetectors() { // action try { BooleanDetector.and(Collections.emptyList()); Assert.fail("Expected Exception"); } catch (NoSuchElementException e) { // expected } } /** Mock detector to set the g function to arbitrary values. */ private static class MockDetector implements EventDetector { /** Serializable UID. */ private static final long serialVersionUID = 1L; /** value to return from {@link #g(SpacecraftState)}. */ public double g = 0; @Override public void init(SpacecraftState s0, AbsoluteDate t) { } @Override public double g(SpacecraftState s) throws OrekitException { return this.g; } @Override public double getThreshold() { return 0; } @Override public double getMaxCheckInterval() { return 0; } @Override public int getMaxIterationCount() { return 0; } @Override public Action eventOccurred(SpacecraftState s, boolean increasing) throws OrekitException { return null; } @Override public SpacecraftState resetState(SpacecraftState oldState) throws OrekitException { return null; } } }