1   package org.orekit.files.iirv;
2   
3   import org.junit.jupiter.api.BeforeEach;
4   import org.junit.jupiter.api.Test;
5   import org.junit.jupiter.api.io.TempDir;
6   import org.orekit.Utils;
7   import org.orekit.annotation.DefaultDataContext;
8   import org.orekit.data.DataSource;
9   import org.orekit.errors.OrekitException;
10  import org.orekit.errors.OrekitIllegalArgumentException;
11  import org.orekit.time.TimeScalesFactory;
12  import org.orekit.time.UTCScale;
13  import org.orekit.utils.Constants;
14  
15  import java.io.BufferedWriter;
16  import java.io.File;
17  import java.io.IOException;
18  import java.nio.charset.StandardCharsets;
19  import java.nio.file.Files;
20  import java.nio.file.Path;
21  import java.util.ArrayList;
22  
23  import static org.junit.jupiter.api.Assertions.assertEquals;
24  import static org.junit.jupiter.api.Assertions.assertThrows;
25  
26  
27  /**
28   * Tests IIRV file writing routines
29   */
30  public class IIRVWriterParserTest {
31  
32  
33      private static UTCScale UTC;
34  
35      private final String iirvPathMultipleVectors = "/iirv/ISS_ZARYA_25544_NASA_IIRV_1DAY.iirv";
36      private IIRVMessage sampleIirvMessage;
37      private IIRVParser parser;
38  
39      @TempDir
40      public Path temporaryFolderPath;
41  
42      @DefaultDataContext
43      @BeforeEach
44      public void setUp() {
45          // Sets the root of data to read
46          Utils.setDataRoot("regular-data");
47          UTC = TimeScalesFactory.getUTC();
48          parser = new IIRVParser(Constants.EIGEN5C_EARTH_MU, 7, 2024, UTC);
49  
50          DataSource iirvTestDataSource = new DataSource(iirvPathMultipleVectors,
51              () -> getClass().getResourceAsStream(iirvPathMultipleVectors));
52          sampleIirvMessage = parser.parse(iirvTestDataSource).getIIRV();
53  
54          IIRVBuilder iirvBuilder = new IIRVBuilder(UTC);
55          iirvBuilder.setSupportIdCode(6406);
56          iirvBuilder.setVehicleIdCode(1);
57          iirvBuilder.setMass(1000.0);
58          iirvBuilder.setCrossSectionalArea(20);
59          iirvBuilder.setDragCoefficient(2.2);
60          iirvBuilder.setSolarReflectivityCoefficient(1);
61          iirvBuilder.setOriginatorRoutingIndicator("GCQU");
62      }
63  
64      @Test
65      void readWriteStringBuffer() throws IOException {
66          final StringBuilder buffer = new StringBuilder();
67  
68          StreamingIIRVFileWriter writer = new StreamingIIRVFileWriter(buffer, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
69          assertEquals(writer.getIncludeMessageMetadataSetting(), IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
70  
71          writer.writeIIRVMessage(sampleIirvMessage);
72          IIRVEphemerisFile iirvEphemerisFile = parser.parse(buffer.toString());
73          IIRVMessage iirvFromStringBuffer = iirvEphemerisFile.getIIRV();
74          assertEquals(sampleIirvMessage, iirvFromStringBuffer);
75      }
76  
77      @Test
78      void readWriteMessageMetadata() throws IOException {
79  
80          final File allMetadataFile = temporaryFolderPath.resolve("writeAll.iirv").toFile();
81          final File firstOnlyMetadataFile = temporaryFolderPath.resolve("firstOnly.iirv").toFile();
82  
83          // Write all metadata file
84          try (BufferedWriter writer = Files.newBufferedWriter(allMetadataFile.toPath(), StandardCharsets.UTF_8)) {
85              StreamingIIRVFileWriter allVectorsWriter = new StreamingIIRVFileWriter(
86                  writer,
87                  IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
88              allVectorsWriter.writeIIRVMessage(sampleIirvMessage);
89          }
90  
91          // Write first line only file
92          try (BufferedWriter writer = Files.newBufferedWriter(firstOnlyMetadataFile.toPath(), StandardCharsets.UTF_8)) {
93              StreamingIIRVFileWriter firstOnlyWriter = new StreamingIIRVFileWriter(
94                  writer,
95                  IIRVMessage.IncludeMessageMetadata.FIRST_VECTOR_ONLY);
96  
97              firstOnlyWriter.writeIIRVMessage(sampleIirvMessage);
98          }
99  
100         IIRVMessage parsedAllMetadata = parser.parse(new DataSource(allMetadataFile.toString())).getIIRV();
101         IIRVMessage parsedFirstOnlyMetadata = parser.parse(new DataSource(firstOnlyMetadataFile.toString())).getIIRV();
102 
103         assertEquals(parsedAllMetadata.get(0).toIIRVString(true),
104             parsedFirstOnlyMetadata.get(0).toIIRVString(true));
105         assertEquals(parsedAllMetadata.get(0).toIIRVString(true),
106             parsedAllMetadata.getVectorStrings(IIRVMessage.IncludeMessageMetadata.ALL_VECTORS).get(0));
107         assertEquals(parsedAllMetadata.get(1).toIIRVString(true),
108             parsedAllMetadata.getVectorStrings(IIRVMessage.IncludeMessageMetadata.ALL_VECTORS).get(1));
109 
110         assertEquals(parsedAllMetadata.get(0).toIIRVString(false),
111             parsedFirstOnlyMetadata.get(0).toIIRVString(false));
112         assertEquals(parsedAllMetadata.get(1).toIIRVString(false),
113             parsedAllMetadata.getVectorStrings(IIRVMessage.IncludeMessageMetadata.FIRST_VECTOR_ONLY).get(1));
114 
115     }
116 
117     @Test
118     void writeMultipleVectorIIRV() throws IOException {
119 
120         // Create IIRV Builder object to set each non-default value
121         IIRVBuilder iirvBuilder = new IIRVBuilder(UTC);
122         iirvBuilder.setSupportIdCode(6406);
123         iirvBuilder.setVehicleIdCode(1);
124         iirvBuilder.setMass(1000.0);
125         iirvBuilder.setCrossSectionalArea(20);
126         iirvBuilder.setDragCoefficient(2.2);
127         iirvBuilder.setSolarReflectivityCoefficient(1);
128         iirvBuilder.setOriginatorRoutingIndicator("GCQU");
129 
130         IIRVFileWriter writer = new IIRVFileWriter(iirvBuilder, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
131 
132         // Write the IIRV message
133         final File tempFile = temporaryFolderPath.resolve("writeIIRVExample.iirv").toFile();
134         writer.write(tempFile.toString(), new IIRVEphemerisFile(2024, sampleIirvMessage));
135 
136         // Read in
137         IIRVMessage parsedMessage = parser.parse(new DataSource(tempFile.toString())).getIIRV();
138         assertEquals(6, parsedMessage.size());
139     }
140 
141     @Test
142     void readWriteIIRV() throws IOException {
143 
144         // Create temporary file for test case
145         final Path tempFilepath = temporaryFolderPath.resolve("readWriteIIRVTest.iirv");
146 
147         // Write IIRV to file
148         IIRVVector originalIIRV = sampleIirvMessage.get(0);
149 
150         try (BufferedWriter bufferedWriter = Files.newBufferedWriter(tempFilepath, StandardCharsets.UTF_8)) {
151             StreamingIIRVFileWriter writer = new StreamingIIRVFileWriter(
152                 bufferedWriter,
153                 IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
154             writer.writeIIRVMessage(new IIRVMessage(originalIIRV));
155         }
156 
157         IIRVMessage parsedIIRVVectors = parser.parse(new DataSource(tempFilepath.toString())).getIIRV();
158         assertEquals(1, parsedIIRVVectors.size());
159 
160         IIRVVector recoveredIIRV = parsedIIRVVectors.get(0);
161         assertEquals(0, originalIIRV.compareTo(recoveredIIRV));
162     }
163 
164     @Test
165     void readWriteMultiLineIIRV() throws IOException, NullPointerException {
166 
167         // Read test file
168         final String iirvFileResource = "/iirv/ISS_ZARYA_25544_NASA_IIRV_1DAY.iirv";
169         final DataSource source = new DataSource(iirvFileResource,
170             () -> getClass().getResourceAsStream(iirvFileResource));
171         IIRVMessage iirvMessageBeforeWriting = parser.parse(source).getIIRV();
172 
173         // Immediately write back out
174         final Path tempFilepath = temporaryFolderPath.resolve("readWriteIIRVTest.iirv");
175         try (BufferedWriter bufferedWriter = Files.newBufferedWriter(tempFilepath, StandardCharsets.UTF_8)) {
176             StreamingIIRVFileWriter writer = new StreamingIIRVFileWriter(
177                 bufferedWriter,
178                 IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
179             writer.writeIIRVMessage(iirvMessageBeforeWriting);
180         }
181 
182         // Immediately read back in
183         IIRVMessage iirvVectorsAfterWriting = parser.parse(new DataSource(tempFilepath.toString())).getIIRV();
184 
185         // Is it still the same
186         for (int i = 0; i < iirvMessageBeforeWriting.size(); i++) {
187             IIRVVector originalIIRV = iirvMessageBeforeWriting.get(i);
188             IIRVVector readWriteIIRV = iirvVectorsAfterWriting.get(i);
189             assertEquals(0, originalIIRV.compareTo(readWriteIIRV));
190         }
191     }
192 
193     @Test
194     void checkErrorHandling() throws IOException, NullPointerException {
195 
196         // Write the IIRV message
197         IIRVFileWriter iirvFileWriter = new IIRVFileWriter(new IIRVBuilder(UTC), IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
198         IIRVEphemerisFile iirvEphemerisFile = new IIRVEphemerisFile(2024, sampleIirvMessage);
199 
200         // IIRVFileWriter: null appendable handling
201         assertThrows(OrekitIllegalArgumentException.class, () -> iirvFileWriter.write((Appendable) null, iirvEphemerisFile));
202 
203         // IIRVFileWriter: null ephemeris file handling
204         final Path tempFilepath = temporaryFolderPath.resolve("readWriteIIRVTest.iirv");
205         try (BufferedWriter bufferedWriter = Files.newBufferedWriter(tempFilepath, StandardCharsets.UTF_8)) {
206             iirvFileWriter.write(bufferedWriter, null);
207             assertEquals(0, tempFilepath.toFile().length()); // Check that file is empty
208         }
209 
210         //IIRVParser: null inputs
211         assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse((DataSource) null)); // null data source
212         assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse((ArrayList<String>) null)); // null array
213         assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse(new ArrayList<>())); // empty array
214 
215         // IIRVParser: i/o exception
216         assertThrows(OrekitException.class, () -> parser.parse(new DataSource("/nonexistant/data/path.iirv")));
217     }
218 
219     @Test
220     void readSingleVectorIIRV() {
221         final String iirvFile = "/iirv/ISS_ZARYA_25544_NASA_IIRV.iirv";
222         final DataSource source = new DataSource(iirvFile, () -> getClass().getResourceAsStream(iirvFile));
223 
224         IIRVVector iirv = new IIRVParser(2024, UTC).parse(source).getIIRV().get(0);
225         assertEquals("030000000010GIIRV GSFC", iirv.buildLine1(true));
226         assertEquals("GIIRV GSFC", iirv.buildLine1(false));
227     }
228 
229 }