1   package org.orekit.propagation.events;
2   
3   import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
4   import org.hipparchus.analysis.differentiation.UnivariateDerivative2Field;
5   import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
6   import org.junit.jupiter.api.BeforeAll;
7   import org.junit.jupiter.api.Test;
8   import org.orekit.TestUtils;
9   import org.orekit.Utils;
10  import org.orekit.bodies.AnalyticalSolarPositionProvider;
11  import org.orekit.bodies.GeodeticPoint;
12  import org.orekit.frames.FramesFactory;
13  import org.orekit.frames.TopocentricFrame;
14  import org.orekit.models.earth.ReferenceEllipsoid;
15  import org.orekit.propagation.SpacecraftState;
16  import org.orekit.propagation.events.handlers.StopOnEvent;
17  import org.orekit.time.AbsoluteDate;
18  import org.orekit.time.FieldAbsoluteDate;
19  import org.orekit.utils.ExtendedPositionProvider;
20  import org.orekit.utils.FieldPVCoordinates;
21  
22  import static org.junit.jupiter.api.Assertions.*;
23  import static org.mockito.Mockito.mock;
24  
25  class ExtremumAngularSeparationDetectorTest {
26  
27      @BeforeAll
28      static void setUpBeforeClass() {
29          Utils.setDataRoot("regular-data");
30      }
31  
32      @Test
33      void testGetter() {
34          // GIVEN
35          final ExtendedPositionProvider mockedBeacon = mock();
36          final ExtendedPositionProvider mockedObserver = mock();
37          // WHEN
38          final ExtremumAngularSeparationDetector detector = new ExtremumAngularSeparationDetector(EventDetectionSettings.getDefaultEventDetectionSettings(),
39                  new StopOnEvent(), mockedBeacon, mockedObserver);
40          // THEN
41          assertEquals(mockedBeacon, detector.getBeacon());
42          assertEquals(mockedObserver, detector.getObserver());
43      }
44  
45      @Test
46      void testG() {
47          // GIVEN
48          final SpacecraftState state = new SpacecraftState(TestUtils.getDefaultOrbit(AbsoluteDate.ARBITRARY_EPOCH));
49          final ExtendedPositionProvider beacon = new AnalyticalSolarPositionProvider();
50          final ExtendedPositionProvider observer = new TopocentricFrame(ReferenceEllipsoid.getWgs84(FramesFactory.getGTOD(true)),
51                  new GeodeticPoint(0., 1., 2.), "");
52          final ExtremumAngularSeparationDetector detector = new ExtremumAngularSeparationDetector(EventDetectionSettings.getDefaultEventDetectionSettings(),
53                  new StopOnEvent(), beacon, observer);
54          // WHEN
55          final double actualG = detector.g(state);
56          // THEN
57          final FieldAbsoluteDate<UnivariateDerivative2> fieldDate = new FieldAbsoluteDate<>(UnivariateDerivative2Field.getInstance(),
58                  state.getDate()).shiftedBy(new UnivariateDerivative2(0, 1, 0));
59          final FieldVector3D<UnivariateDerivative2> bP = beacon.getPosition(fieldDate, state.getFrame());
60          final FieldVector3D<UnivariateDerivative2> oP = observer.getPosition(fieldDate, state.getFrame());
61          final FieldPVCoordinates<UnivariateDerivative2> pv = state.getPVCoordinates().toUnivariateDerivative2PV();
62          final UnivariateDerivative2 separation = FieldVector3D.angle(pv.getPosition().subtract(oP), bP.subtract(oP));
63          final double expectedG = separation.getFirstDerivative();
64          assertEquals(expectedG, actualG, 1e-15);
65      }
66  }