1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.events;
18
19 import org.hipparchus.geometry.euclidean.threed.Vector3D;
20 import org.hipparchus.ode.events.Action;
21 import org.hipparchus.ode.nonstiff.AdaptiveStepsizeIntegrator;
22 import org.hipparchus.ode.nonstiff.DormandPrince853Integrator;
23 import org.junit.jupiter.api.AfterEach;
24 import org.junit.jupiter.api.Assertions;
25 import org.junit.jupiter.api.BeforeEach;
26 import org.junit.jupiter.api.Test;
27 import org.junit.jupiter.params.ParameterizedTest;
28 import org.junit.jupiter.params.provider.ValueSource;
29 import org.mockito.Mockito;
30 import org.orekit.Utils;
31 import org.orekit.errors.OrekitException;
32 import org.orekit.frames.FramesFactory;
33 import org.orekit.orbits.EquinoctialOrbit;
34 import org.orekit.orbits.Orbit;
35 import org.orekit.propagation.SpacecraftState;
36 import org.orekit.propagation.events.handlers.EventHandler;
37 import org.orekit.propagation.events.handlers.StopOnEvent;
38 import org.orekit.propagation.numerical.NumericalPropagator;
39 import org.orekit.time.AbsoluteDate;
40 import org.orekit.time.TimeScalesFactory;
41 import org.orekit.utils.PVCoordinates;
42
43 import java.util.concurrent.atomic.AtomicInteger;
44
45 class DetectorModifierTest {
46
47 private double maxCheck;
48 private double threshold;
49 private double dt;
50 private Orbit iniOrbit;
51 private AbsoluteDate iniDate;
52 private NumericalPropagator propagator;
53
54 @Test
55 void testGetDetectionSettings() {
56
57 final EventDetector detector = Mockito.mock(EventDetector.class);
58 final EventDetectionSettings detectionSettings = Mockito.mock(EventDetectionSettings.class);
59 Mockito.when(detector.getDetectionSettings()).thenReturn(detectionSettings);
60 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
61
62 final EventDetectionSettings actualSettings = detectorModifier.getDetectionSettings();
63
64 Assertions.assertEquals(detectionSettings, actualSettings);
65 }
66
67 @ParameterizedTest
68 @ValueSource(booleans = {true, false})
69 void testDependsOnTimeOnly(final boolean value) {
70
71 final EventDetector detector = Mockito.mock(EventDetector.class);
72 Mockito.when(detector.dependsOnTimeOnly()).thenReturn(value);
73 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
74
75 final boolean actual = detectorModifier.dependsOnTimeOnly();
76
77 Assertions.assertEquals(value, actual);
78 }
79
80 @Test
81 void testInit() {
82
83 final EventDetector detector = Mockito.mock(EventDetector.class);
84 Mockito.when(detector.getHandler()).thenReturn(new StopOnEvent());
85 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
86 final AbsoluteDate mockedDate = Mockito.mock(AbsoluteDate.class);
87 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
88
89 detectorModifier.init(mockedState, mockedDate);
90
91 Mockito.verify(detector).init(mockedState, mockedDate);
92 }
93
94 @Test
95 void testReset() {
96
97 final EventDetector detector = Mockito.mock(EventDetector.class);
98 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
99 final AbsoluteDate mockedDate = Mockito.mock(AbsoluteDate.class);
100 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
101
102 detectorModifier.reset(mockedState, mockedDate);
103
104 Mockito.verify(detector).reset(mockedState, mockedDate);
105 }
106
107 @Test
108 void testG() {
109
110 final EventDetector detector = Mockito.mock(EventDetector.class);
111 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
112 final double expectedG = 10.;
113 Mockito.when(detector.g(mockedState)).thenReturn(expectedG);
114 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
115
116 final double actualG = detectorModifier.g(mockedState);
117
118 Assertions.assertEquals(expectedG, actualG);
119 }
120
121 @Test
122 void testFinish() {
123
124 final EventDetector detector = Mockito.mock(EventDetector.class);
125 Mockito.when(detector.getHandler()).thenReturn(new StopOnEvent());
126 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
127 final DetectorModifier detectorModifier = new TestDetectorModifier(detector);
128
129 detectorModifier.finish(mockedState);
130
131 Mockito.verify(detector).finish(mockedState);
132 }
133
134 @Test
135 void testSimpleTimer() {
136 DateDetector dateDetector = new DateDetector(iniDate.shiftedBy(2.0*dt)).
137 withMaxCheck(maxCheck).
138 withThreshold(threshold);
139 DetectorModifier adapter = new TestDetectorModifier(dateDetector);
140 Assertions.assertSame(dateDetector, adapter.getDetector());
141 Assertions.assertEquals(2 * dt, dateDetector.getDate().durationFrom(iniDate), 1.0e-10);
142 propagator.addEventDetector(adapter);
143 final SpacecraftState finalState = propagator.propagate(iniDate.shiftedBy(100.*dt));
144
145 Assertions.assertEquals(2.0*dt, finalState.getDate().durationFrom(iniDate), threshold);
146 }
147
148 @Test
149 void testOverrideHandler() {
150 AtomicInteger count = new AtomicInteger(0);
151 DateDetector dateDetector = new DateDetector(iniDate.shiftedBy(2.0*dt)).
152 withMaxCheck(maxCheck).
153 withThreshold(threshold);
154 DetectorModifier adapter = new TestDetectorModifier(dateDetector) {
155
156 @Override
157 public EventHandler getHandler() {
158 return new EventHandler() {
159
160 @Override
161 public Action eventOccurred(final SpacecraftState s, final EventDetector detector, final boolean increasing) {
162 count.incrementAndGet();
163 return Action.RESET_STATE;
164 }
165 };
166 }
167 };
168 Assertions.assertSame(dateDetector, adapter.getDetector());
169 Assertions.assertEquals(2 * dt, dateDetector.getDate().durationFrom(iniDate), 1.0e-10);
170 propagator.addEventDetector(adapter);
171 Assertions.assertEquals(0, count.get());
172 final SpacecraftState finalState = propagator.propagate(iniDate.shiftedBy(100.*dt));
173 Assertions.assertEquals(1, count.get());
174
175 Assertions.assertEquals(100.0*dt, finalState.getDate().durationFrom(iniDate), threshold);
176 }
177
178 @Deprecated
179 @Test
180 void testAdapterDetector() {
181
182 final DateDetector detector = new DateDetector();
183
184 final AdapterDetector adapterDetector = new AdapterDetector(detector);
185
186 final TestDetectorModifier detectorModifier = new TestDetectorModifier(detector);
187 Assertions.assertEquals(detectorModifier.getDetector(), adapterDetector.getDetector());
188 }
189
190 private static class TestDetectorModifier implements DetectorModifier {
191
192 private final EventDetector detector;
193
194 TestDetectorModifier(final EventDetector detector) {
195 this.detector = detector;
196 }
197
198 @Override
199 public EventDetector getDetector() {
200 return detector;
201 }
202 }
203
204 @BeforeEach
205 public void setUp() {
206 try {
207 Utils.setDataRoot("regular-data");
208 final double mu = 3.9860047e14;
209 final Vector3D position = new Vector3D(-6142438.668, 3492467.560, -25767.25680);
210 final Vector3D velocity = new Vector3D(505.8479685, 942.7809215, 7435.922231);
211 iniDate = new AbsoluteDate(1969, 7, 28, 4, 0, 0.0, TimeScalesFactory.getTT());
212 iniOrbit = new EquinoctialOrbit(new PVCoordinates(position, velocity),
213 FramesFactory.getEME2000(), iniDate, mu);
214 SpacecraftState initialState = new SpacecraftState(iniOrbit);
215 double[] absTolerance = {
216 0.001, 1.0e-9, 1.0e-9, 1.0e-6, 1.0e-6, 1.0e-6, 0.001
217 };
218 double[] relTolerance = {
219 1.0e-7, 1.0e-4, 1.0e-4, 1.0e-7, 1.0e-7, 1.0e-7, 1.0e-7
220 };
221 AdaptiveStepsizeIntegrator integrator =
222 new DormandPrince853Integrator(0.001, 1000, absTolerance, relTolerance);
223 integrator.setInitialStepSize(60);
224 propagator = new NumericalPropagator(integrator);
225 propagator.setInitialState(initialState);
226 dt = 60.;
227 maxCheck = 10.;
228 threshold = 10.e-10;
229 } catch (OrekitException oe) {
230 Assertions.fail(oe.getLocalizedMessage());
231 }
232 }
233
234 @AfterEach
235 public void tearDown() {
236 iniDate = null;
237 propagator = null;
238 }
239
240 }