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
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
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
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
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
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
133 final File tempFile = temporaryFolderPath.resolve("writeIIRVExample.iirv").toFile();
134 writer.write(tempFile.toString(), new IIRVEphemerisFile(2024, sampleIirvMessage));
135
136
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
145 final Path tempFilepath = temporaryFolderPath.resolve("readWriteIIRVTest.iirv");
146
147
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
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
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
183 IIRVMessage iirvVectorsAfterWriting = parser.parse(new DataSource(tempFilepath.toString())).getIIRV();
184
185
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
197 IIRVFileWriter iirvFileWriter = new IIRVFileWriter(new IIRVBuilder(UTC), IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
198 IIRVEphemerisFile iirvEphemerisFile = new IIRVEphemerisFile(2024, sampleIirvMessage);
199
200
201 assertThrows(OrekitIllegalArgumentException.class, () -> iirvFileWriter.write((Appendable) null, iirvEphemerisFile));
202
203
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());
208 }
209
210
211 assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse((DataSource) null));
212 assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse((ArrayList<String>) null));
213 assertThrows(OrekitIllegalArgumentException.class, () -> parser.parse(new ArrayList<>()));
214
215
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 }