1   /* Contributed in the public domain.
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.propagation.conversion;
19  
20  import org.hipparchus.geometry.euclidean.threed.Vector3D;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.DisplayName;
23  import org.junit.jupiter.api.Test;
24  import org.orekit.TestUtils;
25  import org.orekit.Utils;
26  import org.orekit.attitudes.AttitudeProvider;
27  import org.orekit.frames.Frame;
28  import org.orekit.frames.FramesFactory;
29  import org.orekit.orbits.CartesianOrbit;
30  import org.orekit.orbits.Orbit;
31  import org.orekit.propagation.SpacecraftState;
32  import org.orekit.propagation.SpacecraftStateInterpolator;
33  import org.orekit.propagation.analytical.Ephemeris;
34  import org.orekit.time.AbsoluteDate;
35  import org.orekit.time.TimeInterpolator;
36  import org.orekit.utils.Constants;
37  import org.orekit.utils.PVCoordinates;
38  
39  import java.util.ArrayList;
40  import java.util.Arrays;
41  import java.util.List;
42  
43  import static org.junit.jupiter.api.Assertions.assertEquals;
44  import static org.mockito.Mockito.mock;
45  import static org.mockito.Mockito.when;
46  import static org.orekit.propagation.conversion.AbstractPropagatorBuilderTest.assertPropagatorBuilderIsACopy;
47  
48  /**
49   * Unit tests for {@link EphemerisPropagatorBuilder}.
50   *
51   * @author Vincent Cucchietti
52   */
53  public class EphemerisPropagatorBuilderTest {
54  
55      @Test
56      @DisplayName("Test issue 1316 : Regression in EphemerisPropagatorBuilder API")
57      void testIssue1316() {
58          // GIVEN
59          final int    interpolationPoints     = 3;
60          final double extrapolationThresholds = 0.007;
61  
62          // Create mock attitude provider
63          final AttitudeProvider mockAttitudeProvider = mock(AttitudeProvider.class);
64  
65          // Get default orbit
66          final Orbit defaultOrbit = TestUtils.getDefaultOrbit(new AbsoluteDate());
67  
68          // Create fake list of states
69          final SpacecraftState mockState1 = mock(SpacecraftState.class);
70          when(mockState1.getFrame()).thenReturn(defaultOrbit.getFrame());
71          when(mockState1.getOrbit()).thenReturn(defaultOrbit);
72          final SpacecraftState mockState2 = mock(SpacecraftState.class);
73          final SpacecraftState mockState3 = mock(SpacecraftState.class);
74  
75          final List<SpacecraftState> fakeStates = Arrays.asList(mockState1, mockState2, mockState3);
76  
77          // WHEN
78          final EphemerisPropagatorBuilder builder = new EphemerisPropagatorBuilder(fakeStates,
79                                                                                    interpolationPoints,
80                                                                                    extrapolationThresholds,
81                                                                                    mockAttitudeProvider);
82  
83          // THEN
84          // Assert initial orbit
85          assertEquals(defaultOrbit.getFrame(), builder.getFrame());
86          assertEquals(defaultOrbit.getType(),  builder.getOrbitType());
87          assertEquals(defaultOrbit.getDate(),  builder.getInitialOrbitDate());
88          assertEquals(defaultOrbit.getMu(),  builder.getMu());
89  
90          // Assert attitude provider
91          assertEquals(mockAttitudeProvider,  builder.getAttitudeProvider());
92      }
93  
94      @Test
95      @DisplayName("Test buildPropagator method")
96      void should_create_expected_propagator() {
97  
98          // Given
99          final Orbit orbit = new CartesianOrbit(new PVCoordinates(
100                 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
101                 new Vector3D(0, 7668.6, 0)), FramesFactory.getGCRF(), new AbsoluteDate(),
102                                                Constants.EIGEN5C_EARTH_MU);
103         final List<SpacecraftState> states = new ArrayList<>();
104         states.add(new SpacecraftState(orbit));
105         states.add(new SpacecraftState(orbit.shiftedBy(1)));
106 
107         final Frame                             frame             = FramesFactory.getGCRF();
108         final TimeInterpolator<SpacecraftState> stateInterpolator = new SpacecraftStateInterpolator(frame);
109 
110         final EphemerisPropagatorBuilder builder =
111                 new EphemerisPropagatorBuilder(states, stateInterpolator);
112 
113         // When
114         final Ephemeris builtPropagator = (Ephemeris) builder.buildPropagator();
115 
116         // Then
117         final Ephemeris expectedPropagator = new Ephemeris(states, stateInterpolator);
118 
119         assertEquals(expectedPropagator.getFrame(), builtPropagator.getFrame());
120         assertEquals(expectedPropagator.getMinDate(), builtPropagator.getMinDate());
121         assertEquals(expectedPropagator.getMaxDate(), builtPropagator.getMaxDate());
122 
123         Assertions.assertArrayEquals(expectedPropagator.getManagedAdditionalData(),
124                                      builtPropagator.getManagedAdditionalData());
125         // Initial state has also been verified to be equal between both ephemeris (except for the Attitude which is expected
126         // to have different memory address)
127     }
128 
129     @Test
130     void testClone() {
131 
132         // Given
133         final Orbit orbit = new CartesianOrbit(new PVCoordinates(
134                 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
135                 new Vector3D(0, 7668.6, 0)), FramesFactory.getGCRF(),
136                 new AbsoluteDate(), Constants.EIGEN5C_EARTH_MU);
137         final List<SpacecraftState> states = new ArrayList<>();
138         double end = Constants.JULIAN_DAY;
139         for (double dt = 0; dt <= end; dt += 3600.0) {
140             AbsoluteDate shiftedEpoch = orbit.getDate().shiftedBy(dt);
141             states.add(new SpacecraftState(orbit.shiftedBy(dt), Utils.defaultLaw().getAttitude(orbit, shiftedEpoch, orbit.getFrame())));
142         }
143 
144         final TimeInterpolator<SpacecraftState> stateInterpolator = new SpacecraftStateInterpolator(orbit.getFrame());
145         final AttitudeProvider                  attitudeProvider  =  Utils.defaultLaw();
146 
147         final EphemerisPropagatorBuilder builder =
148                 new EphemerisPropagatorBuilder(states, stateInterpolator, attitudeProvider);
149 
150         // When
151         final EphemerisPropagatorBuilder copyBuilder = (EphemerisPropagatorBuilder) builder.clone();
152 
153         // Then
154         assertPropagatorBuilderIsACopy(builder, copyBuilder);
155     }
156 }