1   /* Copyright 2020-2025 Airbus Defence and Space
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.handlers;
18  
19  import org.hipparchus.ode.events.Action;
20  import org.junit.jupiter.api.Assertions;
21  import org.junit.jupiter.api.BeforeEach;
22  import org.junit.jupiter.api.Test;
23  import org.mockito.Mockito;
24  import org.orekit.Utils;
25  import org.orekit.frames.Frame;
26  import org.orekit.frames.FramesFactory;
27  import org.orekit.orbits.KeplerianOrbit;
28  import org.orekit.orbits.Orbit;
29  import org.orekit.orbits.PositionAngleType;
30  import org.orekit.propagation.SpacecraftState;
31  import org.orekit.propagation.events.DateDetector;
32  import org.orekit.propagation.events.EventDetector;
33  import org.orekit.time.AbsoluteDate;
34  import org.orekit.utils.Constants;
35  
36  /**
37   * Unit tests for {@link EventMultipleHandler}.
38   *
39   * @author Lara Hué
40   */
41  public class EventMultipleHandlerTest {
42  
43      @BeforeEach
44      public void setUp() {
45          Utils.setDataRoot("regular-data");
46      }
47  
48      @Test
49      void testFinishEmpty() {
50          final EventHandler mockedHandler = Mockito.mock(EventHandler.class);
51          final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
52          final EventDetector mockedDetector = Mockito.mock(EventDetector.class);
53          final EventMultipleHandler eventMultipleHandler = new EventMultipleHandler();
54          Assertions.assertDoesNotThrow(() -> eventMultipleHandler.finish(mockedState, mockedDetector));
55      }
56  
57      @Test
58      void testFinish() {
59          final EventHandler mockedHandler = Mockito.mock(EventHandler.class);
60          final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
61          final EventDetector mockedDetector = Mockito.mock(EventDetector.class);
62          final EventMultipleHandler eventMultipleHandler = new EventMultipleHandler().addHandler(mockedHandler);
63          Assertions.assertDoesNotThrow(() -> eventMultipleHandler.finish(mockedState, mockedDetector));
64      }
65  
66       /**
67       * check eventOccurred method.
68       */
69      @Test
70      public void testEventOccurred() {
71          // setup
72          ContinueOnEvent handler1 = new ContinueOnEvent();
73          StopOnEvent handler2 = new StopOnEvent();
74          StopOnDecreasing handler3 = new StopOnDecreasing();
75          AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
76          DateDetector detector = new DateDetector(date);
77          Frame eci = FramesFactory.getGCRF();
78          Orbit orbit = new KeplerianOrbit(6378137 + 500e3, 0, 0, 0, 0, 0,
79                  PositionAngleType.TRUE, eci, date, Constants.EIGEN5C_EARTH_MU);
80          SpacecraftState s = new SpacecraftState(orbit);
81  
82          // actions
83          EventMultipleHandler facade1 = new EventMultipleHandler().addHandler(handler1).addHandler(handler2);
84          Assertions.assertEquals(Action.STOP, facade1.eventOccurred(s, detector, true));
85  
86          EventMultipleHandler facade2 = new EventMultipleHandler().addHandler(handler1).addHandler(handler3);
87          Assertions.assertEquals(Action.CONTINUE, facade2.eventOccurred(s, detector, true));
88      }
89  
90      /**
91       * check resetState method.
92       */
93      @Test
94      public void testResetState() {
95          // setup
96          ContinueOnEvent handler1 = new ContinueOnEvent();
97          AbsoluteDate date = AbsoluteDate.J2000_EPOCH;
98          DateDetector detector = new DateDetector(date);
99          Frame eci = FramesFactory.getGCRF();
100         Orbit orbit = new KeplerianOrbit(6378137 + 500e3, 0, 0, 0, 0, 0,
101                                          PositionAngleType.TRUE, eci, date, Constants.EIGEN5C_EARTH_MU);
102         SpacecraftState s = new SpacecraftState(orbit);
103 
104         // actions
105         EventHandler handler2 = getHandler(10);
106         EventHandler handler3 = getHandler(20);
107         EventMultipleHandler facade = new EventMultipleHandler().addHandlers(handler1, handler2, handler3);
108 
109         // verify
110         Assertions.assertEquals(Action.RESET_STATE, facade.eventOccurred(s, detector, true));
111         Assertions.assertEquals(s.shiftedBy(30).getOrbit().getDate(), facade.resetState(detector, s).getOrbit().getDate());
112     }
113 
114     /**
115      * get a handler that returns action RESET_STATE and shifts orbit
116      */
117     private EventHandler getHandler(double timeShift) {
118 
119         return new EventHandler() {
120 
121             @Override
122             public Action eventOccurred(SpacecraftState s, EventDetector detector, boolean increasing) {
123                 return Action.RESET_STATE;
124             }
125 
126             @Override
127             public SpacecraftState resetState(EventDetector detector, SpacecraftState oldState) {
128                 return oldState.shiftedBy(timeShift);
129             }
130         };
131     }
132 }