1   /* Copyright 2002-2025 CS GROUP
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.forces.maneuvers.trigger;
18  
19  import java.util.Collections;
20  import java.util.List;
21  
22  import org.hipparchus.CalculusFieldElement;
23  import org.hipparchus.Field;
24  import org.hipparchus.util.Binary64Field;
25  import org.junit.jupiter.api.Assertions;
26  import org.junit.jupiter.api.Test;
27  import org.orekit.propagation.events.DateDetector;
28  import org.orekit.propagation.events.FieldAbstractDetector;
29  import org.orekit.propagation.events.FieldDateDetector;
30  import org.orekit.propagation.events.FieldEventDetector;
31  import org.orekit.propagation.events.handlers.StopOnEvent;
32  import org.orekit.time.AbsoluteDate;
33  import org.orekit.time.FieldAbsoluteDate;
34  import org.orekit.time.TimeStamped;
35  import org.orekit.utils.ParameterDriver;
36  
37  public class StartStopEventTriggerTest extends AbstractManeuverTriggersTest<StartStopEventsTrigger<DateDetector, DateDetector>> {
38  
39      public static class StartStopDates extends StartStopEventsTrigger<DateDetector, DateDetector> {
40  
41          public StartStopDates(final AbsoluteDate start, final AbsoluteDate stop) {
42              super(new DateDetector(start, stop.shiftedBy(10.0)).
43                    withMaxCheck(5.0).
44                    withThreshold(1.0e-10).
45                    withHandler(new StopOnEvent()),
46                    new DateDetector(stop, stop.shiftedBy(20.0)).
47                    withMaxCheck(5.0).
48                    withThreshold(1.0e-10).
49                    withHandler(new StopOnEvent()));
50          }
51  
52          @Override
53          protected <D extends FieldEventDetector<S>, S extends CalculusFieldElement<S>>
54              D convertStartDetector(Field<S> field, DateDetector detector) {
55              final FieldAbsoluteDate<S> target = new FieldAbsoluteDate<>(field, detector.getDates().get(0).getDate());
56              @SuppressWarnings("unchecked")
57              final D converted = (D) new FieldDateDetector<>(field, target);
58              return converted;
59          }
60  
61          @Override
62          protected <D extends FieldEventDetector<S>, S extends CalculusFieldElement<S>>
63          D convertStopDetector(Field<S> field, DateDetector detector) {
64              final FieldAbsoluteDate<S> target = new FieldAbsoluteDate<>(field, detector.getDates().get(0).getDate());
65              @SuppressWarnings("unchecked")
66              final D converted = (D) new FieldDateDetector<>(field, target);
67              return converted;
68          }
69  
70          @Override
71          public List<ParameterDriver> getParametersDrivers() {
72              return Collections.emptyList();
73          }
74  
75      }
76  
77      protected StartStopEventsTrigger<DateDetector, DateDetector> createTrigger(final AbsoluteDate start, final AbsoluteDate stop) {
78          return new StartStopDates(start, stop);
79      }
80  
81      @Test
82      void testComponents() {
83          StartStopEventsTrigger<DateDetector, DateDetector> trigger = createTrigger(AbsoluteDate.J2000_EPOCH,
84                                                                                     AbsoluteDate.J2000_EPOCH.shiftedBy(100.0));
85          final List<TimeStamped>    startDates = trigger.getStartDetector().getDates();
86          final List<TimeStamped>    stopDates  = trigger.getStopDetector().getDates();
87          Assertions.assertEquals(2,     trigger.getEventDetectors().count());
88          Assertions.assertEquals(2,     trigger.getFieldEventDetectors(Binary64Field.getInstance()).count());
89          Assertions.assertEquals(2,     startDates.size());
90          Assertions.assertEquals(  0.0, startDates.get(0).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
91          Assertions.assertEquals(110.0, startDates.get(1).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
92          Assertions.assertEquals(2,     stopDates.size());
93          Assertions.assertEquals(100.0, stopDates.get(0).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
94          Assertions.assertEquals(120.0, stopDates.get(1).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
95      }
96  
97  }