1   package org.orekit.forces;
2   
3   import org.hipparchus.CalculusFieldElement;
4   import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
5   import org.hipparchus.geometry.euclidean.threed.Vector3D;
6   import org.hipparchus.util.Binary64;
7   import org.hipparchus.util.Binary64Field;
8   import org.junit.jupiter.api.Assertions;
9   import org.junit.jupiter.api.Test;
10  import org.mockito.Mockito;
11  import org.orekit.propagation.FieldSpacecraftState;
12  import org.orekit.propagation.SpacecraftState;
13  import org.orekit.propagation.events.EventDetector;
14  import org.orekit.propagation.events.FieldEventDetector;
15  import org.orekit.time.FieldAbsoluteDate;
16  import org.orekit.utils.ParameterDriver;
17  
18  import java.util.Collections;
19  import java.util.List;
20  import java.util.stream.Collectors;
21  
22  class ForceModelModifierTest {
23  
24      @Test
25      void testGetParametersDriver() {
26          // GIVEN
27          final TestForceModel forceModel = new TestForceModel();
28          final ForceModelModifier modelModifier = () -> forceModel;
29          // WHEN
30          final List<ParameterDriver> drivers = modelModifier.getParametersDrivers();
31          // THEN
32          final List<ParameterDriver> expectedDrivers = modelModifier.getParametersDrivers();
33          Assertions.assertEquals(expectedDrivers.size(), drivers.size());
34      }
35  
36      @Test
37      void testGetEventDetectors() {
38          // GIVEN
39          final TestForceModel forceModel = new TestForceModel();
40          final ForceModelModifier modelModifier = () -> forceModel;
41          // WHEN
42          final List<EventDetector> detectors = modelModifier.getEventDetectors().collect(Collectors.toList());
43          // THEN
44          final List<EventDetector> expectedDetectors = modelModifier.getEventDetectors().collect(Collectors.toList());
45          Assertions.assertEquals(expectedDetectors.size(), detectors.size());
46      }
47  
48      @Test
49      void testGetFieldEventDetectors() {
50          // GIVEN
51          final TestForceModel forceModel = new TestForceModel();
52          final ForceModelModifier modelModifier = () -> forceModel;
53          final Binary64Field field = Binary64Field.getInstance();
54          // WHEN
55          final List<FieldEventDetector<Binary64>> detectors = modelModifier.getFieldEventDetectors(field).collect(Collectors.toList());
56          // THEN
57          final List<FieldEventDetector<Binary64>> expectedDetectors = modelModifier.getFieldEventDetectors(field).collect(Collectors.toList());
58          Assertions.assertEquals(expectedDetectors.size(), detectors.size());
59      }
60  
61      @Test
62      void testAcceleration() {
63          // GIVEN
64          final TestForceModel forceModel = new TestForceModel();
65          final ForceModelModifier modelModifier = () -> forceModel;
66          // WHEN
67          final Vector3D actualAcceleration = modelModifier.acceleration(null, new double[0]);
68          // THEN
69          final Vector3D expectedAcceleration = forceModel.acceleration(null, new double[0]);
70          Assertions.assertEquals(expectedAcceleration, actualAcceleration);
71      }
72  
73      @Test
74      @SuppressWarnings("unchecked")
75      void testAccelerationField() {
76          // GIVEN
77          final TestForceModel forceModel = new TestForceModel();
78          final ForceModelModifier modelModifier = () -> forceModel;
79          final Binary64[] array = new Binary64[0];
80          final FieldSpacecraftState<Binary64> mockedState = Mockito.mock(FieldSpacecraftState.class);
81          Mockito.when(mockedState.getDate()).thenReturn(FieldAbsoluteDate.getArbitraryEpoch(Binary64Field.getInstance()));
82          // WHEN
83          final FieldVector3D<Binary64> actualAcceleration = modelModifier.acceleration(mockedState, array);
84          // THEN
85          final FieldVector3D<Binary64> expectedAcceleration = forceModel.acceleration(mockedState, array);
86          Assertions.assertEquals(expectedAcceleration, actualAcceleration);
87      }
88  
89      @Test
90      void testDependsOn() {
91          // GIVEN
92          final TestForceModel forceModel = new TestForceModel();
93          final ForceModelModifier modelModifier = () -> forceModel;
94          // WHEN & THEN
95          Assertions.assertEquals(forceModel.dependsOnPositionOnly(), modelModifier.dependsOnPositionOnly());
96          Assertions.assertEquals(forceModel.dependsOnAttitudeRate(), modelModifier.dependsOnAttitudeRate());
97      }
98  
99  
100     private static class TestForceModel implements ForceModel {
101 
102         @Override
103         public boolean dependsOnPositionOnly() {
104             return false;
105         }
106 
107         @Override
108         public Vector3D acceleration(SpacecraftState s, double[] parameters) {
109             return Vector3D.ZERO;
110         }
111 
112         @Override
113         public <T extends CalculusFieldElement<T>> FieldVector3D<T> acceleration(FieldSpacecraftState<T> s, T[] parameters) {
114             return new FieldVector3D<>(s.getDate().getField(), Vector3D.ZERO);
115         }
116 
117         @Override
118         public List<ParameterDriver> getParametersDrivers() {
119             return Collections.emptyList();
120         }
121     }
122 }