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