1   /* Copyright 2002-2025 CS GROUP
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.Test;
23  import org.mockito.Mockito;
24  import org.orekit.forces.maneuvers.ImpulseManeuver;
25  import org.orekit.frames.FramesFactory;
26  import org.orekit.orbits.CartesianOrbit;
27  import org.orekit.orbits.Orbit;
28  import org.orekit.orbits.PositionAngleType;
29  import org.orekit.propagation.Propagator;
30  import org.orekit.time.AbsoluteDate;
31  import org.orekit.utils.Constants;
32  import org.orekit.utils.PVCoordinates;
33  import org.orekit.utils.TimeStampedPVCoordinates;
34  
35  import static org.orekit.propagation.conversion.AbstractPropagatorBuilderTest.assertPropagatorBuilderIsACopy;
36  
37  public class KeplerianPropagatorBuilderTest {
38  
39      @Test
40      void testClone() {
41  
42          // Given
43          final Orbit orbit = getOrbit();
44          final KeplerianPropagatorBuilder builder = new KeplerianPropagatorBuilder(orbit, PositionAngleType.MEAN, 1.0);
45  
46          // When
47          final KeplerianPropagatorBuilder copyBuilder = builder.clone();
48  
49          // Then
50          assertPropagatorBuilderIsACopy(builder, copyBuilder);
51          Assertions.assertEquals(builder.getImpulseManeuvers().size(), copyBuilder.getImpulseManeuvers().size());
52  
53      }
54  
55      @Test
56      void testClearImpulseManeuvers() {
57          // Given
58          final Orbit orbit = getOrbit();
59          final KeplerianPropagatorBuilder builder = new KeplerianPropagatorBuilder(orbit, PositionAngleType.MEAN, 1.0);
60          final ImpulseManeuver mockedManeuver = Mockito.mock(ImpulseManeuver.class);
61          builder.addImpulseManeuver(mockedManeuver);
62  
63          // When
64          builder.clearImpulseManeuvers();
65  
66          // Then
67          final Propagator propagator = builder.buildPropagator();
68          Assertions.assertTrue(propagator.getEventDetectors().isEmpty());
69      }
70  
71      @Test
72      void testAddImpulseManeuver() {
73          // Given
74          final Orbit orbit = getOrbit();
75          final KeplerianPropagatorBuilder builder = new KeplerianPropagatorBuilder(orbit, PositionAngleType.MEAN, 1.0);
76          final ImpulseManeuver mockedManeuver = Mockito.mock(ImpulseManeuver.class);
77  
78          // When
79          builder.addImpulseManeuver(mockedManeuver);
80  
81          // Then
82          final Propagator propagator = builder.buildPropagator();
83          Assertions.assertEquals(1, propagator.getEventDetectors().size());
84          Assertions.assertEquals(mockedManeuver, propagator.getEventDetectors().toArray()[0]);
85      }
86  
87      /** Test for issue #1741.
88       * <p>This test checks that orbital drivers in cloned propagator builders
89       * ain't at the same physical address, i.e. that they're not linked anymore.</p>
90       */
91      @Test
92      void testIssue1741() {
93  
94          // Given
95          final Orbit orbit = getOrbit();
96          final KeplerianPropagatorBuilder builder = new KeplerianPropagatorBuilder(orbit, PositionAngleType.MEAN, 1.0);
97  
98          // When
99          final KeplerianPropagatorBuilder copyBuilder = builder.clone();
100 
101 
102         // Change orbit of the copied builder
103         final TimeStampedPVCoordinates modifiedPv = orbit.shiftedBy(3600.).getPVCoordinates();
104         copyBuilder.resetOrbit(new CartesianOrbit(modifiedPv, orbit.getFrame(), orbit.getDate(), orbit.getMu()));
105 
106         // Then
107         // Original builder should still have original orbit
108         final PVCoordinates originalPv = orbit.getPVCoordinates();
109         final PVCoordinates initialPv = builder.createInitialOrbit().getPVCoordinates();
110         final double dP = originalPv.getPosition().distance(initialPv.getPosition());
111         final double dV = originalPv.getVelocity().distance(initialPv.getVelocity());
112         final double dA = originalPv.getAcceleration().distance(initialPv.getAcceleration());
113         Assertions.assertEquals(0., dP, 0.);
114         Assertions.assertEquals(0., dV, 0.);
115         Assertions.assertEquals(0., dA, 0.);
116     }
117 
118     private static Orbit getOrbit() {
119         return new CartesianOrbit(new PVCoordinates(
120                 new Vector3D(Constants.EIGEN5C_EARTH_EQUATORIAL_RADIUS + 400000, 0, 0),
121                 new Vector3D(0, 7668.6, 0)), FramesFactory.getGCRF(),
122                                   new AbsoluteDate(), Constants.EIGEN5C_EARTH_MU);
123     }
124 }