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.CalculusFieldElement;
20  import org.hipparchus.util.Binary64;
21  import org.hipparchus.util.Binary64Field;
22  import org.junit.jupiter.api.Assertions;
23  import org.junit.jupiter.api.Test;
24  import org.junit.jupiter.params.ParameterizedTest;
25  import org.junit.jupiter.params.provider.ValueSource;
26  import org.mockito.Mockito;
27  import org.orekit.propagation.FieldSpacecraftState;
28  import org.orekit.propagation.events.handlers.FieldEventHandler;
29  import org.orekit.propagation.events.handlers.FieldStopOnEvent;
30  import org.orekit.time.FieldAbsoluteDate;
31  
32  class FieldDetectorModifierTest {
33  
34      @Test
35      @SuppressWarnings("unchecked")
36      void testGetDetectionSettings() {
37          // GIVEN
38          final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
39          final FieldEventDetectionSettings detectionSettings = Mockito.mock(FieldEventDetectionSettings.class);
40          Mockito.when(detector.getDetectionSettings()).thenReturn(detectionSettings);
41          final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
42          // WHEN
43          final FieldEventDetectionSettings<?> actualSettings = modifierDetector.getDetectionSettings();
44          // THEN
45          Assertions.assertEquals(detectionSettings, actualSettings);
46      }
47  
48      @ParameterizedTest
49      @ValueSource(booleans = {true, false})
50      void testDependsOnlyOnTime(final boolean value) {
51          // GIVEN
52          final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
53          Mockito.when(detector.dependsOnTimeOnly()).thenReturn(value);
54          final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
55          // WHEN
56          final boolean actual = modifierDetector.dependsOnTimeOnly();
57          // THEN
58          Assertions.assertEquals(value, actual);
59      }
60  
61      @Test
62      @SuppressWarnings("unchecked")
63      void testGetHandler() {
64          // GIVEN
65          final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
66          final FieldEventHandler handler = Mockito.mock(FieldEventHandler.class);
67          Mockito.when(detector.getHandler()).thenReturn(handler);
68          final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
69          // WHEN
70          final FieldEventHandler<?> actualHandler = modifierDetector.getHandler();
71          // THEN
72          Assertions.assertEquals(handler, actualHandler);
73      }
74  
75      @Test
76      @SuppressWarnings("unchecked")
77      void testInit() {
78          // GIVEN
79          final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
80          Mockito.when(detector.getHandler()).thenReturn(new FieldStopOnEvent<>());
81          final FieldSpacecraftState mockedState = Mockito.mock(FieldSpacecraftState.class);
82          final FieldAbsoluteDate mockedDate = Mockito.mock(FieldAbsoluteDate.class);
83          final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
84          // WHEN
85          modifierDetector.init(mockedState, mockedDate);
86          // THEN
87          Mockito.verify(detector).init(mockedState, mockedDate);
88      }
89  
90      @Test
91      @SuppressWarnings("unchecked")
92      void testReset() {
93          // GIVEN
94          final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
95          Mockito.when(detector.getHandler()).thenReturn(new FieldStopOnEvent<>());
96          final FieldSpacecraftState mockedState = Mockito.mock(FieldSpacecraftState.class);
97          final FieldAbsoluteDate mockedDate = Mockito.mock(FieldAbsoluteDate.class);
98          final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
99          // WHEN
100         modifierDetector.reset(mockedState, mockedDate);
101         // THEN
102         Mockito.verify(detector).reset(mockedState, mockedDate);
103     }
104 
105     @Test
106     @SuppressWarnings("unchecked")
107     void testG() {
108         // GIVEN
109         final Binary64Field field = Binary64Field.getInstance();
110         final FieldAbsoluteDate<Binary64> date = FieldAbsoluteDate.getArbitraryEpoch(field);
111         final FieldEventDetector<Binary64> detector = new FieldDateDetector<>(date);
112         final FieldSpacecraftState<Binary64> mockedState = Mockito.mock(FieldSpacecraftState.class);
113         Mockito.when(mockedState.getDate()).thenReturn(date);
114         final TestFieldDetector<Binary64> modifierDetector = new TestFieldDetector<>(detector);
115         // WHEN
116         final double actualG = modifierDetector.g(mockedState).getReal();
117         // THEN
118         Assertions.assertEquals(detector.g(mockedState).getReal(), actualG);
119     }
120 
121     @Test
122     @SuppressWarnings("unchecked")
123     void testFinish() {
124         // GIVEN
125         final FieldEventDetector<?> detector = Mockito.mock(FieldEventDetector.class);
126         Mockito.when(detector.getHandler()).thenReturn(new FieldStopOnEvent<>());
127         final FieldSpacecraftState mockedState = Mockito.mock(FieldSpacecraftState.class);
128         final TestFieldDetector<?> modifierDetector = new TestFieldDetector<>(detector);
129         // WHEN
130         modifierDetector.finish(mockedState);
131         // THEN
132         Mockito.verify(detector).finish(mockedState);
133     }
134 
135     @Deprecated
136     @Test
137     void testAdapterDetector() {
138         // GIVEN
139         final FieldDateDetector<Binary64> detector = new FieldDateDetector<>(Binary64Field.getInstance());
140         // WHEN
141         final FieldAdapterDetector<Binary64> adapterDetector = new FieldAdapterDetector<>(detector);
142         // THEN
143         final TestFieldDetector<Binary64> detectorModifier = new TestFieldDetector<>(detector);
144         Assertions.assertEquals(detectorModifier.getDetector(), adapterDetector.getDetector());
145     }
146 
147     private static class TestFieldDetector<T extends CalculusFieldElement<T>> implements FieldDetectorModifier<T> {
148 
149         private final FieldEventDetector<T> detector;
150 
151         TestFieldDetector(final FieldEventDetector<T> detector) {
152             this.detector = detector;
153         }
154 
155         @Override
156         public FieldEventDetector<T> getDetector() {
157             return detector;
158         }
159     }
160 }