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.models.earth.atmosphere;
18  
19  import org.hipparchus.CalculusFieldElement;
20  import org.hipparchus.complex.Complex;
21  import org.hipparchus.complex.ComplexField;
22  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23  import org.hipparchus.geometry.euclidean.threed.Vector3D;
24  import org.junit.jupiter.api.Assertions;
25  import org.junit.jupiter.api.Test;
26  import org.mockito.Mockito;
27  import org.orekit.frames.Frame;
28  import org.orekit.time.AbsoluteDate;
29  import org.orekit.time.FieldAbsoluteDate;
30  import org.orekit.utils.ExtendedPositionProvider;
31  
32  class AbstractSunInfluencedAtmosphereTest {
33  
34      @Test
35      void testGetSunPosition() {
36          // GIVEN
37          final ExtendedPositionProvider provider = new TestProvider();
38          final TestAtmosphere testAtmosphere = new TestAtmosphere(provider);
39          final Frame mockedFrame = Mockito.mock(Frame.class);
40          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
41          final FieldAbsoluteDate<Complex> fieldDate = new FieldAbsoluteDate<>(ComplexField.getInstance(), date).shiftedBy(Complex.I);
42          // WHEN
43          final FieldVector3D<Complex> fieldSunPosition = testAtmosphere.getSunPosition(fieldDate, mockedFrame);
44          // THEN
45          final Vector3D sunPosition = testAtmosphere.getSunPosition(date, mockedFrame);
46          Assertions.assertEquals(sunPosition, fieldSunPosition.toVector3D());
47          Assertions.assertNotEquals(0., fieldSunPosition.getX().getImaginary());
48      }
49  
50      @Test
51      void testGetSun() {
52          // GIVEN
53          final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
54          final TestAtmosphere testAtmosphere = new TestAtmosphere(mockedProvider);
55          // WHEN
56          final ExtendedPositionProvider sun = testAtmosphere.getSun();
57          // THEN
58          Assertions.assertEquals(mockedProvider, sun);
59      }
60  
61      private static class TestProvider implements ExtendedPositionProvider {
62  
63          @Override
64          public <T extends CalculusFieldElement<T>> FieldVector3D<T> getPosition(FieldAbsoluteDate<T> date, Frame frame) {
65              final T zero = date.getField().getZero();
66              return new FieldVector3D<>(date.durationFrom(AbsoluteDate.ARBITRARY_EPOCH), zero, zero);
67          }
68      }
69  
70      private static class TestAtmosphere extends AbstractSunInfluencedAtmosphere {
71  
72          public TestAtmosphere(final ExtendedPositionProvider provider) {
73              super(provider);
74          }
75  
76          @Override
77          public Frame getFrame() {
78              return null;
79          }
80  
81          @Override
82          public double getDensity(AbsoluteDate date, Vector3D position, Frame frame) {
83              return 0;
84          }
85  
86          @Override
87          public <T extends CalculusFieldElement<T>> T getDensity(FieldAbsoluteDate<T> date, FieldVector3D<T> position, Frame frame) {
88              return null;
89          }
90      }
91  }