1   package org.orekit.attitudes;
2   
3   import org.hipparchus.CalculusFieldElement;
4   import org.hipparchus.analysis.differentiation.Gradient;
5   import org.hipparchus.analysis.differentiation.GradientField;
6   import org.hipparchus.geometry.euclidean.threed.FieldRotation;
7   import org.hipparchus.geometry.euclidean.threed.Rotation;
8   import org.junit.jupiter.api.Assertions;
9   import org.junit.jupiter.api.Test;
10  import org.mockito.Mockito;
11  import org.orekit.frames.Frame;
12  import org.orekit.frames.FramesFactory;
13  import org.orekit.time.AbsoluteDate;
14  import org.orekit.time.FieldAbsoluteDate;
15  import org.orekit.utils.AngularCoordinates;
16  import org.orekit.utils.FieldPVCoordinatesProvider;
17  import org.orekit.utils.PVCoordinatesProvider;
18  import org.orekit.utils.TimeSpanMap;
19  
20  import static org.mockito.Mockito.mock;
21  
22  class AbstractSwitchingAttitudeProviderTest {
23  
24      @Test
25      void testResetActiveProvider() {
26          // GIVEN
27          final TestAttitudesSequence attitudesSequence = new TestAttitudesSequence();
28          final AttitudeProvider attitudeProvider = Mockito.mock(AttitudeProvider.class);
29          // WHEN
30          attitudesSequence.resetActiveProvider(attitudeProvider);
31          // THEN
32          final TimeSpanMap<AttitudeProvider> timeSpanMap = attitudesSequence.getActivated();
33          Assertions.assertEquals(1, timeSpanMap.getSpansNumber());
34      }
35  
36  
37      @Test
38      void testGetAttitudeRotation() {
39          // GIVEN
40          final AttitudeProvider attitudeProvider = new TestAttitudeProvider();
41          final TestAttitudesSequence attitudesSequence = new TestAttitudesSequence();
42          attitudesSequence.resetActiveProvider(attitudeProvider);
43          final Frame frame = FramesFactory.getGCRF();
44          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
45          final PVCoordinatesProvider mockPvCoordinatesProvider = mock(PVCoordinatesProvider.class);
46          // WHEN
47          final Rotation actualRotation = attitudesSequence.getAttitudeRotation(mockPvCoordinatesProvider, date, frame);
48          // THEN
49          final Attitude attitude = attitudesSequence.getAttitude(mockPvCoordinatesProvider, date, frame);
50          final Rotation expectedRotation = attitude.getRotation();
51          Assertions.assertEquals(0., Rotation.distance(expectedRotation, actualRotation));
52      }
53  
54      @Test
55      @SuppressWarnings("unchecked")
56      void testGetAttitudeRotationFieldTest() {
57          // GIVEN
58          final GradientField field = GradientField.getField(1);
59          final AttitudeProvider attitudeProvider = new TestAttitudeProvider();
60          final TestAttitudesSequence attitudesSequence = new TestAttitudesSequence();
61          attitudesSequence.resetActiveProvider(attitudeProvider);
62          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
63          final FieldAbsoluteDate<Gradient> fieldDate = new FieldAbsoluteDate<>(field, date);
64          final FieldPVCoordinatesProvider<Gradient> pvCoordinatesProvider = mock(FieldPVCoordinatesProvider.class);
65          final Frame mockFrame = mock(Frame.class);
66          // WHEN
67          final FieldRotation<Gradient> actualRotation = attitudesSequence.getAttitudeRotation(pvCoordinatesProvider, fieldDate, mockFrame);
68          // THEN
69          final FieldAttitude<Gradient> attitude = attitudesSequence.getAttitude(pvCoordinatesProvider, fieldDate, mockFrame);
70          final FieldRotation<Gradient> expectedRotation = attitude.getRotation();
71          Assertions.assertEquals(0., Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation()));
72      }
73  
74      private static class TestAttitudesSequence extends AbstractSwitchingAttitudeProvider {}
75  
76      private static class TestAttitudeProvider implements AttitudeProvider {
77  
78          TestAttitudeProvider() {
79              // nothing to do
80          }
81  
82          @Override
83          public Attitude getAttitude(PVCoordinatesProvider pvProv, AbsoluteDate date, Frame frame) {
84              return new Attitude(date, frame, new AngularCoordinates());
85          }
86  
87          @Override
88          public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(FieldPVCoordinatesProvider<T> pvProv,
89                                                                                  FieldAbsoluteDate<T> date, Frame frame) {
90              return new FieldAttitude<>(date.getField(), new Attitude(date.toAbsoluteDate(), frame,
91                      new AngularCoordinates()));
92          }
93  
94      }
95  }