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