1   /* Copyright 2022-2025 Romain Serra
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.frames;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.Field;
21  import org.hipparchus.complex.Complex;
22  import org.hipparchus.complex.ComplexField;
23  import org.hipparchus.geometry.euclidean.threed.FieldRotation;
24  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
25  import org.hipparchus.geometry.euclidean.threed.Rotation;
26  import org.hipparchus.geometry.euclidean.threed.RotationConvention;
27  import org.hipparchus.geometry.euclidean.threed.Vector3D;
28  import org.junit.jupiter.api.Assertions;
29  import org.junit.jupiter.api.Test;
30  import org.orekit.time.AbsoluteDate;
31  import org.orekit.time.FieldAbsoluteDate;
32  
33  class TransformProviderTest {
34  
35      @Test
36      void testGetStaticTransform() {
37          // GIVEN
38          final TestTransformProvider transformProvider = new TestTransformProvider();
39          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
40          // WHEN
41          final StaticTransform staticTransform = transformProvider.getStaticTransform(date);
42          // THEN
43          final Transform transform = transformProvider.getTransform(date);
44          Assertions.assertEquals(date, staticTransform.getDate());
45          Assertions.assertEquals(transform.getCartesian().getPosition(), staticTransform.getTranslation());
46          Assertions.assertEquals(0., Rotation.distance(transform.getRotation(), staticTransform.getRotation()));
47      }
48  
49      @Test
50      void testGetKinematicTransform() {
51          // GIVEN
52          final TestTransformProvider transformProvider = new TestTransformProvider();
53          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
54          // WHEN
55          final KinematicTransform kinematicTransform = transformProvider.getKinematicTransform(date);
56          // THEN
57          final Transform transform = transformProvider.getTransform(date);
58          Assertions.assertEquals(date, kinematicTransform.getDate());
59          Assertions.assertEquals(transform.getCartesian().getPosition(), kinematicTransform.getTranslation());
60          Assertions.assertEquals(transform.getCartesian().getVelocity(), kinematicTransform.getVelocity());
61          Assertions.assertEquals(0., Rotation.distance(transform.getRotation(), kinematicTransform.getRotation()));
62          Assertions.assertEquals(transform.getRotationRate(), kinematicTransform.getRotationRate());
63      }
64  
65      @Test
66      void testFieldGetKinematicTransform() {
67          // GIVEN
68          final TestTransformProvider transformProvider = new TestTransformProvider();
69          final ComplexField complexField = ComplexField.getInstance();
70          final FieldAbsoluteDate<Complex> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(complexField);
71          // WHEN
72          final FieldKinematicTransform<Complex> fieldKinematicTransform = transformProvider
73                  .getKinematicTransform(fieldDate);
74          // THEN
75          final KinematicTransform kinematicTransform = transformProvider.getKinematicTransform(fieldDate.toAbsoluteDate());
76          Assertions.assertEquals(kinematicTransform.getDate(), fieldKinematicTransform.getDate());
77          Assertions.assertEquals(kinematicTransform.getTranslation(), fieldKinematicTransform.getTranslation().toVector3D());
78          Assertions.assertEquals(kinematicTransform.getVelocity(), fieldKinematicTransform.getVelocity().toVector3D());
79          Assertions.assertEquals(0., Rotation.distance(kinematicTransform.getRotation(),
80                  fieldKinematicTransform.getRotation().toRotation()));
81          Assertions.assertEquals(kinematicTransform.getRotationRate(),
82                  fieldKinematicTransform.getRotationRate().toVector3D());
83      }
84  
85      @Test
86      void testFieldGetStaticTransform() {
87          // GIVEN
88          final TestTransformProvider transformProvider = new TestTransformProvider();
89          final ComplexField complexField = ComplexField.getInstance();
90          final FieldAbsoluteDate<Complex> fieldDate = FieldAbsoluteDate.getArbitraryEpoch(complexField);
91          // WHEN
92          final FieldStaticTransform<Complex> fieldStaticTransform = transformProvider
93                  .getStaticTransform(fieldDate);
94          // THEN
95          final StaticTransform staticTransform = transformProvider.getStaticTransform(fieldDate.toAbsoluteDate());
96          Assertions.assertEquals(staticTransform.getDate(), fieldStaticTransform.getDate());
97          Assertions.assertEquals(staticTransform.getTranslation(), fieldStaticTransform.getTranslation().toVector3D());
98          Assertions.assertEquals(0., Rotation.distance(staticTransform.getRotation(),
99                  fieldStaticTransform.getRotation().toRotation()));
100     }
101 
102     private static class TestTransformProvider implements TransformProvider {
103 
104         @Override
105         public Transform getTransform(AbsoluteDate date) {
106             return new Transform(date, new Rotation(Vector3D.PLUS_I, 1., RotationConvention.FRAME_TRANSFORM),
107                     Vector3D.MINUS_J);
108         }
109 
110         @Override
111         public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(FieldAbsoluteDate<T> date) {
112             final Transform transform = getTransform(date.toAbsoluteDate());
113             final Field<T> field = date.getField();
114             final FieldRotation<T> fieldRotation = new FieldRotation<>(field, transform.getRotation());
115             final FieldVector3D<T> fieldRotationRate = new FieldVector3D<>(field, transform.getRotationRate());
116             return new FieldTransform<>(date, fieldRotation, fieldRotationRate);
117         }
118     }
119 
120 }