1   package org.orekit.files.iirv;
2   
3   import org.junit.jupiter.api.Assertions;
4   import org.junit.jupiter.api.BeforeEach;
5   import org.junit.jupiter.api.Test;
6   import org.junit.jupiter.api.io.TempDir;
7   import org.orekit.Utils;
8   import org.orekit.annotation.DefaultDataContext;
9   import org.orekit.errors.OrekitIllegalArgumentException;
10  import org.orekit.files.iirv.terms.CoordinateSystemTerm;
11  import org.orekit.files.iirv.terms.CrossSectionalAreaTerm;
12  import org.orekit.files.iirv.terms.DataSourceTerm;
13  import org.orekit.files.iirv.terms.DragCoefficientTerm;
14  import org.orekit.files.iirv.terms.MassTerm;
15  import org.orekit.files.iirv.terms.MessageClassTerm;
16  import org.orekit.files.iirv.terms.MessageIDTerm;
17  import org.orekit.files.iirv.terms.MessageSourceTerm;
18  import org.orekit.files.iirv.terms.MessageTypeTerm;
19  import org.orekit.files.iirv.terms.OriginIdentificationTerm;
20  import org.orekit.files.iirv.terms.OriginatorRoutingIndicatorTerm;
21  import org.orekit.files.iirv.terms.RoutingIndicatorTerm;
22  import org.orekit.files.iirv.terms.SequenceNumberTerm;
23  import org.orekit.files.iirv.terms.SolarReflectivityCoefficientTerm;
24  import org.orekit.files.iirv.terms.SupportIdCodeTerm;
25  import org.orekit.files.iirv.terms.VectorTypeTerm;
26  import org.orekit.files.iirv.terms.VehicleIdCodeTerm;
27  import org.orekit.frames.Frame;
28  import org.orekit.frames.FramesFactory;
29  import org.orekit.orbits.KeplerianOrbit;
30  import org.orekit.orbits.PositionAngleType;
31  import org.orekit.propagation.analytical.KeplerianPropagator;
32  import org.orekit.time.AbsoluteDate;
33  import org.orekit.time.TimeComponents;
34  import org.orekit.time.TimeScalesFactory;
35  import org.orekit.time.UTCScale;
36  import org.orekit.utils.Constants;
37  import org.orekit.utils.TimeStampedPVCoordinates;
38  
39  import java.io.IOException;
40  import java.nio.file.Path;
41  import java.util.ArrayList;
42  import java.util.List;
43  
44  import static org.junit.jupiter.api.Assertions.assertEquals;
45  import static org.junit.jupiter.api.Assertions.assertThrows;
46  
47  
48  /**
49   * Unit tests for {@link IIRVBuilder}
50   */
51  public class IIRVBuilderTest {
52  
53      private static UTCScale UTC;
54      private static List<TimeStampedPVCoordinates> testCoordinates;
55  
56      @TempDir
57      public Path temporaryFolderPath;
58  
59      @BeforeEach
60      @DefaultDataContext
61      public void setUp() {
62          // Sets the root of data to read
63          Utils.setDataRoot("regular-data");
64          UTC = TimeScalesFactory.getUTC();
65          testCoordinates = getTestCoordinates(5);
66      }
67  
68      /** Test coordinates, see {@link org.orekit.files.stk.STKEphemerisFileTest} */
69      List<TimeStampedPVCoordinates> getTestCoordinates(int nCoordinates) {
70          final KeplerianOrbit orbit =
71              new KeplerianOrbit(6.5e6, 0.01, -0.1, 0.1, 0.2, 0.3, PositionAngleType.TRUE,
72                  FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH,
73                  Constants.WGS84_EARTH_MU);
74          final AbsoluteDate startDate = new AbsoluteDate(2009, 1, 16, 0, 0, 0, UTC);
75  
76          final Frame eme2000 = FramesFactory.getEME2000();
77  
78          final double finalTime = 3600;
79          final double stepSizeSeconds = finalTime / nCoordinates;
80  
81          final KeplerianPropagator propagator = new KeplerianPropagator(orbit);
82          final List<TimeStampedPVCoordinates> coordinates = new ArrayList<>();
83          for (double dt = 0.0; dt < finalTime; dt += stepSizeSeconds) {
84              coordinates.add(propagator.getPVCoordinates(startDate.shiftedBy(dt), eme2000));
85          }
86          return coordinates;
87      }
88  
89      @Test
90      @DefaultDataContext
91      void testIIRVBuilderBuildMethods() {
92          final IIRVBuilder iirvBuilder = new IIRVBuilder(UTC);
93  
94          for (TimeStampedPVCoordinates pv : testCoordinates) {
95  
96              // Build from TimeStampedPVCoordinates
97              IIRVVector iirvPrecise = iirvBuilder.buildVector(pv);
98              IIRVVector iirv = new IIRVVector(iirvPrecise.toIIRVStrings(true), UTC);
99  
100             // Build from terms
101             IIRVVector iirvFromTerms = iirvBuilder.buildVector(
102                 iirvPrecise.getDayOfYear(),
103                 iirvPrecise.getVectorEpoch(),
104                 iirvPrecise.getXPosition(),
105                 iirvPrecise.getYPosition(),
106                 iirvPrecise.getZPosition(),
107                 iirvPrecise.getXVelocity(),
108                 iirvPrecise.getYVelocity(),
109                 iirvPrecise.getZVelocity());
110 
111             // PositionVectorTerm
112             assertEquals(Math.round(pv.getPosition().getX()), iirv.getPositionVector().getX());
113             assertEquals(Math.round(pv.getPosition().getX()), iirv.getXPosition().value());
114             assertEquals(Math.round(pv.getPosition().getY()), iirv.getPositionVector().getY());
115             assertEquals(Math.round(pv.getPosition().getY()), iirv.getYPosition().value());
116             assertEquals(Math.round(pv.getPosition().getZ()), iirv.getPositionVector().getZ());
117             assertEquals(Math.round(pv.getPosition().getZ()), iirv.getZPosition().value());
118 
119             // VelocityVectorTerm
120             final double velTol = 1e-3;
121             assertEquals(pv.getVelocity().getX(), iirv.getVelocityVector().getX(), velTol);
122             assertEquals(pv.getVelocity().getX(), iirv.getXVelocity().value(), velTol);
123             assertEquals(pv.getVelocity().getY(), iirv.getVelocityVector().getY(), velTol);
124             assertEquals(pv.getVelocity().getY(), iirv.getYVelocity().value(), velTol);
125             assertEquals(pv.getVelocity().getZ(), iirv.getVelocityVector().getZ(), velTol);
126             assertEquals(pv.getVelocity().getZ(), iirv.getZVelocity().value(), velTol);
127 
128             //DayOfYearTerm
129             assertEquals(pv.getDate().getComponents(UTC).getDate().getDayOfYear(),
130                 iirv.getDayOfYear().value());
131 
132             // VectorEpochTerm
133             TimeComponents timeTruth = pv.getDate().getComponents(UTC).getTime();
134             TimeComponents timeIIRV = iirv.getVectorEpoch().value();
135             assertEquals(timeTruth.getHour(), timeIIRV.getHour());
136             assertEquals(timeTruth.getMinute(), timeIIRV.getMinute());
137             assertEquals(timeTruth.getSecond(), timeIIRV.getSecond(), 1e-3);
138 
139             assertEquals(iirvPrecise, iirvFromTerms);
140             assertEquals(iirv, iirvFromTerms);
141         }
142     }
143 
144     @Test
145     void testIIRVBuilderMassTerm() {
146         IIRVBuilder iirvBuilder;
147 
148         String valStr = "1.2";
149         double val = Double.parseDouble(valStr);
150         MassTerm massTerm = new MassTerm(val);
151 
152         // set by IIRVTerm instance
153         iirvBuilder = new IIRVBuilder(UTC);
154         iirvBuilder.setMass(massTerm);
155         assertEquals(massTerm, iirvBuilder.getMass());
156 
157         // Set by value (double)
158         iirvBuilder = new IIRVBuilder(UTC);
159         iirvBuilder.setMass(val);
160         assertEquals(massTerm, iirvBuilder.getMass());
161 
162         // Set by value (string)
163         iirvBuilder = new IIRVBuilder(UTC);
164         iirvBuilder.setMass(massTerm.toEncodedString());
165         assertEquals(massTerm, iirvBuilder.getMass());
166     }
167 
168     @Test
169     void testIIRVBuilderMessageID() {
170         IIRVBuilder iirvBuilder;
171 
172         String valStr = "0012345";
173         long val = Long.parseLong(valStr);
174         MessageIDTerm messageIDTerm = new MessageIDTerm(valStr);
175 
176         // set by IIRVTerm instance
177         iirvBuilder = new IIRVBuilder(UTC);
178         iirvBuilder.setMessageID(messageIDTerm);
179         assertEquals(messageIDTerm, iirvBuilder.getMessageID());
180 
181         // Set by value (long)
182         iirvBuilder = new IIRVBuilder(UTC);
183         iirvBuilder.setMessageID(val);
184         assertEquals(messageIDTerm, iirvBuilder.getMessageID());
185 
186         // Set by value (int)
187         iirvBuilder = new IIRVBuilder(UTC);
188         iirvBuilder.setMessageID((int) val);
189         assertEquals(messageIDTerm, iirvBuilder.getMessageID());
190 
191         // Set by value (string)
192         iirvBuilder = new IIRVBuilder(UTC);
193         iirvBuilder.setMessageID(messageIDTerm.toEncodedString());
194         assertEquals(messageIDTerm, iirvBuilder.getMessageID());
195     }
196 
197     @Test
198     void testIIRVBuilderMessageClass() {
199         IIRVBuilder iirvBuilder;
200 
201         MessageClassTerm messageClassTerm = MessageClassTerm.NOMINAL;
202 
203         // set by IIRVTerm instance
204         iirvBuilder = new IIRVBuilder(UTC);
205         iirvBuilder.setMessageClass(messageClassTerm);
206         assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
207 
208         // Set by value (long)
209         iirvBuilder = new IIRVBuilder(UTC);
210         iirvBuilder.setMessageClass(messageClassTerm.value());
211         assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
212 
213         // Set by value (string)
214         iirvBuilder = new IIRVBuilder(UTC);
215         iirvBuilder.setMessageClass(messageClassTerm.toEncodedString());
216         assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
217     }
218 
219     @Test
220     void testIIRVBuilderOriginIdentification() {
221         IIRVBuilder iirvBuilder;
222 
223         OriginIdentificationTerm originIdentificationTerm = OriginIdentificationTerm.GSFC;
224 
225         // set by IIRVTerm instance
226         iirvBuilder = new IIRVBuilder(UTC);
227         iirvBuilder.setOriginIdentification(originIdentificationTerm);
228         assertEquals(originIdentificationTerm, iirvBuilder.getOriginIdentification());
229 
230         // Set by value (string)
231         iirvBuilder = new IIRVBuilder(UTC);
232         iirvBuilder.setOriginIdentification(originIdentificationTerm.toEncodedString());
233         assertEquals(originIdentificationTerm, iirvBuilder.getOriginIdentification());
234     }
235 
236     @Test
237     void testIIRVBuilderMessageTypeTerm() {
238         IIRVBuilder iirvBuilder;
239 
240         MessageTypeTerm messageTypeTerm = new MessageTypeTerm("05");
241 
242         // set by IIRVTerm instance
243         iirvBuilder = new IIRVBuilder(UTC);
244         iirvBuilder.setMessageType(messageTypeTerm);
245         assertEquals(messageTypeTerm, iirvBuilder.getMessageType());
246 
247         // Set by value (string)
248         iirvBuilder = new IIRVBuilder(UTC);
249         iirvBuilder.setMessageType(messageTypeTerm.toEncodedString());
250         assertEquals(messageTypeTerm, iirvBuilder.getMessageType());
251     }
252 
253     @Test
254     void testIIRVBuilderMessageSourceTerm() {
255         IIRVBuilder iirvBuilder;
256 
257         MessageSourceTerm messageSourceTerm = new MessageSourceTerm("1");
258 
259         // set by IIRVTerm instance
260         iirvBuilder = new IIRVBuilder(UTC);
261         iirvBuilder.setMessageSource(messageSourceTerm);
262         assertEquals(messageSourceTerm, iirvBuilder.getMessageSource());
263 
264         // Set by value (string)
265         iirvBuilder = new IIRVBuilder(UTC);
266         iirvBuilder.setMessageSource(messageSourceTerm.toEncodedString());
267         assertEquals(messageSourceTerm, iirvBuilder.getMessageSource());
268     }
269 
270     @Test
271     void testIIRVBuilderRoutingIndicator() {
272         IIRVBuilder iirvBuilder;
273 
274         RoutingIndicatorTerm routingIndicatorTerm = RoutingIndicatorTerm.GSFC;
275 
276         // set by IIRVTerm instance
277         iirvBuilder = new IIRVBuilder(UTC);
278         iirvBuilder.setRoutingIndicator(routingIndicatorTerm);
279         assertEquals(routingIndicatorTerm, iirvBuilder.getRoutingIndicator());
280 
281         // Set by value (string)
282         iirvBuilder = new IIRVBuilder(UTC);
283         iirvBuilder.setRoutingIndicator(routingIndicatorTerm.toEncodedString());
284         assertEquals(routingIndicatorTerm, iirvBuilder.getRoutingIndicator());
285     }
286 
287     @Test
288     void testIIRVBuilderVectorType() {
289         IIRVBuilder iirvBuilder;
290 
291         VectorTypeTerm vectorTypeTerm = VectorTypeTerm.POWERED_FLIGHT;
292 
293         // set by IIRVTerm instance
294         iirvBuilder = new IIRVBuilder(UTC);
295         iirvBuilder.setVectorType(vectorTypeTerm);
296         assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
297 
298         // Set by value (long)
299         iirvBuilder = new IIRVBuilder(UTC);
300         iirvBuilder.setVectorType(vectorTypeTerm.value());
301         assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
302 
303         // Set by value (string)
304         iirvBuilder = new IIRVBuilder(UTC);
305         iirvBuilder.setVectorType(vectorTypeTerm.toEncodedString());
306         assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
307     }
308 
309     @Test
310     void testIIRVBuilderDataSourceTerm() {
311         IIRVBuilder iirvBuilder;
312 
313         DataSourceTerm dataSourceTerm = DataSourceTerm.OFFLINE;
314 
315         // set by IIRVTerm instance
316         iirvBuilder = new IIRVBuilder(UTC);
317         iirvBuilder.setDataSource(dataSourceTerm);
318         assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
319 
320         // Set by value (long)
321         iirvBuilder = new IIRVBuilder(UTC);
322         iirvBuilder.setDataSource(dataSourceTerm.value());
323         assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
324 
325         // Set by value (string)
326         iirvBuilder = new IIRVBuilder(UTC);
327         iirvBuilder.setDataSource(dataSourceTerm.toEncodedString());
328         assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
329     }
330 
331     @Test
332     void testIIRVBuilderCoordinateSystemTerm() {
333         IIRVBuilder iirvBuilder;
334 
335         CoordinateSystemTerm coordinateSystemTerm = CoordinateSystemTerm.GEOCENTRIC_TRUE_OF_DATE_ROTATING;
336 
337         // set by IIRVTerm instance
338         iirvBuilder = new IIRVBuilder(UTC);
339         iirvBuilder.setCoordinateSystem(coordinateSystemTerm);
340         assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
341 
342         // Set by value (long)
343         iirvBuilder = new IIRVBuilder(UTC);
344         iirvBuilder.setCoordinateSystem(coordinateSystemTerm.value());
345         assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
346 
347         // Set by value (string)
348         iirvBuilder = new IIRVBuilder(UTC);
349         iirvBuilder.setCoordinateSystem(coordinateSystemTerm.toEncodedString());
350         assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
351     }
352 
353     @Test
354     void testIIRVBuilderSupportIdTerm() {
355         IIRVBuilder iirvBuilder;
356 
357         SupportIdCodeTerm supportIdCodeTerm = new SupportIdCodeTerm(1234);
358 
359         // set by IIRVTerm instance
360         iirvBuilder = new IIRVBuilder(UTC);
361         iirvBuilder.setSupportIdCode(supportIdCodeTerm);
362         assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
363 
364         // Set by value (long)
365         iirvBuilder = new IIRVBuilder(UTC);
366         iirvBuilder.setSupportIdCode(supportIdCodeTerm.value());
367         assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
368 
369         // Set by value (string)
370         iirvBuilder = new IIRVBuilder(UTC);
371         iirvBuilder.setSupportIdCode(supportIdCodeTerm.toEncodedString());
372         assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
373     }
374 
375     @Test
376     void testIIRVBuilderVehicleIdTerm() {
377         IIRVBuilder iirvBuilder;
378 
379         VehicleIdCodeTerm vehicleIdCodeTerm = new VehicleIdCodeTerm(5);
380 
381         // set by IIRVTerm instance
382         iirvBuilder = new IIRVBuilder(UTC);
383         iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm);
384         assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
385 
386         // Set by value (long)
387         iirvBuilder = new IIRVBuilder(UTC);
388         iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm.value());
389         assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
390 
391         // Set by value (string)
392         iirvBuilder = new IIRVBuilder(UTC);
393         iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm.toEncodedString());
394         assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
395     }
396 
397     @Test
398     void testIIRVBuilderSequenceNumberTerm() {
399         IIRVBuilder iirvBuilder;
400 
401         SequenceNumberTerm sequenceNumberTerm = new SequenceNumberTerm(10);
402 
403         // set by IIRVTerm instance
404         iirvBuilder = new IIRVBuilder(UTC);
405         iirvBuilder.setSequenceNumber(sequenceNumberTerm);
406         assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
407 
408         // Set by value (long)
409         iirvBuilder = new IIRVBuilder(UTC);
410         iirvBuilder.setSequenceNumber(sequenceNumberTerm.value());
411         assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
412 
413         // Set by value (string)
414         iirvBuilder = new IIRVBuilder(UTC);
415         iirvBuilder.setSequenceNumber(sequenceNumberTerm.toEncodedString());
416         assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
417 
418         // Exceeds max value
419         Assertions.assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).setSequenceNumber(1000));
420     }
421 
422     @Test
423     void testIIRVBuilderCrossSectionalAreaTerm() {
424         IIRVBuilder iirvBuilder;
425 
426         CrossSectionalAreaTerm crossSectionalAreaTerm = new CrossSectionalAreaTerm(10.5);
427 
428         // set by IIRVTerm instance
429         iirvBuilder = new IIRVBuilder(UTC);
430         iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm);
431         assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
432 
433         // Set by value (double)
434         iirvBuilder = new IIRVBuilder(UTC);
435         iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm.value());
436         assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
437 
438         // Set by value (string)
439         iirvBuilder = new IIRVBuilder(UTC);
440         iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm.toEncodedString());
441         assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
442     }
443 
444     @Test
445     void testIIRVBuilderDragCoefficientTerm() {
446         IIRVBuilder iirvBuilder;
447 
448         DragCoefficientTerm dragCoefficientTerm = new DragCoefficientTerm(2.2);
449 
450         // set by IIRVTerm instance
451         iirvBuilder = new IIRVBuilder(UTC);
452         iirvBuilder.setDragCoefficient(dragCoefficientTerm);
453         assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
454 
455         // Set by value (double)
456         iirvBuilder = new IIRVBuilder(UTC);
457         iirvBuilder.setDragCoefficient(dragCoefficientTerm.value());
458         assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
459 
460         // Set by value (string)
461         iirvBuilder = new IIRVBuilder(UTC);
462         iirvBuilder.setDragCoefficient(dragCoefficientTerm.toEncodedString());
463         assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
464     }
465 
466     @Test
467     void testIIRVBuilderSolarReflectivityCoefficientTerm() {
468         IIRVBuilder iirvBuilder;
469 
470         SolarReflectivityCoefficientTerm solarReflectivityCoefficientTerm = new SolarReflectivityCoefficientTerm(-7.8);
471 
472         // set by IIRVTerm instance
473         iirvBuilder = new IIRVBuilder(UTC);
474         iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm);
475         assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
476 
477         // Set by value (double)
478         iirvBuilder = new IIRVBuilder(UTC);
479         iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm.value());
480         assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
481 
482         // Set by value (string)
483         iirvBuilder = new IIRVBuilder(UTC);
484         iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm.toEncodedString());
485         assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
486     }
487 
488     @Test
489     void testIIRVBuilderOriginatorRoutingIndicatorTerm() {
490         IIRVBuilder iirvBuilder;
491 
492         OriginatorRoutingIndicatorTerm originatorRoutingIndicatorTerm = OriginatorRoutingIndicatorTerm.GCQU;
493 
494         // set by IIRVTerm instance
495         iirvBuilder = new IIRVBuilder(UTC);
496         iirvBuilder.setOriginatorRoutingIndicator(originatorRoutingIndicatorTerm);
497         assertEquals(originatorRoutingIndicatorTerm, iirvBuilder.getOriginatorRoutingIndicator());
498 
499         // Set by value (string)
500         iirvBuilder = new IIRVBuilder(UTC);
501         iirvBuilder.setOriginatorRoutingIndicator(originatorRoutingIndicatorTerm.toEncodedString());
502         assertEquals(originatorRoutingIndicatorTerm, iirvBuilder.getOriginatorRoutingIndicator());
503     }
504 
505     @Test
506     void testNumberOfElementsErrorHandling() {
507         // Make sure an exception is thrown if the number of coordinates is too large
508         List<TimeStampedPVCoordinates> coordinates = getTestCoordinates(1001);
509         assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).buildIIRVMessage(coordinates));
510         assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).buildEphemerisFile(coordinates));
511     }
512 
513 
514     @Test
515     void exampleUsage() throws IOException {
516         // Example script used in documentation in IIRVFileWriter
517 
518         // Given a list of {@code TimeStampedPVCoordinates} objects
519         List<TimeStampedPVCoordinates> coordinates = testCoordinates;
520 
521         // 1. Create an {@link IIRVBuilder} class to define the spacecraft/mission metadata values
522         IIRVBuilder iirvBuilder = new IIRVBuilder(TimeScalesFactory.getUTC());
523         iirvBuilder.setSupportIdCode(1221);
524         iirvBuilder.setDragCoefficient(2.2);
525         iirvBuilder.setOriginIdentification(OriginIdentificationTerm.GSFC);
526         iirvBuilder.setRoutingIndicator("MANY");
527         // ... (additional fields here)
528 
529         // 2. Create an {@link IIRVFileWriter} with the builder object
530         IIRVFileWriter writer = new IIRVFileWriter(iirvBuilder, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
531 
532         // 3. Generate an {@link IIRVEphemerisFile} object containing the ephemeris data
533         IIRVEphemerisFile iirvFile = iirvBuilder.buildEphemerisFile(coordinates);
534 
535         // 4. Write to disk.
536         // Recommendation: embed the start year in the filename (year does not appear in the IIRV itself)
537         String testFilename = "TestSatellite" + "_" +
538             iirvFile.getStartYear() + "_" +
539             iirvFile.getIIRV().get(0).getDayOfYear().toEncodedString() + "_" +
540             iirvFile.getIIRV().get(0).getVectorEpoch().toEncodedString() + ".iirv";
541         writer.write(temporaryFolderPath.resolve(testFilename).toString(), iirvFile);
542     }
543 }