1   package org.orekit.files.iirv;
2   
3   import org.hipparchus.geometry.euclidean.threed.Vector3D;
4   import org.junit.jupiter.api.BeforeEach;
5   import org.junit.jupiter.api.Test;
6   import org.orekit.Utils;
7   import org.orekit.annotation.DefaultDataContext;
8   import org.orekit.data.DataContext;
9   import org.orekit.data.DataSource;
10  import org.orekit.time.AbsoluteDate;
11  import org.orekit.time.TimeScalesFactory;
12  import org.orekit.time.UTCScale;
13  import org.orekit.utils.CartesianDerivativesFilter;
14  import org.orekit.utils.Constants;
15  import org.orekit.utils.TimeStampedPVCoordinates;
16  
17  import java.util.Arrays;
18  import java.util.List;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  
22  public class IIRVEphemerisTest {
23  
24      private static UTCScale UTC;
25      private IIRVEphemerisFile.IIRVEphemeris iirvEphemeris;
26      private IIRVSegment iirvSegment;
27  
28      @BeforeEach
29      @DefaultDataContext
30      public void setUp() {
31          Utils.setDataRoot("regular-data");
32          UTC = TimeScalesFactory.getUTC();
33          final IIRVParser parser = new IIRVParser(2024, UTC);
34  
35          final String stereoAheadIirvFile = "/iirv/ahead_20240909_01.iirv";
36          final IIRVEphemerisFile iirvEphemerisFile = parser.parse(
37              new DataSource(stereoAheadIirvFile,
38                  () -> getClass().getResourceAsStream(stereoAheadIirvFile)));
39  
40          iirvEphemeris = iirvEphemerisFile.getSatellites().get("01");
41          iirvSegment = iirvEphemeris.getSegment();
42      }
43  
44      @Test
45      void testConstructors() {
46          // Test constructors
47          IIRVEphemerisFile fileFromEphemeris = new IIRVEphemerisFile(iirvEphemeris);
48          IIRVEphemerisFile fileFromValues = new IIRVEphemerisFile(
49              iirvSegment.getMu(),
50              iirvSegment.getInterpolationSamples(),
51              iirvSegment.getStartYear(),
52              iirvSegment.getIIRVMessage()
53          );
54          IIRVEphemerisFile fileFromMessage = new IIRVEphemerisFile(
55              iirvSegment.getStartYear(),
56              iirvSegment.getIIRVMessage()
57          );
58          assertEquals(fileFromEphemeris.getIIRV(), fileFromValues.getIIRV());
59          assertEquals(fileFromEphemeris.getIIRV(), fileFromMessage.getIIRV());
60      }
61  
62      @Test
63      void testIIRVSegment() {
64          assertEquals(iirvEphemeris.getMu(), iirvSegment.getMu());
65          assertEquals(iirvEphemeris.getStart(), iirvSegment.getStart());
66          assertEquals(iirvEphemeris.getStop(), iirvSegment.getStop());
67  
68  
69          IIRVMessage testMessage = iirvSegment.getIIRVMessage();
70          IIRVSegment testSegment = new IIRVSegment(
71              Constants.IERS96_EARTH_MU,
72              14,
73              2020,
74              testMessage
75          );
76  
77          assertEquals(testSegment.getMu(), Constants.IERS96_EARTH_MU);
78          assertEquals(testSegment.getFrame().getName(), "GTOD/2010 simple EOP");
79          assertEquals(testSegment.getInterpolationSamples(), 14);
80          assertEquals(testSegment.getAvailableDerivatives(), CartesianDerivativesFilter.USE_PV);
81          assertEquals(testSegment.getStartYear(), 2020);
82          assertEquals(testSegment.getStart().toString(UTC), "2020-09-09T00:00:00.000");
83          assertEquals(testSegment.getStop().toString(UTC), "2020-09-10T00:00:00.000");
84          assertEquals(testSegment.getIIRVMessage(), testMessage);
85  
86          // Test frames
87          for (IIRVVector iirv : testSegment.getIIRVMessage().getVectors()) {
88              assertEquals(testSegment.getFrame().getName(), iirv.getFrame().getName());
89              assertEquals(testSegment.getFrame().getName(), iirv.getFrame(DataContext.getDefault()).getName());
90              assertEquals(testSegment.getFrame().getName(), iirv.getCoordinateSystem().getFrame().getName());
91          }
92  
93      }
94  
95      @Test
96      void testYearRolloverHandling() {
97          // Make sure the date/epoch terms roll over at Jan 1 midnight (given that the start year is not represented
98          // the IIRV message itself().
99  
100         TimeStampedPVCoordinates pv_before_midnight = new TimeStampedPVCoordinates(
101             new AbsoluteDate(2020, 12, 31, 23, 59, 59, UTC),
102             new Vector3D(1.0e6, 2.0e6, 3.0e6),
103             new Vector3D(-300, -200, -100));
104         TimeStampedPVCoordinates pv_after_midnight = new TimeStampedPVCoordinates(
105             new AbsoluteDate(2021, 1, 1, 0, 0, 1, UTC),
106             new Vector3D(1.0e6, 2.0e6, 3.0e6),
107             new Vector3D(-300, -200, -100));
108 
109         final IIRVBuilder iirvBuilder = new IIRVBuilder(UTC);
110         IIRVSegment iirv_segment = new IIRVSegment(2020, iirvBuilder.buildIIRVMessage(Arrays.asList(pv_before_midnight, pv_after_midnight)));
111 
112         List<TimeStampedPVCoordinates> coordinates_from_segment = iirv_segment.getCoordinates();
113         assert (coordinates_from_segment.get(0).getDate().getComponents(UTC).getDate().getYear() == 2020);
114         assert (coordinates_from_segment.get(1).getDate().getComponents(UTC).getDate().getYear() == 2021);
115     }
116 }