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.integration;
18  
19  import org.hipparchus.analysis.differentiation.Gradient;
20  import org.hipparchus.geometry.euclidean.threed.Vector3D;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.Test;
23  import org.mockito.Mockito;
24  import org.orekit.attitudes.AttitudeProvider;
25  import org.orekit.attitudes.FrameAlignedProvider;
26  import org.orekit.frames.Frame;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.orbits.Orbit;
29  import org.orekit.propagation.FieldSpacecraftState;
30  import org.orekit.propagation.SpacecraftState;
31  import org.orekit.time.AbsoluteDate;
32  import org.orekit.utils.Constants;
33  import org.orekit.utils.PVCoordinates;
34  import org.orekit.utils.ParameterDriver;
35  import org.orekit.utils.ParameterDriversProvider;
36  import org.orekit.utils.TimeStampedPVCoordinates;
37  
38  import java.util.ArrayList;
39  import java.util.List;
40  
41  class AbstractGradientConverterTest {
42  
43      @Test
44      void getStateOrbitTest() {
45          templateGetStateTest(true);
46      }
47  
48      @Test
49      void getStateAPVTest() {
50          templateGetStateTest(false);
51      }
52  
53      private void templateGetStateTest(final boolean isOrbitDefined) {
54          // GIVEN
55          final int freeParameters = 6;
56          final FieldSpacecraftState<Gradient> initGradientState = createGradientState(isOrbitDefined, freeParameters);
57          final TestGradientConverter testGradientConverter = new TestGradientConverter(freeParameters);
58          testGradientConverter.initStates(initGradientState);
59          final ParameterDriversProvider mockedDriversProvider = mockParameterDriversProvider();
60          // WHEN
61          final FieldSpacecraftState<Gradient> actualGradientState = testGradientConverter.getState(mockedDriversProvider);
62          // THEN
63          Assertions.assertEquals(isOrbitDefined, actualGradientState.isOrbitDefined());
64          Assertions.assertEquals(initGradientState.getFrame(), actualGradientState.getFrame());
65          Assertions.assertEquals(initGradientState.getMass().getReal(), actualGradientState.getMass().getReal());
66          Assertions.assertEquals(initGradientState.getDate().toAbsoluteDate(),
67                  actualGradientState.getDate().toAbsoluteDate());
68          Assertions.assertEquals(initGradientState.getPosition().toVector3D(),
69                  actualGradientState.getPosition().toVector3D());
70          Assertions.assertTrue(freeParameters < actualGradientState.getMass().getGradient().length);
71      }
72  
73      @Test
74      void testBuildBasicGradientSpacecraftStateOrbit() {
75          templateTestBuildBasicGradientSpacecraftState(true);
76      }
77  
78      @Test
79      void testBuildBasicGradientSpacecraftStateAPV() {
80          templateTestBuildBasicGradientSpacecraftState(false);
81      }
82  
83      private void templateTestBuildBasicGradientSpacecraftState(final boolean isOrbitDefined) {
84          // GIVEN
85          final int freeParameters = 6;
86          final Frame frame = FramesFactory.getGCRF();
87          final SpacecraftState mockedState = mockState(isOrbitDefined, frame);
88          final AttitudeProvider provider = new FrameAlignedProvider(frame);
89          // WHEN
90          final FieldSpacecraftState<Gradient> fieldState = AbstractGradientConverter
91                  .buildBasicGradientSpacecraftState(mockedState, freeParameters, provider);
92          // THEN
93          Assertions.assertEquals(mockedState.getFrame(), fieldState.getFrame());
94          Assertions.assertEquals(mockedState.getDate(), fieldState.getDate().toAbsoluteDate());
95          Assertions.assertEquals(mockedState.getPosition(), fieldState.getPosition().toVector3D());
96          Assertions.assertEquals(mockedState.isOrbitDefined(), fieldState.isOrbitDefined());
97          if (isOrbitDefined) {
98              Assertions.assertEquals(mockedState.getOrbit().getMu(), fieldState.getOrbit().getMu().getReal());
99          }
100         final Gradient expectedFieldZero = Gradient.constant(freeParameters, 0.);
101         Assertions.assertEquals(expectedFieldZero, fieldState.getDate().getField().getZero());
102         final Gradient expectedFieldMass = Gradient.constant(freeParameters, mockedState.getMass());
103         Assertions.assertEquals(expectedFieldMass, fieldState.getMass());
104     }
105 
106     private SpacecraftState mockState(final boolean isOrbitDefined, final Frame frame) {
107         final SpacecraftState state = Mockito.mock(SpacecraftState.class);
108         Mockito.when(state.getDate()).thenReturn(AbsoluteDate.ARBITRARY_EPOCH);
109         final TimeStampedPVCoordinates pvCoordinates = new TimeStampedPVCoordinates(state.getDate(),
110                                                                                     new PVCoordinates(Vector3D.PLUS_I));
111         Mockito.when(state.getPVCoordinates()).thenReturn(pvCoordinates);
112         Mockito.when(state.getPosition()).thenReturn(pvCoordinates.getPosition());
113         Mockito.when(state.isOrbitDefined()).thenReturn(isOrbitDefined);
114         Mockito.when(state.getMass()).thenReturn(1000.);
115         Mockito.when(state.getFrame()).thenReturn(frame);
116         if (isOrbitDefined) {
117             final Orbit mockedOrbit = Mockito.mock();
118             Mockito.when(mockedOrbit.getMu()).thenReturn(Constants.EGM96_EARTH_MU);
119             Mockito.when(state.getOrbit()).thenReturn(mockedOrbit);
120         }
121         return state;
122     }
123 
124     private FieldSpacecraftState<Gradient> createGradientState(final boolean isOrbitDefined,
125                                                                final int freeParameters) {
126         final Frame frame = FramesFactory.getGCRF();
127         final AttitudeProvider provider = new FrameAlignedProvider(frame);
128         final SpacecraftState mockedState = mockState(isOrbitDefined, frame);
129         return AbstractGradientConverter.buildBasicGradientSpacecraftState(mockedState, freeParameters, provider);
130     }
131 
132     private ParameterDriversProvider mockParameterDriversProvider() {
133         final int nonZeroNumberOfValues = 1;
134         final ParameterDriver mockedParameterDriver = Mockito.mock(ParameterDriver.class);
135         Mockito.when(mockedParameterDriver.isSelected()).thenReturn(true);
136         Mockito.when(mockedParameterDriver.getNbOfValues()).thenReturn(nonZeroNumberOfValues);
137         final ParameterDriversProvider mockedDriversProvider = Mockito.mock(ParameterDriversProvider.class);
138         final List<ParameterDriver> parameterDriverList = new ArrayList<>();
139         parameterDriverList.add(mockedParameterDriver);
140         Mockito.when(mockedDriversProvider.getParametersDrivers()).thenReturn(parameterDriverList);
141         return mockedDriversProvider;
142     }
143 
144     private static class TestGradientConverter extends AbstractGradientConverter{
145 
146         protected TestGradientConverter(int freeStateParameters) {
147             super(freeStateParameters);
148         }
149 
150     }
151 
152 }