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
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
34 final Vector3D actualFluxVector = mockedFluxModel.getLightFluxVector(mockedState);
35
36 Assertions.assertEquals(Vector3D.ZERO, actualFluxVector);
37 }
38
39 @Test
40 void testGetLightFluxVector() {
41
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
51 final Vector3D actualFluxVector = testLightFluxModel.getLightFluxVector(mockedState);
52
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
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
78 final Complex fieldLightingRatio = testLightFluxModel.getLightingRatio(mockedFieldState);
79
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
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
98 final FieldVector3D<Complex> actualFluxVector = testLightFluxModel.getLightFluxVector(mockedState);
99
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
117 final ExtendedPositionProvider mockedProvider = Mockito.mock(ExtendedPositionProvider.class);
118 final TestLightFluxModel testLightFluxModel = new TestLightFluxModel(mockedProvider);
119
120 final ExtendedPositionProvider actualProvider = testLightFluxModel.getOccultedBody();
121
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 }