1   /* Copyright 2002-2022 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.triggers;
18  
19  
20  import java.util.List;
21  
22  import org.hipparchus.CalculusFieldElement;
23  import org.hipparchus.Field;
24  import org.hipparchus.util.Decimal64Field;
25  import org.junit.Assert;
26  import org.junit.Test;
27  import org.orekit.forces.maneuvers.trigger.IntervalEventTrigger;
28  import org.orekit.propagation.events.DateDetector;
29  import org.orekit.propagation.events.FieldAbstractDetector;
30  import org.orekit.propagation.events.FieldDateDetector;
31  import org.orekit.propagation.events.FieldEventDetector;
32  import org.orekit.propagation.events.handlers.StopOnEvent;
33  import org.orekit.time.AbsoluteDate;
34  import org.orekit.time.FieldAbsoluteDate;
35  import org.orekit.time.TimeStamped;
36  
37  public class IntervalEventTriggerTest extends AbstractManeuverTriggersTest<IntervalEventTrigger<DateDetector>> {
38  
39      public static class IntervalDates extends IntervalEventTrigger<DateDetector> {
40  
41          public IntervalDates(final AbsoluteDate start, final AbsoluteDate stop) {
42              super(new DateDetector(0.5 * stop.durationFrom(start), 1.0e-10, start, stop).
43                    withHandler(new StopOnEvent<DateDetector>()));
44          }
45  
46          @Override
47          protected <D extends FieldEventDetector<S>, S extends CalculusFieldElement<S>>
48              FieldAbstractDetector<D, S> convertIntervalDetector(Field<S> field, DateDetector detector) {
49              final S                    maxCheck = field.getZero().newInstance(detector.getMaxCheckInterval());
50              final FieldAbsoluteDate<S> d0 = new FieldAbsoluteDate<>(field, detector.getDates().get(0).getDate());
51              final FieldAbsoluteDate<S> d1 = new FieldAbsoluteDate<>(field, detector.getDates().get(1).getDate());
52              @SuppressWarnings("unchecked")
53              final FieldAbstractDetector<D, S> converted = (FieldAbstractDetector<D, S>) new FieldDateDetector<>(maxCheck, null, d0, d1);
54              return converted;
55          }
56  
57      }
58  
59      protected IntervalDates createTrigger(final AbsoluteDate start, final AbsoluteDate stop) {
60          return new IntervalDates(start, stop);
61      }
62  
63      @Test
64      public void testComponents() {
65          IntervalDates trigger = createTrigger(AbsoluteDate.J2000_EPOCH,
66                                                AbsoluteDate.J2000_EPOCH.shiftedBy(100.0));
67          final List<TimeStamped>    dates = trigger.getFiringIntervalDetector().getDates();
68          Assert.assertEquals(1,     trigger.getEventsDetectors().count());
69          Assert.assertEquals(1,     trigger.getFieldEventsDetectors(Decimal64Field.getInstance()).count());
70          Assert.assertEquals(2,     dates.size());
71          Assert.assertEquals(  0.0, dates.get(0).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
72          Assert.assertEquals(100.0, dates.get(1).getDate().durationFrom(AbsoluteDate.J2000_EPOCH), 1.0e-10);
73      }
74  
75  }