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.Test;
27  import org.mockito.Mockito;
28  import org.orekit.frames.Frame;
29  import org.orekit.time.AbsoluteDate;
30  import org.orekit.time.FieldAbsoluteDate;
31  
32  class ExtendedPositionProviderTest {
33  
34      @Test
35      void testGetPVCoordinates() {
36          // GIVEN
37          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
38          final Frame frame = Mockito.mock(Frame.class);
39          final AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
40          // WHEN
41          final TimeStampedPVCoordinates pvCoordinates = positionProvider.getPVCoordinates(date, frame);
42          // THEN
43          final Vector3D expectedPosition = positionProvider.getPosition(date, frame);
44          Assertions.assertEquals(expectedPosition, pvCoordinates.getPosition());
45          Assertions.assertEquals(1., pvCoordinates.getVelocity().getX());
46          Assertions.assertEquals(0., pvCoordinates.getAcceleration().getNorm());
47      }
48  
49      @Test
50      void testGetPVCoordinatesField() {
51          // GIVEN
52          final TestExtendedPositionProvider positionProvider = new TestExtendedPositionProvider();
53          final Frame frame = Mockito.mock(Frame.class);
54          final FieldAbsoluteDate<Complex> date = FieldAbsoluteDate.getJ2000Epoch(ComplexField.getInstance());
55          // WHEN
56          final TimeStampedFieldPVCoordinates<Complex> pvCoordinates = positionProvider.getPVCoordinates(date, frame);
57          // THEN
58          final FieldVector3D<Complex> expectedPosition = positionProvider.getPosition(date, frame);
59          Assertions.assertEquals(expectedPosition, pvCoordinates.getPosition());
60          Assertions.assertEquals(1., pvCoordinates.getVelocity().getX().getReal());
61          Assertions.assertEquals(0., pvCoordinates.getAcceleration().getNorm().getReal());
62      }
63  
64      @Test
65      void testToFieldPVCoordinatesProvider() {
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 FieldPVCoordinatesProvider<Complex> fieldPVCoordinatesProvider = positionProvider
72              .toFieldPVCoordinatesProvider(ComplexField.getInstance());
73          // THEN
74          final FieldVector3D<Complex> expectedPosition = positionProvider.getPosition(date, frame);
75          final FieldVector3D<Complex> actualPosition = fieldPVCoordinatesProvider.getPosition(date, frame);
76          Assertions.assertEquals(expectedPosition, actualPosition);
77          final FieldPVCoordinates<Complex> expectedPV = positionProvider.getPVCoordinates(date, frame);
78          final FieldPVCoordinates<Complex> actualPV = fieldPVCoordinatesProvider.getPVCoordinates(date, frame);
79          Assertions.assertEquals(expectedPV.getPosition(), actualPV.getPosition());
80          Assertions.assertEquals(expectedPV.getVelocity(), actualPV.getVelocity());
81          Assertions.assertEquals(expectedPV.getAcceleration(), actualPV.getAcceleration());
82      }
83  
84      private static class TestExtendedPositionProvider implements ExtendedPositionProvider {
85  
86          private final AbsoluteDate referenceDate = AbsoluteDate.ARBITRARY_EPOCH;
87  
88          @Override
89          public Vector3D getPosition(AbsoluteDate date, Frame frame) {
90              final double shift = date.durationFrom(referenceDate);
91              return new Vector3D(1. + shift, 2., 3.);
92          }
93  
94          @Override
95          public <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame) {
96              final T zero = date.getField().getZero();
97              final T shift = date.durationFrom(referenceDate);
98              return new FieldVector3D<>(zero.newInstance(1.).add(shift), zero.newInstance(2.), zero.newInstance(3.));
99          }
100     }
101 
102 }