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 testGetPVCoordinates() {
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 FieldPVCoordinates<Complex> actualState = testPropagator.getPVCoordinates(fieldDate, frame);
66          // THEN
67          final FieldPVCoordinates<Complex> expectedState = testPropagator.propagate(fieldDate).getPVCoordinates(frame);
68          Assertions.assertEquals(expectedState.getPosition().toVector3D(), actualState.getPosition().toVector3D());
69          Assertions.assertEquals(expectedState.getVelocity().toVector3D(), actualState.getVelocity().toVector3D());
70      }
71  
72      @SuppressWarnings("unchecked")
73      private static FieldSpacecraftState<Complex> mockFieldSpacecraftState(final FieldAbsoluteDate<Complex> date) {
74          final FieldSpacecraftState<Complex> mockedFieldSpacecraftState = Mockito.mock(FieldSpacecraftState.class);
75          Mockito.when(mockedFieldSpacecraftState.getDate()).thenReturn(date);
76          final ComplexField complexField = ComplexField.getInstance();
77          final PVCoordinates pvCoordinates = new PVCoordinates(Vector3D.MINUS_I, Vector3D.PLUS_K);
78          final TimeStampedPVCoordinates tspvc = new TimeStampedPVCoordinates(date.toAbsoluteDate(), pvCoordinates);
79          final TimeStampedFieldPVCoordinates<Complex> fieldPVCoordinates = new TimeStampedFieldPVCoordinates<>(
80                  complexField, tspvc);
81          Mockito.when(mockedFieldSpacecraftState.getPVCoordinates()).thenReturn(fieldPVCoordinates);
82          Mockito.when(mockedFieldSpacecraftState.getPVCoordinates(Mockito.any(Frame.class)))
83                  .thenReturn(fieldPVCoordinates);
84          Mockito.when(mockedFieldSpacecraftState.getPosition(Mockito.any(Frame.class)))
85                  .thenReturn(fieldPVCoordinates.getPosition());
86          return mockedFieldSpacecraftState;
87      }
88  
89      private static class TestFieldPropagator implements FieldPropagator<Complex> {
90  
91          @Override
92          public FieldStepHandlerMultiplexer<Complex> getMultiplexer() {
93              return null;
94          }
95  
96          @Override
97          public FieldEphemerisGenerator<Complex> getEphemerisGenerator() {
98              return null;
99          }
100 
101         @Override
102         public FieldSpacecraftState<Complex> getInitialState() {
103             return null;
104         }
105 
106         @Override
107         public void resetInitialState(FieldSpacecraftState<Complex> state) {
108             // not used in test
109         }
110 
111         @Override
112         public void addAdditionalDataProvider(FieldAdditionalDataProvider<?, Complex> additionalDataProvider) {
113             // not used in test
114         }
115 
116         @Override
117         public List<FieldAdditionalDataProvider<?, Complex>> getAdditionalDataProviders() {
118             return null;
119         }
120 
121         @Override
122         public boolean isAdditionalDataManaged(String name) {
123             return false;
124         }
125 
126         @Override
127         public String[] getManagedAdditionalData() {
128             return new String[0];
129         }
130 
131         @Override
132         public <D extends FieldEventDetector<Complex>> void addEventDetector(D detector) {
133             // not used in test
134         }
135 
136         @Override
137         public Collection<FieldEventDetector<Complex>> getEventDetectors() {
138             return null;
139         }
140 
141         @Override
142         public void clearEventsDetectors() {
143             // not used in test
144         }
145 
146         @Override
147         public AttitudeProvider getAttitudeProvider() {
148             return null;
149         }
150 
151         @Override
152         public void setAttitudeProvider(AttitudeProvider attitudeProvider) {
153             // not used in test
154         }
155 
156         @Override
157         public Frame getFrame() {
158             return null;
159         }
160 
161         @Override
162         public FieldSpacecraftState<Complex> propagate(FieldAbsoluteDate<Complex> target) {
163             return mockFieldSpacecraftState(target);
164         }
165 
166         @Override
167         public FieldSpacecraftState<Complex> propagate(FieldAbsoluteDate<Complex> start, FieldAbsoluteDate<Complex> target) {
168             return null;
169         }
170     }
171 
172 }