1   /* Copyright 2022-2025 Thales Alenia 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  
18  package org.orekit.time;
19  
20  import org.hipparchus.CalculusFieldElement;
21  import org.hipparchus.Field;
22  import org.hipparchus.util.Binary64Field;
23  import org.junit.jupiter.api.Assertions;
24  import org.junit.jupiter.api.Test;
25  
26  import java.util.Arrays;
27  
28  class FieldClockOffsetHermiteInterpolatorTest {
29  
30      @Test
31      void testNoRate() {
32          doTestNoRate(Binary64Field.getInstance());
33      }
34  
35      private <T extends CalculusFieldElement<T>> void doTestNoRate(final Field<T> field) {
36          final T zero = field.getZero();
37          final FieldAbsoluteDate<T> t0 = FieldAbsoluteDate.getGalileoEpoch(field);
38          final FieldClockOffsetHermiteInterpolator<T> interpolator = new FieldClockOffsetHermiteInterpolator<>(4);
39          FieldClockOffset<T> interpolated =
40              interpolator.interpolate(t0.shiftedBy(2.5),
41                                       Arrays.asList(new FieldClockOffset<>(t0.shiftedBy(0), zero.newInstance( 0.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN)),
42                                                     new FieldClockOffset<>(t0.shiftedBy(1), zero.newInstance( 1.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN)),
43                                                     new FieldClockOffset<>(t0.shiftedBy(2), zero.newInstance( 4.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN)),
44                                                     new FieldClockOffset<>(t0.shiftedBy(3), zero.newInstance( 9.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN)),
45                                                     new FieldClockOffset<>(t0.shiftedBy(4), zero.newInstance(16.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN)),
46                                                     new FieldClockOffset<>(t0.shiftedBy(5), zero.newInstance(25.0), zero.newInstance(Double.NaN), zero.newInstance(Double.NaN))));
47          Assertions.assertEquals(6.25, interpolated.getOffset().getReal(),       1.0e-15);
48          Assertions.assertEquals(5.00, interpolated.getRate().getReal(),         1.0e-15);
49          Assertions.assertEquals(2.00, interpolated.getAcceleration().getReal(), 1.0e-15);
50      }
51  
52      @Test
53      void testNoAcceleration() {
54          doTestNoAcceleration(Binary64Field.getInstance());
55      }
56  
57      private <T extends CalculusFieldElement<T>> void doTestNoAcceleration(final Field<T> field) {
58          final T zero = field.getZero();
59          final FieldAbsoluteDate<T> t0 = FieldAbsoluteDate.getGalileoEpoch(field);
60          final FieldClockOffsetHermiteInterpolator<T> interpolator = new FieldClockOffsetHermiteInterpolator<>(4);
61          FieldClockOffset<T> interpolated =
62              interpolator.interpolate(t0.shiftedBy(2.5),
63                                       Arrays.asList(new FieldClockOffset<>(t0.shiftedBy(0), zero.newInstance( 0.0), zero.newInstance( 0.0), zero.newInstance(Double.NaN)),
64                                                     new FieldClockOffset<>(t0.shiftedBy(1), zero.newInstance( 1.0), zero.newInstance( 2.0), zero.newInstance(Double.NaN)),
65                                                     new FieldClockOffset<>(t0.shiftedBy(2), zero.newInstance( 4.0), zero.newInstance( 4.0), zero.newInstance(Double.NaN)),
66                                                     new FieldClockOffset<>(t0.shiftedBy(3), zero.newInstance( 9.0), zero.newInstance( 6.0), zero.newInstance(Double.NaN)),
67                                                     new FieldClockOffset<>(t0.shiftedBy(4), zero.newInstance(16.0), zero.newInstance( 8.0), zero.newInstance(Double.NaN)),
68                                                     new FieldClockOffset<>(t0.shiftedBy(5), zero.newInstance(25.0), zero.newInstance(10.0), zero.newInstance(Double.NaN))));
69          Assertions.assertEquals(6.25, interpolated.getOffset().getReal(),       1.0e-15);
70          Assertions.assertEquals(5.00, interpolated.getRate().getReal(),         1.0e-15);
71          Assertions.assertEquals(2.00, interpolated.getAcceleration().getReal(), 1.0e-15);
72      }
73  
74      @Test
75      void testComplete() {
76          doTestComplete(Binary64Field.getInstance());
77      }
78  
79      private <T extends CalculusFieldElement<T>> void doTestComplete(final Field<T> field) {
80          final T zero = field.getZero();
81          final FieldAbsoluteDate<T> t0 = FieldAbsoluteDate.getGalileoEpoch(field);
82          final FieldClockOffsetHermiteInterpolator<T> interpolator = new FieldClockOffsetHermiteInterpolator<>(4);
83          FieldClockOffset<T> interpolated =
84              interpolator.interpolate(t0.shiftedBy(2.5),
85                                       Arrays.asList(new FieldClockOffset<>(t0.shiftedBy(0), zero.newInstance( 0.0), zero.newInstance( 0.0), zero.newInstance(2.0)),
86                                                     new FieldClockOffset<>(t0.shiftedBy(1), zero.newInstance( 1.0), zero.newInstance( 2.0), zero.newInstance(2.0)),
87                                                     new FieldClockOffset<>(t0.shiftedBy(2), zero.newInstance( 4.0), zero.newInstance( 4.0), zero.newInstance(2.0)),
88                                                     new FieldClockOffset<>(t0.shiftedBy(3), zero.newInstance( 9.0), zero.newInstance( 6.0), zero.newInstance(2.0)),
89                                                     new FieldClockOffset<>(t0.shiftedBy(4), zero.newInstance(16.0), zero.newInstance( 8.0), zero.newInstance(2.0)),
90                                                     new FieldClockOffset<>(t0.shiftedBy(5), zero.newInstance(25.0), zero.newInstance(10.0), zero.newInstance(2.0))));
91          Assertions.assertEquals(6.25, interpolated.getOffset().getReal(),       1.0e-15);
92          Assertions.assertEquals(5.00, interpolated.getRate().getReal(),         1.0e-15);
93          Assertions.assertEquals(2.00, interpolated.getAcceleration().getReal(), 1.0e-15);
94      }
95  
96  }