1   /* Copyright 2022-2025 Romain Serra
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.orekit.utils;
19  
20  import org.hipparchus.CalculusFieldElement;
21  import org.hipparchus.complex.Complex;
22  import org.hipparchus.complex.ComplexField;
23  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
24  import org.hipparchus.geometry.euclidean.threed.Vector3D;
25  import org.junit.jupiter.api.Assertions;
26  import org.junit.jupiter.api.BeforeEach;
27  import org.junit.jupiter.api.Test;
28  import org.mockito.Mockito;
29  import org.orekit.Utils;
30  import org.orekit.frames.Frame;
31  import org.orekit.time.AbsoluteDate;
32  import org.orekit.time.FieldAbsoluteDate;
33  
34  class ExtendedPositionProviderTest {
35  
36      @Test
37      void testGetVelocity() {
38          // GIVEN
39          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
40          final Frame frame = Mockito.mock(Frame.class);
41          final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
42          // WHEN
43          final Vector3D velocity = positionProvider.getVelocity(date, frame);
44          // THEN
45          final TimeStampedPVCoordinates pvCoordinates = positionProvider.getPVCoordinates(date, frame);
46          Assertions.assertEquals(pvCoordinates.getVelocity(), velocity);
47      }
48  
49      @Test
50      void testGetPVCoordinates() {
51          // GIVEN
52          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
53          final Frame frame = Mockito.mock(Frame.class);
54          final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
55          // WHEN
56          final TimeStampedPVCoordinates pvCoordinates = positionProvider.getPVCoordinates(date, frame);
57          // THEN
58          final Vector3D expectedPosition = positionProvider.getPosition(date, frame);
59          Assertions.assertEquals(expectedPosition, pvCoordinates.getPosition());
60          Assertions.assertEquals(1., pvCoordinates.getVelocity().getX());
61          Assertions.assertEquals(0., pvCoordinates.getAcceleration().getNorm());
62      }
63  
64      @Test
65      void testGetPVCoordinatesField() {
66          // GIVEN
67          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
68          final Frame frame = Mockito.mock(Frame.class);
69          final FieldAbsoluteDate<Complex> date = FieldAbsoluteDate.getJ2000Epoch(ComplexField.getInstance());
70          // WHEN
71          final TimeStampedFieldPVCoordinates<Complex> pvCoordinates = positionProvider.getPVCoordinates(date, frame);
72          // THEN
73          final FieldVector3D<Complex> expectedPosition = positionProvider.getPosition(date, frame);
74          Assertions.assertEquals(expectedPosition, pvCoordinates.getPosition());
75          Assertions.assertEquals(1., pvCoordinates.getVelocity().getX().getReal());
76          Assertions.assertEquals(0., pvCoordinates.getAcceleration().getNorm().getReal());
77      }
78  
79      @Test
80      void testToFieldPVCoordinatesProvider() {
81          // GIVEN
82          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
83          final Frame frame = Mockito.mock(Frame.class);
84          final FieldAbsoluteDate<Complex> date = FieldAbsoluteDate.getJ2000Epoch(ComplexField.getInstance());
85          // WHEN
86          final FieldPVCoordinatesProvider<Complex> fieldPVCoordinatesProvider = positionProvider
87              .toFieldPVCoordinatesProvider(ComplexField.getInstance());
88          // THEN
89          final FieldVector3D<Complex> expectedPosition = positionProvider.getPosition(date, frame);
90          final FieldVector3D<Complex> actualPosition = fieldPVCoordinatesProvider.getPosition(date, frame);
91          Assertions.assertEquals(expectedPosition, actualPosition);
92          final FieldPVCoordinates<Complex> expectedPV = positionProvider.getPVCoordinates(date, frame);
93          final FieldPVCoordinates<Complex> actualPV = fieldPVCoordinatesProvider.getPVCoordinates(date, frame);
94          Assertions.assertEquals(expectedPV.getPosition(), actualPV.getPosition());
95          Assertions.assertEquals(expectedPV.getVelocity(), actualPV.getVelocity());
96          Assertions.assertEquals(expectedPV.getAcceleration(), actualPV.getAcceleration());
97      }
98  
99      private static class TestExtendedPositionProvider implements ExtendedPositionProvider {
100 
101         private final AbsoluteDate referenceDate = AbsoluteDate.ARBITRARY_EPOCH;
102 
103         @Override
104         public Vector3D getPosition(AbsoluteDate date, Frame frame) {
105             final double shift = date.durationFrom(referenceDate);
106             return new Vector3D(1. + shift, 2., 3.);
107         }
108 
109         @Override
110         public <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame) {
111             final T zero = date.getField().getZero();
112             final T shift = date.durationFrom(referenceDate);
113             return new FieldVector3D<>(zero.newInstance(1.).add(shift), zero.newInstance(2.), zero.newInstance(3.));
114         }
115     }
116 
117     @BeforeEach
118     public void setUp() {
119         Utils.setDataRoot("regular-data");
120     }
121 
122 }