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.events;
18  
19  import org.hipparchus.util.Binary64;
20  import org.hipparchus.util.Binary64Field;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.Test;
23  import org.junit.jupiter.params.ParameterizedTest;
24  import org.junit.jupiter.params.provider.ValueSource;
25  import org.mockito.Mockito;
26  import org.orekit.TestUtils;
27  import org.orekit.orbits.FieldCartesianOrbit;
28  import org.orekit.orbits.FieldOrbit;
29  import org.orekit.orbits.Orbit;
30  import org.orekit.propagation.FieldSpacecraftState;
31  import org.orekit.propagation.SpacecraftState;
32  import org.orekit.propagation.analytical.FieldKeplerianPropagator;
33  import org.orekit.propagation.events.handlers.FieldRecordAndContinue;
34  import org.orekit.time.FieldAbsoluteDate;
35  
36  import static org.junit.jupiter.api.Assertions.*;
37  
38  class FieldEventShifterTest {
39  
40      @Test
41      void testEventOccurred() {
42          // GIVEN
43          final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(Binary64Field.getInstance());
44          final FieldDateDetector<Binary64> dateDetector = new FieldDateDetector<>(fieldDate);
45          final Binary64 increasingTimeShift = Binary64.ONE;
46          final Binary64 decreasingTimeShift = new Binary64(2);
47          final FieldEventShifter<Binary64> fieldEventShifter = new FieldEventShifter<>(dateDetector, true,
48                  increasingTimeShift, decreasingTimeShift);
49          final SpacecraftState state = new SpacecraftState(TestUtils.getDefaultOrbit(fieldDate.toAbsoluteDate()));
50          final FieldSpacecraftState<Binary64> fieldState = new FieldSpacecraftState<>(fieldDate.getField(), state);
51          fieldEventShifter.getHandler().eventOccurred(fieldState, fieldEventShifter, true);
52  
53          // WHEN
54          final FieldSpacecraftState<Binary64> resettedState = fieldEventShifter.getHandler().resetState(fieldEventShifter, fieldState);
55  
56          // THEN
57          assertEquals(fieldState.getOrbit(), resettedState.getOrbit());
58          assertEquals(fieldState.getMass(), resettedState.getMass());
59          assertEquals(fieldState.getAttitude(), resettedState.getAttitude());
60          assertEquals(fieldState.getDate(), resettedState.getDate());
61          assertEquals(fieldState.getAdditionalDataValues(), resettedState.getAdditionalDataValues());
62          assertEquals(fieldState.getAdditionalStatesDerivatives().size(),
63                  resettedState.getAdditionalStatesDerivatives().size());
64      }
65  
66      @ParameterizedTest
67      @ValueSource(booleans = {true, false})
68      void testGetters(final boolean useShiftedStates) {
69          // GIVEN
70          final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(Binary64Field.getInstance());
71          final FieldDateDetector<Binary64> dateDetector = new FieldDateDetector<>(fieldDate);
72          final Binary64 increasingTimeShift = Binary64.ONE;
73          final Binary64 decreasingTimeShift = new Binary64(2);
74  
75          // WHEN
76          final FieldEventShifter<Binary64> fieldEventShifter = new FieldEventShifter<>(dateDetector, useShiftedStates,
77                  increasingTimeShift, decreasingTimeShift);
78  
79          // THEN
80          assertEquals(increasingTimeShift, fieldEventShifter.getIncreasingTimeShift());
81          assertEquals(decreasingTimeShift, fieldEventShifter.getDecreasingTimeShift());
82          assertEquals(dateDetector, fieldEventShifter.getDetector());
83      }
84  
85      @Test
86      @SuppressWarnings("unchecked")
87      void testWithDetectionSettings() {
88          // GIVEN
89          final FieldDateDetector<Binary64> detector = new FieldDateDetector<>(FieldAbsoluteDate.getArbitraryEpoch(Binary64Field.getInstance()));
90          final FieldEventShifter<Binary64> template = new FieldEventShifter<>(detector, true, Binary64.ONE, new Binary64(2));
91          final FieldEventDetectionSettings<Binary64> detectionSettings = Mockito.mock();
92          // WHEN
93          final FieldEventShifter<Binary64> shifter = template.withDetectionSettings(detectionSettings);
94          // THEN
95          Assertions.assertEquals(detector, shifter.getDetector());
96          Assertions.assertEquals(detectionSettings, shifter.getDetectionSettings());
97          Assertions.assertEquals(template.getIncreasingTimeShift(), shifter.getIncreasingTimeShift());
98          Assertions.assertEquals(template.getDecreasingTimeShift(), shifter.getDecreasingTimeShift());
99      }
100 
101     @ParameterizedTest
102     @ValueSource(booleans = {true, false})
103     void testDetection(final boolean useShiftedStates) {
104         // GIVEN
105         final FieldAbsoluteDate<Binary64> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(Binary64Field.getInstance());
106         final FieldRecordAndContinue<Binary64> recordAndContinue = new FieldRecordAndContinue<>();
107         final FieldDateDetector<Binary64> dateDetector = new FieldDateDetector<>(fieldDate).withHandler(recordAndContinue);
108         final Binary64 increasingTimeShift = Binary64.ONE;
109         final Binary64 decreasingTimeShift = increasingTimeShift;
110         final FieldEventShifter<Binary64> fieldEventShifter = new FieldEventShifter<>(dateDetector, useShiftedStates,
111                 increasingTimeShift, decreasingTimeShift);
112         final Binary64 dt = Binary64.ONE;
113         final Orbit orbit = TestUtils.getDefaultOrbit(fieldDate.shiftedBy(dt.negate()).toAbsoluteDate());
114         final FieldOrbit<Binary64> initialOrbit = new FieldCartesianOrbit<>(Binary64Field.getInstance(), orbit);
115         final FieldKeplerianPropagator<Binary64> keplerianPropagator = new FieldKeplerianPropagator<>(initialOrbit);
116         keplerianPropagator.addEventDetector(fieldEventShifter);
117 
118         // WHEN
119         keplerianPropagator.propagate(fieldDate.shiftedBy(dt));
120 
121         // THEN
122         assertEquals(1, recordAndContinue.getEvents().size());
123         final double shift = useShiftedStates ? increasingTimeShift.getReal() : 0.;
124         assertEquals(dateDetector.getDate().shiftedBy(shift),
125                 recordAndContinue.getEvents().get(0).getState().getDate());
126     }
127 }