1   package org.orekit.attitudes;
2   
3   import org.hipparchus.CalculusFieldElement;
4   import org.hipparchus.analysis.differentiation.FieldUnivariateDerivative2;
5   import org.hipparchus.complex.Complex;
6   import org.hipparchus.complex.ComplexField;
7   import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
8   import org.hipparchus.geometry.euclidean.threed.Vector3D;
9   import org.junit.jupiter.api.Assertions;
10  import org.junit.jupiter.api.Test;
11  import org.orekit.bodies.OneAxisEllipsoid;
12  import org.orekit.frames.Frame;
13  import org.orekit.time.AbsoluteDate;
14  import org.orekit.utils.ExtendedPositionProvider;
15  import org.orekit.utils.PVCoordinates;
16  import org.orekit.utils.TimeStampedFieldPVCoordinates;
17  import org.orekit.utils.TimeStampedPVCoordinates;
18  
19  class TargetProviderTest {
20  
21      @Test
22      void testGetTargetDirection() {
23          // GIVEN
24          final TestTargetProvider testTargetProvider = new TestTargetProvider();
25          final TimeStampedPVCoordinates pvCoordinates = new TimeStampedPVCoordinates(AbsoluteDate.ARBITRARY_EPOCH,
26                  new PVCoordinates());
27          // WHEN
28          final Vector3D targetVector = testTargetProvider.getTargetDirection(null, null, pvCoordinates, null);
29          // THEN
30          final Vector3D expectedVector = testTargetProvider.getDerivative2TargetDirection(null, null,
31                  pvCoordinates, null).toVector3D();
32          Assertions.assertEquals(expectedVector, targetVector);
33      }
34  
35      @Test
36      void testFieldGetTargetDirection() {
37          // GIVEN
38          final TestTargetProvider testTargetProvider = new TestTargetProvider();
39          final TimeStampedPVCoordinates pvCoordinates = new TimeStampedPVCoordinates(AbsoluteDate.ARBITRARY_EPOCH,
40                  new PVCoordinates());
41          final TimeStampedFieldPVCoordinates<Complex> fieldPVCoordinates = new TimeStampedFieldPVCoordinates<Complex>(ComplexField.getInstance(),
42                  pvCoordinates);
43          // WHEN
44          final FieldVector3D<Complex> targetVector = testTargetProvider.getTargetDirection(null, null, fieldPVCoordinates, null);
45          // THEN
46          final FieldVector3D<FieldUnivariateDerivative2<Complex>> ud2Vector = testTargetProvider.getDerivative2TargetDirection(null, null,
47                  fieldPVCoordinates, null);
48          final FieldVector3D<Complex> expectedVector = new FieldVector3D<>(ud2Vector.getX().getValue(), ud2Vector.getY().getValue(),
49                  ud2Vector.getZ().getValue());
50          Assertions.assertEquals(expectedVector, targetVector);
51      }
52  
53      private static class TestTargetProvider implements TargetProvider {
54  
55          @Override
56          public <T extends CalculusFieldElement<T>> FieldVector3D<T> getTargetDirection(ExtendedPositionProvider sun, OneAxisEllipsoid earth,
57                                                                                          TimeStampedFieldPVCoordinates<T> pv, Frame frame) {
58              return new FieldVector3D<>(pv.getDate().getField(), pv.getPosition().toVector3D());
59          }
60      }
61  
62  }