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  package org.orekit.propagation;
18  
19  import org.hipparchus.complex.Complex;
20  import org.hipparchus.complex.ComplexField;
21  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22  import org.hipparchus.geometry.euclidean.threed.Vector3D;
23  import org.junit.jupiter.api.Assertions;
24  import org.junit.jupiter.api.Test;
25  import org.mockito.Mockito;
26  import org.orekit.attitudes.AttitudeProvider;
27  import org.orekit.frames.Frame;
28  import org.orekit.frames.FramesFactory;
29  import org.orekit.propagation.events.FieldEventDetector;
30  import org.orekit.propagation.sampling.FieldStepHandlerMultiplexer;
31  import org.orekit.time.AbsoluteDate;
32  import org.orekit.time.FieldAbsoluteDate;
33  import org.orekit.utils.FieldPVCoordinates;
34  import org.orekit.utils.PVCoordinates;
35  import org.orekit.utils.TimeStampedFieldPVCoordinates;
36  import org.orekit.utils.TimeStampedPVCoordinates;
37  
38  import java.util.Collection;
39  import java.util.List;
40  
41  class FieldPropagatorTest {
42  
43      @Test
44      void testGetPosition() {
45          // GIVEN
46          final TestFieldPropagator testPropagator = new TestFieldPropagator();
47          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
48          final FieldAbsoluteDate<Complex> fieldDate = new FieldAbsoluteDate<>(ComplexField.getInstance(), date);
49          final Frame frame = FramesFactory.getGCRF();
50          // WHEN
51          final FieldVector3D<Complex> actualPosition = testPropagator.getPosition(fieldDate, frame);
52          // THEN
53          final FieldPVCoordinates<Complex> expectedState = testPropagator.propagate(fieldDate).getPVCoordinates(frame);
54          Assertions.assertEquals(expectedState.getPosition().toVector3D(), actualPosition.toVector3D());
55      }
56  
57      @Test
58      void testGetVelocity() {
59          // GIVEN
60          final TestFieldPropagator testPropagator = new TestFieldPropagator();
61          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
62          final FieldAbsoluteDate<Complex> fieldDate = new FieldAbsoluteDate<>(ComplexField.getInstance(), date);
63          final Frame frame = FramesFactory.getGCRF();
64          // WHEN
65          final FieldVector3D<Complex> actualVelocity = testPropagator.getVelocity(fieldDate, frame);
66          // THEN
67          final FieldPVCoordinates<Complex> expectedState = testPropagator.propagate(fieldDate).getPVCoordinates(frame);
68          Assertions.assertEquals(expectedState.getVelocity().toVector3D(), actualVelocity.toVector3D());
69      }
70  
71      @Test
72      void testGetPVCoordinates() {
73          // GIVEN
74          final TestFieldPropagator testPropagator = new TestFieldPropagator();
75          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
76          final FieldAbsoluteDate<Complex> fieldDate = new FieldAbsoluteDate<>(ComplexField.getInstance(), date);
77          final Frame frame = FramesFactory.getGCRF();
78          // WHEN
79          final FieldPVCoordinates<Complex> actualState = testPropagator.getPVCoordinates(fieldDate, frame);
80          // THEN
81          final FieldPVCoordinates<Complex> expectedState = testPropagator.propagate(fieldDate).getPVCoordinates(frame);
82          Assertions.assertEquals(expectedState.getPosition().toVector3D(), actualState.getPosition().toVector3D());
83          Assertions.assertEquals(expectedState.getVelocity().toVector3D(), actualState.getVelocity().toVector3D());
84      }
85  
86      @SuppressWarnings("unchecked")
87      private static FieldSpacecraftState<Complex> mockFieldSpacecraftState(final FieldAbsoluteDate<Complex> date) {
88          final FieldSpacecraftState<Complex> mockedFieldSpacecraftState = Mockito.mock(FieldSpacecraftState.class);
89          Mockito.when(mockedFieldSpacecraftState.getDate()).thenReturn(date);
90          final ComplexField complexField = ComplexField.getInstance();
91          final PVCoordinates pvCoordinates = new PVCoordinates(Vector3D.MINUS_I, Vector3D.PLUS_K);
92          final TimeStampedPVCoordinates tspvc = new TimeStampedPVCoordinates(date.toAbsoluteDate(), pvCoordinates);
93          final TimeStampedFieldPVCoordinates<Complex> fieldPVCoordinates = new TimeStampedFieldPVCoordinates<>(
94                  complexField, tspvc);
95          Mockito.when(mockedFieldSpacecraftState.getPVCoordinates()).thenReturn(fieldPVCoordinates);
96          Mockito.when(mockedFieldSpacecraftState.getPVCoordinates(Mockito.any(Frame.class)))
97                  .thenReturn(fieldPVCoordinates);
98          Mockito.when(mockedFieldSpacecraftState.getPosition(Mockito.any(Frame.class)))
99                  .thenReturn(fieldPVCoordinates.getPosition());
100         Mockito.when(mockedFieldSpacecraftState.getVelocity()).thenReturn(fieldPVCoordinates.getVelocity());
101         return mockedFieldSpacecraftState;
102     }
103 
104     private static class TestFieldPropagator implements FieldPropagator<Complex> {
105 
106         @Override
107         public FieldStepHandlerMultiplexer<Complex> getMultiplexer() {
108             return null;
109         }
110 
111         @Override
112         public FieldEphemerisGenerator<Complex> getEphemerisGenerator() {
113             return null;
114         }
115 
116         @Override
117         public FieldSpacecraftState<Complex> getInitialState() {
118             return null;
119         }
120 
121         @Override
122         public void resetInitialState(FieldSpacecraftState<Complex> state) {
123             // not used in test
124         }
125 
126         @Override
127         public void addAdditionalDataProvider(FieldAdditionalDataProvider<?, Complex> additionalDataProvider) {
128             // not used in test
129         }
130 
131         @Override
132         public List<FieldAdditionalDataProvider<?, Complex>> getAdditionalDataProviders() {
133             return null;
134         }
135 
136         @Override
137         public boolean isAdditionalDataManaged(String name) {
138             return false;
139         }
140 
141         @Override
142         public String[] getManagedAdditionalData() {
143             return new String[0];
144         }
145 
146         @Override
147         public <D extends FieldEventDetector<Complex>> void addEventDetector(D detector) {
148             // not used in test
149         }
150 
151         @Override
152         public Collection<FieldEventDetector<Complex>> getEventDetectors() {
153             return null;
154         }
155 
156         @Override
157         public void clearEventsDetectors() {
158             // not used in test
159         }
160 
161         @Override
162         public AttitudeProvider getAttitudeProvider() {
163             return null;
164         }
165 
166         @Override
167         public void setAttitudeProvider(AttitudeProvider attitudeProvider) {
168             // not used in test
169         }
170 
171         @Override
172         public Frame getFrame() {
173             return FramesFactory.getGCRF();
174         }
175 
176         @Override
177         public FieldSpacecraftState<Complex> propagate(FieldAbsoluteDate<Complex> target) {
178             return mockFieldSpacecraftState(target);
179         }
180 
181         @Override
182         public FieldSpacecraftState<Complex> propagate(FieldAbsoluteDate<Complex> start, FieldAbsoluteDate<Complex> target) {
183             return null;
184         }
185     }
186 
187 }