1   package org.orekit.forces.radiation;
2   
3   import org.hipparchus.CalculusFieldElement;
4   import org.hipparchus.Field;
5   import org.hipparchus.complex.Complex;
6   import org.hipparchus.complex.ComplexField;
7   import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
8   import org.hipparchus.geometry.euclidean.threed.Vector3D;
9   import org.junit.jupiter.api.Assertions;
10  import org.junit.jupiter.api.Test;
11  import org.mockito.Mockito;
12  import org.orekit.frames.Frame;
13  import org.orekit.propagation.FieldSpacecraftState;
14  import org.orekit.propagation.SpacecraftState;
15  import org.orekit.propagation.events.EventDetector;
16  import org.orekit.propagation.events.FieldEventDetector;
17  import org.orekit.time.AbsoluteDate;
18  import org.orekit.time.FieldAbsoluteDate;
19  import org.orekit.utils.ExtendedPositionProvider;
20  
21  import java.util.Collections;
22  import java.util.List;
23  
24  class AbstractLightFluxModelTest {
25  
26      @Test
27      void testGetLightFluxVectorWithZeroLightingRatio() {
28          // GIVEN
29          final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
30          final AbstractLightFluxModel mockedFluxModel = Mockito.mock(AbstractLightFluxModel.class);
31          Mockito.when(mockedFluxModel.getLightingRatio(Mockito.any(Vector3D.class), Mockito.any(Vector3D.class))).thenReturn(0.);
32          Mockito.when(mockedFluxModel.getLightFluxVector(mockedState)).thenCallRealMethod();
33          // WHEN
34          final Vector3D actualFluxVector = mockedFluxModel.getLightFluxVector(mockedState);
35          // THEN
36          Assertions.assertEquals(Vector3D.ZERO, actualFluxVector);
37      }
38  
39      @Test
40      void testGetLightFluxVector() {
41          // GIVEN
42          final Vector3D position = new Vector3D(1.0, 2.0, 3.0);
43          final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
44          final Frame mockedFrame = Mockito.mock(Frame.class);
45          final SpacecraftState mockedState = mockState(position, date, mockedFrame);
46          final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
47          final Vector3D sunPosition = Vector3D.PLUS_K;
48          Mockito.when(mockedProvider.getPosition(date, mockedFrame)).thenReturn(sunPosition);
49          final TestLightFluxModel testLightFluxModel = new TestLightFluxModel(mockedProvider);
50          // WHEN
51          final Vector3D actualFluxVector = testLightFluxModel.getLightFluxVector(mockedState);
52          // THEN
53          final Vector3D expectedFluxVector = position.subtract(sunPosition).normalize();
54          Assertions.assertEquals(expectedFluxVector, actualFluxVector);
55      }
56  
57      private SpacecraftState mockState(final Vector3D position, final AbsoluteDate date, final Frame frame) {
58          final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
59          Mockito.when(mockedState.getFrame()).thenReturn(frame);
60          Mockito.when(mockedState.getPosition()).thenReturn(position);
61          Mockito.when(mockedState.getDate()).thenReturn(date);
62          return mockedState;
63      }
64  
65      @Test
66      void testGetLightingRatioField() {
67          // GIVEN
68          final ComplexField field = ComplexField.getInstance();
69          final FieldVector3D<Complex> position = new FieldVector3D<>(field, new Vector3D(1.0, 2.0, 3.0));
70          final FieldAbsoluteDate<Complex> date = FieldAbsoluteDate.getArbitraryEpoch(field);
71          final Frame mockedFrame = Mockito.mock(Frame.class);
72          final FieldSpacecraftState<Complex> mockedFieldState = mockState(position, date, mockedFrame);
73          final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
74          final FieldVector3D<Complex> sunPosition = FieldVector3D.getMinusJ(field);
75          Mockito.when(mockedProvider.getPosition(date, mockedFrame)).thenReturn(sunPosition);
76          final TestLightFluxModel testLightFluxModel = new TestLightFluxModel(mockedProvider);
77          // WHEN
78          final Complex fieldLightingRatio = testLightFluxModel.getLightingRatio(mockedFieldState);
79          // THEN
80          final SpacecraftState mockedState = mockState(position.toVector3D(), date.toAbsoluteDate(), mockedFrame);
81          final double expectedLightingRatio = testLightFluxModel.getLightingRatio(mockedState);
82          Assertions.assertEquals(expectedLightingRatio, fieldLightingRatio.getReal());
83      }
84  
85      @Test
86      void testGetLightFluxVectorField() {
87          // GIVEN
88          final ComplexField field = ComplexField.getInstance();
89          final FieldVector3D<Complex> position = new FieldVector3D<>(field, new Vector3D(1.0, 2.0, 3.0));
90          final FieldAbsoluteDate<Complex> date = FieldAbsoluteDate.getArbitraryEpoch(field);
91          final Frame mockedFrame = Mockito.mock(Frame.class);
92          final FieldSpacecraftState<Complex> mockedState = mockState(position, date, mockedFrame);
93          final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
94          final FieldVector3D<Complex> sunPosition = FieldVector3D.getMinusJ(field);
95          Mockito.when(mockedProvider.getPosition(date, mockedFrame)).thenReturn(sunPosition);
96          final TestLightFluxModel testLightFluxModel = new TestLightFluxModel(mockedProvider);
97          // WHEN
98          final FieldVector3D<Complex> actualFluxVector = testLightFluxModel.getLightFluxVector(mockedState);
99          // THEN
100         final FieldVector3D<Complex> expectedFluxVector = position.subtract(sunPosition).normalize();
101         Assertions.assertEquals(expectedFluxVector, actualFluxVector);
102     }
103 
104     @SuppressWarnings("unchecked")
105     private FieldSpacecraftState<Complex> mockState(final FieldVector3D<Complex> position, final FieldAbsoluteDate<Complex> date,
106                                                     final Frame frame) {
107         final FieldSpacecraftState<Complex> mockedState = Mockito.mock(FieldSpacecraftState.class);
108         Mockito.when(mockedState.getFrame()).thenReturn(frame);
109         Mockito.when(mockedState.getPosition()).thenReturn(position);
110         Mockito.when(mockedState.getDate()).thenReturn(date);
111         return mockedState;
112     }
113 
114     @Test
115     void testConstructor() {
116         // GIVEN
117         final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
118         final TestLightFluxModel testLightFluxModel = new TestLightFluxModel(mockedProvider);
119         // WHEN
120         final ExtendedPositionProvider actualProvider = testLightFluxModel.getOccultedBody();
121         // THEN
122         Assertions.assertEquals(mockedProvider, actualProvider);
123     }
124 
125     private static class TestLightFluxModel extends AbstractLightFluxModel {
126 
127         public TestLightFluxModel(final ExtendedPositionProvider occultedBody) {
128             super(occultedBody);
129         }
130 
131         @Override
132         protected Vector3D getUnoccultedFluxVector(Vector3D relativePosition) {
133             return relativePosition.normalize();
134         }
135 
136         @Override
137         protected <T extends CalculusFieldElement<T>> FieldVector3D<T> getUnoccultedFluxVector(FieldVector3D<T> relativePosition) {
138             return relativePosition.normalize();
139         }
140 
141         @Override
142         protected double getLightingRatio(Vector3D position, Vector3D occultedBodyPosition) {
143             return 1.;
144         }
145 
146         @Override
147         protected <T extends CalculusFieldElement<T>> T getLightingRatio(FieldVector3D<T> position, FieldVector3D<T> occultedBodyPosition) {
148             return position.getX().getField().getOne();
149         }
150 
151         @Override
152         public List<EventDetector> getEclipseConditionsDetector() {
153             return Collections.emptyList();
154         }
155 
156         @Override
157         public <T extends CalculusFieldElement<T>> List<FieldEventDetector<T>> getFieldEclipseConditionsDetector(Field<T> field) {
158             return Collections.emptyList();
159         }
160     }
161 
162 }